ETH Price: $3,146.00 (+0.86%)
Gas: 2 Gwei

Token

EBK (EBK)
 

Overview

Max Total Supply

800 EBK

Holders

262

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
generalnemo.eth
Balance
6 EBK
0x17ab241effbf26e55169a3ea20a8a8214ea9eb84
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
Elements_By_Koketit

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 16: minter.sol
// SPDX-License-Identifier: MIT
// @author: Exotic Technology LTD




pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IPaperKeyManager.sol";
import "./ownable.sol";
import "./ERC721enumerable.sol";
import "./merkle.sol";





contract Elements_By_Koketit is Ownable, ERC721, ERC721Enumerable {
    
    IPaperKeyManager paperKeyManager;
    
    bool public saleIsActive = false;

    bool public claim = false;

    uint256 public  MAX_TOKEN = 800;
    
    
    uint256  public royalty = 90;

    uint256 MAX_PUBLIC_MINT = 10;


    uint256 public salePrice = 0.15 ether;

    uint256 public preSalePrice = 0.1 ether;



    uint256 public SALE_START = 0;


    string private _baseURIextended;

    string public PROVENANCE;

    bytes32 public merkleRoot = 0x1b37dbe7f06ec1a780263e873304a99bd9264f9abf8598dc87a87e2c79e490ad;

    
    mapping(address => bool) private senders;
   

    
    constructor(address _paperKeyManagerAddress) ERC721("EBK", "EBK") {
       

        _baseURIextended = "ipfs://QmXZdTv4Q4q2QwRBi3W9aY4MF55BkFz1CjURGHCDLQDVbs/"; //cover

        senders[msg.sender] = true; // add owner

        paperKeyManager = IPaperKeyManager(_paperKeyManagerAddress);


    }

        // onlyPaper modifier 
    modifier onlyPaper(bytes32 _hash, bytes32 _nonce, bytes calldata _signature) {
        bool success = paperKeyManager.verify(_hash, _nonce, _signature);
        require(success, "Failed to verify signature");
        _;
    }


    function registerPaperKey(address _paperKey) external  {
        require(senders[_msgSender()]);

        require(paperKeyManager.register(_paperKey), "Error registering key");
    }



  

   function updateMerkle(bytes32 _merkle) public   {
        require(senders[_msgSender()]); 
       merkleRoot = _merkle;
       
    }


   function addSender(address _address) public onlyOwner  {
        
        require(_address != address(0));
        senders[_address] = true;
       
    }
    
    function removeSender(address _address) public onlyOwner {
        require(_address != address(0));
        senders[_address] = false;
        
    }

    function updateSaleStart(uint _start) public {
        require(senders[_msgSender()]);
        require(_start > 0,"zero");
        SALE_START = _start;
    }

    function updateMaxToken(uint _max) public {
        require(senders[_msgSender()]);

        require(_max > 0,"zero");
        uint256 ts = totalSupply();
        require(_max >= ts,"below supply");
        MAX_TOKEN = _max;
    }


    function updateSalePrice(uint _price) public {
        require(senders[_msgSender()]);

        salePrice = _price;
    }

    function updatePreSalePrice(uint _price) public {
        require(senders[_msgSender()]);

        preSalePrice = _price;
    }
    

    function updateMaxPublicMint(uint _max) public{
        require(senders[_msgSender()]);

        MAX_PUBLIC_MINT = _max;
    }

   function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view override  returns (
        address receiver,
        uint256 royaltyAmount
    ){
        require(_exists(_tokenId));
        return (owner(), uint256(royalty * _salePrice / 1000));

    }


    function flipSaleState() public  {
        require(senders[_msgSender()]);
        saleIsActive = !saleIsActive;
    }



    function updateRoyalty(uint newRoyalty) public {
        require(senders[_msgSender()]);

        royalty = newRoyalty ;
    }


    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
            super._beforeTokenTransfer(from, to, tokenId);
        }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
            return super.supportsInterface(interfaceId);
        }

    function setBaseURI(string memory baseURI_)  external {
             require(senders[_msgSender()]);
            _baseURIextended = baseURI_;
        }

    function _baseURI() internal view virtual override returns (string memory) {
            return _baseURIextended;
        }

    function setProvenance(string memory provenance) public onlyOwner {
            PROVENANCE = provenance;
        }



    function getSaleState() public view returns (bool) {
            return saleIsActive;
    }

  

    
    function _confirmMint(uint _tokenNumber) private view returns (bool) {
        require(saleIsActive, "closed!");

        uint256 ts = totalSupply();
        require(_tokenNumber <= MAX_PUBLIC_MINT,"max public");
        require(ts + _tokenNumber <= MAX_TOKEN, "max total");
        
        

        return true;
    }



    function _doMint(uint numberOfTokens, address _target)private {
        

            uint256 t = totalSupply();

            for (uint256 i = 0; i < numberOfTokens; i++) {
                    _safeMint(_target, t + i);
                    
              }


               
   
    }

    function prooveMerkle(bytes32[] calldata _merkleProof, bytes32 _merkleRoot)private view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));

        require(MerkleProof.verify(_merkleProof, _merkleRoot, leaf));

        return true;
    }

    // paper
    function checkClaimEligibility(uint256 quantity) external view returns (string memory){
        if (!saleIsActive) {
            return "not live yet";
        } else if (quantity > MAX_PUBLIC_MINT) {
            return "max mint amount per transaction exceeded";
        } else if (totalSupply() + quantity > MAX_TOKEN) {
            return "not enough supply";
        }
        return "";
        }

    // paper mint
    function mintTo(address recipient, uint256 quantity,bytes32 _nonce, bytes calldata _signature) public payable 
    onlyPaper(keccak256(abi.encode(recipient,quantity)), _nonce, _signature){
        
        require(SALE_START > 0, "not yet");
        require(salePrice * (quantity) <= msg.value, "Ether");
        require(_confirmMint(quantity), "confirm");
                  
        _doMint(quantity,recipient);
    
    }

    function mintToWl(address recipient, uint256 quantity,bytes32 _nonce, bytes calldata _signature) public payable 
    onlyPaper(keccak256(abi.encode(recipient,quantity)), _nonce, _signature){
        
        require(SALE_START > 0, "not yet");
        require(preSalePrice * (quantity) <= msg.value, "Ether");
        require(_confirmMint(quantity), "confirm");
                  
        _doMint(quantity,recipient);
    
    }


    // team reserve
    function sendToken(uint _amount, address _target)public {
        require(senders[_msgSender()]);

        require(_amount >0);
        uint256 ts = totalSupply();
        require(ts + _amount <= MAX_TOKEN);
        

        _doMint(_amount,_target);
           
    }


    // Public Mint
    function publicMint(uint256  _amount) public payable {
        
        require(SALE_START > 0 && block.timestamp >= SALE_START, "not yet");
        require(salePrice * (_amount) <= msg.value, "Ether");
        require(_confirmMint(_amount), "confirm");
                  
        _doMint(_amount, _msgSender());
    
    }

    // Presale Mint
    function preSaleMint(uint256  _amount, bytes32[] calldata _proof) public payable {
      
       require(SALE_START > 0, "not yet");
       require(prooveMerkle(_proof, merkleRoot ),"whitelist");
       require(preSalePrice * (_amount) <= msg.value, "Ether");
       require(_confirmMint(_amount), "confirm");
                  
        _doMint(_amount, _msgSender());
    
    }
    
    function airdrop(address  _target, uint numberOfTokens) public {
        
        require(senders[_msgSender()]);
        require(numberOfTokens >0);
        uint256 ts = totalSupply();
        require(ts + numberOfTokens <= MAX_TOKEN, "max");
        
        _doMint(numberOfTokens, _target);
    }

    function burn(uint256 tokenId) external onlyOwner {
        require(ERC721.ownerOf(tokenId) == _msgSender(), "ERC721: transfer from incorrect owner");
        
        _burn(tokenId);
    }



    function withdraw(address _beneficiary) public onlyOwner {
        uint balance = address(this).balance;
        payable(_beneficiary).transfer(balance);
    }


    function transferOwnership(address newOwner) public override onlyOwner {
        require(newOwner != address(0), "address");
       
        _transferOwnership(newOwner);

    }
    
}   

/*
                                                                                                                                                     
                                                                                
                               %%%%%*       /%%%%*                              
                         %%%                         %%                         
                     .%%                                 %%                     
                   %%                                       %                   
                 %%                                           %                 
               %%                                               %               
             .%     @@@@@@@@@@@@@@@@@@@@@               @@@@                    
            %%      @@@                @@@             @@@         ,            
            %       @@@                  @@@         @@@                        
           %%       &&&                   &@@@     @@@              %           
           %        &&&                     @@@@ @@@                            
          ,%        &&&&&&&&&&&&&&&&&&&%%(.   @@@@@                             
           %        %%%                      @@@@@@@                            
           %        %%%                    @@@@   @@@@                          
           %%       %%%                  @@@@       @@@             %           
            %%      %%%                 @@@           @@@          %            
             %%     %%%               @@@               @@@       %             
              %%    %%%%%%%%%%%%%%%%@@@                  @@@@    %              
                %%                                             %                
                  %%                                         %                  
                    %%                                     %                    
                       %%%                             %%                       
                            %%%                   %%#                           
                                    #%%%%%%%                 

*/

File 1 of 16: address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 2 of 16: context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";


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

File 4 of 16: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./ERC165.sol";
import "./IERC721.sol";
import "./IERC721receiver.sol";
import "./IERC721metadata.sol";
import "./IERC2981.sol";
import "./address.sol";
import "./context.sol";
import "./strings.sol";


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC2981 {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

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

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

    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view virtual override returns (
        address receiver,
        uint256 royaltyAmount
    ){

    }

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */

    function tokenURI(uint256 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())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";
  
/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

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

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

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

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

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

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

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 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).

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

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 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];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 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).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 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)
        uint256 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();
    }
}

File 6 of 16: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

///
/// @dev Interface for the NFT Royalty Standard
///
interface IERC2981 is IERC165 {
    /// ERC165 bytes to add to interface array - set in parent contract
    /// implementing this standard
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view returns (
        address receiver,
        uint256 royaltyAmount
    );
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";


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

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

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

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

pragma solidity ^0.8.0;


interface IERC721Metadata {


  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}

File 11 of 16: IERC721receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 16: IPaperKeyManager.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @title Paper Key Manager
/// @author Winston Yeo
/// @notice PaperKeyManager makes it easy for developers to restrict certain functions to Paper.
/// @dev Developers are in charge of registering the contract with the initial Paper key.
///      Paper will then help you  automatically rotate and update your key in line with good security hygiene
interface IPaperKeyManager {
    /// @notice Registers a Paper Key to a contract
    /// @dev Registers the @param _paperKey with the caller of the function (your contract)
    /// @param _paperKey The Paper key that is associated with the checkout. 
    /// You should be able to find this in the response of the checkout API or on the checkout dashbaord.
    /// @return bool indicating if the @param _paperKey was successfully registered with the calling address
    function register(address _paperKey) external returns (bool);

    /// @notice Verifies if the given @param _data is from Paper and have not been used before
    /// @dev Called as the first line in your function or extracted in a modifier. Refer to the Documentation for more usage details.
    /// @param _hash The bytes32 encoding of the data passed into your function.
    /// This is done by calling keccak256(abi.encode(...your params in order))
    /// @param _nonce a random set of bytes Paper passes your function which you forward. This helps ensure that the @param _hash has not been used before.
    /// @param _signature used to verify that Paper was the one who sent the @param _hash
    /// @return bool indicating if the @param _hash was successfully verified
    function verify(
        bytes32 _hash,
        bytes32 _nonce,
        bytes calldata _signature
    ) external returns (bool);
}

File 13 of 16: merkle.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


pragma solidity ^0.8.0;

import "./context.sol";

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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 16 of 16: strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_paperKeyManagerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[],"name":"MAX_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"checkClaimEligibility","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","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":"getSaleState","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":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32","name":"_nonce","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32","name":"_nonce","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mintToWl","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_paperKey","type":"address"}],"name":"registerPaperKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_target","type":"address"}],"name":"sendToken","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","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":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkle","type":"bytes32"}],"name":"updateMerkle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updatePreSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRoyalty","type":"uint256"}],"name":"updateRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"}],"name":"updateSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60146101000a81548160ff0219169083151502179055506000600b60156101000a81548160ff021916908315150217905550610320600c55605a600d55600a600e55670214e8348c4f0000600f5567016345785d8a000060105560006011557f1b37dbe7f06ec1a780263e873304a99bd9264f9abf8598dc87a87e2c79e490ad60001b6014553480156200009b57600080fd5b50604051620063ae380380620063ae8339818101604052810190620000c19190620003e6565b6040518060400160405280600381526020017f45424b00000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f45424b00000000000000000000000000000000000000000000000000000000008152506200014d620001416200025360201b60201c565b6200025b60201b60201c565b8160019080519060200190620001659291906200031f565b5080600290805190602001906200017e9291906200031f565b505050604051806060016040528060368152602001620063786036913960129080519060200190620001b29291906200031f565b506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620004d0565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200032d906200044c565b90600052602060002090601f0160209004810192826200035157600085556200039d565b82601f106200036c57805160ff19168380011785556200039d565b828001600101855582156200039d579182015b828111156200039c5782518255916020019190600101906200037f565b5b509050620003ac9190620003b0565b5090565b5b80821115620003cb576000816000905550600101620003b1565b5090565b600081519050620003e081620004b6565b92915050565b600060208284031215620003ff57620003fe620004b1565b5b60006200040f84828501620003cf565b91505092915050565b600062000425826200042c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200046557607f821691505b602082108114156200047c576200047b62000482565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620004c18162000418565b8114620004cd57600080fd5b50565b615e9880620004e06000396000f3fe6080604052600436106102ff5760003560e01c80636373a6b111610190578063a22cb465116100dc578063c87b56dd11610095578063eb8d24441161006f578063eb8d244414610b3d578063f2fde38b14610b68578063f51f96dd14610b91578063ffe630b514610bbc576102ff565b8063c87b56dd14610a98578063e757c17d14610ad5578063e985e9c514610b00576102ff565b8063a22cb465146109af578063b2c9ea4e146109d8578063b2f87643146109f4578063b697f53114610a1d578063b88d4fde14610a46578063bf97180b14610a6f576102ff565b806372378554116101495780638ba4cc3c116101235780638ba4cc3c146109075780638da5cb5b146109305780638fffd8b51461095b57806395d89b4114610984576102ff565b8063723785541461088c5780637a742d94146108b55780637ec0912e146108de576102ff565b80636373a6b11461079057806365fccb52146107bb5780636e1bd323146107e457806370a082311461080f578063713362421461084c578063715018a614610875576102ff565b80632eb4a7ab1161024f5780634c220f6e1161020857806351cff8d9116101e257806351cff8d9146106d857806355f804b31461070157806360febc8c1461072a5780636352211e14610753576102ff565b80634c220f6e146106545780634e71d92d146106705780634f6ccce71461069b576102ff565b80632eb4a7ab1461055a5780632f745c591461058557806334918dfd146105c257806342842e0e146105d957806342966c6814610602578063435fe1b51461062b576102ff565b806318160ddd116102bc57806325bdb2a81161029657806325bdb2a8146104aa57806329ee566c146104d55780632a55205a146105005780632db115441461053e576102ff565b806318160ddd1461042b578063226730301461045657806323b872dd14610481576102ff565b806301ffc9a71461030457806306fdde0314610341578063072dad781461036c578063081812fc146103a9578063095ea7b3146103e65780630b8a5fd51461040f575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906145e6565b610be5565b6040516103389190614da2565b60405180910390f35b34801561034d57600080fd5b50610356610bf7565b6040516103639190614e18565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190614689565b610c89565b6040516103a09190614e18565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190614689565b610d77565b6040516103dd9190614d12565b60405180910390f35b3480156103f257600080fd5b5061040d600480360381019061040891906144c4565b610dfc565b005b61042960048036038101906104249190614504565b610f14565b005b34801561043757600080fd5b5061044061112a565b60405161044d91906151fa565b60405180910390f35b34801561046257600080fd5b5061046b611137565b60405161047891906151fa565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a391906143ae565b61113d565b005b3480156104b657600080fd5b506104bf61119d565b6040516104cc9190614da2565b60405180910390f35b3480156104e157600080fd5b506104ea6111b4565b6040516104f791906151fa565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190614756565b6111ba565b604051610535929190614d79565b60405180910390f35b61055860048036038101906105539190614689565b6111fd565b005b34801561056657600080fd5b5061056f6112fc565b60405161057c9190614dbd565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a791906144c4565b611302565b6040516105b991906151fa565b60405180910390f35b3480156105ce57600080fd5b506105d76113a7565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906143ae565b611430565b005b34801561060e57600080fd5b5061062960048036038101906106249190614689565b611450565b005b34801561063757600080fd5b50610652600480360381019061064d9190614689565b611555565b005b61066e600480360381019061066991906146f6565b6115ff565b005b34801561067c57600080fd5b5061068561173e565b6040516106929190614da2565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd9190614689565b611751565b6040516106cf91906151fa565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190614341565b6117c2565b005b34801561070d57600080fd5b5061072860048036038101906107239190614640565b61188e565b005b34801561073657600080fd5b50610751600480360381019061074c9190614341565b611905565b005b34801561075f57600080fd5b5061077a60048036038101906107759190614689565b611a51565b6040516107879190614d12565b60405180910390f35b34801561079c57600080fd5b506107a5611b03565b6040516107b29190614e18565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd9190614689565b611b91565b005b3480156107f057600080fd5b506107f9611bf8565b60405161080691906151fa565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190614341565b611bfe565b60405161084391906151fa565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190614689565b611cb6565b005b34801561088157600080fd5b5061088a611d1d565b005b34801561089857600080fd5b506108b360048036038101906108ae91906146b6565b611da5565b005b3480156108c157600080fd5b506108dc60048036038101906108d791906145b9565b611e44565b005b3480156108ea57600080fd5b5061090560048036038101906109009190614689565b611eab565b005b34801561091357600080fd5b5061092e600480360381019061092991906144c4565b611f12565b005b34801561093c57600080fd5b50610945611fe7565b6040516109529190614d12565b60405180910390f35b34801561096757600080fd5b50610982600480360381019061097d9190614689565b612010565b005b34801561099057600080fd5b50610999612077565b6040516109a69190614e18565b60405180910390f35b3480156109bb57600080fd5b506109d660048036038101906109d19190614484565b612109565b005b6109f260048036038101906109ed9190614504565b61211f565b005b348015610a0057600080fd5b50610a1b6004803603810190610a169190614341565b612335565b005b348015610a2957600080fd5b50610a446004803603810190610a3f9190614341565b612446565b005b348015610a5257600080fd5b50610a6d6004803603810190610a689190614401565b612557565b005b348015610a7b57600080fd5b50610a966004803603810190610a919190614689565b6125b9565b005b348015610aa457600080fd5b50610abf6004803603810190610aba9190614689565b6126b3565b604051610acc9190614e18565b60405180910390f35b348015610ae157600080fd5b50610aea61275a565b604051610af791906151fa565b60405180910390f35b348015610b0c57600080fd5b50610b276004803603810190610b22919061436e565b612760565b604051610b349190614da2565b60405180910390f35b348015610b4957600080fd5b50610b526127f4565b604051610b5f9190614da2565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a9190614341565b612807565b005b348015610b9d57600080fd5b50610ba66128ff565b604051610bb391906151fa565b60405180910390f35b348015610bc857600080fd5b50610be36004803603810190610bde9190614640565b612905565b005b6000610bf08261299b565b9050919050565b606060018054610c06906154b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c32906154b4565b8015610c7f5780601f10610c5457610100808354040283529160200191610c7f565b820191906000526020600020905b815481529060010190602001808311610c6257829003601f168201915b5050505050905090565b6060600b60149054906101000a900460ff16610cdc576040518060400160405280600c81526020017f6e6f74206c6976652079657400000000000000000000000000000000000000008152509050610d72565b600e54821115610d0657604051806060016040528060288152602001615e3b602891399050610d72565b600c5482610d1261112a565b610d1c91906152df565b1115610d5f576040518060400160405280601181526020017f6e6f7420656e6f75676820737570706c790000000000000000000000000000008152509050610d72565b6040518060200160405280600081525090505b919050565b6000610d8282612a15565b610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db89061505a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e0782611a51565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f9061513a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e97612a81565b73ffffffffffffffffffffffffffffffffffffffff161480610ec65750610ec581610ec0612a81565b612760565b5b610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90614fba565b60405180910390fd5b610f0f8383612a89565b505050565b8484604051602001610f27929190614d79565b604051602081830303815290604052805190602001208383836000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663de12c640868686866040518563ffffffff1660e01b8152600401610fa39493929190614dd8565b602060405180830381600087803b158015610fbd57600080fd5b505af1158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff5919061458c565b905080611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e9061511a565b60405180910390fd5b60006011541161107c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110739061515a565b60405180910390fd5b3489600f5461108b9190615366565b11156110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c39061509a565b60405180910390fd5b6110d589612b42565b611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906150da565b60405180910390fd5b61111e898b612c3e565b50505050505050505050565b6000600980549050905090565b60115481565b61114e611148612a81565b82612c83565b61118d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111849061517a565b60405180910390fd5b611198838383612d61565b505050565b6000600b60149054906101000a900460ff16905090565b600d5481565b6000806111c684612a15565b6111cf57600080fd5b6111d7611fe7565b6103e884600d546111e89190615366565b6111f29190615335565b915091509250929050565b600060115411801561121157506011544210155b611250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112479061515a565b60405180910390fd5b3481600f5461125f9190615366565b11156112a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112979061509a565b60405180910390fd5b6112a981612b42565b6112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df906150da565b60405180910390fd5b6112f9816112f4612a81565b612c3e565b50565b60145481565b600061130d83611bfe565b821061134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590614e7a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601560006113b3612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661140457600080fd5b600b60149054906101000a900460ff1615600b60146101000a81548160ff021916908315150217905550565b61144b83838360405180602001604052806000815250612557565b505050565b611458612a81565b73ffffffffffffffffffffffffffffffffffffffff16611476611fe7565b73ffffffffffffffffffffffffffffffffffffffff16146114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c39061507a565b60405180910390fd5b6114d4612a81565b73ffffffffffffffffffffffffffffffffffffffff166114f382611a51565b73ffffffffffffffffffffffffffffffffffffffff1614611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090614eba565b60405180910390fd5b61155281612fc8565b50565b60156000611561612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115b257600080fd5b600081116115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614eda565b60405180910390fd5b8060118190555050565b600060115411611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b9061515a565b60405180910390fd5b61165182826014546130e5565b611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168790614f7a565b60405180910390fd5b348360105461169f9190615366565b11156116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d79061509a565b60405180910390fd5b6116e983612b42565b611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f906150da565b60405180910390fd5b61173983611734612a81565b612c3e565b505050565b600b60159054906101000a900460ff1681565b600061175b61112a565b821061179c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117939061519a565b60405180910390fd5b600982815481106117b0576117af615671565b5b90600052602060002001549050919050565b6117ca612a81565b73ffffffffffffffffffffffffffffffffffffffff166117e8611fe7565b73ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118359061507a565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611889573d6000803e3d6000fd5b505050565b6015600061189a612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118eb57600080fd5b806012908051906020019061190192919061407f565b5050565b60156000611911612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661196257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634420e486826040518263ffffffff1660e01b81526004016119bd9190614d12565b602060405180830381600087803b1580156119d757600080fd5b505af11580156119eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0f919061458c565b611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a459061501a565b60405180910390fd5b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190614ffa565b60405180910390fd5b80915050919050565b60138054611b10906154b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3c906154b4565b8015611b895780601f10611b5e57610100808354040283529160200191611b89565b820191906000526020600020905b815481529060010190602001808311611b6c57829003601f168201915b505050505081565b60156000611b9d612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bee57600080fd5b8060108190555050565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6690614fda565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60156000611cc2612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d1357600080fd5b80600e8190555050565b611d25612a81565b73ffffffffffffffffffffffffffffffffffffffff16611d43611fe7565b73ffffffffffffffffffffffffffffffffffffffff1614611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d909061507a565b60405180910390fd5b611da36000613179565b565b60156000611db1612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e0257600080fd5b60008211611e0f57600080fd5b6000611e1961112a565b9050600c548382611e2a91906152df565b1115611e3557600080fd5b611e3f8383612c3e565b505050565b60156000611e50612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ea157600080fd5b8060148190555050565b60156000611eb7612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f0857600080fd5b80600f8190555050565b60156000611f1e612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f6f57600080fd5b60008111611f7c57600080fd5b6000611f8661112a565b9050600c548282611f9791906152df565b1115611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf906150fa565b60405180910390fd5b611fe28284612c3e565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6015600061201c612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661206d57600080fd5b80600d8190555050565b606060028054612086906154b4565b80601f01602080910402602001604051908101604052809291908181526020018280546120b2906154b4565b80156120ff5780601f106120d4576101008083540402835291602001916120ff565b820191906000526020600020905b8154815290600101906020018083116120e257829003601f168201915b5050505050905090565b61211b612114612a81565b838361323d565b5050565b8484604051602001612132929190614d79565b604051602081830303815290604052805190602001208383836000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663de12c640868686866040518563ffffffff1660e01b81526004016121ae9493929190614dd8565b602060405180830381600087803b1580156121c857600080fd5b505af11580156121dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612200919061458c565b905080612242576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122399061511a565b60405180910390fd5b600060115411612287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227e9061515a565b60405180910390fd5b34896010546122969190615366565b11156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce9061509a565b60405180910390fd5b6122e089612b42565b61231f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612316906150da565b60405180910390fd5b612329898b612c3e565b50505050505050505050565b61233d612a81565b73ffffffffffffffffffffffffffffffffffffffff1661235b611fe7565b73ffffffffffffffffffffffffffffffffffffffff16146123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a89061507a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123eb57600080fd5b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61244e612a81565b73ffffffffffffffffffffffffffffffffffffffff1661246c611fe7565b73ffffffffffffffffffffffffffffffffffffffff16146124c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b99061507a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124fc57600080fd5b6001601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b612568612562612a81565b83612c83565b6125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e9061517a565b60405180910390fd5b6125b3848484846133aa565b50505050565b601560006125c5612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661261657600080fd5b60008111612659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265090614eda565b60405180910390fd5b600061266361112a565b9050808210156126a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269f906151ba565b60405180910390fd5b81600c819055505050565b60606126be82612a15565b6126fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f4906150ba565b60405180910390fd5b6000612707613406565b905060008151116127275760405180602001604052806000815250612752565b8061273184613498565b604051602001612742929190614cee565b6040516020818303038152906040525b915050919050565b60105481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60149054906101000a900460ff1681565b61280f612a81565b73ffffffffffffffffffffffffffffffffffffffff1661282d611fe7565b73ffffffffffffffffffffffffffffffffffffffff1614612883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287a9061507a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ea90614f1a565b60405180910390fd5b6128fc81613179565b50565b600f5481565b61290d612a81565b73ffffffffffffffffffffffffffffffffffffffff1661292b611fe7565b73ffffffffffffffffffffffffffffffffffffffff1614612981576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129789061507a565b60405180910390fd5b806013908051906020019061299792919061407f565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a0e5750612a0d826135f9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612afc83611a51565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000600b60149054906101000a900460ff16612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a90614e5a565b60405180910390fd5b6000612b9d61112a565b9050600e54831115612be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdb90614e3a565b60405180910390fd5b600c548382612bf391906152df565b1115612c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2b906151da565b60405180910390fd5b6001915050919050565b6000612c4861112a565b905060005b83811015612c7d57612c6a838284612c6591906152df565b61379b565b8080612c7590615517565b915050612c4d565b50505050565b6000612c8e82612a15565b612ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc490614f9a565b60405180910390fd5b6000612cd883611a51565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d4757508373ffffffffffffffffffffffffffffffffffffffff16612d2f84610d77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d585750612d578185612760565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d8182611a51565b73ffffffffffffffffffffffffffffffffffffffff1614612dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dce90614eba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3e90614f3a565b60405180910390fd5b612e528383836137b9565b612e5d600082612a89565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ead91906153c0565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0491906152df565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fc38383836137c9565b505050565b6000612fd382611a51565b9050612fe1816000846137b9565b612fec600083612a89565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461303c91906153c0565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130e1816000846137c9565b5050565b6000806130f0612a81565b6040516020016131009190614cd3565b604051602081830303815290604052805190602001209050613164858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505084836137ce565b61316d57600080fd5b60019150509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a390614f5a565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161339d9190614da2565b60405180910390a3505050565b6133b5848484612d61565b6133c1848484846137e5565b613400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f790614e9a565b60405180910390fd5b50505050565b606060128054613415906154b4565b80601f0160208091040260200160405190810160405280929190818152602001828054613441906154b4565b801561348e5780601f106134635761010080835404028352916020019161348e565b820191906000526020600020905b81548152906001019060200180831161347157829003601f168201915b5050505050905090565b606060008214156134e0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135f4565b600082905060005b600082146135125780806134fb90615517565b915050600a8261350b9190615335565b91506134e8565b60008167ffffffffffffffff81111561352e5761352d6156a0565b5b6040519080825280601f01601f1916602001820160405280156135605781602001600182028036833780820191505090505b5090505b600085146135ed5760018261357991906153c0565b9150600a856135889190615584565b603061359491906152df565b60f81b8183815181106135aa576135a9615671565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135e69190615335565b9450613564565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806136c457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061372c57507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061379457507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6137b582826040518060200160405280600081525061397c565b5050565b6137c48383836139d7565b505050565b505050565b6000826137db8584613aeb565b1490509392505050565b60006138068473ffffffffffffffffffffffffffffffffffffffff16613b60565b1561396f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261382f612a81565b8786866040518563ffffffff1660e01b81526004016138519493929190614d2d565b602060405180830381600087803b15801561386b57600080fd5b505af192505050801561389c57506040513d601f19601f820116820180604052508101906138999190614613565b60015b61391f573d80600081146138cc576040519150601f19603f3d011682016040523d82523d6000602084013e6138d1565b606091505b50600081511415613917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390e90614e9a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613974565b600190505b949350505050565b6139868383613b83565b61399360008484846137e5565b6139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c990614e9a565b60405180910390fd5b505050565b6139e2838383613d5d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613a2557613a2081613d62565b613a64565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613a6357613a628382613dab565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613aa757613aa281613f18565b613ae6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613ae557613ae48282613fe9565b5b5b505050565b60008082905060005b8451811015613b55576000858281518110613b1257613b11615671565b5b60200260200101519050808311613b3457613b2d8382614068565b9250613b41565b613b3e8184614068565b92505b508080613b4d90615517565b915050613af4565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bea9061503a565b60405180910390fd5b613bfc81612a15565b15613c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3390614efa565b60405180910390fd5b613c48600083836137b9565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c9891906152df565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d59600083836137c9565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613db884611bfe565b613dc291906153c0565b9050600060086000848152602001908152602001600020549050818114613ea7576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050613f2c91906153c0565b90506000600a6000848152602001908152602001600020549050600060098381548110613f5c57613f5b615671565b5b906000526020600020015490508060098381548110613f7e57613f7d615671565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613fcd57613fcc615642565b5b6001900381819060005260206000200160009055905550505050565b6000613ff483611bfe565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b82805461408b906154b4565b90600052602060002090601f0160209004810192826140ad57600085556140f4565b82601f106140c657805160ff19168380011785556140f4565b828001600101855582156140f4579182015b828111156140f35782518255916020019190600101906140d8565b5b5090506141019190614105565b5090565b5b8082111561411e576000816000905550600101614106565b5090565b60006141356141308461523a565b615215565b905082815260208101848484011115614151576141506156de565b5b61415c848285615472565b509392505050565b60006141776141728461526b565b615215565b905082815260208101848484011115614193576141926156de565b5b61419e848285615472565b509392505050565b6000813590506141b581615dc7565b92915050565b60008083601f8401126141d1576141d06156d4565b5b8235905067ffffffffffffffff8111156141ee576141ed6156cf565b5b60208301915083602082028301111561420a576142096156d9565b5b9250929050565b60008135905061422081615dde565b92915050565b60008151905061423581615dde565b92915050565b60008135905061424a81615df5565b92915050565b60008135905061425f81615e0c565b92915050565b60008151905061427481615e0c565b92915050565b60008083601f8401126142905761428f6156d4565b5b8235905067ffffffffffffffff8111156142ad576142ac6156cf565b5b6020830191508360018202830111156142c9576142c86156d9565b5b9250929050565b600082601f8301126142e5576142e46156d4565b5b81356142f5848260208601614122565b91505092915050565b600082601f830112614313576143126156d4565b5b8135614323848260208601614164565b91505092915050565b60008135905061433b81615e23565b92915050565b600060208284031215614357576143566156e8565b5b6000614365848285016141a6565b91505092915050565b60008060408385031215614385576143846156e8565b5b6000614393858286016141a6565b92505060206143a4858286016141a6565b9150509250929050565b6000806000606084860312156143c7576143c66156e8565b5b60006143d5868287016141a6565b93505060206143e6868287016141a6565b92505060406143f78682870161432c565b9150509250925092565b6000806000806080858703121561441b5761441a6156e8565b5b6000614429878288016141a6565b945050602061443a878288016141a6565b935050604061444b8782880161432c565b925050606085013567ffffffffffffffff81111561446c5761446b6156e3565b5b614478878288016142d0565b91505092959194509250565b6000806040838503121561449b5761449a6156e8565b5b60006144a9858286016141a6565b92505060206144ba85828601614211565b9150509250929050565b600080604083850312156144db576144da6156e8565b5b60006144e9858286016141a6565b92505060206144fa8582860161432c565b9150509250929050565b6000806000806000608086880312156145205761451f6156e8565b5b600061452e888289016141a6565b955050602061453f8882890161432c565b94505060406145508882890161423b565b935050606086013567ffffffffffffffff811115614571576145706156e3565b5b61457d8882890161427a565b92509250509295509295909350565b6000602082840312156145a2576145a16156e8565b5b60006145b084828501614226565b91505092915050565b6000602082840312156145cf576145ce6156e8565b5b60006145dd8482850161423b565b91505092915050565b6000602082840312156145fc576145fb6156e8565b5b600061460a84828501614250565b91505092915050565b600060208284031215614629576146286156e8565b5b600061463784828501614265565b91505092915050565b600060208284031215614656576146556156e8565b5b600082013567ffffffffffffffff811115614674576146736156e3565b5b614680848285016142fe565b91505092915050565b60006020828403121561469f5761469e6156e8565b5b60006146ad8482850161432c565b91505092915050565b600080604083850312156146cd576146cc6156e8565b5b60006146db8582860161432c565b92505060206146ec858286016141a6565b9150509250929050565b60008060006040848603121561470f5761470e6156e8565b5b600061471d8682870161432c565b935050602084013567ffffffffffffffff81111561473e5761473d6156e3565b5b61474a868287016141bb565b92509250509250925092565b6000806040838503121561476d5761476c6156e8565b5b600061477b8582860161432c565b925050602061478c8582860161432c565b9150509250929050565b61479f816153f4565b82525050565b6147b66147b1826153f4565b615560565b82525050565b6147c581615406565b82525050565b6147d481615412565b82525050565b60006147e683856152b2565b93506147f3838584615472565b6147fc836156ed565b840190509392505050565b60006148128261529c565b61481c81856152b2565b935061482c818560208601615481565b614835816156ed565b840191505092915050565b600061484b826152a7565b61485581856152c3565b9350614865818560208601615481565b61486e816156ed565b840191505092915050565b6000614884826152a7565b61488e81856152d4565b935061489e818560208601615481565b80840191505092915050565b60006148b7600a836152c3565b91506148c28261570b565b602082019050919050565b60006148da6007836152c3565b91506148e582615734565b602082019050919050565b60006148fd602b836152c3565b91506149088261575d565b604082019050919050565b60006149206032836152c3565b915061492b826157ac565b604082019050919050565b60006149436025836152c3565b915061494e826157fb565b604082019050919050565b60006149666004836152c3565b91506149718261584a565b602082019050919050565b6000614989601c836152c3565b915061499482615873565b602082019050919050565b60006149ac6007836152c3565b91506149b78261589c565b602082019050919050565b60006149cf6024836152c3565b91506149da826158c5565b604082019050919050565b60006149f26019836152c3565b91506149fd82615914565b602082019050919050565b6000614a156009836152c3565b9150614a208261593d565b602082019050919050565b6000614a38602c836152c3565b9150614a4382615966565b604082019050919050565b6000614a5b6038836152c3565b9150614a66826159b5565b604082019050919050565b6000614a7e602a836152c3565b9150614a8982615a04565b604082019050919050565b6000614aa16029836152c3565b9150614aac82615a53565b604082019050919050565b6000614ac46015836152c3565b9150614acf82615aa2565b602082019050919050565b6000614ae76020836152c3565b9150614af282615acb565b602082019050919050565b6000614b0a602c836152c3565b9150614b1582615af4565b604082019050919050565b6000614b2d6020836152c3565b9150614b3882615b43565b602082019050919050565b6000614b506005836152c3565b9150614b5b82615b6c565b602082019050919050565b6000614b73602f836152c3565b9150614b7e82615b95565b604082019050919050565b6000614b966007836152c3565b9150614ba182615be4565b602082019050919050565b6000614bb96003836152c3565b9150614bc482615c0d565b602082019050919050565b6000614bdc601a836152c3565b9150614be782615c36565b602082019050919050565b6000614bff6021836152c3565b9150614c0a82615c5f565b604082019050919050565b6000614c226007836152c3565b9150614c2d82615cae565b602082019050919050565b6000614c456031836152c3565b9150614c5082615cd7565b604082019050919050565b6000614c68602c836152c3565b9150614c7382615d26565b604082019050919050565b6000614c8b600c836152c3565b9150614c9682615d75565b602082019050919050565b6000614cae6009836152c3565b9150614cb982615d9e565b602082019050919050565b614ccd81615468565b82525050565b6000614cdf82846147a5565b60148201915081905092915050565b6000614cfa8285614879565b9150614d068284614879565b91508190509392505050565b6000602082019050614d276000830184614796565b92915050565b6000608082019050614d426000830187614796565b614d4f6020830186614796565b614d5c6040830185614cc4565b8181036060830152614d6e8184614807565b905095945050505050565b6000604082019050614d8e6000830185614796565b614d9b6020830184614cc4565b9392505050565b6000602082019050614db760008301846147bc565b92915050565b6000602082019050614dd260008301846147cb565b92915050565b6000606082019050614ded60008301876147cb565b614dfa60208301866147cb565b8181036040830152614e0d8184866147da565b905095945050505050565b60006020820190508181036000830152614e328184614840565b905092915050565b60006020820190508181036000830152614e53816148aa565b9050919050565b60006020820190508181036000830152614e73816148cd565b9050919050565b60006020820190508181036000830152614e93816148f0565b9050919050565b60006020820190508181036000830152614eb381614913565b9050919050565b60006020820190508181036000830152614ed381614936565b9050919050565b60006020820190508181036000830152614ef381614959565b9050919050565b60006020820190508181036000830152614f138161497c565b9050919050565b60006020820190508181036000830152614f338161499f565b9050919050565b60006020820190508181036000830152614f53816149c2565b9050919050565b60006020820190508181036000830152614f73816149e5565b9050919050565b60006020820190508181036000830152614f9381614a08565b9050919050565b60006020820190508181036000830152614fb381614a2b565b9050919050565b60006020820190508181036000830152614fd381614a4e565b9050919050565b60006020820190508181036000830152614ff381614a71565b9050919050565b6000602082019050818103600083015261501381614a94565b9050919050565b6000602082019050818103600083015261503381614ab7565b9050919050565b6000602082019050818103600083015261505381614ada565b9050919050565b6000602082019050818103600083015261507381614afd565b9050919050565b6000602082019050818103600083015261509381614b20565b9050919050565b600060208201905081810360008301526150b381614b43565b9050919050565b600060208201905081810360008301526150d381614b66565b9050919050565b600060208201905081810360008301526150f381614b89565b9050919050565b6000602082019050818103600083015261511381614bac565b9050919050565b6000602082019050818103600083015261513381614bcf565b9050919050565b6000602082019050818103600083015261515381614bf2565b9050919050565b6000602082019050818103600083015261517381614c15565b9050919050565b6000602082019050818103600083015261519381614c38565b9050919050565b600060208201905081810360008301526151b381614c5b565b9050919050565b600060208201905081810360008301526151d381614c7e565b9050919050565b600060208201905081810360008301526151f381614ca1565b9050919050565b600060208201905061520f6000830184614cc4565b92915050565b600061521f615230565b905061522b82826154e6565b919050565b6000604051905090565b600067ffffffffffffffff821115615255576152546156a0565b5b61525e826156ed565b9050602081019050919050565b600067ffffffffffffffff821115615286576152856156a0565b5b61528f826156ed565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006152ea82615468565b91506152f583615468565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561532a576153296155b5565b5b828201905092915050565b600061534082615468565b915061534b83615468565b92508261535b5761535a6155e4565b5b828204905092915050565b600061537182615468565b915061537c83615468565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153b5576153b46155b5565b5b828202905092915050565b60006153cb82615468565b91506153d683615468565b9250828210156153e9576153e86155b5565b5b828203905092915050565b60006153ff82615448565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561549f578082015181840152602081019050615484565b838111156154ae576000848401525b50505050565b600060028204905060018216806154cc57607f821691505b602082108114156154e0576154df615613565b5b50919050565b6154ef826156ed565b810181811067ffffffffffffffff8211171561550e5761550d6156a0565b5b80604052505050565b600061552282615468565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615555576155546155b5565b5b600182019050919050565b600061556b82615572565b9050919050565b600061557d826156fe565b9050919050565b600061558f82615468565b915061559a83615468565b9250826155aa576155a96155e4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f6d6178207075626c696300000000000000000000000000000000000000000000600082015250565b7f636c6f7365642100000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6164647265737300000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f77686974656c6973740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4572726f72207265676973746572696e67206b65790000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4574686572000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f636f6e6669726d00000000000000000000000000000000000000000000000000600082015250565b7f6d61780000000000000000000000000000000000000000000000000000000000600082015250565b7f4661696c656420746f20766572696679207369676e6174757265000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f742079657400000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f62656c6f7720737570706c790000000000000000000000000000000000000000600082015250565b7f6d617820746f74616c0000000000000000000000000000000000000000000000600082015250565b615dd0816153f4565b8114615ddb57600080fd5b50565b615de781615406565b8114615df257600080fd5b50565b615dfe81615412565b8114615e0957600080fd5b50565b615e158161541c565b8114615e2057600080fd5b50565b615e2c81615468565b8114615e3757600080fd5b5056fe6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e206578636565646564a2646970667358221220a06e7244d43209a07afb8fcfbff5c31cbec9c77fcf3a22143a8f726cd86f05b264736f6c63430008070033697066733a2f2f516d585a645476345134713251775242693357396159344d463535426b467a31436a5552474843444c51445662732f000000000000000000000000678a3f64a1bf33ba0746ffd88ba749b40b565da5

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80636373a6b111610190578063a22cb465116100dc578063c87b56dd11610095578063eb8d24441161006f578063eb8d244414610b3d578063f2fde38b14610b68578063f51f96dd14610b91578063ffe630b514610bbc576102ff565b8063c87b56dd14610a98578063e757c17d14610ad5578063e985e9c514610b00576102ff565b8063a22cb465146109af578063b2c9ea4e146109d8578063b2f87643146109f4578063b697f53114610a1d578063b88d4fde14610a46578063bf97180b14610a6f576102ff565b806372378554116101495780638ba4cc3c116101235780638ba4cc3c146109075780638da5cb5b146109305780638fffd8b51461095b57806395d89b4114610984576102ff565b8063723785541461088c5780637a742d94146108b55780637ec0912e146108de576102ff565b80636373a6b11461079057806365fccb52146107bb5780636e1bd323146107e457806370a082311461080f578063713362421461084c578063715018a614610875576102ff565b80632eb4a7ab1161024f5780634c220f6e1161020857806351cff8d9116101e257806351cff8d9146106d857806355f804b31461070157806360febc8c1461072a5780636352211e14610753576102ff565b80634c220f6e146106545780634e71d92d146106705780634f6ccce71461069b576102ff565b80632eb4a7ab1461055a5780632f745c591461058557806334918dfd146105c257806342842e0e146105d957806342966c6814610602578063435fe1b51461062b576102ff565b806318160ddd116102bc57806325bdb2a81161029657806325bdb2a8146104aa57806329ee566c146104d55780632a55205a146105005780632db115441461053e576102ff565b806318160ddd1461042b578063226730301461045657806323b872dd14610481576102ff565b806301ffc9a71461030457806306fdde0314610341578063072dad781461036c578063081812fc146103a9578063095ea7b3146103e65780630b8a5fd51461040f575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906145e6565b610be5565b6040516103389190614da2565b60405180910390f35b34801561034d57600080fd5b50610356610bf7565b6040516103639190614e18565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190614689565b610c89565b6040516103a09190614e18565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190614689565b610d77565b6040516103dd9190614d12565b60405180910390f35b3480156103f257600080fd5b5061040d600480360381019061040891906144c4565b610dfc565b005b61042960048036038101906104249190614504565b610f14565b005b34801561043757600080fd5b5061044061112a565b60405161044d91906151fa565b60405180910390f35b34801561046257600080fd5b5061046b611137565b60405161047891906151fa565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a391906143ae565b61113d565b005b3480156104b657600080fd5b506104bf61119d565b6040516104cc9190614da2565b60405180910390f35b3480156104e157600080fd5b506104ea6111b4565b6040516104f791906151fa565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190614756565b6111ba565b604051610535929190614d79565b60405180910390f35b61055860048036038101906105539190614689565b6111fd565b005b34801561056657600080fd5b5061056f6112fc565b60405161057c9190614dbd565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a791906144c4565b611302565b6040516105b991906151fa565b60405180910390f35b3480156105ce57600080fd5b506105d76113a7565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906143ae565b611430565b005b34801561060e57600080fd5b5061062960048036038101906106249190614689565b611450565b005b34801561063757600080fd5b50610652600480360381019061064d9190614689565b611555565b005b61066e600480360381019061066991906146f6565b6115ff565b005b34801561067c57600080fd5b5061068561173e565b6040516106929190614da2565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd9190614689565b611751565b6040516106cf91906151fa565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190614341565b6117c2565b005b34801561070d57600080fd5b5061072860048036038101906107239190614640565b61188e565b005b34801561073657600080fd5b50610751600480360381019061074c9190614341565b611905565b005b34801561075f57600080fd5b5061077a60048036038101906107759190614689565b611a51565b6040516107879190614d12565b60405180910390f35b34801561079c57600080fd5b506107a5611b03565b6040516107b29190614e18565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd9190614689565b611b91565b005b3480156107f057600080fd5b506107f9611bf8565b60405161080691906151fa565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190614341565b611bfe565b60405161084391906151fa565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190614689565b611cb6565b005b34801561088157600080fd5b5061088a611d1d565b005b34801561089857600080fd5b506108b360048036038101906108ae91906146b6565b611da5565b005b3480156108c157600080fd5b506108dc60048036038101906108d791906145b9565b611e44565b005b3480156108ea57600080fd5b5061090560048036038101906109009190614689565b611eab565b005b34801561091357600080fd5b5061092e600480360381019061092991906144c4565b611f12565b005b34801561093c57600080fd5b50610945611fe7565b6040516109529190614d12565b60405180910390f35b34801561096757600080fd5b50610982600480360381019061097d9190614689565b612010565b005b34801561099057600080fd5b50610999612077565b6040516109a69190614e18565b60405180910390f35b3480156109bb57600080fd5b506109d660048036038101906109d19190614484565b612109565b005b6109f260048036038101906109ed9190614504565b61211f565b005b348015610a0057600080fd5b50610a1b6004803603810190610a169190614341565b612335565b005b348015610a2957600080fd5b50610a446004803603810190610a3f9190614341565b612446565b005b348015610a5257600080fd5b50610a6d6004803603810190610a689190614401565b612557565b005b348015610a7b57600080fd5b50610a966004803603810190610a919190614689565b6125b9565b005b348015610aa457600080fd5b50610abf6004803603810190610aba9190614689565b6126b3565b604051610acc9190614e18565b60405180910390f35b348015610ae157600080fd5b50610aea61275a565b604051610af791906151fa565b60405180910390f35b348015610b0c57600080fd5b50610b276004803603810190610b22919061436e565b612760565b604051610b349190614da2565b60405180910390f35b348015610b4957600080fd5b50610b526127f4565b604051610b5f9190614da2565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a9190614341565b612807565b005b348015610b9d57600080fd5b50610ba66128ff565b604051610bb391906151fa565b60405180910390f35b348015610bc857600080fd5b50610be36004803603810190610bde9190614640565b612905565b005b6000610bf08261299b565b9050919050565b606060018054610c06906154b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c32906154b4565b8015610c7f5780601f10610c5457610100808354040283529160200191610c7f565b820191906000526020600020905b815481529060010190602001808311610c6257829003601f168201915b5050505050905090565b6060600b60149054906101000a900460ff16610cdc576040518060400160405280600c81526020017f6e6f74206c6976652079657400000000000000000000000000000000000000008152509050610d72565b600e54821115610d0657604051806060016040528060288152602001615e3b602891399050610d72565b600c5482610d1261112a565b610d1c91906152df565b1115610d5f576040518060400160405280601181526020017f6e6f7420656e6f75676820737570706c790000000000000000000000000000008152509050610d72565b6040518060200160405280600081525090505b919050565b6000610d8282612a15565b610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db89061505a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e0782611a51565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f9061513a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e97612a81565b73ffffffffffffffffffffffffffffffffffffffff161480610ec65750610ec581610ec0612a81565b612760565b5b610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90614fba565b60405180910390fd5b610f0f8383612a89565b505050565b8484604051602001610f27929190614d79565b604051602081830303815290604052805190602001208383836000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663de12c640868686866040518563ffffffff1660e01b8152600401610fa39493929190614dd8565b602060405180830381600087803b158015610fbd57600080fd5b505af1158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff5919061458c565b905080611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e9061511a565b60405180910390fd5b60006011541161107c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110739061515a565b60405180910390fd5b3489600f5461108b9190615366565b11156110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c39061509a565b60405180910390fd5b6110d589612b42565b611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906150da565b60405180910390fd5b61111e898b612c3e565b50505050505050505050565b6000600980549050905090565b60115481565b61114e611148612a81565b82612c83565b61118d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111849061517a565b60405180910390fd5b611198838383612d61565b505050565b6000600b60149054906101000a900460ff16905090565b600d5481565b6000806111c684612a15565b6111cf57600080fd5b6111d7611fe7565b6103e884600d546111e89190615366565b6111f29190615335565b915091509250929050565b600060115411801561121157506011544210155b611250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112479061515a565b60405180910390fd5b3481600f5461125f9190615366565b11156112a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112979061509a565b60405180910390fd5b6112a981612b42565b6112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df906150da565b60405180910390fd5b6112f9816112f4612a81565b612c3e565b50565b60145481565b600061130d83611bfe565b821061134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590614e7a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601560006113b3612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661140457600080fd5b600b60149054906101000a900460ff1615600b60146101000a81548160ff021916908315150217905550565b61144b83838360405180602001604052806000815250612557565b505050565b611458612a81565b73ffffffffffffffffffffffffffffffffffffffff16611476611fe7565b73ffffffffffffffffffffffffffffffffffffffff16146114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c39061507a565b60405180910390fd5b6114d4612a81565b73ffffffffffffffffffffffffffffffffffffffff166114f382611a51565b73ffffffffffffffffffffffffffffffffffffffff1614611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090614eba565b60405180910390fd5b61155281612fc8565b50565b60156000611561612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115b257600080fd5b600081116115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614eda565b60405180910390fd5b8060118190555050565b600060115411611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b9061515a565b60405180910390fd5b61165182826014546130e5565b611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168790614f7a565b60405180910390fd5b348360105461169f9190615366565b11156116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d79061509a565b60405180910390fd5b6116e983612b42565b611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f906150da565b60405180910390fd5b61173983611734612a81565b612c3e565b505050565b600b60159054906101000a900460ff1681565b600061175b61112a565b821061179c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117939061519a565b60405180910390fd5b600982815481106117b0576117af615671565b5b90600052602060002001549050919050565b6117ca612a81565b73ffffffffffffffffffffffffffffffffffffffff166117e8611fe7565b73ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118359061507a565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611889573d6000803e3d6000fd5b505050565b6015600061189a612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118eb57600080fd5b806012908051906020019061190192919061407f565b5050565b60156000611911612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661196257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634420e486826040518263ffffffff1660e01b81526004016119bd9190614d12565b602060405180830381600087803b1580156119d757600080fd5b505af11580156119eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0f919061458c565b611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a459061501a565b60405180910390fd5b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190614ffa565b60405180910390fd5b80915050919050565b60138054611b10906154b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3c906154b4565b8015611b895780601f10611b5e57610100808354040283529160200191611b89565b820191906000526020600020905b815481529060010190602001808311611b6c57829003601f168201915b505050505081565b60156000611b9d612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bee57600080fd5b8060108190555050565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6690614fda565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60156000611cc2612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d1357600080fd5b80600e8190555050565b611d25612a81565b73ffffffffffffffffffffffffffffffffffffffff16611d43611fe7565b73ffffffffffffffffffffffffffffffffffffffff1614611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d909061507a565b60405180910390fd5b611da36000613179565b565b60156000611db1612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e0257600080fd5b60008211611e0f57600080fd5b6000611e1961112a565b9050600c548382611e2a91906152df565b1115611e3557600080fd5b611e3f8383612c3e565b505050565b60156000611e50612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ea157600080fd5b8060148190555050565b60156000611eb7612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f0857600080fd5b80600f8190555050565b60156000611f1e612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f6f57600080fd5b60008111611f7c57600080fd5b6000611f8661112a565b9050600c548282611f9791906152df565b1115611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf906150fa565b60405180910390fd5b611fe28284612c3e565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6015600061201c612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661206d57600080fd5b80600d8190555050565b606060028054612086906154b4565b80601f01602080910402602001604051908101604052809291908181526020018280546120b2906154b4565b80156120ff5780601f106120d4576101008083540402835291602001916120ff565b820191906000526020600020905b8154815290600101906020018083116120e257829003601f168201915b5050505050905090565b61211b612114612a81565b838361323d565b5050565b8484604051602001612132929190614d79565b604051602081830303815290604052805190602001208383836000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663de12c640868686866040518563ffffffff1660e01b81526004016121ae9493929190614dd8565b602060405180830381600087803b1580156121c857600080fd5b505af11580156121dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612200919061458c565b905080612242576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122399061511a565b60405180910390fd5b600060115411612287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227e9061515a565b60405180910390fd5b34896010546122969190615366565b11156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce9061509a565b60405180910390fd5b6122e089612b42565b61231f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612316906150da565b60405180910390fd5b612329898b612c3e565b50505050505050505050565b61233d612a81565b73ffffffffffffffffffffffffffffffffffffffff1661235b611fe7565b73ffffffffffffffffffffffffffffffffffffffff16146123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a89061507a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123eb57600080fd5b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61244e612a81565b73ffffffffffffffffffffffffffffffffffffffff1661246c611fe7565b73ffffffffffffffffffffffffffffffffffffffff16146124c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b99061507a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124fc57600080fd5b6001601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b612568612562612a81565b83612c83565b6125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e9061517a565b60405180910390fd5b6125b3848484846133aa565b50505050565b601560006125c5612a81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661261657600080fd5b60008111612659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265090614eda565b60405180910390fd5b600061266361112a565b9050808210156126a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269f906151ba565b60405180910390fd5b81600c819055505050565b60606126be82612a15565b6126fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f4906150ba565b60405180910390fd5b6000612707613406565b905060008151116127275760405180602001604052806000815250612752565b8061273184613498565b604051602001612742929190614cee565b6040516020818303038152906040525b915050919050565b60105481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60149054906101000a900460ff1681565b61280f612a81565b73ffffffffffffffffffffffffffffffffffffffff1661282d611fe7565b73ffffffffffffffffffffffffffffffffffffffff1614612883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287a9061507a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ea90614f1a565b60405180910390fd5b6128fc81613179565b50565b600f5481565b61290d612a81565b73ffffffffffffffffffffffffffffffffffffffff1661292b611fe7565b73ffffffffffffffffffffffffffffffffffffffff1614612981576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129789061507a565b60405180910390fd5b806013908051906020019061299792919061407f565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a0e5750612a0d826135f9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612afc83611a51565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000600b60149054906101000a900460ff16612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a90614e5a565b60405180910390fd5b6000612b9d61112a565b9050600e54831115612be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdb90614e3a565b60405180910390fd5b600c548382612bf391906152df565b1115612c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2b906151da565b60405180910390fd5b6001915050919050565b6000612c4861112a565b905060005b83811015612c7d57612c6a838284612c6591906152df565b61379b565b8080612c7590615517565b915050612c4d565b50505050565b6000612c8e82612a15565b612ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc490614f9a565b60405180910390fd5b6000612cd883611a51565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d4757508373ffffffffffffffffffffffffffffffffffffffff16612d2f84610d77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d585750612d578185612760565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d8182611a51565b73ffffffffffffffffffffffffffffffffffffffff1614612dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dce90614eba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3e90614f3a565b60405180910390fd5b612e528383836137b9565b612e5d600082612a89565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ead91906153c0565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0491906152df565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fc38383836137c9565b505050565b6000612fd382611a51565b9050612fe1816000846137b9565b612fec600083612a89565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461303c91906153c0565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130e1816000846137c9565b5050565b6000806130f0612a81565b6040516020016131009190614cd3565b604051602081830303815290604052805190602001209050613164858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505084836137ce565b61316d57600080fd5b60019150509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a390614f5a565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161339d9190614da2565b60405180910390a3505050565b6133b5848484612d61565b6133c1848484846137e5565b613400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f790614e9a565b60405180910390fd5b50505050565b606060128054613415906154b4565b80601f0160208091040260200160405190810160405280929190818152602001828054613441906154b4565b801561348e5780601f106134635761010080835404028352916020019161348e565b820191906000526020600020905b81548152906001019060200180831161347157829003601f168201915b5050505050905090565b606060008214156134e0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135f4565b600082905060005b600082146135125780806134fb90615517565b915050600a8261350b9190615335565b91506134e8565b60008167ffffffffffffffff81111561352e5761352d6156a0565b5b6040519080825280601f01601f1916602001820160405280156135605781602001600182028036833780820191505090505b5090505b600085146135ed5760018261357991906153c0565b9150600a856135889190615584565b603061359491906152df565b60f81b8183815181106135aa576135a9615671565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135e69190615335565b9450613564565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806136c457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061372c57507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061379457507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6137b582826040518060200160405280600081525061397c565b5050565b6137c48383836139d7565b505050565b505050565b6000826137db8584613aeb565b1490509392505050565b60006138068473ffffffffffffffffffffffffffffffffffffffff16613b60565b1561396f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261382f612a81565b8786866040518563ffffffff1660e01b81526004016138519493929190614d2d565b602060405180830381600087803b15801561386b57600080fd5b505af192505050801561389c57506040513d601f19601f820116820180604052508101906138999190614613565b60015b61391f573d80600081146138cc576040519150601f19603f3d011682016040523d82523d6000602084013e6138d1565b606091505b50600081511415613917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390e90614e9a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613974565b600190505b949350505050565b6139868383613b83565b61399360008484846137e5565b6139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c990614e9a565b60405180910390fd5b505050565b6139e2838383613d5d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613a2557613a2081613d62565b613a64565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613a6357613a628382613dab565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613aa757613aa281613f18565b613ae6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613ae557613ae48282613fe9565b5b5b505050565b60008082905060005b8451811015613b55576000858281518110613b1257613b11615671565b5b60200260200101519050808311613b3457613b2d8382614068565b9250613b41565b613b3e8184614068565b92505b508080613b4d90615517565b915050613af4565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bea9061503a565b60405180910390fd5b613bfc81612a15565b15613c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3390614efa565b60405180910390fd5b613c48600083836137b9565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c9891906152df565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d59600083836137c9565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613db884611bfe565b613dc291906153c0565b9050600060086000848152602001908152602001600020549050818114613ea7576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050613f2c91906153c0565b90506000600a6000848152602001908152602001600020549050600060098381548110613f5c57613f5b615671565b5b906000526020600020015490508060098381548110613f7e57613f7d615671565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613fcd57613fcc615642565b5b6001900381819060005260206000200160009055905550505050565b6000613ff483611bfe565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b82805461408b906154b4565b90600052602060002090601f0160209004810192826140ad57600085556140f4565b82601f106140c657805160ff19168380011785556140f4565b828001600101855582156140f4579182015b828111156140f35782518255916020019190600101906140d8565b5b5090506141019190614105565b5090565b5b8082111561411e576000816000905550600101614106565b5090565b60006141356141308461523a565b615215565b905082815260208101848484011115614151576141506156de565b5b61415c848285615472565b509392505050565b60006141776141728461526b565b615215565b905082815260208101848484011115614193576141926156de565b5b61419e848285615472565b509392505050565b6000813590506141b581615dc7565b92915050565b60008083601f8401126141d1576141d06156d4565b5b8235905067ffffffffffffffff8111156141ee576141ed6156cf565b5b60208301915083602082028301111561420a576142096156d9565b5b9250929050565b60008135905061422081615dde565b92915050565b60008151905061423581615dde565b92915050565b60008135905061424a81615df5565b92915050565b60008135905061425f81615e0c565b92915050565b60008151905061427481615e0c565b92915050565b60008083601f8401126142905761428f6156d4565b5b8235905067ffffffffffffffff8111156142ad576142ac6156cf565b5b6020830191508360018202830111156142c9576142c86156d9565b5b9250929050565b600082601f8301126142e5576142e46156d4565b5b81356142f5848260208601614122565b91505092915050565b600082601f830112614313576143126156d4565b5b8135614323848260208601614164565b91505092915050565b60008135905061433b81615e23565b92915050565b600060208284031215614357576143566156e8565b5b6000614365848285016141a6565b91505092915050565b60008060408385031215614385576143846156e8565b5b6000614393858286016141a6565b92505060206143a4858286016141a6565b9150509250929050565b6000806000606084860312156143c7576143c66156e8565b5b60006143d5868287016141a6565b93505060206143e6868287016141a6565b92505060406143f78682870161432c565b9150509250925092565b6000806000806080858703121561441b5761441a6156e8565b5b6000614429878288016141a6565b945050602061443a878288016141a6565b935050604061444b8782880161432c565b925050606085013567ffffffffffffffff81111561446c5761446b6156e3565b5b614478878288016142d0565b91505092959194509250565b6000806040838503121561449b5761449a6156e8565b5b60006144a9858286016141a6565b92505060206144ba85828601614211565b9150509250929050565b600080604083850312156144db576144da6156e8565b5b60006144e9858286016141a6565b92505060206144fa8582860161432c565b9150509250929050565b6000806000806000608086880312156145205761451f6156e8565b5b600061452e888289016141a6565b955050602061453f8882890161432c565b94505060406145508882890161423b565b935050606086013567ffffffffffffffff811115614571576145706156e3565b5b61457d8882890161427a565b92509250509295509295909350565b6000602082840312156145a2576145a16156e8565b5b60006145b084828501614226565b91505092915050565b6000602082840312156145cf576145ce6156e8565b5b60006145dd8482850161423b565b91505092915050565b6000602082840312156145fc576145fb6156e8565b5b600061460a84828501614250565b91505092915050565b600060208284031215614629576146286156e8565b5b600061463784828501614265565b91505092915050565b600060208284031215614656576146556156e8565b5b600082013567ffffffffffffffff811115614674576146736156e3565b5b614680848285016142fe565b91505092915050565b60006020828403121561469f5761469e6156e8565b5b60006146ad8482850161432c565b91505092915050565b600080604083850312156146cd576146cc6156e8565b5b60006146db8582860161432c565b92505060206146ec858286016141a6565b9150509250929050565b60008060006040848603121561470f5761470e6156e8565b5b600061471d8682870161432c565b935050602084013567ffffffffffffffff81111561473e5761473d6156e3565b5b61474a868287016141bb565b92509250509250925092565b6000806040838503121561476d5761476c6156e8565b5b600061477b8582860161432c565b925050602061478c8582860161432c565b9150509250929050565b61479f816153f4565b82525050565b6147b66147b1826153f4565b615560565b82525050565b6147c581615406565b82525050565b6147d481615412565b82525050565b60006147e683856152b2565b93506147f3838584615472565b6147fc836156ed565b840190509392505050565b60006148128261529c565b61481c81856152b2565b935061482c818560208601615481565b614835816156ed565b840191505092915050565b600061484b826152a7565b61485581856152c3565b9350614865818560208601615481565b61486e816156ed565b840191505092915050565b6000614884826152a7565b61488e81856152d4565b935061489e818560208601615481565b80840191505092915050565b60006148b7600a836152c3565b91506148c28261570b565b602082019050919050565b60006148da6007836152c3565b91506148e582615734565b602082019050919050565b60006148fd602b836152c3565b91506149088261575d565b604082019050919050565b60006149206032836152c3565b915061492b826157ac565b604082019050919050565b60006149436025836152c3565b915061494e826157fb565b604082019050919050565b60006149666004836152c3565b91506149718261584a565b602082019050919050565b6000614989601c836152c3565b915061499482615873565b602082019050919050565b60006149ac6007836152c3565b91506149b78261589c565b602082019050919050565b60006149cf6024836152c3565b91506149da826158c5565b604082019050919050565b60006149f26019836152c3565b91506149fd82615914565b602082019050919050565b6000614a156009836152c3565b9150614a208261593d565b602082019050919050565b6000614a38602c836152c3565b9150614a4382615966565b604082019050919050565b6000614a5b6038836152c3565b9150614a66826159b5565b604082019050919050565b6000614a7e602a836152c3565b9150614a8982615a04565b604082019050919050565b6000614aa16029836152c3565b9150614aac82615a53565b604082019050919050565b6000614ac46015836152c3565b9150614acf82615aa2565b602082019050919050565b6000614ae76020836152c3565b9150614af282615acb565b602082019050919050565b6000614b0a602c836152c3565b9150614b1582615af4565b604082019050919050565b6000614b2d6020836152c3565b9150614b3882615b43565b602082019050919050565b6000614b506005836152c3565b9150614b5b82615b6c565b602082019050919050565b6000614b73602f836152c3565b9150614b7e82615b95565b604082019050919050565b6000614b966007836152c3565b9150614ba182615be4565b602082019050919050565b6000614bb96003836152c3565b9150614bc482615c0d565b602082019050919050565b6000614bdc601a836152c3565b9150614be782615c36565b602082019050919050565b6000614bff6021836152c3565b9150614c0a82615c5f565b604082019050919050565b6000614c226007836152c3565b9150614c2d82615cae565b602082019050919050565b6000614c456031836152c3565b9150614c5082615cd7565b604082019050919050565b6000614c68602c836152c3565b9150614c7382615d26565b604082019050919050565b6000614c8b600c836152c3565b9150614c9682615d75565b602082019050919050565b6000614cae6009836152c3565b9150614cb982615d9e565b602082019050919050565b614ccd81615468565b82525050565b6000614cdf82846147a5565b60148201915081905092915050565b6000614cfa8285614879565b9150614d068284614879565b91508190509392505050565b6000602082019050614d276000830184614796565b92915050565b6000608082019050614d426000830187614796565b614d4f6020830186614796565b614d5c6040830185614cc4565b8181036060830152614d6e8184614807565b905095945050505050565b6000604082019050614d8e6000830185614796565b614d9b6020830184614cc4565b9392505050565b6000602082019050614db760008301846147bc565b92915050565b6000602082019050614dd260008301846147cb565b92915050565b6000606082019050614ded60008301876147cb565b614dfa60208301866147cb565b8181036040830152614e0d8184866147da565b905095945050505050565b60006020820190508181036000830152614e328184614840565b905092915050565b60006020820190508181036000830152614e53816148aa565b9050919050565b60006020820190508181036000830152614e73816148cd565b9050919050565b60006020820190508181036000830152614e93816148f0565b9050919050565b60006020820190508181036000830152614eb381614913565b9050919050565b60006020820190508181036000830152614ed381614936565b9050919050565b60006020820190508181036000830152614ef381614959565b9050919050565b60006020820190508181036000830152614f138161497c565b9050919050565b60006020820190508181036000830152614f338161499f565b9050919050565b60006020820190508181036000830152614f53816149c2565b9050919050565b60006020820190508181036000830152614f73816149e5565b9050919050565b60006020820190508181036000830152614f9381614a08565b9050919050565b60006020820190508181036000830152614fb381614a2b565b9050919050565b60006020820190508181036000830152614fd381614a4e565b9050919050565b60006020820190508181036000830152614ff381614a71565b9050919050565b6000602082019050818103600083015261501381614a94565b9050919050565b6000602082019050818103600083015261503381614ab7565b9050919050565b6000602082019050818103600083015261505381614ada565b9050919050565b6000602082019050818103600083015261507381614afd565b9050919050565b6000602082019050818103600083015261509381614b20565b9050919050565b600060208201905081810360008301526150b381614b43565b9050919050565b600060208201905081810360008301526150d381614b66565b9050919050565b600060208201905081810360008301526150f381614b89565b9050919050565b6000602082019050818103600083015261511381614bac565b9050919050565b6000602082019050818103600083015261513381614bcf565b9050919050565b6000602082019050818103600083015261515381614bf2565b9050919050565b6000602082019050818103600083015261517381614c15565b9050919050565b6000602082019050818103600083015261519381614c38565b9050919050565b600060208201905081810360008301526151b381614c5b565b9050919050565b600060208201905081810360008301526151d381614c7e565b9050919050565b600060208201905081810360008301526151f381614ca1565b9050919050565b600060208201905061520f6000830184614cc4565b92915050565b600061521f615230565b905061522b82826154e6565b919050565b6000604051905090565b600067ffffffffffffffff821115615255576152546156a0565b5b61525e826156ed565b9050602081019050919050565b600067ffffffffffffffff821115615286576152856156a0565b5b61528f826156ed565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006152ea82615468565b91506152f583615468565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561532a576153296155b5565b5b828201905092915050565b600061534082615468565b915061534b83615468565b92508261535b5761535a6155e4565b5b828204905092915050565b600061537182615468565b915061537c83615468565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153b5576153b46155b5565b5b828202905092915050565b60006153cb82615468565b91506153d683615468565b9250828210156153e9576153e86155b5565b5b828203905092915050565b60006153ff82615448565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561549f578082015181840152602081019050615484565b838111156154ae576000848401525b50505050565b600060028204905060018216806154cc57607f821691505b602082108114156154e0576154df615613565b5b50919050565b6154ef826156ed565b810181811067ffffffffffffffff8211171561550e5761550d6156a0565b5b80604052505050565b600061552282615468565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615555576155546155b5565b5b600182019050919050565b600061556b82615572565b9050919050565b600061557d826156fe565b9050919050565b600061558f82615468565b915061559a83615468565b9250826155aa576155a96155e4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f6d6178207075626c696300000000000000000000000000000000000000000000600082015250565b7f636c6f7365642100000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6164647265737300000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f77686974656c6973740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4572726f72207265676973746572696e67206b65790000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4574686572000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f636f6e6669726d00000000000000000000000000000000000000000000000000600082015250565b7f6d61780000000000000000000000000000000000000000000000000000000000600082015250565b7f4661696c656420746f20766572696679207369676e6174757265000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f742079657400000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f62656c6f7720737570706c790000000000000000000000000000000000000000600082015250565b7f6d617820746f74616c0000000000000000000000000000000000000000000000600082015250565b615dd0816153f4565b8114615ddb57600080fd5b50565b615de781615406565b8114615df257600080fd5b50565b615dfe81615412565b8114615e0957600080fd5b50565b615e158161541c565b8114615e2057600080fd5b50565b615e2c81615468565b8114615e3757600080fd5b5056fe6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e206578636565646564a2646970667358221220a06e7244d43209a07afb8fcfbff5c31cbec9c77fcf3a22143a8f726cd86f05b264736f6c63430008070033

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

000000000000000000000000678a3f64a1bf33ba0746ffd88ba749b40b565da5

-----Decoded View---------------
Arg [0] : _paperKeyManagerAddress (address): 0x678a3F64A1bF33Ba0746fFD88Ba749B40B565Da5

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000678a3f64a1bf33ba0746ffd88ba749b40b565da5


Deployed Bytecode Sourcemap

236:8223:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3661:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2708:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5264:401:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4220:217:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3758:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5689:423:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1536:111:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;637:29:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4947:330:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4252:91:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;474:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2918:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;6868:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;743:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1212:253:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3209:118:13;;;;;;;;;;;;;:::i;:::-;;5343:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7912:189:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2122:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7217:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;395:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1719:230:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8109:159:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3844:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1471:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2411:235:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;712:24:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2649:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;427:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2149:205:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2787:126:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1608:101:14;;;;;;;;;;;;;:::i;:::-;;6573:269:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1664:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2522:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7606:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;976:85:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3335:126:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2870:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4504:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6118:428:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1967:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1803:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5588:320:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2285:230:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3039:329:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;589:39:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4723:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;356:32:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8275:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;545:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4130:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3661:177;3764:4;3791:36;3815:11;3791:23;:36::i;:::-;3784:43;;3661:177;;;:::o;2708:98:1:-;2762:13;2794:5;2787:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2708:98;:::o;5264:401:13:-;5336:13;5365:12;;;;;;;;;;;5360:276;;5393:21;;;;;;;;;;;;;;;;;;;;;5360:276;5446:15;;5435:8;:26;5431:205;;;5477:49;;;;;;;;;;;;;;;;;;;;;5431:205;5574:9;;5563:8;5547:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;5543:93;;;5599:26;;;;;;;;;;;;;;;;;;;;;5543:93;5645:9;;;;;;;;;;;;;;5264:401;;;;:::o;4220:217:1:-;4296:7;4323:16;4331:7;4323;:16::i;:::-;4315:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4406:15;:24;4422:7;4406:24;;;;;;;;;;;;;;;;;;;;;4399:31;;4220:217;;;:::o;3758:401::-;3838:13;3854:23;3869:7;3854:14;:23::i;:::-;3838:39;;3901:5;3895:11;;:2;:11;;;;3887:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3992:5;3976:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4001:37;4018:5;4025:12;:10;:12::i;:::-;4001:16;:37::i;:::-;3976:62;3955:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;4131:21;4140:2;4144:7;4131:8;:21::i;:::-;3828:331;3758:401;;:::o;5689:423:13:-;5835:9;5845:8;5824:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5814:41;;;;;;5857:6;5865:10;;1326:12;1341:15;;;;;;;;;;;:22;;;1364:5;1371:6;1379:10;;1341:49;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1326:64;;1408:7;1400:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5916:1:::1;5903:10;;:14;5895:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;5973:9;5960:8;5947:9;;:22;;;;:::i;:::-;:35;;5939:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;6010:22;6023:8;6010:12;:22::i;:::-;6002:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;6073:27;6081:8;6090:9;6073:7;:27::i;:::-;1316:148:::0;5689:423;;;;;;;;;:::o;1536:111:2:-;1597:7;1623:10;:17;;;;1616:24;;1536:111;:::o;637:29:13:-;;;;:::o;4947:330:1:-;5136:41;5155:12;:10;:12::i;:::-;5169:7;5136:18;:41::i;:::-;5128:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5242:28;5252:4;5258:2;5262:7;5242:9;:28::i;:::-;4947:330;;;:::o;4252:91:13:-;4297:4;4324:12;;;;;;;;;;;4317:19;;4252:91;:::o;474:28::-;;;;:::o;2918:284::-;3041:16;3067:21;3112:17;3120:8;3112:7;:17::i;:::-;3104:26;;;;;;3148:7;:5;:7::i;:::-;3188:4;3175:10;3165:7;;:20;;;;:::i;:::-;:27;;;;:::i;:::-;3140:54;;;;2918:284;;;;;:::o;6868:323::-;6961:1;6948:10;;:14;:47;;;;;6985:10;;6966:15;:29;;6948:47;6940:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7050:9;7038:7;7025:9;;:21;;;;:::i;:::-;:34;;7017:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;7087:21;7100:7;7087:12;:21::i;:::-;7079:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;7149:30;7157:7;7166:12;:10;:12::i;:::-;7149:7;:30::i;:::-;6868:323;:::o;743:94::-;;;;:::o;1212:253:2:-;1309:7;1344:23;1361:5;1344:16;:23::i;:::-;1336:5;:31;1328:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1432:12;:19;1445:5;1432:19;;;;;;;;;;;;;;;:26;1452:5;1432:26;;;;;;;;;;;;1425:33;;1212:253;;;;:::o;3209:118:13:-;3260:7;:21;3268:12;:10;:12::i;:::-;3260:21;;;;;;;;;;;;;;;;;;;;;;;;;3252:30;;;;;;3308:12;;;;;;;;;;;3307:13;3292:12;;:28;;;;;;;;;;;;;;;;;;3209:118::o;5343:179:1:-;5476:39;5493:4;5499:2;5503:7;5476:39;;;;;;;;;;;;:16;:39::i;:::-;5343:179;;;:::o;7912:189:13:-;1199:12:14;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8007:12:13::1;:10;:12::i;:::-;7980:39;;:23;7995:7;7980:14;:23::i;:::-;:39;;;7972:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;8080:14;8086:7;8080:5;:14::i;:::-;7912:189:::0;:::o;2122:157::-;2185:7;:21;2193:12;:10;:12::i;:::-;2185:21;;;;;;;;;;;;;;;;;;;;;;;;;2177:30;;;;;;2234:1;2225:6;:10;2217:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;2266:6;2253:10;:19;;;;2122:157;:::o;7217:379::-;7335:1;7322:10;;:14;7314:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;7365:33;7378:6;;7386:10;;7365:12;:33::i;:::-;7357:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;7456:9;7444:7;7428:12;;:24;;;;:::i;:::-;:37;;7420:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;7492:21;7505:7;7492:12;:21::i;:::-;7484:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:30;7562:7;7571:12;:10;:12::i;:::-;7554:7;:30::i;:::-;7217:379;;;:::o;395:25::-;;;;;;;;;;;;;:::o;1719:230:2:-;1794:7;1829:30;:28;:30::i;:::-;1821:5;:38;1813:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1925:10;1936:5;1925:17;;;;;;;;:::i;:::-;;;;;;;;;;1918:24;;1719:230;;;:::o;8109:159:13:-;1199:12:14;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8176:12:13::1;8191:21;8176:36;;8230:12;8222:30;;:39;8253:7;8222:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;8166:102;8109:159:::0;:::o;3844:151::-;3921:7;:21;3929:12;:10;:12::i;:::-;3921:21;;;;;;;;;;;;;;;;;;;;;;;;;3913:30;;;;;;3976:8;3957:16;:27;;;;;;;;;;;;:::i;:::-;;3844:151;:::o;1471:182::-;1544:7;:21;1552:12;:10;:12::i;:::-;1544:21;;;;;;;;;;;;;;;;;;;;;;;;;1536:30;;;;;;1585:15;;;;;;;;;;;:24;;;1610:9;1585:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1577:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1471:182;:::o;2411:235:1:-;2483:7;2502:13;2518:7;:16;2526:7;2518:16;;;;;;;;;;;;;;;;;;;;;2502:32;;2569:1;2552:19;;:5;:19;;;;2544:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2634:5;2627:12;;;2411:235;;;:::o;712:24:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2649:127::-;2715:7;:21;2723:12;:10;:12::i;:::-;2715:21;;;;;;;;;;;;;;;;;;;;;;;;;2707:30;;;;;;2763:6;2748:12;:21;;;;2649:127;:::o;427:31::-;;;;:::o;2149:205:1:-;2221:7;2265:1;2248:19;;:5;:19;;;;2240:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2331:9;:16;2341:5;2331:16;;;;;;;;;;;;;;;;2324:23;;2149:205;;;:::o;2787:126:13:-;2851:7;:21;2859:12;:10;:12::i;:::-;2851:21;;;;;;;;;;;;;;;;;;;;;;;;;2843:30;;;;;;2902:4;2884:15;:22;;;;2787:126;:::o;1608:101:14:-;1199:12;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1672:30:::1;1699:1;1672:18;:30::i;:::-;1608:101::o:0;6573:269:13:-;6647:7;:21;6655:12;:10;:12::i;:::-;6647:21;;;;;;;;;;;;;;;;;;;;;;;;;6639:30;;;;;;6697:1;6688:7;:10;6680:19;;;;;;6709:10;6722:13;:11;:13::i;:::-;6709:26;;6769:9;;6758:7;6753:2;:12;;;;:::i;:::-;:25;;6745:34;;;;;;6799:24;6807:7;6815;6799;:24::i;:::-;6629:213;6573:269;;:::o;1664:133::-;1730:7;:21;1738:12;:10;:12::i;:::-;1730:21;;;;;;;;;;;;;;;;;;;;;;;;;1722:30;;;;;;1775:7;1762:10;:20;;;;1664:133;:::o;2522:121::-;2585:7;:21;2593:12;:10;:12::i;:::-;2585:21;;;;;;;;;;;;;;;;;;;;;;;;;2577:30;;;;;;2630:6;2618:9;:18;;;;2522:121;:::o;7606:300::-;7696:7;:21;7704:12;:10;:12::i;:::-;7696:21;;;;;;;;;;;;;;;;;;;;;;;;;7688:30;;;;;;7752:1;7736:14;:17;7728:26;;;;;;7764:10;7777:13;:11;:13::i;:::-;7764:26;;7831:9;;7813:14;7808:2;:19;;;;:::i;:::-;:32;;7800:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:32;7875:14;7891:7;7867;:32::i;:::-;7669:237;7606:300;;:::o;976:85:14:-;1022:7;1048:6;;;;;;;;;;;1041:13;;976:85;:::o;3335:126:13:-;3400:7;:21;3408:12;:10;:12::i;:::-;3400:21;;;;;;;;;;;;;;;;;;;;;;;;;3392:30;;;;;;3443:10;3433:7;:20;;;;3335:126;:::o;2870:102:1:-;2926:13;2958:7;2951:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2870:102;:::o;4504:153::-;4598:52;4617:12;:10;:12::i;:::-;4631:8;4641;4598:18;:52::i;:::-;4504:153;;:::o;6118:428:13:-;6266:9;6276:8;6255:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6245:41;;;;;;6288:6;6296:10;;1326:12;1341:15;;;;;;;;;;;:22;;;1364:5;1371:6;1379:10;;1341:49;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1326:64;;1408:7;1400:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;6347:1:::1;6334:10;;:14;6326:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;6407:9;6394:8;6378:12;;:25;;;;:::i;:::-;:38;;6370:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6444:22;6457:8;6444:12;:22::i;:::-;6436:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;6507:27;6515:8;6524:9;6507:7;:27::i;:::-;1316:148:::0;6118:428;;;;;;;;;:::o;1967:149::-;1199:12:14;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2062:1:13::1;2042:22;;:8;:22;;;;2034:31;;;::::0;::::1;;2095:5;2075:7;:17;2083:8;2075:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;1967:149:::0;:::o;1803:154::-;1199:12:14;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1905:1:13::1;1885:22;;:8;:22;;;;1877:31;;;::::0;::::1;;1938:4;1918:7;:17;1926:8;1918:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;1803:154:::0;:::o;5588:320:1:-;5757:41;5776:12;:10;:12::i;:::-;5790:7;5757:18;:41::i;:::-;5749:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5862:39;5876:4;5882:2;5886:7;5895:5;5862:13;:39::i;:::-;5588:320;;;;:::o;2285:230:13:-;2345:7;:21;2353:12;:10;:12::i;:::-;2345:21;;;;;;;;;;;;;;;;;;;;;;;;;2337:30;;;;;;2393:1;2386:4;:8;2378:24;;;;;;;;;;;;:::i;:::-;;;;;;;;;2412:10;2425:13;:11;:13::i;:::-;2412:26;;2464:2;2456:4;:10;;2448:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;2504:4;2492:9;:16;;;;2327:188;2285:230;:::o;3039:329:1:-;3112:13;3145:16;3153:7;3145;:16::i;:::-;3137:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3224:21;3248:10;:8;:10::i;:::-;3224:34;;3299:1;3281:7;3275:21;:25;:86;;;;;;;;;;;;;;;;;3327:7;3336:18;:7;:16;:18::i;:::-;3310:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3275:86;3268:93;;;3039:329;;;:::o;589:39:13:-;;;;:::o;4723:162:1:-;4820:4;4843:18;:25;4862:5;4843:25;;;;;;;;;;;;;;;:35;4869:8;4843:35;;;;;;;;;;;;;;;;;;;;;;;;;4836:42;;4723:162;;;;:::o;356:32:13:-;;;;;;;;;;;;;:::o;8275:177::-;1199:12:14;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8384:1:13::1;8364:22;;:8;:22;;;;8356:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;8416:28;8435:8;8416:18;:28::i;:::-;8275:177:::0;:::o;545:37::-;;;;:::o;4130:114::-;1199:12:14;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4223:10:13::1;4210;:23;;;;;;;;;;;;:::i;:::-;;4130:114:::0;:::o;911:222:2:-;1013:4;1051:35;1036:50;;;:11;:50;;;;:90;;;;1090:36;1114:11;1090:23;:36::i;:::-;1036:90;1029:97;;911:222;;;:::o;7380:125:1:-;7445:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7380:125;;;:::o;640:96:11:-;693:7;719:10;712:17;;640:96;:::o;11389:171:1:-;11490:2;11463:15;:24;11479:7;11463:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11545:7;11541:2;11507:46;;11516:23;11531:7;11516:14;:23::i;:::-;11507:46;;;;;;;;;;;;11389:171;;:::o;4358:320:13:-;4421:4;4445:12;;;;;;;;;;;4437:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;4480:10;4493:13;:11;:13::i;:::-;4480:26;;4540:15;;4524:12;:31;;4516:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;4608:9;;4592:12;4587:2;:17;;;;:::i;:::-;:30;;4579:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4667:4;4660:11;;;4358:320;;;:::o;4686:284::-;4772:9;4784:13;:11;:13::i;:::-;4772:25;;4817:9;4812:130;4836:14;4832:1;:18;4812:130;;;4879:25;4889:7;4902:1;4898;:5;;;;:::i;:::-;4879:9;:25::i;:::-;4852:3;;;;;:::i;:::-;;;;4812:130;;;;4748:222;4686:284;;:::o;7663:344:1:-;7756:4;7780:16;7788:7;7780;:16::i;:::-;7772:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7855:13;7871:23;7886:7;7871:14;:23::i;:::-;7855:39;;7923:5;7912:16;;:7;:16;;;:51;;;;7956:7;7932:31;;:20;7944:7;7932:11;:20::i;:::-;:31;;;7912:51;:87;;;;7967:32;7984:5;7991:7;7967:16;:32::i;:::-;7912:87;7904:96;;;7663:344;;;;:::o;10673:605::-;10827:4;10800:31;;:23;10815:7;10800:14;:23::i;:::-;:31;;;10792:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10905:1;10891:16;;:2;:16;;;;10883:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10959:39;10980:4;10986:2;10990:7;10959:20;:39::i;:::-;11060:29;11077:1;11081:7;11060:8;:29::i;:::-;11119:1;11100:9;:15;11110:4;11100:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11147:1;11130:9;:13;11140:2;11130:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11177:2;11158:7;:16;11166:7;11158:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11214:7;11210:2;11195:27;;11204:4;11195:27;;;;;;;;;;;;11233:38;11253:4;11259:2;11263:7;11233:19;:38::i;:::-;10673:605;;;:::o;9943:406::-;10002:13;10018:23;10033:7;10018:14;:23::i;:::-;10002:39;;10052:48;10073:5;10088:1;10092:7;10052:20;:48::i;:::-;10138:29;10155:1;10159:7;10138:8;:29::i;:::-;10198:1;10178:9;:16;10188:5;10178:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;10216:7;:16;10224:7;10216:16;;;;;;;;;;;;10209:23;;;;;;;;;;;10276:7;10272:1;10248:36;;10257:5;10248:36;;;;;;;;;;;;10295:47;10315:5;10330:1;10334:7;10295:19;:47::i;:::-;9992:357;9943:406;:::o;4976:269:13:-;5073:4;5089:12;5131;:10;:12::i;:::-;5114:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;5104:41;;;;;;5089:56;;5164:51;5183:12;;5164:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5197:11;5210:4;5164:18;:51::i;:::-;5156:60;;;;;;5234:4;5227:11;;;4976:269;;;;;:::o;2210:187:14:-;2283:16;2302:6;;;;;;;;;;;2283:25;;2327:8;2318:6;;:17;;;;;;;;;;;;;;;;;;2381:8;2350:40;;2371:8;2350:40;;;;;;;;;;;;2273:124;2210:187;:::o;11695:307:1:-;11845:8;11836:17;;:5;:17;;;;11828:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11931:8;11893:18;:25;11912:5;11893:25;;;;;;;;;;;;;;;:35;11919:8;11893:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11976:8;11954:41;;11969:5;11954:41;;;11986:8;11954:41;;;;;;:::i;:::-;;;;;;;;11695:307;;;:::o;6770:::-;6921:28;6931:4;6937:2;6941:7;6921:9;:28::i;:::-;6967:48;6990:4;6996:2;7000:7;7009:5;6967:22;:48::i;:::-;6959:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6770:307;;;;:::o;4001:123:13:-;4061:13;4097:16;4090:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4001:123;:::o;328:703:15:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;1532:361:1:-;1634:4;1684:25;1669:40;;;:11;:40;;;;:104;;;;1740:33;1725:48;;;:11;:48;;;;1669:104;:161;;;;1804:26;1789:41;;;:11;:41;;;;1669:161;:217;;;;1861:25;1846:40;;;:11;:40;;;;1669:217;1650:236;;1532:361;;;:::o;8337:108::-;8412:26;8422:2;8426:7;8412:26;;;;;;;;;;;;:9;:26::i;:::-;8337:108;;:::o;3468:187:13:-;3599:45;3626:4;3632:2;3636:7;3599:26;:45::i;:::-;3468:187;;;:::o;14397:121:1:-;;;;:::o;1139:184:12:-;1260:4;1312;1283:25;1296:5;1303:4;1283:12;:25::i;:::-;:33;1276:40;;1139:184;;;;;:::o;12555:778:1:-;12705:4;12725:15;:2;:13;;;:15::i;:::-;12721:606;;;12776:2;12760:36;;;12797:12;:10;:12::i;:::-;12811:4;12817:7;12826:5;12760:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12756:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13016:1;12999:6;:13;:18;12995:266;;;13041:60;;;;;;;;;;:::i;:::-;;;;;;;;12995:266;13213:6;13207:13;13198:6;13194:2;13190:15;13183:38;12756:519;12892:41;;;12882:51;;;:6;:51;;;;12875:58;;;;;12721:606;13312:4;13305:11;;12555:778;;;;;;;:::o;8666:311::-;8791:18;8797:2;8801:7;8791:5;:18::i;:::-;8840:54;8871:1;8875:2;8879:7;8888:5;8840:22;:54::i;:::-;8819:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8666:311;;;:::o;2545:572:2:-;2684:45;2711:4;2717:2;2721:7;2684:26;:45::i;:::-;2760:1;2744:18;;:4;:18;;;2740:183;;;2778:40;2810:7;2778:31;:40::i;:::-;2740:183;;;2847:2;2839:10;;:4;:10;;;2835:88;;2865:47;2898:4;2904:7;2865:32;:47::i;:::-;2835:88;2740:183;2950:1;2936:16;;:2;:16;;;2932:179;;;2968:45;3005:7;2968:36;:45::i;:::-;2932:179;;;3040:4;3034:10;;:2;:10;;;3030:81;;3060:40;3088:2;3092:7;3060:27;:40::i;:::-;3030:81;2932:179;2545:572;;;:::o;1674:662:12:-;1757:7;1776:20;1799:4;1776:27;;1818:9;1813:488;1837:5;:12;1833:1;:16;1813:488;;;1870:20;1893:5;1899:1;1893:8;;;;;;;;:::i;:::-;;;;;;;;1870:31;;1935:12;1919;:28;1915:376;;2060:42;2075:12;2089;2060:14;:42::i;:::-;2045:57;;1915:376;;;2234:42;2249:12;2263;2234:14;:42::i;:::-;2219:57;;1915:376;1856:445;1851:3;;;;;:::i;:::-;;;;1813:488;;;;2317:12;2310:19;;;1674:662;;;;:::o;1160:320:10:-;1220:4;1472:1;1450:7;:19;;;:23;1443:30;;1160:320;;;:::o;9299:427:1:-;9392:1;9378:16;;:2;:16;;;;9370:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9450:16;9458:7;9450;:16::i;:::-;9449:17;9441:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:45;9539:1;9543:2;9547:7;9510:20;:45::i;:::-;9583:1;9566:9;:13;9576:2;9566:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9613:2;9594:7;:16;9602:7;9594:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9656:7;9652:2;9631:33;;9648:1;9631:33;;;;;;;;;;;;9675:44;9703:1;9707:2;9711:7;9675:19;:44::i;:::-;9299:427;;:::o;13895:122::-;;;;:::o;3823:161:2:-;3926:10;:17;;;;3899:15;:24;3915:7;3899:24;;;;;;;;;;;:44;;;;3953:10;3969:7;3953:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3823:161;:::o;4601:970::-;4863:22;4913:1;4888:22;4905:4;4888:16;:22::i;:::-;:26;;;;:::i;:::-;4863:51;;4924:18;4945:17;:26;4963:7;4945:26;;;;;;;;;;;;4924:47;;5089:14;5075:10;:28;5071:323;;5119:19;5141:12;:18;5154:4;5141:18;;;;;;;;;;;;;;;:34;5160:14;5141:34;;;;;;;;;;;;5119:56;;5223:11;5190:12;:18;5203:4;5190:18;;;;;;;;;;;;;;;:30;5209:10;5190:30;;;;;;;;;;;:44;;;;5339:10;5306:17;:30;5324:11;5306:30;;;;;;;;;;;:43;;;;5105:289;5071:323;5487:17;:26;5505:7;5487:26;;;;;;;;;;;5480:33;;;5530:12;:18;5543:4;5530:18;;;;;;;;;;;;;;;:34;5549:14;5530:34;;;;;;;;;;;5523:41;;;4682:889;;4601:970;;:::o;5859:1061::-;6108:22;6153:1;6133:10;:17;;;;:21;;;;:::i;:::-;6108:46;;6164:18;6185:15;:24;6201:7;6185:24;;;;;;;;;;;;6164:45;;6531:19;6553:10;6564:14;6553:26;;;;;;;;:::i;:::-;;;;;;;;;;6531:48;;6615:11;6590:10;6601;6590:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6725:10;6694:15;:28;6710:11;6694:28;;;;;;;;;;;:41;;;;6863:15;:24;6879:7;6863:24;;;;;;;;;;;6856:31;;;6897:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5930:990;;;5859:1061;:::o;3411:217::-;3495:14;3512:20;3529:2;3512:16;:20::i;:::-;3495:37;;3569:7;3542:12;:16;3555:2;3542:16;;;;;;;;;;;;;;;:24;3559:6;3542:24;;;;;;;;;;;:34;;;;3615:6;3586:17;:26;3604:7;3586:26;;;;;;;;;;;:35;;;;3485:143;3411:217;;:::o;2342:218:12:-;2410:13;2471:1;2465:4;2458:15;2499:1;2493:4;2486:15;2539:4;2533;2523:21;2514:30;;2342:218;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:16:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1770:5;1801:6;1795:13;1786:22;;1817:30;1841:5;1817:30;:::i;:::-;1716:137;;;;:::o;1859:139::-;1905:5;1943:6;1930:20;1921:29;;1959:33;1986:5;1959:33;:::i;:::-;1859:139;;;;:::o;2004:137::-;2049:5;2087:6;2074:20;2065:29;;2103:32;2129:5;2103:32;:::i;:::-;2004:137;;;;:::o;2147:141::-;2203:5;2234:6;2228:13;2219:22;;2250:32;2276:5;2250:32;:::i;:::-;2147:141;;;;:::o;2307:552::-;2364:8;2374:6;2424:3;2417:4;2409:6;2405:17;2401:27;2391:122;;2432:79;;:::i;:::-;2391:122;2545:6;2532:20;2522:30;;2575:18;2567:6;2564:30;2561:117;;;2597:79;;:::i;:::-;2561:117;2711:4;2703:6;2699:17;2687:29;;2765:3;2757:4;2749:6;2745:17;2735:8;2731:32;2728:41;2725:128;;;2772:79;;:::i;:::-;2725:128;2307:552;;;;;:::o;2878:338::-;2933:5;2982:3;2975:4;2967:6;2963:17;2959:27;2949:122;;2990:79;;:::i;:::-;2949:122;3107:6;3094:20;3132:78;3206:3;3198:6;3191:4;3183:6;3179:17;3132:78;:::i;:::-;3123:87;;2939:277;2878:338;;;;:::o;3236:340::-;3292:5;3341:3;3334:4;3326:6;3322:17;3318:27;3308:122;;3349:79;;:::i;:::-;3308:122;3466:6;3453:20;3491:79;3566:3;3558:6;3551:4;3543:6;3539:17;3491:79;:::i;:::-;3482:88;;3298:278;3236:340;;;;:::o;3582:139::-;3628:5;3666:6;3653:20;3644:29;;3682:33;3709:5;3682:33;:::i;:::-;3582:139;;;;:::o;3727:329::-;3786:6;3835:2;3823:9;3814:7;3810:23;3806:32;3803:119;;;3841:79;;:::i;:::-;3803:119;3961:1;3986:53;4031:7;4022:6;4011:9;4007:22;3986:53;:::i;:::-;3976:63;;3932:117;3727:329;;;;:::o;4062:474::-;4130:6;4138;4187:2;4175:9;4166:7;4162:23;4158:32;4155:119;;;4193:79;;:::i;:::-;4155:119;4313:1;4338:53;4383:7;4374:6;4363:9;4359:22;4338:53;:::i;:::-;4328:63;;4284:117;4440:2;4466:53;4511:7;4502:6;4491:9;4487:22;4466:53;:::i;:::-;4456:63;;4411:118;4062:474;;;;;:::o;4542:619::-;4619:6;4627;4635;4684:2;4672:9;4663:7;4659:23;4655:32;4652:119;;;4690:79;;:::i;:::-;4652:119;4810:1;4835:53;4880:7;4871:6;4860:9;4856:22;4835:53;:::i;:::-;4825:63;;4781:117;4937:2;4963:53;5008:7;4999:6;4988:9;4984:22;4963:53;:::i;:::-;4953:63;;4908:118;5065:2;5091:53;5136:7;5127:6;5116:9;5112:22;5091:53;:::i;:::-;5081:63;;5036:118;4542:619;;;;;:::o;5167:943::-;5262:6;5270;5278;5286;5335:3;5323:9;5314:7;5310:23;5306:33;5303:120;;;5342:79;;:::i;:::-;5303:120;5462:1;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5433:117;5589:2;5615:53;5660:7;5651:6;5640:9;5636:22;5615:53;:::i;:::-;5605:63;;5560:118;5717:2;5743:53;5788:7;5779:6;5768:9;5764:22;5743:53;:::i;:::-;5733:63;;5688:118;5873:2;5862:9;5858:18;5845:32;5904:18;5896:6;5893:30;5890:117;;;5926:79;;:::i;:::-;5890:117;6031:62;6085:7;6076:6;6065:9;6061:22;6031:62;:::i;:::-;6021:72;;5816:287;5167:943;;;;;;;:::o;6116:468::-;6181:6;6189;6238:2;6226:9;6217:7;6213:23;6209:32;6206:119;;;6244:79;;:::i;:::-;6206:119;6364:1;6389:53;6434:7;6425:6;6414:9;6410:22;6389:53;:::i;:::-;6379:63;;6335:117;6491:2;6517:50;6559:7;6550:6;6539:9;6535:22;6517:50;:::i;:::-;6507:60;;6462:115;6116:468;;;;;:::o;6590:474::-;6658:6;6666;6715:2;6703:9;6694:7;6690:23;6686:32;6683:119;;;6721:79;;:::i;:::-;6683:119;6841:1;6866:53;6911:7;6902:6;6891:9;6887:22;6866:53;:::i;:::-;6856:63;;6812:117;6968:2;6994:53;7039:7;7030:6;7019:9;7015:22;6994:53;:::i;:::-;6984:63;;6939:118;6590:474;;;;;:::o;7070:963::-;7167:6;7175;7183;7191;7199;7248:3;7236:9;7227:7;7223:23;7219:33;7216:120;;;7255:79;;:::i;:::-;7216:120;7375:1;7400:53;7445:7;7436:6;7425:9;7421:22;7400:53;:::i;:::-;7390:63;;7346:117;7502:2;7528:53;7573:7;7564:6;7553:9;7549:22;7528:53;:::i;:::-;7518:63;;7473:118;7630:2;7656:53;7701:7;7692:6;7681:9;7677:22;7656:53;:::i;:::-;7646:63;;7601:118;7786:2;7775:9;7771:18;7758:32;7817:18;7809:6;7806:30;7803:117;;;7839:79;;:::i;:::-;7803:117;7952:64;8008:7;7999:6;7988:9;7984:22;7952:64;:::i;:::-;7934:82;;;;7729:297;7070:963;;;;;;;;:::o;8039:345::-;8106:6;8155:2;8143:9;8134:7;8130:23;8126:32;8123:119;;;8161:79;;:::i;:::-;8123:119;8281:1;8306:61;8359:7;8350:6;8339:9;8335:22;8306:61;:::i;:::-;8296:71;;8252:125;8039:345;;;;:::o;8390:329::-;8449:6;8498:2;8486:9;8477:7;8473:23;8469:32;8466:119;;;8504:79;;:::i;:::-;8466:119;8624:1;8649:53;8694:7;8685:6;8674:9;8670:22;8649:53;:::i;:::-;8639:63;;8595:117;8390:329;;;;:::o;8725:327::-;8783:6;8832:2;8820:9;8811:7;8807:23;8803:32;8800:119;;;8838:79;;:::i;:::-;8800:119;8958:1;8983:52;9027:7;9018:6;9007:9;9003:22;8983:52;:::i;:::-;8973:62;;8929:116;8725:327;;;;:::o;9058:349::-;9127:6;9176:2;9164:9;9155:7;9151:23;9147:32;9144:119;;;9182:79;;:::i;:::-;9144:119;9302:1;9327:63;9382:7;9373:6;9362:9;9358:22;9327:63;:::i;:::-;9317:73;;9273:127;9058:349;;;;:::o;9413:509::-;9482:6;9531:2;9519:9;9510:7;9506:23;9502:32;9499:119;;;9537:79;;:::i;:::-;9499:119;9685:1;9674:9;9670:17;9657:31;9715:18;9707:6;9704:30;9701:117;;;9737:79;;:::i;:::-;9701:117;9842:63;9897:7;9888:6;9877:9;9873:22;9842:63;:::i;:::-;9832:73;;9628:287;9413:509;;;;:::o;9928:329::-;9987:6;10036:2;10024:9;10015:7;10011:23;10007:32;10004:119;;;10042:79;;:::i;:::-;10004:119;10162:1;10187:53;10232:7;10223:6;10212:9;10208:22;10187:53;:::i;:::-;10177:63;;10133:117;9928:329;;;;:::o;10263:474::-;10331:6;10339;10388:2;10376:9;10367:7;10363:23;10359:32;10356:119;;;10394:79;;:::i;:::-;10356:119;10514:1;10539:53;10584:7;10575:6;10564:9;10560:22;10539:53;:::i;:::-;10529:63;;10485:117;10641:2;10667:53;10712:7;10703:6;10692:9;10688:22;10667:53;:::i;:::-;10657:63;;10612:118;10263:474;;;;;:::o;10743:704::-;10838:6;10846;10854;10903:2;10891:9;10882:7;10878:23;10874:32;10871:119;;;10909:79;;:::i;:::-;10871:119;11029:1;11054:53;11099:7;11090:6;11079:9;11075:22;11054:53;:::i;:::-;11044:63;;11000:117;11184:2;11173:9;11169:18;11156:32;11215:18;11207:6;11204:30;11201:117;;;11237:79;;:::i;:::-;11201:117;11350:80;11422:7;11413:6;11402:9;11398:22;11350:80;:::i;:::-;11332:98;;;;11127:313;10743:704;;;;;:::o;11453:474::-;11521:6;11529;11578:2;11566:9;11557:7;11553:23;11549:32;11546:119;;;11584:79;;:::i;:::-;11546:119;11704:1;11729:53;11774:7;11765:6;11754:9;11750:22;11729:53;:::i;:::-;11719:63;;11675:117;11831:2;11857:53;11902:7;11893:6;11882:9;11878:22;11857:53;:::i;:::-;11847:63;;11802:118;11453:474;;;;;:::o;11933:118::-;12020:24;12038:5;12020:24;:::i;:::-;12015:3;12008:37;11933:118;;:::o;12057:157::-;12162:45;12182:24;12200:5;12182:24;:::i;:::-;12162:45;:::i;:::-;12157:3;12150:58;12057:157;;:::o;12220:109::-;12301:21;12316:5;12301:21;:::i;:::-;12296:3;12289:34;12220:109;;:::o;12335:118::-;12422:24;12440:5;12422:24;:::i;:::-;12417:3;12410:37;12335:118;;:::o;12481:301::-;12577:3;12598:70;12661:6;12656:3;12598:70;:::i;:::-;12591:77;;12678:43;12714:6;12709:3;12702:5;12678:43;:::i;:::-;12746:29;12768:6;12746:29;:::i;:::-;12741:3;12737:39;12730:46;;12481:301;;;;;:::o;12788:360::-;12874:3;12902:38;12934:5;12902:38;:::i;:::-;12956:70;13019:6;13014:3;12956:70;:::i;:::-;12949:77;;13035:52;13080:6;13075:3;13068:4;13061:5;13057:16;13035:52;:::i;:::-;13112:29;13134:6;13112:29;:::i;:::-;13107:3;13103:39;13096:46;;12878:270;12788:360;;;;:::o;13154:364::-;13242:3;13270:39;13303:5;13270:39;:::i;:::-;13325:71;13389:6;13384:3;13325:71;:::i;:::-;13318:78;;13405:52;13450:6;13445:3;13438:4;13431:5;13427:16;13405:52;:::i;:::-;13482:29;13504:6;13482:29;:::i;:::-;13477:3;13473:39;13466:46;;13246:272;13154:364;;;;:::o;13524:377::-;13630:3;13658:39;13691:5;13658:39;:::i;:::-;13713:89;13795:6;13790:3;13713:89;:::i;:::-;13706:96;;13811:52;13856:6;13851:3;13844:4;13837:5;13833:16;13811:52;:::i;:::-;13888:6;13883:3;13879:16;13872:23;;13634:267;13524:377;;;;:::o;13907:366::-;14049:3;14070:67;14134:2;14129:3;14070:67;:::i;:::-;14063:74;;14146:93;14235:3;14146:93;:::i;:::-;14264:2;14259:3;14255:12;14248:19;;13907:366;;;:::o;14279:365::-;14421:3;14442:66;14506:1;14501:3;14442:66;:::i;:::-;14435:73;;14517:93;14606:3;14517:93;:::i;:::-;14635:2;14630:3;14626:12;14619:19;;14279:365;;;:::o;14650:366::-;14792:3;14813:67;14877:2;14872:3;14813:67;:::i;:::-;14806:74;;14889:93;14978:3;14889:93;:::i;:::-;15007:2;15002:3;14998:12;14991:19;;14650:366;;;:::o;15022:::-;15164:3;15185:67;15249:2;15244:3;15185:67;:::i;:::-;15178:74;;15261:93;15350:3;15261:93;:::i;:::-;15379:2;15374:3;15370:12;15363:19;;15022:366;;;:::o;15394:::-;15536:3;15557:67;15621:2;15616:3;15557:67;:::i;:::-;15550:74;;15633:93;15722:3;15633:93;:::i;:::-;15751:2;15746:3;15742:12;15735:19;;15394:366;;;:::o;15766:365::-;15908:3;15929:66;15993:1;15988:3;15929:66;:::i;:::-;15922:73;;16004:93;16093:3;16004:93;:::i;:::-;16122:2;16117:3;16113:12;16106:19;;15766:365;;;:::o;16137:366::-;16279:3;16300:67;16364:2;16359:3;16300:67;:::i;:::-;16293:74;;16376:93;16465:3;16376:93;:::i;:::-;16494:2;16489:3;16485:12;16478:19;;16137:366;;;:::o;16509:365::-;16651:3;16672:66;16736:1;16731:3;16672:66;:::i;:::-;16665:73;;16747:93;16836:3;16747:93;:::i;:::-;16865:2;16860:3;16856:12;16849:19;;16509:365;;;:::o;16880:366::-;17022:3;17043:67;17107:2;17102:3;17043:67;:::i;:::-;17036:74;;17119:93;17208:3;17119:93;:::i;:::-;17237:2;17232:3;17228:12;17221:19;;16880:366;;;:::o;17252:::-;17394:3;17415:67;17479:2;17474:3;17415:67;:::i;:::-;17408:74;;17491:93;17580:3;17491:93;:::i;:::-;17609:2;17604:3;17600:12;17593:19;;17252:366;;;:::o;17624:365::-;17766:3;17787:66;17851:1;17846:3;17787:66;:::i;:::-;17780:73;;17862:93;17951:3;17862:93;:::i;:::-;17980:2;17975:3;17971:12;17964:19;;17624:365;;;:::o;17995:366::-;18137:3;18158:67;18222:2;18217:3;18158:67;:::i;:::-;18151:74;;18234:93;18323:3;18234:93;:::i;:::-;18352:2;18347:3;18343:12;18336:19;;17995:366;;;:::o;18367:::-;18509:3;18530:67;18594:2;18589:3;18530:67;:::i;:::-;18523:74;;18606:93;18695:3;18606:93;:::i;:::-;18724:2;18719:3;18715:12;18708:19;;18367:366;;;:::o;18739:::-;18881:3;18902:67;18966:2;18961:3;18902:67;:::i;:::-;18895:74;;18978:93;19067:3;18978:93;:::i;:::-;19096:2;19091:3;19087:12;19080:19;;18739:366;;;:::o;19111:::-;19253:3;19274:67;19338:2;19333:3;19274:67;:::i;:::-;19267:74;;19350:93;19439:3;19350:93;:::i;:::-;19468:2;19463:3;19459:12;19452:19;;19111:366;;;:::o;19483:::-;19625:3;19646:67;19710:2;19705:3;19646:67;:::i;:::-;19639:74;;19722:93;19811:3;19722:93;:::i;:::-;19840:2;19835:3;19831:12;19824:19;;19483:366;;;:::o;19855:::-;19997:3;20018:67;20082:2;20077:3;20018:67;:::i;:::-;20011:74;;20094:93;20183:3;20094:93;:::i;:::-;20212:2;20207:3;20203:12;20196:19;;19855:366;;;:::o;20227:::-;20369:3;20390:67;20454:2;20449:3;20390:67;:::i;:::-;20383:74;;20466:93;20555:3;20466:93;:::i;:::-;20584:2;20579:3;20575:12;20568:19;;20227:366;;;:::o;20599:::-;20741:3;20762:67;20826:2;20821:3;20762:67;:::i;:::-;20755:74;;20838:93;20927:3;20838:93;:::i;:::-;20956:2;20951:3;20947:12;20940:19;;20599:366;;;:::o;20971:365::-;21113:3;21134:66;21198:1;21193:3;21134:66;:::i;:::-;21127:73;;21209:93;21298:3;21209:93;:::i;:::-;21327:2;21322:3;21318:12;21311:19;;20971:365;;;:::o;21342:366::-;21484:3;21505:67;21569:2;21564:3;21505:67;:::i;:::-;21498:74;;21581:93;21670:3;21581:93;:::i;:::-;21699:2;21694:3;21690:12;21683:19;;21342:366;;;:::o;21714:365::-;21856:3;21877:66;21941:1;21936:3;21877:66;:::i;:::-;21870:73;;21952:93;22041:3;21952:93;:::i;:::-;22070:2;22065:3;22061:12;22054:19;;21714:365;;;:::o;22085:::-;22227:3;22248:66;22312:1;22307:3;22248:66;:::i;:::-;22241:73;;22323:93;22412:3;22323:93;:::i;:::-;22441:2;22436:3;22432:12;22425:19;;22085:365;;;:::o;22456:366::-;22598:3;22619:67;22683:2;22678:3;22619:67;:::i;:::-;22612:74;;22695:93;22784:3;22695:93;:::i;:::-;22813:2;22808:3;22804:12;22797:19;;22456:366;;;:::o;22828:::-;22970:3;22991:67;23055:2;23050:3;22991:67;:::i;:::-;22984:74;;23067:93;23156:3;23067:93;:::i;:::-;23185:2;23180:3;23176:12;23169:19;;22828:366;;;:::o;23200:365::-;23342:3;23363:66;23427:1;23422:3;23363:66;:::i;:::-;23356:73;;23438:93;23527:3;23438:93;:::i;:::-;23556:2;23551:3;23547:12;23540:19;;23200:365;;;:::o;23571:366::-;23713:3;23734:67;23798:2;23793:3;23734:67;:::i;:::-;23727:74;;23810:93;23899:3;23810:93;:::i;:::-;23928:2;23923:3;23919:12;23912:19;;23571:366;;;:::o;23943:::-;24085:3;24106:67;24170:2;24165:3;24106:67;:::i;:::-;24099:74;;24182:93;24271:3;24182:93;:::i;:::-;24300:2;24295:3;24291:12;24284:19;;23943:366;;;:::o;24315:::-;24457:3;24478:67;24542:2;24537:3;24478:67;:::i;:::-;24471:74;;24554:93;24643:3;24554:93;:::i;:::-;24672:2;24667:3;24663:12;24656:19;;24315:366;;;:::o;24687:365::-;24829:3;24850:66;24914:1;24909:3;24850:66;:::i;:::-;24843:73;;24925:93;25014:3;24925:93;:::i;:::-;25043:2;25038:3;25034:12;25027:19;;24687:365;;;:::o;25058:118::-;25145:24;25163:5;25145:24;:::i;:::-;25140:3;25133:37;25058:118;;:::o;25182:256::-;25294:3;25309:75;25380:3;25371:6;25309:75;:::i;:::-;25409:2;25404:3;25400:12;25393:19;;25429:3;25422:10;;25182:256;;;;:::o;25444:435::-;25624:3;25646:95;25737:3;25728:6;25646:95;:::i;:::-;25639:102;;25758:95;25849:3;25840:6;25758:95;:::i;:::-;25751:102;;25870:3;25863:10;;25444:435;;;;;:::o;25885:222::-;25978:4;26016:2;26005:9;26001:18;25993:26;;26029:71;26097:1;26086:9;26082:17;26073:6;26029:71;:::i;:::-;25885:222;;;;:::o;26113:640::-;26308:4;26346:3;26335:9;26331:19;26323:27;;26360:71;26428:1;26417:9;26413:17;26404:6;26360:71;:::i;:::-;26441:72;26509:2;26498:9;26494:18;26485:6;26441:72;:::i;:::-;26523;26591:2;26580:9;26576:18;26567:6;26523:72;:::i;:::-;26642:9;26636:4;26632:20;26627:2;26616:9;26612:18;26605:48;26670:76;26741:4;26732:6;26670:76;:::i;:::-;26662:84;;26113:640;;;;;;;:::o;26759:332::-;26880:4;26918:2;26907:9;26903:18;26895:26;;26931:71;26999:1;26988:9;26984:17;26975:6;26931:71;:::i;:::-;27012:72;27080:2;27069:9;27065:18;27056:6;27012:72;:::i;:::-;26759:332;;;;;:::o;27097:210::-;27184:4;27222:2;27211:9;27207:18;27199:26;;27235:65;27297:1;27286:9;27282:17;27273:6;27235:65;:::i;:::-;27097:210;;;;:::o;27313:222::-;27406:4;27444:2;27433:9;27429:18;27421:26;;27457:71;27525:1;27514:9;27510:17;27501:6;27457:71;:::i;:::-;27313:222;;;;:::o;27541:549::-;27718:4;27756:2;27745:9;27741:18;27733:26;;27769:71;27837:1;27826:9;27822:17;27813:6;27769:71;:::i;:::-;27850:72;27918:2;27907:9;27903:18;27894:6;27850:72;:::i;:::-;27969:9;27963:4;27959:20;27954:2;27943:9;27939:18;27932:48;27997:86;28078:4;28069:6;28061;27997:86;:::i;:::-;27989:94;;27541:549;;;;;;;:::o;28096:313::-;28209:4;28247:2;28236:9;28232:18;28224:26;;28296:9;28290:4;28286:20;28282:1;28271:9;28267:17;28260:47;28324:78;28397:4;28388:6;28324:78;:::i;:::-;28316:86;;28096:313;;;;:::o;28415:419::-;28581:4;28619:2;28608:9;28604:18;28596:26;;28668:9;28662:4;28658:20;28654:1;28643:9;28639:17;28632:47;28696:131;28822:4;28696:131;:::i;:::-;28688:139;;28415:419;;;:::o;28840:::-;29006:4;29044:2;29033:9;29029:18;29021:26;;29093:9;29087:4;29083:20;29079:1;29068:9;29064:17;29057:47;29121:131;29247:4;29121:131;:::i;:::-;29113:139;;28840:419;;;:::o;29265:::-;29431:4;29469:2;29458:9;29454:18;29446:26;;29518:9;29512:4;29508:20;29504:1;29493:9;29489:17;29482:47;29546:131;29672:4;29546:131;:::i;:::-;29538:139;;29265:419;;;:::o;29690:::-;29856:4;29894:2;29883:9;29879:18;29871:26;;29943:9;29937:4;29933:20;29929:1;29918:9;29914:17;29907:47;29971:131;30097:4;29971:131;:::i;:::-;29963:139;;29690:419;;;:::o;30115:::-;30281:4;30319:2;30308:9;30304:18;30296:26;;30368:9;30362:4;30358:20;30354:1;30343:9;30339:17;30332:47;30396:131;30522:4;30396:131;:::i;:::-;30388:139;;30115:419;;;:::o;30540:::-;30706:4;30744:2;30733:9;30729:18;30721:26;;30793:9;30787:4;30783:20;30779:1;30768:9;30764:17;30757:47;30821:131;30947:4;30821:131;:::i;:::-;30813:139;;30540:419;;;:::o;30965:::-;31131:4;31169:2;31158:9;31154:18;31146:26;;31218:9;31212:4;31208:20;31204:1;31193:9;31189:17;31182:47;31246:131;31372:4;31246:131;:::i;:::-;31238:139;;30965:419;;;:::o;31390:::-;31556:4;31594:2;31583:9;31579:18;31571:26;;31643:9;31637:4;31633:20;31629:1;31618:9;31614:17;31607:47;31671:131;31797:4;31671:131;:::i;:::-;31663:139;;31390:419;;;:::o;31815:::-;31981:4;32019:2;32008:9;32004:18;31996:26;;32068:9;32062:4;32058:20;32054:1;32043:9;32039:17;32032:47;32096:131;32222:4;32096:131;:::i;:::-;32088:139;;31815:419;;;:::o;32240:::-;32406:4;32444:2;32433:9;32429:18;32421:26;;32493:9;32487:4;32483:20;32479:1;32468:9;32464:17;32457:47;32521:131;32647:4;32521:131;:::i;:::-;32513:139;;32240:419;;;:::o;32665:::-;32831:4;32869:2;32858:9;32854:18;32846:26;;32918:9;32912:4;32908:20;32904:1;32893:9;32889:17;32882:47;32946:131;33072:4;32946:131;:::i;:::-;32938:139;;32665:419;;;:::o;33090:::-;33256:4;33294:2;33283:9;33279:18;33271:26;;33343:9;33337:4;33333:20;33329:1;33318:9;33314:17;33307:47;33371:131;33497:4;33371:131;:::i;:::-;33363:139;;33090:419;;;:::o;33515:::-;33681:4;33719:2;33708:9;33704:18;33696:26;;33768:9;33762:4;33758:20;33754:1;33743:9;33739:17;33732:47;33796:131;33922:4;33796:131;:::i;:::-;33788:139;;33515:419;;;:::o;33940:::-;34106:4;34144:2;34133:9;34129:18;34121:26;;34193:9;34187:4;34183:20;34179:1;34168:9;34164:17;34157:47;34221:131;34347:4;34221:131;:::i;:::-;34213:139;;33940:419;;;:::o;34365:::-;34531:4;34569:2;34558:9;34554:18;34546:26;;34618:9;34612:4;34608:20;34604:1;34593:9;34589:17;34582:47;34646:131;34772:4;34646:131;:::i;:::-;34638:139;;34365:419;;;:::o;34790:::-;34956:4;34994:2;34983:9;34979:18;34971:26;;35043:9;35037:4;35033:20;35029:1;35018:9;35014:17;35007:47;35071:131;35197:4;35071:131;:::i;:::-;35063:139;;34790:419;;;:::o;35215:::-;35381:4;35419:2;35408:9;35404:18;35396:26;;35468:9;35462:4;35458:20;35454:1;35443:9;35439:17;35432:47;35496:131;35622:4;35496:131;:::i;:::-;35488:139;;35215:419;;;:::o;35640:::-;35806:4;35844:2;35833:9;35829:18;35821:26;;35893:9;35887:4;35883:20;35879:1;35868:9;35864:17;35857:47;35921:131;36047:4;35921:131;:::i;:::-;35913:139;;35640:419;;;:::o;36065:::-;36231:4;36269:2;36258:9;36254:18;36246:26;;36318:9;36312:4;36308:20;36304:1;36293:9;36289:17;36282:47;36346:131;36472:4;36346:131;:::i;:::-;36338:139;;36065:419;;;:::o;36490:::-;36656:4;36694:2;36683:9;36679:18;36671:26;;36743:9;36737:4;36733:20;36729:1;36718:9;36714:17;36707:47;36771:131;36897:4;36771:131;:::i;:::-;36763:139;;36490:419;;;:::o;36915:::-;37081:4;37119:2;37108:9;37104:18;37096:26;;37168:9;37162:4;37158:20;37154:1;37143:9;37139:17;37132:47;37196:131;37322:4;37196:131;:::i;:::-;37188:139;;36915:419;;;:::o;37340:::-;37506:4;37544:2;37533:9;37529:18;37521:26;;37593:9;37587:4;37583:20;37579:1;37568:9;37564:17;37557:47;37621:131;37747:4;37621:131;:::i;:::-;37613:139;;37340:419;;;:::o;37765:::-;37931:4;37969:2;37958:9;37954:18;37946:26;;38018:9;38012:4;38008:20;38004:1;37993:9;37989:17;37982:47;38046:131;38172:4;38046:131;:::i;:::-;38038:139;;37765:419;;;:::o;38190:::-;38356:4;38394:2;38383:9;38379:18;38371:26;;38443:9;38437:4;38433:20;38429:1;38418:9;38414:17;38407:47;38471:131;38597:4;38471:131;:::i;:::-;38463:139;;38190:419;;;:::o;38615:::-;38781:4;38819:2;38808:9;38804:18;38796:26;;38868:9;38862:4;38858:20;38854:1;38843:9;38839:17;38832:47;38896:131;39022:4;38896:131;:::i;:::-;38888:139;;38615:419;;;:::o;39040:::-;39206:4;39244:2;39233:9;39229:18;39221:26;;39293:9;39287:4;39283:20;39279:1;39268:9;39264:17;39257:47;39321:131;39447:4;39321:131;:::i;:::-;39313:139;;39040:419;;;:::o;39465:::-;39631:4;39669:2;39658:9;39654:18;39646:26;;39718:9;39712:4;39708:20;39704:1;39693:9;39689:17;39682:47;39746:131;39872:4;39746:131;:::i;:::-;39738:139;;39465:419;;;:::o;39890:::-;40056:4;40094:2;40083:9;40079:18;40071:26;;40143:9;40137:4;40133:20;40129:1;40118:9;40114:17;40107:47;40171:131;40297:4;40171:131;:::i;:::-;40163:139;;39890:419;;;:::o;40315:::-;40481:4;40519:2;40508:9;40504:18;40496:26;;40568:9;40562:4;40558:20;40554:1;40543:9;40539:17;40532:47;40596:131;40722:4;40596:131;:::i;:::-;40588:139;;40315:419;;;:::o;40740:::-;40906:4;40944:2;40933:9;40929:18;40921:26;;40993:9;40987:4;40983:20;40979:1;40968:9;40964:17;40957:47;41021:131;41147:4;41021:131;:::i;:::-;41013:139;;40740:419;;;:::o;41165:222::-;41258:4;41296:2;41285:9;41281:18;41273:26;;41309:71;41377:1;41366:9;41362:17;41353:6;41309:71;:::i;:::-;41165:222;;;;:::o;41393:129::-;41427:6;41454:20;;:::i;:::-;41444:30;;41483:33;41511:4;41503:6;41483:33;:::i;:::-;41393:129;;;:::o;41528:75::-;41561:6;41594:2;41588:9;41578:19;;41528:75;:::o;41609:307::-;41670:4;41760:18;41752:6;41749:30;41746:56;;;41782:18;;:::i;:::-;41746:56;41820:29;41842:6;41820:29;:::i;:::-;41812:37;;41904:4;41898;41894:15;41886:23;;41609:307;;;:::o;41922:308::-;41984:4;42074:18;42066:6;42063:30;42060:56;;;42096:18;;:::i;:::-;42060:56;42134:29;42156:6;42134:29;:::i;:::-;42126:37;;42218:4;42212;42208:15;42200:23;;41922:308;;;:::o;42236:98::-;42287:6;42321:5;42315:12;42305:22;;42236:98;;;:::o;42340:99::-;42392:6;42426:5;42420:12;42410:22;;42340:99;;;:::o;42445:168::-;42528:11;42562:6;42557:3;42550:19;42602:4;42597:3;42593:14;42578:29;;42445:168;;;;:::o;42619:169::-;42703:11;42737:6;42732:3;42725:19;42777:4;42772:3;42768:14;42753:29;;42619:169;;;;:::o;42794:148::-;42896:11;42933:3;42918:18;;42794:148;;;;:::o;42948:305::-;42988:3;43007:20;43025:1;43007:20;:::i;:::-;43002:25;;43041:20;43059:1;43041:20;:::i;:::-;43036:25;;43195:1;43127:66;43123:74;43120:1;43117:81;43114:107;;;43201:18;;:::i;:::-;43114:107;43245:1;43242;43238:9;43231:16;;42948:305;;;;:::o;43259:185::-;43299:1;43316:20;43334:1;43316:20;:::i;:::-;43311:25;;43350:20;43368:1;43350:20;:::i;:::-;43345:25;;43389:1;43379:35;;43394:18;;:::i;:::-;43379:35;43436:1;43433;43429:9;43424:14;;43259:185;;;;:::o;43450:348::-;43490:7;43513:20;43531:1;43513:20;:::i;:::-;43508:25;;43547:20;43565:1;43547:20;:::i;:::-;43542:25;;43735:1;43667:66;43663:74;43660:1;43657:81;43652:1;43645:9;43638:17;43634:105;43631:131;;;43742:18;;:::i;:::-;43631:131;43790:1;43787;43783:9;43772:20;;43450:348;;;;:::o;43804:191::-;43844:4;43864:20;43882:1;43864:20;:::i;:::-;43859:25;;43898:20;43916:1;43898:20;:::i;:::-;43893:25;;43937:1;43934;43931:8;43928:34;;;43942:18;;:::i;:::-;43928:34;43987:1;43984;43980:9;43972:17;;43804:191;;;;:::o;44001:96::-;44038:7;44067:24;44085:5;44067:24;:::i;:::-;44056:35;;44001:96;;;:::o;44103:90::-;44137:7;44180:5;44173:13;44166:21;44155:32;;44103:90;;;:::o;44199:77::-;44236:7;44265:5;44254:16;;44199:77;;;:::o;44282:149::-;44318:7;44358:66;44351:5;44347:78;44336:89;;44282:149;;;:::o;44437:126::-;44474:7;44514:42;44507:5;44503:54;44492:65;;44437:126;;;:::o;44569:77::-;44606:7;44635:5;44624:16;;44569:77;;;:::o;44652:154::-;44736:6;44731:3;44726;44713:30;44798:1;44789:6;44784:3;44780:16;44773:27;44652:154;;;:::o;44812:307::-;44880:1;44890:113;44904:6;44901:1;44898:13;44890:113;;;44989:1;44984:3;44980:11;44974:18;44970:1;44965:3;44961:11;44954:39;44926:2;44923:1;44919:10;44914:15;;44890:113;;;45021:6;45018:1;45015:13;45012:101;;;45101:1;45092:6;45087:3;45083:16;45076:27;45012:101;44861:258;44812:307;;;:::o;45125:320::-;45169:6;45206:1;45200:4;45196:12;45186:22;;45253:1;45247:4;45243:12;45274:18;45264:81;;45330:4;45322:6;45318:17;45308:27;;45264:81;45392:2;45384:6;45381:14;45361:18;45358:38;45355:84;;;45411:18;;:::i;:::-;45355:84;45176:269;45125:320;;;:::o;45451:281::-;45534:27;45556:4;45534:27;:::i;:::-;45526:6;45522:40;45664:6;45652:10;45649:22;45628:18;45616:10;45613:34;45610:62;45607:88;;;45675:18;;:::i;:::-;45607:88;45715:10;45711:2;45704:22;45494:238;45451:281;;:::o;45738:233::-;45777:3;45800:24;45818:5;45800:24;:::i;:::-;45791:33;;45846:66;45839:5;45836:77;45833:103;;;45916:18;;:::i;:::-;45833:103;45963:1;45956:5;45952:13;45945:20;;45738:233;;;:::o;45977:100::-;46016:7;46045:26;46065:5;46045:26;:::i;:::-;46034:37;;45977:100;;;:::o;46083:94::-;46122:7;46151:20;46165:5;46151:20;:::i;:::-;46140:31;;46083:94;;;:::o;46183:176::-;46215:1;46232:20;46250:1;46232:20;:::i;:::-;46227:25;;46266:20;46284:1;46266:20;:::i;:::-;46261:25;;46305:1;46295:35;;46310:18;;:::i;:::-;46295:35;46351:1;46348;46344:9;46339:14;;46183:176;;;;:::o;46365:180::-;46413:77;46410:1;46403:88;46510:4;46507:1;46500:15;46534:4;46531:1;46524:15;46551:180;46599:77;46596:1;46589:88;46696:4;46693:1;46686:15;46720:4;46717:1;46710:15;46737:180;46785:77;46782:1;46775:88;46882:4;46879:1;46872:15;46906:4;46903:1;46896:15;46923:180;46971:77;46968:1;46961:88;47068:4;47065:1;47058:15;47092:4;47089:1;47082:15;47109:180;47157:77;47154:1;47147:88;47254:4;47251:1;47244:15;47278:4;47275:1;47268:15;47295:180;47343:77;47340:1;47333:88;47440:4;47437:1;47430:15;47464:4;47461:1;47454:15;47481:117;47590:1;47587;47580:12;47604:117;47713:1;47710;47703:12;47727:117;47836:1;47833;47826:12;47850:117;47959:1;47956;47949:12;47973:117;48082:1;48079;48072:12;48096:117;48205:1;48202;48195:12;48219:102;48260:6;48311:2;48307:7;48302:2;48295:5;48291:14;48287:28;48277:38;;48219:102;;;:::o;48327:94::-;48360:8;48408:5;48404:2;48400:14;48379:35;;48327:94;;;:::o;48427:160::-;48567:12;48563:1;48555:6;48551:14;48544:36;48427:160;:::o;48593:157::-;48733:9;48729:1;48721:6;48717:14;48710:33;48593:157;:::o;48756:230::-;48896:34;48892:1;48884:6;48880:14;48873:58;48965:13;48960:2;48952:6;48948:15;48941:38;48756:230;:::o;48992:237::-;49132:34;49128:1;49120:6;49116:14;49109:58;49201:20;49196:2;49188:6;49184:15;49177:45;48992:237;:::o;49235:224::-;49375:34;49371:1;49363:6;49359:14;49352:58;49444:7;49439:2;49431:6;49427:15;49420:32;49235:224;:::o;49465:154::-;49605:6;49601:1;49593:6;49589:14;49582:30;49465:154;:::o;49625:178::-;49765:30;49761:1;49753:6;49749:14;49742:54;49625:178;:::o;49809:157::-;49949:9;49945:1;49937:6;49933:14;49926:33;49809:157;:::o;49972:223::-;50112:34;50108:1;50100:6;50096:14;50089:58;50181:6;50176:2;50168:6;50164:15;50157:31;49972:223;:::o;50201:175::-;50341:27;50337:1;50329:6;50325:14;50318:51;50201:175;:::o;50382:159::-;50522:11;50518:1;50510:6;50506:14;50499:35;50382:159;:::o;50547:231::-;50687:34;50683:1;50675:6;50671:14;50664:58;50756:14;50751:2;50743:6;50739:15;50732:39;50547:231;:::o;50784:243::-;50924:34;50920:1;50912:6;50908:14;50901:58;50993:26;50988:2;50980:6;50976:15;50969:51;50784:243;:::o;51033:229::-;51173:34;51169:1;51161:6;51157:14;51150:58;51242:12;51237:2;51229:6;51225:15;51218:37;51033:229;:::o;51268:228::-;51408:34;51404:1;51396:6;51392:14;51385:58;51477:11;51472:2;51464:6;51460:15;51453:36;51268:228;:::o;51502:171::-;51642:23;51638:1;51630:6;51626:14;51619:47;51502:171;:::o;51679:182::-;51819:34;51815:1;51807:6;51803:14;51796:58;51679:182;:::o;51867:231::-;52007:34;52003:1;51995:6;51991:14;51984:58;52076:14;52071:2;52063:6;52059:15;52052:39;51867:231;:::o;52104:182::-;52244:34;52240:1;52232:6;52228:14;52221:58;52104:182;:::o;52292:155::-;52432:7;52428:1;52420:6;52416:14;52409:31;52292:155;:::o;52453:234::-;52593:34;52589:1;52581:6;52577:14;52570:58;52662:17;52657:2;52649:6;52645:15;52638:42;52453:234;:::o;52693:157::-;52833:9;52829:1;52821:6;52817:14;52810:33;52693:157;:::o;52856:153::-;52996:5;52992:1;52984:6;52980:14;52973:29;52856:153;:::o;53015:176::-;53155:28;53151:1;53143:6;53139:14;53132:52;53015:176;:::o;53197:220::-;53337:34;53333:1;53325:6;53321:14;53314:58;53406:3;53401:2;53393:6;53389:15;53382:28;53197:220;:::o;53423:157::-;53563:9;53559:1;53551:6;53547:14;53540:33;53423:157;:::o;53586:236::-;53726:34;53722:1;53714:6;53710:14;53703:58;53795:19;53790:2;53782:6;53778:15;53771:44;53586:236;:::o;53828:231::-;53968:34;53964:1;53956:6;53952:14;53945:58;54037:14;54032:2;54024:6;54020:15;54013:39;53828:231;:::o;54065:162::-;54205:14;54201:1;54193:6;54189:14;54182:38;54065:162;:::o;54233:159::-;54373:11;54369:1;54361:6;54357:14;54350:35;54233:159;:::o;54398:122::-;54471:24;54489:5;54471:24;:::i;:::-;54464:5;54461:35;54451:63;;54510:1;54507;54500:12;54451:63;54398:122;:::o;54526:116::-;54596:21;54611:5;54596:21;:::i;:::-;54589:5;54586:32;54576:60;;54632:1;54629;54622:12;54576:60;54526:116;:::o;54648:122::-;54721:24;54739:5;54721:24;:::i;:::-;54714:5;54711:35;54701:63;;54760:1;54757;54750:12;54701:63;54648:122;:::o;54776:120::-;54848:23;54865:5;54848:23;:::i;:::-;54841:5;54838:34;54828:62;;54886:1;54883;54876:12;54828:62;54776:120;:::o;54902:122::-;54975:24;54993:5;54975:24;:::i;:::-;54968:5;54965:35;54955:63;;55014:1;55011;55004:12;54955:63;54902:122;:::o

Swarm Source

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