ETH Price: $3,187.73 (+1.08%)

Contract

0x0B549125fbEA37E52Ee05FA388a3A0a7Df792Fa7
Transaction Hash
Method
Block
From
To
Value
Mint To Just ABA...2321963742024-07-14 18:02:0157 mins ago1720980121IN
0x0B549125...7Df792Fa7
0.00000396 ETH0.000000970.01
Mint2321240522024-07-14 13:00:215 hrs ago1720962021IN
0x0B549125...7Df792Fa7
0.00000401 ETH0.000001010.01
Mint2320525922024-07-14 8:02:1710 hrs ago1720944137IN
0x0B549125...7Df792Fa7
0.00000403 ETH0.000001030.01
Mint To Just ABA...2319812202024-07-14 3:04:2315 hrs ago1720926263IN
0x0B549125...7Df792Fa7
0.00000396 ETH0.000000830.01
Mint2319090482024-07-13 22:02:3620 hrs ago1720908156IN
0x0B549125...7Df792Fa7
0.00000366 ETH0.000000970.01
Mint2318305232024-07-13 16:35:0126 hrs ago1720888501IN
0x0B549125...7Df792Fa7
0.00000366 ETH0.000001050.01
Mint2317520232024-07-13 11:07:3631 hrs ago1720868856IN
0x0B549125...7Df792Fa7
0.00000362 ETH0.000000950.01
Mint2316726042024-07-13 5:36:1837 hrs ago1720848978IN
0x0B549125...7Df792Fa7
0.00000003 ETH0.000000910.01
Mint2315720792024-07-12 22:36:0544 hrs ago1720823765IN
0x0B549125...7Df792Fa7
0.00000003 ETH0.0000010.01
Mint2314714582024-07-12 15:35:562 days ago1720798556IN
0x0B549125...7Df792Fa7
0.00000003 ETH0.000001220.010022
Mint2313708062024-07-12 8:35:462 days ago1720773346IN
0x0B549125...7Df792Fa7
0.00000006 ETH0.000001080.01
Mint2312760552024-07-12 2:00:122 days ago1720749612IN
0x0B549125...7Df792Fa7
0.00000011 ETH0.000001060.01
Mint2311849902024-07-11 19:39:512 days ago1720726791IN
0x0B549125...7Df792Fa7
0.00000011 ETH0.000001220.01
Mint2310940322024-07-11 13:19:393 days ago1720703979IN
0x0B549125...7Df792Fa7
0.00000009 ETH0.000001720.011919
Mint2310021432024-07-11 6:55:353 days ago1720680935IN
0x0B549125...7Df792Fa7
0.00000006 ETH0.000001020.01
Mint2309077942024-07-11 0:21:383 days ago1720657298IN
0x0B549125...7Df792Fa7
0.00000012 ETH0.000000990.01
Mint2308170822024-07-10 18:02:534 days ago1720634573IN
0x0B549125...7Df792Fa7
0.00000012 ETH0.000001750.01
Mint2307265952024-07-10 11:44:164 days ago1720611856IN
0x0B549125...7Df792Fa7
0.0000001 ETH0.000001460.01
Mint2306349722024-07-10 5:21:474 days ago1720588907IN
0x0B549125...7Df792Fa7
0.00000406 ETH0.000001090.01
Mint2305644722024-07-10 0:26:544 days ago1720571214IN
0x0B549125...7Df792Fa7
0.00000452 ETH0.000001040.01
Mint2305012102024-07-09 20:02:144 days ago1720555334IN
0x0B549125...7Df792Fa7
0.0000048 ETH0.000001060.01
Mint2304415042024-07-09 15:52:465 days ago1720540366IN
0x0B549125...7Df792Fa7
0.0000048 ETH0.000001730.01
Mint2303818832024-07-09 11:43:285 days ago1720525408IN
0x0B549125...7Df792Fa7
0.00000473 ETH0.000001030.01
Mint2303212922024-07-09 7:30:185 days ago1720510218IN
0x0B549125...7Df792Fa7
0.00000371 ETH0.000001050.01
Mint2302440492024-07-09 2:07:085 days ago1720490828IN
0x0B549125...7Df792Fa7
0.00000409 ETH0.000000970.01
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To Value
2321240522024-07-14 13:00:215 hrs ago1720962021
0x0B549125...7Df792Fa7
0.0000296 ETH
2320525922024-07-14 8:02:1710 hrs ago1720944137
0x0B549125...7Df792Fa7
0.0000296 ETH
2319090482024-07-13 22:02:3620 hrs ago1720908156
0x0B549125...7Df792Fa7
0.0000296 ETH
2318305232024-07-13 16:35:0126 hrs ago1720888501
0x0B549125...7Df792Fa7
0.0000296 ETH
2317520232024-07-13 11:07:3631 hrs ago1720868856
0x0B549125...7Df792Fa7
0.0000296 ETH
2316726042024-07-13 5:36:1837 hrs ago1720848978
0x0B549125...7Df792Fa7
0.0000296 ETH
2315720792024-07-12 22:36:0544 hrs ago1720823765
0x0B549125...7Df792Fa7
0.0000296 ETH
2314714582024-07-12 15:35:562 days ago1720798556
0x0B549125...7Df792Fa7
0.0000296 ETH
2313708062024-07-12 8:35:462 days ago1720773346
0x0B549125...7Df792Fa7
0.0000296 ETH
2312760552024-07-12 2:00:122 days ago1720749612
0x0B549125...7Df792Fa7
0.0000296 ETH
2311849902024-07-11 19:39:512 days ago1720726791
0x0B549125...7Df792Fa7
0.0000296 ETH
2310940322024-07-11 13:19:393 days ago1720703979
0x0B549125...7Df792Fa7
0.0000296 ETH
2310021432024-07-11 6:55:353 days ago1720680935
0x0B549125...7Df792Fa7
0.0000296 ETH
2309077942024-07-11 0:21:383 days ago1720657298
0x0B549125...7Df792Fa7
0.0000296 ETH
2308683222024-07-10 21:36:403 days ago1720647400
0x0B549125...7Df792Fa7
0.00059537 ETH
2308170822024-07-10 18:02:534 days ago1720634573
0x0B549125...7Df792Fa7
0.0000296 ETH
2307265952024-07-10 11:44:164 days ago1720611856
0x0B549125...7Df792Fa7
0.0000296 ETH
2306349722024-07-10 5:21:474 days ago1720588907
0x0B549125...7Df792Fa7
0.0000296 ETH
2305644722024-07-10 0:26:544 days ago1720571214
0x0B549125...7Df792Fa7
0.0000296 ETH
2305012102024-07-09 20:02:144 days ago1720555334
0x0B549125...7Df792Fa7
0.0000296 ETH
2304415042024-07-09 15:52:465 days ago1720540366
0x0B549125...7Df792Fa7
0.0000296 ETH
2303818832024-07-09 11:43:285 days ago1720525408
0x0B549125...7Df792Fa7
0.0000296 ETH
2303212922024-07-09 7:30:185 days ago1720510218
0x0B549125...7Df792Fa7
0.0000296 ETH
2302440492024-07-09 2:07:085 days ago1720490828
0x0B549125...7Df792Fa7
0.0000296 ETH
2301741052024-07-08 21:14:065 days ago1720473246
0x0B549125...7Df792Fa7
0.0000296 ETH
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ArbitrumBitcoinAndStaking

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-04-04
*/

// Arbitrum Bitcoin and Staking (ABAS) - Token and Mining Contract
//
// Distrubtion of Arbitrum Bitcoin and Staking (ABAS) Token is as follows:
// 40% of ABAS Token is distributed as Liquidiy Pools as rewards in the ABASRewards Contract which distributes tokens to users who deposit the Liquidity Pool tokens into the LPRewards contracts.
// +
// 40% of ABAS Token is distributed using ABAS Contract(this Contract) which distributes tokens to users by using Proof of work. Computers solve a complicated problem to gain tokens!
// +
// 20% of ABAS Token is Auctioned in the ABASAuctions Contract which distributes tokens to users who use Ethereum to buy tokens in fair price. Each auction lasts ~12 days. Using the Auctions contract.
// +
// = 100% Of the Token is distributed to the users! No dev fee or premine!
//
	
// Symbol: ABAS
// Decimals: 18 
//
// Total supply: 52,500,001.000000000000000000
//   =
// 21,000,000 tokens goes to Liquidity Providers of the token over 100+ year using Bitcoin distribution!  Helps prevent LP losses!  Uses the ABASRewards!
//   +
// 21,000,000 Mined over 100+ years using Bitcoins Distrubtion halvings every 4 years @ 360 min solves. Uses Proof-oF-Work to distribute the tokens. Public Miner is available.  Uses this contract.
//   +
// 10,500,000 Auctioned over 100+ years into 4 day auctions split fairly among all buyers. ALL Ethereum proceeds go into THIS contract which it fairly distributes to miners and stakers.  Uses the ABASAuctions contract
//  
//
//      
// 50% of the Ethereum from this contract goes to the Miner to pay for the transaction cost and if the token grows enough earn Ethereum per mint!
// 50% of the Ethereum from this contract goes to the Liquidity Providers via ABASRewards Contract.  Helps prevent Impermant Loss! Larger Liquidity!
//
// Max Difficulty of 4 TH/s
// To prevent hashrate griefing at targetTime it is ~0.0001 Ethereum per Mint
// @ 30x targetTime it is ~0.0000033 Ethereum per Mint
// This is done to thwart ASICs and high hashrate machines from griefing / ramping difficulty up to stop FPGA profits
//
// No premine, dev cut, or advantage taken at launch. Public miner available at launch.  100% of the token is given away fairly over 100+ years using Bitcoins model!
//
// Send this contract any ERC20 token and it will become instantly mineable and able to distribute using proof-of-work!
// Donate this contract any NFT and we will also distribute it via Proof of Work to our miners!  
//  
//* 1 token were burned to create the LP pool.
//
// Credits: 0xBitcoin, Vether, Synethix


pragma solidity ^0.8.11;

contract Ownable {
    address public owner;

    event TransferOwnership(address _from, address _to);

    constructor() {
        owner = msg.sender;
        emit TransferOwnership(address(0), msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "only owner");
        _;
    }

    function setOwner(address _owner) internal onlyOwner {
        emit TransferOwnership(owner, _owner);
        owner = _owner;
    }
}

pragma solidity >=0.4.21 <0.9.0;

/**
* @title Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. Exposes a variety of system-level functionality.
 */
interface ArbSys {
    /**
    * @notice Get internal version number identifying an ArbOS build
    * @return version number as int
     */
	function arbBlockHash(uint blockNumber) external view returns(bytes32);
    /**
    * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)
    * @return block number as int
     */ 
    function arbBlockNumber() external view returns (uint);

    /** 
    * @notice Send given amount of Eth to dest from sender.
    * This is a convenience function, which is equivalent to calling sendTxToL1 with empty calldataForL1.
    * @param destination recipient address on L1
    * @return unique identifier for this L2-to-L1 transaction.
    */
   
}



library IsContract {
    function isContract(address _addr) internal view returns (bool) {
        bytes32 codehash;
        /* solium-disable-next-line */
        assembly { codehash := extcodehash(_addr) }
        return codehash != bytes32(0) && codehash != bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
    }
}

// File: contracts/utils/SafeMath.sol

library SafeMath2 {
    function add(uint256 x, uint256 y) internal pure returns (uint256) {
        uint256 z = x + y;
        require(z >= x, "Add overflow");
        return z;
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256) {
        require(x >= y, "Sub underflow");
        return x - y;
    }

    function mult(uint256 x, uint256 y) internal pure returns (uint256) {
        if (x == 0) {
            return 0;
        }

        uint256 z = x * y;
        require(z / x == y, "Mult overflow");
        return z;
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        return x / y;
    }

    function divRound(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        uint256 r = x / y;
        if (x % y != 0) {
            r = r + 1;
        }

        return r;
    }
}

// File: contracts/utils/Math.sol

library ExtendedMath2 {


    //return the smaller of the two inputs (a or b)
    function limitLessThan(uint a, uint b) internal pure returns (uint c) {

        if(a > b) return b;

        return a;

    }
}

// File: contracts/interfaces/IERC20.sol

interface IERC20 {
	function totalSupply() external view returns (uint256);
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    function transfer(address _to, uint _value) external returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    function approve(address _spender, uint256 _value) external returns (bool success);
    function balanceOf(address _owner) external view returns (uint256 balance);
    
}



interface IERC721 {
    /**
     * @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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

//Recieve NFTs
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);
}
//Main contract


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);
}

interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC
     5MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

contract ABASAuctionsCT{
    uint256 public totalAuctioned;
    }
    

contract ArbitrumBitcoinAndStaking is Ownable, IERC20 {

    function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }
    
    function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4){
	return IERC1155Receiver.onERC1155Received.selector;
	}	
    function onERC1155BatchReceived(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4){
	return IERC1155Receiver.onERC1155Received.selector;
	}
	
    uint public targetTime = 60 * 12;
// SUPPORTING CONTRACTS
    address public AddressAuction;
    ABASAuctionsCT public AuctionsCT;
    address public AddressLPReward;
//Events
    using SafeMath2 for uint256;
    using ExtendedMath2 for uint;
    event Mint(address indexed from, uint reward_amount, uint epochCount, bytes32 newChallengeNumber);
    event MegaMint(address indexed from, uint epochCount, bytes32 newChallengeNumber, uint NumberOfTokensMinted, uint256 TokenMultipler);

// Managment events
    uint256 override public totalSupply = 52500001000000000000000000;
    bytes32 private constant BALANCE_KEY = keccak256("balance");
    //BITCOIN INITALIZE Start
	
    uint _totalSupply = 21000000000000000000000000;
    uint public latestDifficultyPeriodStarted2 = block.timestamp; //BlockTime of last readjustment
    uint public epochCount = 0;//number of 'blocks' mined
	uint public latestreAdjustStarted = block.timestamp; 
    uint public _BLOCKS_PER_READJUSTMENT = 1024; // should be 1024
    uint public  _MAXIMUM_TARGET = 2**234;
    uint public  _MINIMUM_TARGET = _MAXIMUM_TARGET.div(555000000); //Mainnet = 555000000 = 4 TH/s @ 12 minutes
    uint public miningTarget = _MAXIMUM_TARGET.div(200000000000*25);  //1000 million difficulty to start until i enable mining
    
    bytes32 public challengeNumber = ArbSys(0x0000000000000000000000000000000000000064).arbBlockHash( ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber() - 1);   //generate a new one when a new reward is minted
    uint public rewardEra = 0;
    uint public maxSupplyForEra = (_totalSupply - _totalSupply.div( 2**(rewardEra + 1)));
    uint public reward_amount = 2;
    
    //Stuff for Functions
	uint public sentToLP = 0; //Total ABAS sent to LP pool
    uint public multipler = 0; //Multiplier on held Ethereum (more we hold less % we distribute)
    uint public oldecount = 0; //Previous block count for ArewardSender function
    uint public previousBlockTime  =  block.timestamp; // Previous Blocktime
    uint public Token2Per=           1000000; //Amount of ETH distributed per mint somewhat
    uint public tokensMinted = 0;			//Tokens Minted only for Miners
    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;
    uint public slowBlocks = 0; //Number of slow blocks (12+ minutes)
    uint public epochOld = 0;  //Epoch count at each readjustment 
    uint public give0x = 0;
    uint public give = 1;
    // metadata
    string public name = "Arbitrum Bitcoin and Staking Token";
    string public constant symbol = "ABAS";
    uint8 public constant decimals = 18;
	
    uint256 lastrun = block.timestamp;
    uint public latestDifficultyPeriodStarted = ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber();
    bool initeds = false;
    
    // mint 1 token to setup LPs
	    constructor() {
    balances[msg.sender] = 1000000000000000000;
    emit Transfer(address(0), msg.sender, 1000000000000000000);
	}

function zinit(address AuctionAddress2, address LPGuild2) public onlyOwner{
        uint x = 21000000000000000000000000; 
        // Only init once
        assert(!initeds);
        initeds = true;
	previousBlockTime = block.timestamp;
	reward_amount = 20 * 10**uint(decimals);
    	rewardEra = 0;
	tokensMinted = 0;
	epochCount = 0;
	epochOld = 0;
	multipler = address(this).balance / (1 * 10 ** 18); 	
	Token2Per = (2** rewardEra) * address(this).balance / (250000 + 250000*(multipler)); //aimed to give about 400 days of reserves

    	miningTarget = _MAXIMUM_TARGET.div(1000);
        latestDifficultyPeriodStarted2 = block.timestamp;
    	_startNewMiningEpoch();
        // Init contract variables and mint
        balances[AuctionAddress2] = x/2;
	
        emit Transfer(address(0), AuctionAddress2, x/2);
	
    	AddressAuction = AuctionAddress2;
        AuctionsCT = ABASAuctionsCT(AddressAuction);
        AddressLPReward = payable(LPGuild2);
		slowBlocks = 1;
        oldecount = epochCount;
	
	setOwner(address(0));
     
    }



	///
	// Managment
	///

	function ARewardSender() public {
		//runs every _BLOCKS_PER_READJUSTMENT / 8

		multipler = address(this).balance / (1 * 10 ** 18); 	
		Token2Per = (2** rewardEra) * address(this).balance / (250000 + 250000*(multipler)); //aimed to give about 400 days of reserves

		uint256 runs = block.timestamp - lastrun;

		uint256 epochsPast = epochCount - oldecount; //actually epoch
		uint256 runsperepoch = runs / epochsPast;
		if(rewardEra < 8){
			
			targetTime = ((12 * 60) * 2**rewardEra);
		}else{
			reward_amount = ( 20 * 10**uint(decimals)).div( 2**(rewardEra - 7  ) );
		}
		uint256 x = (runsperepoch * 888).divRound(targetTime);
		uint256 ratio = x * 100 / 888;
		uint256 totalOwed;
		
		 if(ratio < 2000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
		 }else {
			totalOwed = (3200000000);
		} 

		uint totalOwedABAS = (epochsPast * reward_amount * totalOwed).div(100000000);
		balances[AddressLPReward] = balances[AddressLPReward].add(totalOwedABAS);
		emit Transfer(address(0), AddressLPReward, totalOwedABAS);
		sentToLP = sentToLP.add(totalOwedABAS);
		if( address(this).balance > (200 * (Token2Per * _BLOCKS_PER_READJUSTMENT)/4)){  // at least enough blocks to rerun this function for both LPRewards and Users
			//IERC20(AddressZeroXBTC).transfer(AddressLPReward, ((epochsPast) * totalOwed * Token2Per * give0xBTC).div(100000000));
          	 address payable to = payable(AddressLPReward);
			 totalOwed = ((epochsPast) * totalOwed * Token2Per * give0x).div(100000000);
           	to.transfer(totalOwed);
           		 give0x = 1 * give;
		}else{
			give0x = 0;
		}
		
		oldecount = epochCount; //actually epoch

		lastrun = block.timestamp;
	}


	//comability function
	function mint(uint256 nonce, bytes32 challenge_digest) public payable returns (bool success) {
		mintTo(nonce, challenge_digest, msg.sender);
		return true;
	}
	

	function mintNFTGOBlocksUntil() public view returns (uint num) {
		return _BLOCKS_PER_READJUSTMENT/8 - (slowBlocks % (_BLOCKS_PER_READJUSTMENT/8 ));
	}
	
	function mintNFTGO() public view returns (uint num) {
		return slowBlocks % (_BLOCKS_PER_READJUSTMENT/8);
	}
	
	function mintNFT721(address nftaddy, uint nftNumber, uint256 nonce, bytes32 challenge_digest) public payable returns (bool success) {
		require(mintNFTGO() == 0, "Only mint on slowBlocks % _BLOCKS_PER_READJUSTMENT/8 == 0");
		mintTo(nonce, challenge_digest, msg.sender);
		IERC721(nftaddy).safeTransferFrom(address(this), msg.sender, nftNumber, "");
		if(mintNFTGO() == 0){
			slowBlocks = slowBlocks.add(1);
		}
		return true;
	}

	function mintNFT1155(address nftaddy, uint nftNumber, uint256 nonce, bytes32 challenge_digest) public payable returns (bool success) {
		require(mintNFTGO() == 0, "Only mint on slowBlocks % _BLOCKS_PER_READJUSTMENT/8 == 0");
		mintTo(nonce, challenge_digest, msg.sender);
		IERC1155(nftaddy).safeTransferFrom(address(this), msg.sender, nftNumber, 1, "" );
		if(mintNFTGO() == 0){
			slowBlocks = slowBlocks.add(1);
		}
		return true;
	}

	function mintTo(uint256 nonce, bytes32 challenge_digest, address mintToAddress) public payable returns (uint256 totalOwed) {

		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		//the challenge digest must match the expected
		require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");

		//the digest must be smaller than the target
		require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
		_startNewMiningEpoch();

		require(block.timestamp > previousBlockTime, "No same second solves");
		
		//uint diff = block.timestamp - previousBlockTime;
		uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
		uint ratio = x * 100 / 888 ;
	
		
		if(ratio > 100){
			
			slowBlocks = slowBlocks.add(1);
			
		}
		
		//best @ 3000 ratio totalOwed / 100000000 = 71.6
		if(ratio < 3000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
			require(msg.value >= ((1 * 10**15) / ((ratio+10)/10)), "Must send more ETH because requires eth, check howMuchETH() function to find amount needed");
		}else {
			totalOwed = (24*x*5086060).div(888)+3456750000;
			if(ratio < 6000){
				uint ratioETH = ratio - 2995;
				require(msg.value >= ((1 * 10**15) / (((ratioETH+10) / 10) * 500)), "Must send more ETH because requires eth until 60x targetTime, check howMuchETH() function to find amount needed");
			}
		}

		uint totalOwedABAS = (reward_amount * totalOwed).div(100000000);
		
		balances[mintToAddress] = balances[mintToAddress].add(totalOwedABAS);
		emit Transfer(address(0), mintToAddress, totalOwedABAS);
		
		tokensMinted = tokensMinted.add(totalOwedABAS);
		previousBlockTime = block.timestamp;
		if(give0x > 0){
			if(ratio < 2000){
            			address payable to = payable(mintToAddress);
             			to.transfer((totalOwed * Token2Per * give0x).div(100000000));
				//IERC20(AddressZeroXBTC).transfer(mintTo, (totalOwed * Token2Per * give0xBTC).div(100000000 * 2));
			}else{
               			address payable to = payable(mintToAddress);
               			to.transfer((320 * Token2Per * give0x).div(10));
				//IERC20(AddressZeroXBTC).transfer(mintTo, (40 * Token2Per * give0xBTC).div(10 * 2));
			}
		}

		emit Mint(mintToAddress, totalOwedABAS, epochCount, challengeNumber );

		return totalOwed;

	}
	
	function howMuchETHatTime(uint secondsBetweenEpoch) public view returns (uint totalETHNeeded){
		uint256 x = ((secondsBetweenEpoch) * 888) / targetTime;
		uint ratio = x * 100 / 888;
		
		
		if(ratio >= 3000){
			if(ratio < 6000){
				ratio = ratio - 2995;
				return ((1 * 10**15) / (((ratio+7) / 10) * 500)) ;
			}
			return 0;
		}else if(ratio > 18){
			//A Little behind so we dont bump into error on mint.
			ratio = ratio - 3;
		}
		return (1 * 10**15 / ((ratio+10)/10));
	}

	//A Little ahead so we dont bump into error.
	function howMuchETH() public view returns (uint totalETHNeeded){
		return howMuchETHatTime((block.timestamp - previousBlockTime));
	}
	
	function YourETHBalance() public view returns( uint urTotalETHInWallet){
		return (msg.sender).balance;
	}

	function mintJustABAS(uint256 nonce, bytes32 challenge_digest) public payable returns (bool success){
		mintToJustABAS(nonce, challenge_digest, msg.sender);
		return true;
	}

	function mintToJustABAS(uint256 nonce, bytes32 challenge_digest, address mintToAddress) public payable returns (uint256 totalOwed) {

		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		//the challenge digest must match the expected
		require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");

		//the digest must be smaller than the target
		require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
		_startNewMiningEpoch();

		require(block.timestamp > previousBlockTime, "No solve for first 5 seconds.");
		
		//uint diff = block.timestamp - previousBlockTime;
		uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
		uint ratio = x * 100 / 888 ;
		
		
		if(ratio > 100){
			
			slowBlocks = slowBlocks.add(1);
			
		}
		
		//best @ 3000 ratio totalOwed / 100000000 = 71.6
		if(ratio < 3000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
			require(msg.value >= ((1 * 10**15) / ((ratio+10)/10)), "Must send more ETH because requires eth, check howMuchETH() function to find amount needed");
		}else {
			totalOwed = (24*x*5086060).div(888)+3456750000;
			if(ratio < 6000){
				ratio = ratio - 2995;
				require(msg.value >= ((1 * 10**15) / (((ratio+10) / 10) * 500)), "Must send more ETH because requires eth until 60x targetTime, check howMuchETH() function to find amount needed");
			}
		}

		uint totalOwedABAS = (reward_amount * totalOwed).div(100000000);
		
		balances[mintToAddress] = balances[mintToAddress].add(totalOwedABAS);
		emit Transfer(address(0), mintToAddress, totalOwedABAS);

		tokensMinted = tokensMinted.add(totalOwedABAS);
		previousBlockTime = block.timestamp;

		emit Mint(mintToAddress, totalOwedABAS, epochCount, challengeNumber );

		return totalOwed;

	}


	function mintTokensArrayTo(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public payable returns (uint256 owed) {
		uint256 totalOd = mintTo(nonce,challenge_digest, MintTo[0]);
		require(totalOd > 0, "mint issue");

		require(MintTo.length == ExtraFunds.length + 1,"MintTo has to have an extra address compared to ExtraFunds");
		uint xy=0;
		for(xy = 0; xy< ExtraFunds.length; xy++)
		{
			if(epochCount % (2**(xy+1)) != 0){
				break;
			}
			for(uint y=xy+1; y< ExtraFunds.length; y++){
				require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
			}
		}
		
		uint256 totalOwed = 0;
		uint256 TotalOwned = 0;
		for(uint x=0; x<xy; x++)
		{
			//epoch count must evenly dividable by 2^n in order to get extra mints. 
			//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, ..., epoch 32 = 5 extra mints w/ a divRound for the 5th mint(allows small balance token minting aka NFTs)
			if(epochCount % (2**(x+1)) == 0){
				TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
				if(TotalOwned != 0){
					if( x % 3 == 0 && x != 0 && totalOd > 17600000){
						totalOwed = ( (2** rewardEra) *TotalOwned * totalOd).divRound(100000000 * 20000);
						
					}else{
						totalOwed = ( (2** rewardEra) * TotalOwned * totalOd).div(100000000 * 20000);
					}
				}
			    IERC20(ExtraFunds[x]).transfer(MintTo[x+1], totalOwed);
			}
		}
        	
        	
		emit MegaMint(msg.sender, epochCount, challengeNumber, xy, totalOd );

		return totalOd;

    }

	function mintTokensSameAddress(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address MintTo) public payable returns (bool success) {
		address[] memory dd = new address[](ExtraFunds.length + 1); 

		for(uint x=0; x< (ExtraFunds.length + 1); x++)
		{
			dd[x] = MintTo;
		}
		
		mintTokensArrayTo(nonce, challenge_digest, ExtraFunds, dd);

		return true;
	}


	function mintTokensArrayToJustABAS(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public payable returns (uint256 owed) {
		uint256 totalOd = mintToJustABAS(nonce,challenge_digest, MintTo[0]);
		require(totalOd > 0, "mint issue");

		require(MintTo.length == ExtraFunds.length + 1,"MintTo has to have an extra address compared to ExtraFunds");
		uint xy=0;
		for(xy = 0; xy< ExtraFunds.length; xy++)
		{
			if(epochCount % (2**(xy+1)) != 0){
				break;
			}
			for(uint y=xy+1; y< ExtraFunds.length; y++){
				require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
			}
		}
		
		uint256 totalOwed = 0;
		uint256 TotalOwned = 0;
		for(uint x=0; x<xy; x++)
		{
			//epoch count must evenly dividable by 2^n in order to get extra mints. 
			//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, ..., epoch 32 = 5 extra mints w/ a divRound for the 5th mint(allows small balance token minting aka NFTs)
			if(epochCount % (2**(x+1)) == 0){
				TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
				if(TotalOwned != 0){
					if( x % 3 == 0 && x != 0 && totalOd > 17600000){
						totalOwed = ( (2** rewardEra) *TotalOwned * totalOd).divRound(100000000 * 20000);
						
					}else{
						totalOwed = ( (2** rewardEra) * TotalOwned * totalOd).div(100000000 * 20000);
					}
				}
			    IERC20(ExtraFunds[x]).transfer(MintTo[x+1], totalOwed);
			}
		}
        	
        	
		emit MegaMint(msg.sender, epochCount, challengeNumber, xy, totalOd );

		return totalOd;

    }

	function mintTokensSameAddressJustABAS(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address MintTo) public payable returns (bool success) {
		address[] memory dd = new address[](ExtraFunds.length + 1); 

		for(uint x=0; x< (ExtraFunds.length + 1); x++)
		{
			dd[x] = MintTo;
		}
		
		mintTokensArrayToJustABAS(nonce, challenge_digest, ExtraFunds, dd);

		return true;
	}













	function empty_mintTo(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public payable returns (uint256 owed) {
		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		//the challenge digest must match the expected
		require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");

		//the digest must be smaller than the target
		require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
		_startNewMiningEpoch();

		require(block.timestamp > previousBlockTime, "No same second solves");
		require(MintTo.length == ExtraFunds.length,"MintTo has to have same number of addressses as ExtraFunds");

		uint xy=0;
		for(xy = 0; xy< ExtraFunds.length; xy++)
		{
			if(epochCount % (2**(xy+1)) != 0){
				break;
			}
			for(uint y=xy+1; y< ExtraFunds.length; y++){
				require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
			}
		}

		uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
		uint ratio = x * 100 / 888 ;
		uint totalOwed = 0;

		
		if(ratio > 100){
			
			slowBlocks = slowBlocks.add(1);
			
		}
	
		//best @ 3000 ratio totalOwed / 100000000 = 71.6
		if(ratio < 3000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
			require(msg.value >= ((1 * 10**15) / ((ratio+10)/10)), "Must send more ETH because requires eth, check howMuchETH() function to find amount needed");
		}else {
			totalOwed = (24*x*5086060).div(888)+3456750000;
			if(ratio < 6000){
				ratio = ratio - 2995;
				require(msg.value >= ((1 * 10**15) / (((ratio+10) / 10) * 500)), "Must send more ETH because requires eth until 60x targetTime, check howMuchETH() function to find amount needed");
			}
		}

		uint256 TotalOwned;
		for(uint z=0; z<xy; z++)
		{
			//epoch count must evenly dividable by 2^n in order to get extra mints. 
			//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, epoch 16 = 4 extra mints w/ a divRound for the 4th mint(allows small balance token minting aka NFTs)
			if(epochCount % (2**(x+1)) == 0){
				TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
				if(TotalOwned != 0){
					if( x % 3 == 0 && x != 0 && totalOwed > 17600000){
						totalOwed = ( (2** rewardEra) * TotalOwned * totalOwed).divRound(100000000 * 20000);
					}else{
						totalOwed = ( (2** rewardEra) * TotalOwned * totalOwed).div(100000000 * 20000 );
				    }
			    	IERC20(ExtraFunds[x]).transfer(MintTo[x], totalOwed);

           		}
       		}
		}
		previousBlockTime = block.timestamp;
		return totalOwed;   
	}

	function timeFromLastSolve() public view returns (uint256 time){
		time = block.timestamp - previousBlockTime;
		return time;
	}

	function rewardAtCurrentTime() public view returns (uint256 reward){
		uint256 x = (block.timestamp - previousBlockTime);
		reward = rewardAtTime(x);
		return reward;
	}
	
	function rewardAtTime(uint timeDifference) public view returns (uint256 rewards){
		uint256 x = (timeDifference * 888) / targetTime;
		uint ratio = x * 100 / 888 ;
		uint totalOwed = 0;


		//best @ 3000 ratio totalOwed / 100000000 = 71.6
		if(ratio < 3000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
		}else {
			totalOwed = (24*x*5086060).div(888)+3456750000;
		}

		rewards = (reward_amount * totalOwed).div(100000000);

		return rewards;
	}

	function blocksFromReadjust() public view returns (uint256 blocks){
		blocks = (epochCount - epochOld);
		return blocks;
	}
	
	function blocksToReadjust() public view returns (uint blocks){
		if((epochCount - epochOld) == 0){
			if(give == 1){
				return (_BLOCKS_PER_READJUSTMENT);
			}else{
				return (_BLOCKS_PER_READJUSTMENT / 8);
			}
		}
		uint256 blktimestamp = block.timestamp;
		uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestreAdjustStarted;
		uint adjusDiffTargetTime = targetTime * ((epochCount - epochOld) % (_BLOCKS_PER_READJUSTMENT/8)); 

		if( TimeSinceLastDifficultyPeriod2 > adjusDiffTargetTime)
		{
				blocks = _BLOCKS_PER_READJUSTMENT/8 - ((epochCount - epochOld) % (_BLOCKS_PER_READJUSTMENT/8));
				return (blocks);
		}else{
			    blocks = _BLOCKS_PER_READJUSTMENT - ((epochCount - epochOld) % _BLOCKS_PER_READJUSTMENT);
			    return (blocks);
		}
	
	}


	function _startNewMiningEpoch() internal {


		//if max supply for the era will be exceeded next reward round then enter the new era before that happens
		//59 is the final reward era, almost all tokens minted
		if( tokensMinted.add(reward_amount) > maxSupplyForEra && rewardEra < 15)
		{
			rewardEra = rewardEra + 1;
			maxSupplyForEra = _totalSupply - _totalSupply.div( 2**(rewardEra + 1));
			if(rewardEra < 8){
				_MINIMUM_TARGET	= _MINIMUM_TARGET.div(2);
				targetTime = ((12 * 60) * 2**rewardEra);
				if(rewardEra < 6){
					if(_BLOCKS_PER_READJUSTMENT <= 16){
						_BLOCKS_PER_READJUSTMENT = 8;
					}else{
						_BLOCKS_PER_READJUSTMENT = _BLOCKS_PER_READJUSTMENT / 2;
					}
				}
			}else{
				reward_amount = ( 20 * 10**uint(decimals)).div( 2**(rewardEra - 7  ) );
			}
		}

		//set the next minted supply at which the era will change
		// total supply of MINED tokens is 21000000000000000000000000  because of 18 decimal places

		epochCount = epochCount.add(1);

		//every so often, readjust difficulty. Dont readjust when deploying
		if((epochCount - epochOld) % (_BLOCKS_PER_READJUSTMENT / 8) == 0)
		{
			ARewardSender();
			maxSupplyForEra = _totalSupply - _totalSupply.div( 2**(rewardEra + 1));

			uint256 blktimestamp = block.timestamp;
			uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestreAdjustStarted;
			uint adjusDiffTargetTime = targetTime *  (_BLOCKS_PER_READJUSTMENT / 8) ; 
			latestreAdjustStarted = block.timestamp;

			if( TimeSinceLastDifficultyPeriod2 > adjusDiffTargetTime || (epochCount - epochOld) % _BLOCKS_PER_READJUSTMENT == 0) 
			{
				_reAdjustDifficulty();
			}
		}
		challengeNumber = ArbSys(0x0000000000000000000000000000000000000064).arbBlockHash( ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber() - 1);
 }


	function reAdjustsToWhatDifficulty() public view returns (uint difficulty) {
		if(epochCount - epochOld == 0){
			return _MAXIMUM_TARGET.div(miningTarget);
		}
		uint256 blktimestamp = block.timestamp;
		uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
		uint epochTotal = epochCount - epochOld;
		uint adjusDiffTargetTime = targetTime *  epochTotal; 
        uint miningTarget2 = 0;
		//if there were less eth blocks passed in time than expected
		if( TimeSinceLastDifficultyPeriod2 < adjusDiffTargetTime )
		{
			uint excess_block_pct = (adjusDiffTargetTime.mult(100)).div( TimeSinceLastDifficultyPeriod2 );
			uint excess_block_pct_extra = excess_block_pct.sub(100).limitLessThan(1000);
			//make it harder 
			miningTarget2 = miningTarget.sub(miningTarget.div(2000).mult(excess_block_pct_extra));   //by up to 50 %
		}else{
			uint shortage_block_pct = (TimeSinceLastDifficultyPeriod2.mult(100)).div( adjusDiffTargetTime );

			uint shortage_block_pct_extra = shortage_block_pct.sub(100).limitLessThan(1000); //always between 0 and 1000
			//make it easier
			miningTarget2 = miningTarget.add(miningTarget.div(500).mult(shortage_block_pct_extra));   //by up to 200 %
		}

		if(miningTarget2 < _MINIMUM_TARGET) //very difficult
		{
			miningTarget2 = _MINIMUM_TARGET;
		}
		if(miningTarget2 > _MAXIMUM_TARGET) //very easy
		{
			miningTarget2 = _MAXIMUM_TARGET;
		}
		difficulty = _MAXIMUM_TARGET.div(miningTarget2);
			return difficulty;
	}


	function _reAdjustDifficulty() internal {
		uint256 blktimestamp = block.timestamp;
		uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
		uint epochTotal = epochCount - epochOld;
		uint adjusDiffTargetTime = targetTime *  epochTotal; 
		epochOld = epochCount;

		//if there were less eth blocks passed in time than expected
		if( TimeSinceLastDifficultyPeriod2 < adjusDiffTargetTime )
		{
			uint excess_block_pct = (adjusDiffTargetTime.mult(100)).div( TimeSinceLastDifficultyPeriod2 );
			give = 1;
			uint excess_block_pct_extra = excess_block_pct.sub(100).limitLessThan(1000);
			//make it harder 
			miningTarget = miningTarget.sub(miningTarget.div(2000).mult(excess_block_pct_extra));   //by up to 50 %
		}else{
			uint shortage_block_pct = (TimeSinceLastDifficultyPeriod2.mult(100)).div( adjusDiffTargetTime );
			give = 2;
			uint shortage_block_pct_extra = shortage_block_pct.sub(100).limitLessThan(1000); //always between 0 and 1000
			//make it easier
			miningTarget = miningTarget.add(miningTarget.div(500).mult(shortage_block_pct_extra));   //by up to 200 %
		}

		latestDifficultyPeriodStarted2 = blktimestamp;
		latestDifficultyPeriodStarted = ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber();
		if(miningTarget < _MINIMUM_TARGET) //very difficult
		{
			miningTarget = _MINIMUM_TARGET;
		}
		if(miningTarget > _MAXIMUM_TARGET) //very easy
		{
			miningTarget = _MAXIMUM_TARGET;
		}
		
	}


//Stat Functions

	function inflationMined () public view returns (uint YearlyInflation, uint EpochsPerYear, uint RewardsAtTime, uint TimePerEpoch){
		if(epochCount - epochOld == 0){
			return (0, 0, 0, 0);
		}
		uint256 blktimestamp = block.timestamp;
		uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;

        
		TimePerEpoch = TimeSinceLastDifficultyPeriod2 / blocksFromReadjust(); 
		RewardsAtTime = rewardAtTime(TimePerEpoch);
		uint year = 365 * 24 * 60 * 60;
		EpochsPerYear = year / TimePerEpoch;
		YearlyInflation = RewardsAtTime * EpochsPerYear;
		return (YearlyInflation, EpochsPerYear, RewardsAtTime, TimePerEpoch);
	}

	
	function toNextEraDays () public view returns (uint daysToNextEra, uint _maxSupplyForEra, uint _tokensMinted, uint amtDaily){

        (uint totalamt,,,) = inflationMined();
		(amtDaily) = totalamt / 365;
		if(amtDaily == 0){
			return(0,0,0,0);
		}
		daysToNextEra = (maxSupplyForEra - tokensMinted) / amtDaily;
		return (daysToNextEra, maxSupplyForEra, tokensMinted, amtDaily);
	}
	

	function toNextEraEpochs () public view returns ( uint epochs, uint epochTime, uint daysToNextEra){
		if(blocksFromReadjust() == 0){
			return (0,0,0);
        }
		uint256 blktimestamp = block.timestamp;
        uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
		uint timePerEpoch = TimeSinceLastDifficultyPeriod2 / blocksFromReadjust();
		(uint daysz,,,) = toNextEraDays();
		uint amt = daysz * (60*60*24) / timePerEpoch;
		return (amt, timePerEpoch, daysz);
	}

	//help debug mining software
	function checkMintSolution(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number, uint testTarget) public view returns (bool success) {
		bytes32 digest = bytes32(keccak256(abi.encodePacked(challenge_number,msg.sender,nonce)));
		if(uint256(digest) > testTarget) revert();

		return (digest == challenge_digest);
	}

	function checkMintSolutionForAddress(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number, uint testTarget, address sender) public view returns (bool success) {
		bytes32 digest = bytes32(keccak256(abi.encodePacked(challenge_number,sender,nonce)));
		if(uint256(digest) > testTarget) revert();

		return (digest == challenge_digest);
	}


	//this is a recent ethereum block hash, used to prevent pre-mining future blocks
	function getChallengeNumber() public view returns (bytes32) {

		return challengeNumber;

	}

	
	//the number of zeroes the digest of the PoW solution requires.  Auto adjusts
	function getMiningDifficulty() public view returns (uint) {
			return _MAXIMUM_TARGET.div(miningTarget);
	}


	function getMiningTarget() public view returns (uint) {
			return (miningTarget);
	}


	function getMiningMinted() public view returns (uint) {
		return tokensMinted;
	}

    	function getCirculatingSupply() public view returns (uint) {
        	return tokensMinted + sentToLP + AuctionsCT.totalAuctioned();
    	}

	//~21m coins total in minting
	//reward begins at 20 and the same for the first 8 eras (0-7), targetTime doubles to compensate for first 8 eras
	//After rewardEra = 8 it halves the reward every Era after because no more targetTime is added
	function getMiningReward() public view returns (uint) {
		//once we get half way thru the coins, only get 25 per block
		//every reward era, the reward amount halves.

		if(rewardEra < 8){
			return ( 20 * 10**uint(decimals));
		}else{
			return ( 20 * 10**uint(decimals)).div( 2**(rewardEra - 7  ) );
		}
		}


	function getEpoch() public view returns (uint) {

		return epochCount ;

	}


	//help debug mining software
	function getMintDigest(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number) public view returns (bytes32 digesttest) {

		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		return digest;

	}


		// ------------------------------------------------------------------------

		// Get the token balance for account `tokenOwner`

		// ------------------------------------------------------------------------

	function balanceOf(address tokenOwner) public override view returns (uint balance) {

		return balances[tokenOwner];

	}


		// ------------------------------------------------------------------------

		// Transfer the balance from token owner's account to `to` account

		// - Owner's account must have sufficient balance to transfer

		// - 0 value transfers are allowed

		// ------------------------------------------------------------------------


	function transfer(address to, uint tokens) public override returns (bool success) {

		balances[msg.sender] = balances[msg.sender].sub(tokens);
		balances[to] = balances[to].add(tokens);

		emit Transfer(msg.sender, to, tokens);

		return true;

	}


		// ------------------------------------------------------------------------

		// Token owner can approve for `spender` to transferFrom(...) `tokens`

		// from the token owner's account

		//

		// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md

		// recommends that there are no checks for the approval double-spend attack

		// as this should be implemented in user interfaces

		// ------------------------------------------------------------------------


	function approve(address spender, uint tokens) public override returns (bool success) {

		allowed[msg.sender][spender] = tokens;

		emit Approval(msg.sender, spender, tokens);

		return true;

	}


		// ------------------------------------------------------------------------

		// Transfer `tokens` from the `from` account to the `to` account

		//

		// The calling account must already have sufficient tokens approve(...)-d

		// for spending from the `from` account and

		// - From account must have sufficient balance to transfer

		// - Spender must have sufficient allowance to transfer

		// - 0 value transfers are allowed

		// ------------------------------------------------------------------------


	function transferFrom(address from, address to, uint tokens) public override returns (bool success) {

		balances[from] = balances[from].sub(tokens);
		allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
		balances[to] = balances[to].add(tokens);

		emit Transfer(from, to, tokens);

		return true;

	}


		// ------------------------------------------------------------------------

		// Returns the amount of tokens approved by the owner that can be

		// transferred to the spender's account

		// ------------------------------------------------------------------------


	function allowance(address tokenOwner, address spender) public override view returns (uint remaining) {

		return allowed[tokenOwner][spender];

	}




	  //Allow ETH to enter
	receive() external payable {

	}


	fallback() external payable {

	}
}

/*
*
* MIT License
* ===========
*
* Copyright (c) 2023 Arbitrum Bitcoin and Staking (ABAS)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.   
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
*/

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"NumberOfTokensMinted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenMultipler","type":"uint256"}],"name":"MegaMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"TransferOwnership","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ARewardSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AddressAuction","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddressLPReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AuctionsCT","outputs":[{"internalType":"contract ABASAuctionsCT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Token2Per","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YourETHBalance","outputs":[{"internalType":"uint256","name":"urTotalETHInWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BLOCKS_PER_READJUSTMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAXIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MINIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksFromReadjust","outputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksToReadjust","outputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"challengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"},{"internalType":"uint256","name":"testTarget","type":"uint256"}],"name":"checkMintSolution","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"},{"internalType":"uint256","name":"testTarget","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"checkMintSolutionForAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"empty_mintTo","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"epochCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochOld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChallengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningDifficulty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"}],"name":"getMintDigest","outputs":[{"internalType":"bytes32","name":"digesttest","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"give","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"give0x","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"howMuchETH","outputs":[{"internalType":"uint256","name":"totalETHNeeded","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsBetweenEpoch","type":"uint256"}],"name":"howMuchETHatTime","outputs":[{"internalType":"uint256","name":"totalETHNeeded","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inflationMined","outputs":[{"internalType":"uint256","name":"YearlyInflation","type":"uint256"},{"internalType":"uint256","name":"EpochsPerYear","type":"uint256"},{"internalType":"uint256","name":"RewardsAtTime","type":"uint256"},{"internalType":"uint256","name":"TimePerEpoch","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDifficultyPeriodStarted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDifficultyPeriodStarted2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestreAdjustStarted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyForEra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mint","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mintJustABAS","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nftaddy","type":"address"},{"internalType":"uint256","name":"nftNumber","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mintNFT1155","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nftaddy","type":"address"},{"internalType":"uint256","name":"nftNumber","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mintNFT721","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintNFTGO","outputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintNFTGOBlocksUntil","outputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address","name":"mintToAddress","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"totalOwed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address","name":"mintToAddress","type":"address"}],"name":"mintToJustABAS","outputs":[{"internalType":"uint256","name":"totalOwed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"mintTokensArrayTo","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"mintTokensArrayToJustABAS","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address","name":"MintTo","type":"address"}],"name":"mintTokensSameAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address","name":"MintTo","type":"address"}],"name":"mintTokensSameAddressJustABAS","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"multipler","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldecount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reAdjustsToWhatDifficulty","outputs":[{"internalType":"uint256","name":"difficulty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardAtCurrentTime","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeDifference","type":"uint256"}],"name":"rewardAtTime","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardEra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sentToLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"slowBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeFromLastSolve","outputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toNextEraDays","outputs":[{"internalType":"uint256","name":"daysToNextEra","type":"uint256"},{"internalType":"uint256","name":"_maxSupplyForEra","type":"uint256"},{"internalType":"uint256","name":"_tokensMinted","type":"uint256"},{"internalType":"uint256","name":"amtDaily","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toNextEraEpochs","outputs":[{"internalType":"uint256","name":"epochs","type":"uint256"},{"internalType":"uint256","name":"epochTime","type":"uint256"},{"internalType":"uint256","name":"daysToNextEra","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AuctionAddress2","type":"address"},{"internalType":"address","name":"LPGuild2","type":"address"}],"name":"zinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526102d06001556a2b6d4ec1c9bd6f2be400006005556a115eec47f6cf7e3500000060065542600755600060085542600955610400600a55600160ea1b600b5562000063632114a0c0600b546200034f60201b620032251790919060201c565b600c556200008865048c27395000600b546200034f60201b620032251790919060201c565b600d5560646001600160a01b0316632b407a82600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001039190620003a9565b6200010f9190620003d9565b6040518263ffffffff1660e01b81526004016200012e91815260200190565b602060405180830381865afa1580156200014c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001729190620003a9565b600e556000600f55620001b3600f5460016200018f9190620003ef565b6200019c90600262000502565b6006546200034f60201b620032251790919060201c565b600654620001c29190620003d9565b601055600260115560006012556000601355600060145542601555620f424060165560006017556000601a556000601b556000601c556001601d5560405180606001604052806022815260200162004a2f60229139601e90620002269082620005b5565b5042601f5560646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002919190620003a9565b6020556021805460ff19169055348015620002ab57600080fd5b50600080546001600160a01b0319163390811782556040805192835260208301919091527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1336000818152601860209081526040808320670de0b6b3a76400009081905590519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3620006a4565b600081600003620003945760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640160405180910390fd5b620003a0828462000681565b90505b92915050565b600060208284031215620003bc57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115620003a357620003a3620003c3565b80820180821115620003a357620003a3620003c3565b600181815b80851115620004465781600019048211156200042a576200042a620003c3565b808516156200043857918102915b93841c93908002906200040a565b509250929050565b6000826200045f57506001620003a3565b816200046e57506000620003a3565b81600181146200048757600281146200049257620004b2565b6001915050620003a3565b60ff841115620004a657620004a6620003c3565b50506001821b620003a3565b5060208310610133831016604e8410600b8410161715620004d7575081810a620003a3565b620004e3838362000405565b8060001904821115620004fa57620004fa620003c3565b029392505050565b6000620003a083836200044e565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200053b57607f821691505b6020821081036200055c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005b057600081815260208120601f850160051c810160208610156200058b5750805b601f850160051c820191505b81811015620005ac5782815560010162000597565b5050505b505050565b81516001600160401b03811115620005d157620005d162000510565b620005e981620005e2845462000526565b8462000562565b602080601f831160018114620006215760008415620006085750858301515b600019600386901b1c1916600185901b178555620005ac565b600085815260208120601f198616915b82811015620006525788860151825594840194600190910190840162000631565b5085821015620006715787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000826200069f57634e487b7160e01b600052601260045260246000fd5b500490565b61437b80620006b46000396000f3fe60806040526004361061041b5760003560e01c806370a082311161021c578063a7ef6b8f11610122578063d0f66e4b116100b0578063f23a6e6111610077578063f23a6e61146104e9578063f2f3bf2d14610bd5578063f56f8d3614610be8578063f7a5f15514610bfc578063f95d391914610c0f57005b8063d0f66e4b14610b20578063dc6e9cf914610b50578063dd62ed3e14610b66578063ddfbd8dd14610bac578063e932012b14610bbf57005b8063c76ae540116100f4578063c76ae54014610aad578063c8a1465c14610ac2578063cb9ae70714610ad5578063cfcb52d414610aeb578063d0856d1614610b0b57005b8063a7ef6b8f14610a42578063a9059cbb14610a62578063b5ade81b14610a82578063c0abebe014610a9857005b80638ae0368b116101aa57806397566aa01161017157806397566aa0146109c057806399f584b3146109e05780639e96a23a146109f6578063a2ac4c3714610a0c578063a68eb88e14610a2c57005b80638ae0368b146109275780638c0838ab1461093d5780638da5cb5b1461095057806394b939ef1461097057806395d89b411461099057005b8063819c9d9e116101ee578063819c9d9e146108bd578063829965cc146108d257806387a2a9d6146108e85780638a083c98146108fe5780638a769d351461091157005b806370a082311461083f578063757991a81461087557806377ed6b141461088a57806381269a561461089d57005b80632d38bf7a1161032157806345d8a232116102af5780634ef37628116102765780634ef37628146107c95780634fa972e1146107de578063653517ef146107f457806369d3e5df146108095780636de9f32b1461082957005b806345d8a23214610762578063467d809e1461077857806347353b691461078b578063490203a71461079e5780634cbf68fe146107b357005b806334d5b131116102f357806334d5b131146106ec57806335b80bfb146107015780633c953615146107215780633dc8a068146107375780634513e1441461074d57005b80632d38bf7a146106625780632f104e0c14610678578063313ce567146106b057806332e99708146106d757005b80631763a089116103a9578063237ef7db11610370578063237ef7db146105ec5780632381a60e1461060257806323b872dd14610618578063240c3b70146106385780632b112e491461064d57005b80631763a0891461058657806317da485f1461059b5780631801fbe5146105b057806318160ddd146105c35780631fccb33c146105d957005b80630a891b83116103ed5780630a891b83146104b45780630c97e564146104e9578063102943171461052f578063111f95d814610545578063150b7a021461055a57005b8063012d3edf1461042457806305411d881461044d57806306fdde0314610462578063095ea7b31461048457005b3661042257005b005b34801561043057600080fd5b5061043a601b5481565b6040519081526020015b60405180910390f35b34801561045957600080fd5b5061043a610c25565b34801561046e57600080fd5b50610477610c3a565b60405161044491906138e0565b34801561049057600080fd5b506104a461049f36600461394a565b610cc8565b6040519015158152602001610444565b3480156104c057600080fd5b506104c9610d35565b604080519485526020850193909352918301526060820152608001610444565b3480156104f557600080fd5b506105166105043660046139bd565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b03199091168152602001610444565b34801561053b57600080fd5b5061043a60155481565b34801561055157600080fd5b5061043a610dbd565b34801561056657600080fd5b50610516610575366004613a35565b630a85bd0160e11b95945050505050565b34801561059257600080fd5b5061043a610f1c565b3480156105a757600080fd5b5061043a610f53565b6104a46105be366004613aa4565b610f6c565b3480156105cf57600080fd5b5061043a60055481565b6104a46105e7366004613b7e565b610f83565b3480156105f857600080fd5b5061043a60095481565b34801561060e57600080fd5b5061043a60115481565b34801561062457600080fd5b506104a4610633366004613bdf565b611046565b34801561064457600080fd5b506104c9611132565b34801561065957600080fd5b5061043a6111a2565b34801561066e57600080fd5b5061043a600f5481565b34801561068457600080fd5b50600454610698906001600160a01b031681565b6040516001600160a01b039091168152602001610444565b3480156106bc57600080fd5b506106c5601281565b60405160ff9091168152602001610444565b3480156106e357600080fd5b50600d5461043a565b3480156106f857600080fd5b5061043a61122d565b34801561070d57600080fd5b5061043a61071c366004613c1b565b611330565b34801561072d57600080fd5b5061043a601c5481565b34801561074357600080fd5b5061043a60145481565b34801561075957600080fd5b5061043a611414565b34801561076e57600080fd5b5061043a60015481565b6104a4610786366004613aa4565b611427565b6104a4610799366004613c34565b611434565b3480156107aa57600080fd5b5061043a611511565b3480156107bf57600080fd5b5061043a601a5481565b3480156107d557600080fd5b50600e5461043a565b3480156107ea57600080fd5b5061043a60105481565b34801561080057600080fd5b5061043a611569565b34801561081557600080fd5b506104a4610824366004613c6d565b61158b565b34801561083557600080fd5b5061043a60175481565b34801561084b57600080fd5b5061043a61085a366004613cb6565b6001600160a01b031660009081526018602052604090205490565b34801561088157600080fd5b5060085461043a565b6104a4610898366004613c34565b6115d7565b3480156108a957600080fd5b506104a46108b8366004613cd1565b611658565b3480156108c957600080fd5b5061043a6116a3565b3480156108de57600080fd5b5061043a60085481565b3480156108f457600080fd5b5061043a600b5481565b6104a461090c366004613b7e565b6116c1565b34801561091d57600080fd5b5061043a600d5481565b34801561093357600080fd5b5061043a600e5481565b61043a61094b366004613d03565b611777565b34801561095c57600080fd5b50600054610698906001600160a01b031681565b34801561097c57600080fd5b50600254610698906001600160a01b031681565b34801561099c57600080fd5b50610477604051806040016040528060048152602001634142415360e01b81525081565b3480156109cc57600080fd5b5061043a6109db366004613d38565b611aaa565b3480156109ec57600080fd5b5061043a60135481565b348015610a0257600080fd5b5061043a601d5481565b348015610a1857600080fd5b5061043a610a27366004613c1b565b611ae5565b348015610a3857600080fd5b5061043a60165481565b348015610a4e57600080fd5b50600354610698906001600160a01b031681565b348015610a6e57600080fd5b506104a4610a7d36600461394a565b611bb5565b348015610a8e57600080fd5b5061043a600a5481565b348015610aa457600080fd5b5060175461043a565b348015610ab957600080fd5b5061043a611c3a565b61043a610ad0366004613d64565b611c4c565b348015610ae157600080fd5b5061043a60205481565b348015610af757600080fd5b50610422610b06366004613ddb565b61204a565b348015610b1757600080fd5b5061042261220f565b348015610b2c57600080fd5b50610b356124bb565b60408051938452602084019290925290820152606001610444565b348015610b5c57600080fd5b5061043a600c5481565b348015610b7257600080fd5b5061043a610b81366004613ddb565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b61043a610bba366004613d03565b61253f565b348015610bcb57600080fd5b5061043a60075481565b61043a610be3366004613d64565b612920565b348015610bf457600080fd5b50333161043a565b61043a610c0a366004613d64565b612c92565b348015610c1b57600080fd5b5061043a60125481565b600060155442610c359190613e24565b905090565b601e8054610c4790613e37565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7390613e37565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b505050505081565b3360008181526019602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d239086815260200190565b60405180910390a35060015b92915050565b600080600080601b54600854610d4b9190613e24565b600003610d6357506000925082915081905080610db7565b6007544290600090610d759083613e24565b9050610d7f611c3a565b610d899082613e87565b9250610d9483611330565b93506301e13380610da58482613e87565b9550610db18686613e9b565b96505050505b90919293565b6000601b54600854610dcf9190613e24565b600003610de557600d54600b54610c3591613225565b6007544290600090610df79083613e24565b90506000601b54600854610e0b9190613e24565b9050600081600154610e1d9190613e9b565b9050600081841015610e93576000610e4085610e3a856064613276565b90613225565b90506000610e5b6103e8610e558460646132de565b9061332a565b9050610e8a610e8182610e7b6107d0600d5461322590919063ffffffff16565b90613276565b600d54906132de565b92505050610ee7565b6000610ea483610e3a876064613276565b90506000610eb96103e8610e558460646132de565b9050610ee2610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5490613342565b925050505b600c54811015610ef65750600c545b600b54811115610f055750600b545b600b54610f129082613225565b9550505050505090565b60006008600a54610f2d9190613e87565b601a54610f3a9190613eb2565b6008600a54610f499190613e87565b610c359190613e24565b6000610c35600d54600b5461322590919063ffffffff16565b6000610f7983833361253f565b5060019392505050565b60008083516001610f949190613ec6565b67ffffffffffffffff811115610fac57610fac613ac6565b604051908082528060200260200182016040528015610fd5578160200160208202803683370190505b50905060005b8451610fe8906001613ec6565b81101561102c578382828151811061100257611002613ed9565b6001600160a01b03909216602092830291909101909101528061102481613eef565b915050610fdb565b5061103986868684611c4c565b5060019695505050505050565b6001600160a01b03831660009081526018602052604081205461106990836132de565b6001600160a01b03851660009081526018602090815260408083209390935560198152828220338352905220546110a090836132de565b6001600160a01b0380861660009081526019602090815260408083203384528252808320949094559186168152601890915220546110de9083613342565b6001600160a01b038085166000818152601860205260409081902093909355915190861690600080516020614326833981519152906111209086815260200190565b60405180910390a35060019392505050565b6000806000806000611142610d35565b505050905061016d816111559190613e87565b91508160000361117357600080600080945094509450945050610db7565b816017546010546111849190613e24565b61118e9190613e87565b601054601754919650945092505090919293565b6003546040805160016224c73d60e11b0319815290516000926001600160a01b03169163ffb671869160048083019260209291908290030181865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190613f08565b6012546017546112239190613ec6565b610c359190613ec6565b6000601b5460085461123f9190613e24565b60000361126657601d546001036112575750600a5490565b6008600a54610c359190613e87565b60095442906000906112789083613e24565b905060006008600a5461128b9190613e87565b601b5460085461129b9190613e24565b6112a59190613eb2565b6001546112b29190613e9b565b905080821115611306576008600a546112cb9190613e87565b601b546008546112db9190613e24565b6112e59190613eb2565b6008600a546112f49190613e87565b6112fe9190613e24565b935050505090565b600a54601b546008546113199190613e24565b6113239190613eb2565b600a546112fe9190613e24565b600080600154836103786113449190613e9b565b61134e9190613e87565b90506000610378611360836064613e9b565b61136a9190613e87565b90506000610bb88210156113c65761138b610378610e3a856297bb70613e9b565b6113b5620c084061139d600287614005565b6113a890600f613e9b565b610e3a906207c2be613e9b565b6113bf9190613ec6565b90506113f5565b6113e46103786113d7856018613e9b565b610e3a90624d9b6c613e9b565b6113f29063ce09d1b0613ec6565b90505b61140b6305f5e10082601154610e3a9190613e9b565b95945050505050565b6000610c3560155442610a279190613e24565b6000610f79838333611777565b600061143e6116a3565b156114645760405162461bcd60e51b815260040161145b90614014565b60405180910390fd5b61146f83833361253f565b50604051635c46a7ef60e11b81523060048201523360248201526044810185905260806064820152600060848201526001600160a01b0386169063b88d4fde9060a4015b600060405180830381600087803b1580156114cd57600080fd5b505af11580156114e1573d6000803e3d6000fd5b505050506114ed6116a3565b60000361150657601a54611502906001613342565b601a555b506001949350505050565b60006008600f5410156115355761152a6012600a614071565b610c35906014613e9b565b610c356007600f546115479190613e24565b611552906002614071565b61155e6012600a614071565b610e3a906014613e9b565b6000806015544261157a9190613e24565b905061158581611330565b91505090565b6000808483886040516020016115a39392919061407d565b604051602081830303815290604052805190602001209050838160001c11156115cb57600080fd5b90941495945050505050565b60006115e16116a3565b156115fe5760405162461bcd60e51b815260040161145b90614014565b61160983833361253f565b50604051637921219560e11b8152306004820152336024820152604481018590526001606482015260a06084820152600060a48201526001600160a01b0386169063f242432a9060c4016114b3565b6000808333876040516020016116709392919061407d565b604051602081830303815290604052805190602001209050828160001c111561169857600080fd5b909314949350505050565b60006008600a546116b49190613e87565b601a54610c359190613eb2565b600080835160016116d29190613ec6565b67ffffffffffffffff8111156116ea576116ea613ac6565b604051908082528060200260200182016040528015611713578160200160208202803683370190505b50905060005b8451611726906001613ec6565b81101561176a578382828151811061174057611740613ed9565b6001600160a01b03909216602092830291909101909101528061176281613eef565b915050611719565b5061103986868684612920565b600080600e5433866040516020016117919392919061407d565b6040516020818303038152906040528051906020012090508381146117c85760405162461bcd60e51b815260040161145b906140a5565b600d5481106117e95760405162461bcd60e51b815260040161145b906140f3565b6117f1613390565b60155442116118425760405162461bcd60e51b815260206004820152601d60248201527f4e6f20736f6c766520666f722066697273742035207365636f6e64732e000000604482015260640161145b565b6000600154601554426118559190613e24565b61186190610378613e9b565b61186b9190613e87565b9050600061037861187d836064613e9b565b6118879190613e87565b905060648111156118a457601a546118a0906001613342565b601a555b610bb881101561192a576118c1610378610e3a846297bb70613e9b565b6118d3620c084061139d600286614005565b6118dd9190613ec6565b9350600a6118eb8282613ec6565b6118f59190613e87565b6119069066038d7ea4c68000613e87565b3410156119255760405162461bcd60e51b815260040161145b9061413b565b6119b5565b61193b6103786113d7846018613e9b565b6119499063ce09d1b0613ec6565b93506117708110156119b557611961610bb382613e24565b9050600a61196f8282613ec6565b6119799190613e87565b611985906101f4613e9b565b6119969066038d7ea4c68000613e87565b3410156119b55760405162461bcd60e51b815260040161145b906141be565b60006119cd6305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506119f39082613342565b6001600160a01b03871660008181526018602052604080822093909355915190919060008051602061432683398151915290611a329085815260200190565b60405180910390a3601754611a479082613342565b60175542601555600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d906060015b60405180910390a2505050509392505050565b600080600e543386604051602001611ac49392919061407d565b60408051808303601f19018152919052805160209091012095945050505050565b60008060015483610378611af99190613e9b565b611b039190613e87565b90506000610378611b15836064613e9b565b611b1f9190613e87565b9050610bb88110611b8857611770811015611b7e57611b40610bb382613e24565b9050600a611b4f826007613ec6565b611b599190613e87565b611b65906101f4613e9b565b611b769066038d7ea4c68000613e87565b949350505050565b5060009392505050565b6012811115611b9f57611b9c600382613e24565b90505b600a611bab8282613ec6565b611b659190613e87565b33600090815260186020526040812054611bcf90836132de565b33600090815260186020526040808220929092556001600160a01b03851681522054611bfb9083613342565b6001600160a01b03841660008181526018602052604090819020929092559051339060008051602061432683398151915290610d239086815260200190565b6000601b54600854610c359190613e24565b600080611c74868685600081518110611c6757611c67613ed9565b602002602001015161253f565b905060008111611cb35760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351611cc0906001613ec6565b835114611cdf5760405162461bcd60e51b815260040161145b90614259565b60005b8451811015611db657611cf6816001613ec6565b611d01906002614071565b600854611d0e9190613eb2565b600003611db6576000611d22826001613ec6565b90505b8551811015611da357858281518110611d4057611d40613ed9565b60200260200101516001600160a01b0316868281518110611d6357611d63613ed9565b60200260200101516001600160a01b031603611d915760405162461bcd60e51b815260040161145b906142b6565b80611d9b81613eef565b915050611d25565b5080611dae81613eef565b915050611ce2565b60008060005b83811015611fec57611dcf816001613ec6565b611dda906002614071565b600854611de79190613eb2565b600003611fda57878181518110611e0057611e00613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e749190613f08565b91508115611f1557611e87600382613eb2565b158015611e9357508015155b8015611ea2575063010c8e0085115b15611ee357611edc6501d1a94a20008684600f546002611ec29190614071565b611ecc9190613e9b565b611ed69190613e9b565b90613640565b9250611f15565b611f126501d1a94a20008684600f546002611efe9190614071565b611f089190613e9b565b610e3a9190613e9b565b92505b878181518110611f2757611f27613ed9565b60200260200101516001600160a01b031663a9059cbb88836001611f4b9190613ec6565b81518110611f5b57611f5b613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401611f959291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd891906142ed565b505b80611fe481613eef565b915050611dbc565b50600854600e5460408051928352602083019190915281018490526060810185905233907f87e5a7775b8ac2ead741e32752431bffeff76ec5f347cc202a6bad454653930b9060800160405180910390a25091979650505050505050565b6000546001600160a01b031633146120915760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b6021546a115eec47f6cf7e350000009060ff16156120b1576120b161430f565b6021805460ff19166001179055426015556120ce6012600a614071565b6120d9906014613e9b565b6011556000600f81905560178190556008819055601b55612102670de0b6b3a764000047613e87565b6013819055612114906203d090613e9b565b612121906203d090613ec6565b47600f5460026121319190614071565b61213b9190613e9b565b6121459190613e87565b601655600b54612157906103e8613225565b600d5542600755612166613390565b612171600282613e87565b6001600160a01b038416600081815260186020526040812092909255906000805160206143268339815191526121a8600285613e87565b60405190815260200160405180910390a3600280546001600160a01b03199081166001600160a01b038681169182179093556003805483169091179055600480549091169184169190911790556001601a5560085460145561220a60006136a8565b505050565b612221670de0b6b3a764000047613e87565b6013819055612233906203d090613e9b565b612240906203d090613ec6565b47600f5460026122509190614071565b61225a9190613e9b565b6122649190613e87565b601655601f546000906122779042613e24565b9050600060145460085461228b9190613e24565b905060006122998284613e87565b90506008600f5410156122c857600f546122b4906002614071565b6122c0906102d0613e9b565b6001556122de565b6122da6007600f546115479190613e24565b6011555b60006122f460015483610378611ed69190613e9b565b90506000610378612306836064613e9b565b6123109190613e87565b905060006107d082101561235457612331610378610e3a856297bb70613e9b565b612343620c084061139d600287614005565b61234d9190613ec6565b905061235b565b5063bebc20005b60006123746305f5e1008360115489611f089190613e9b565b6004546001600160a01b031660009081526018602052604090205490915061239c9082613342565b600480546001600160a01b039081166000908152601860205260408082209490945591549251921691600080516020614326833981519152906123e29085815260200190565b60405180910390a36012546123f79082613342565b601255600a5460165460049161240c91613e9b565b6124179060c8613e9b565b6124219190613e87565b4711156124a257600454601c546016546001600160a01b0390921691612451916305f5e10091611efe878c613e9b565b6040519093506001600160a01b0382169084156108fc029085906000818181858888f1935050505015801561248a573d6000803e3d6000fd5b50601d54612499906001613e9b565b601c55506124a8565b6000601c555b5050600854601455505042601f55505050565b60008060006124c8611c3a565b6000036124db5750600092839250829150565b60075442906000906124ed9083613e24565b905060006124f9611c3a565b6125039083613e87565b9050600061250f611132565b505050905060008282620151806125269190613e9b565b6125309190613e87565b98929750909550909350505050565b600080600e5433866040516020016125599392919061407d565b6040516020818303038152906040528051906020012090508381146125905760405162461bcd60e51b815260040161145b906140a5565b600d5481106125b15760405162461bcd60e51b815260040161145b906140f3565b6125b9613390565b60155442116126025760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b6000600154601554426126159190613e24565b61262190610378613e9b565b61262b9190613e87565b9050600061037861263d836064613e9b565b6126479190613e87565b9050606481111561266457601a54612660906001613342565b601a555b610bb88110156126ea57612681610378610e3a846297bb70613e9b565b612693620c084061139d600286614005565b61269d9190613ec6565b9350600a6126ab8282613ec6565b6126b59190613e87565b6126c69066038d7ea4c68000613e87565b3410156126e55760405162461bcd60e51b815260040161145b9061413b565b612779565b6126fb6103786113d7846018613e9b565b6127099063ce09d1b0613ec6565b9350611770811015612779576000612723610bb383613e24565b9050600a6127318282613ec6565b61273b9190613e87565b612747906101f4613e9b565b6127589066038d7ea4c68000613e87565b3410156127775760405162461bcd60e51b815260040161145b906141be565b505b60006127916305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506127b79082613342565b6001600160a01b038716600081815260186020526040808220939093559151909190600080516020614326833981519152906127f69085815260200190565b60405180910390a360175461280b9082613342565b60175542601555601c54156128d3576107d082101561287e576000869050806001600160a01b03166108fc61284f6305f5e100601c546016548b611f089190613e9b565b6040518115909202916000818181858888f19350505050158015612877573d6000803e3d6000fd5b50506128d3565b6000869050806001600160a01b03166108fc6128a8600a601c54601654610140611f089190613e9b565b6040518115909202916000818181858888f193505050501580156128d0573d6000803e3d6000fd5b50505b600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d90606001611a97565b60008061294886868560008151811061293b5761293b613ed9565b6020026020010151611777565b9050600081116129875760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351612994906001613ec6565b8351146129b35760405162461bcd60e51b815260040161145b90614259565b60005b8451811015612a8a576129ca816001613ec6565b6129d5906002614071565b6008546129e29190613eb2565b600003612a8a5760006129f6826001613ec6565b90505b8551811015612a7757858281518110612a1457612a14613ed9565b60200260200101516001600160a01b0316868281518110612a3757612a37613ed9565b60200260200101516001600160a01b031603612a655760405162461bcd60e51b815260040161145b906142b6565b80612a6f81613eef565b9150506129f9565b5080612a8281613eef565b9150506129b6565b60008060005b83811015611fec57612aa3816001613ec6565b612aae906002614071565b600854612abb9190613eb2565b600003612c8057878181518110612ad457612ad4613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b489190613f08565b91508115612bbb57612b5b600382613eb2565b158015612b6757508015155b8015612b76575063010c8e0085115b15612b9d57612b966501d1a94a20008684600f546002611ec29190614071565b9250612bbb565b612bb86501d1a94a20008684600f546002611efe9190614071565b92505b878181518110612bcd57612bcd613ed9565b60200260200101516001600160a01b031663a9059cbb88836001612bf19190613ec6565b81518110612c0157612c01613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401612c3b9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7e91906142ed565b505b80612c8a81613eef565b915050612a90565b600080600e543387604051602001612cac9392919061407d565b604051602081830303815290604052805190602001209050848114612ce35760405162461bcd60e51b815260040161145b906140a5565b600d548110612d045760405162461bcd60e51b815260040161145b906140f3565b612d0c613390565b6015544211612d555760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b8351835114612dcc5760405162461bcd60e51b815260206004820152603a60248201527f4d696e74546f2068617320746f20686176652073616d65206e756d626572206f60448201527f66206164647265737373657320617320457874726146756e6473000000000000606482015260840161145b565b60005b8451811015612ea357612de3816001613ec6565b612dee906002614071565b600854612dfb9190613eb2565b600003612ea3576000612e0f826001613ec6565b90505b8551811015612e9057858281518110612e2d57612e2d613ed9565b60200260200101516001600160a01b0316868281518110612e5057612e50613ed9565b60200260200101516001600160a01b031603612e7e5760405162461bcd60e51b815260040161145b906142b6565b80612e8881613eef565b915050612e12565b5080612e9b81613eef565b915050612dcf565b600060015460155442612eb69190613e24565b612ec290610378613e9b565b612ecc9190613e87565b90506000610378612ede836064613e9b565b612ee89190613e87565b905060006064821115612f0757601a54612f03906001613342565b601a555b610bb8821015612f8d57612f24610378610e3a856297bb70613e9b565b612f36620c084061139d600287614005565b612f409190613ec6565b9050600a612f4e8382613ec6565b612f589190613e87565b612f699066038d7ea4c68000613e87565b341015612f885760405162461bcd60e51b815260040161145b9061413b565b613018565b612f9e6103786113d7856018613e9b565b612fac9063ce09d1b0613ec6565b905061177082101561301857612fc4610bb383613e24565b9150600a612fd28382613ec6565b612fdc9190613e87565b612fe8906101f4613e9b565b612ff99066038d7ea4c68000613e87565b3410156130185760405162461bcd60e51b815260040161145b906141be565b6000805b858110156132125761302f856001613ec6565b61303a906002614071565b6008546130479190613eb2565b6000036132005789858151811061306057613060613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156130b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d49190613f08565b91508115613200576130e7600386613eb2565b1580156130f357508415155b8015613102575063010c8e0083115b15613129576131226501d1a94a20008484600f546002611ec29190614071565b9250613147565b6131446501d1a94a20008484600f546002611efe9190614071565b92505b89858151811061315957613159613ed9565b60200260200101516001600160a01b031663a9059cbb8a878151811061318157613181613ed9565b6020026020010151856040518363ffffffff1660e01b81526004016131bb9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156131da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fe91906142ed565b505b8061320a81613eef565b91505061301c565b5050426015559998505050505050505050565b6000816000036132655760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b61326f8284613e87565b9392505050565b60008260000361328857506000610d2f565b60006132948385613e9b565b9050826132a18583613e87565b1461326f5760405162461bcd60e51b815260206004820152600d60248201526c4d756c74206f766572666c6f7760981b604482015260640161145b565b6000818310156133205760405162461bcd60e51b815260206004820152600d60248201526c53756220756e646572666c6f7760981b604482015260640161145b565b61326f8284613e24565b60008183111561333b575080610d2f565b5090919050565b60008061334f8385613ec6565b90508381101561326f5760405162461bcd60e51b815260206004820152600c60248201526b416464206f766572666c6f7760a01b604482015260640161145b565b6010546011546017546133a291613342565b1180156133b05750600f8054105b1561348157600f546133c3906001613ec6565b600f8190556133eb906133d7906001613ec6565b6133e2906002614071565b60065490613225565b6006546133f89190613e24565b601055600f546008111561346b57600c54613414906002613225565b600c55600f54613425906002614071565b613431906102d0613e9b565b600155600f5460061115613466576010600a5411613453576008600a55613481565b6002600a546134629190613e87565b600a555b613481565b61347d6007600f546115479190613e24565b6011555b60085461348f906001613342565b6008908155600a546134a19190613e87565b601b546008546134b19190613e24565b6134bb9190613eb2565b60000361355d576134ca61220f565b6134dc600f5460016133d79190613ec6565b6006546134e99190613e24565b60105560095442906000906134fe9083613e24565b905060006008600a546135119190613e87565b60015461351e9190613e9b565b4260095590508082118061354c5750600a54601b546008546135409190613e24565b61354a9190613eb2565b155b1561355957613559613758565b5050505b60646001600160a01b0316632b407a82600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d29190613f08565b6135dc9190613e24565b6040518263ffffffff1660e01b81526004016135fa91815260200190565b602060405180830381865afa158015613617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363b9190613f08565b600e55565b6000816000036136805760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b600061368c8385613e87565b90506136988385613eb2565b1561326f57611b76816001613ec6565b6000546001600160a01b031633146136ef5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b600054604080516001600160a01b03928316815291831660208301527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600754429060009061376a9083613e24565b90506000601b5460085461377e9190613e24565b90506000816001546137909190613e9b565b600854601b559050808310156137f65760006137b184610e3a846064613276565b6001601d55905060006137cb6103e8610e558460646132de565b90506137eb610e8182610e7b6107d0600d5461322590919063ffffffff16565b600d55506138479050565b600061380782610e3a866064613276565b6002601d55905060006138216103e8610e558460646132de565b9050613841610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5550505b8360078190555060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190613f08565b602055600c54600d5410156138c757600c54600d555b600b54600d5411156138da57600b54600d555b50505050565b600060208083528351808285015260005b8181101561390d578581018301518582016040015282016138f1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461394557600080fd5b919050565b6000806040838503121561395d57600080fd5b6139668361392e565b946020939093013593505050565b60008083601f84011261398657600080fd5b50813567ffffffffffffffff81111561399e57600080fd5b6020830191508360208285010111156139b657600080fd5b9250929050565b60008060008060008060a087890312156139d657600080fd5b6139df8761392e565b95506139ed6020880161392e565b94506040870135935060608701359250608087013567ffffffffffffffff811115613a1757600080fd5b613a2389828a01613974565b979a9699509497509295939492505050565b600080600080600060808688031215613a4d57600080fd5b613a568661392e565b9450613a646020870161392e565b935060408601359250606086013567ffffffffffffffff811115613a8757600080fd5b613a9388828901613974565b969995985093965092949392505050565b60008060408385031215613ab757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613aed57600080fd5b8135602067ffffffffffffffff80831115613b0a57613b0a613ac6565b8260051b604051601f19603f83011681018181108482111715613b2f57613b2f613ac6565b604052938452858101830193838101925087851115613b4d57600080fd5b83870191505b84821015613b7357613b648261392e565b83529183019190830190613b53565b979650505050505050565b60008060008060808587031215613b9457600080fd5b8435935060208501359250604085013567ffffffffffffffff811115613bb957600080fd5b613bc587828801613adc565b925050613bd46060860161392e565b905092959194509250565b600080600060608486031215613bf457600080fd5b613bfd8461392e565b9250613c0b6020850161392e565b9150604084013590509250925092565b600060208284031215613c2d57600080fd5b5035919050565b60008060008060808587031215613c4a57600080fd5b613c538561392e565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215613c8557600080fd5b85359450602086013593506040860135925060608601359150613caa6080870161392e565b90509295509295909350565b600060208284031215613cc857600080fd5b61326f8261392e565b60008060008060808587031215613ce757600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613d1857600080fd5b8335925060208401359150613d2f6040850161392e565b90509250925092565b600080600060608486031215613d4d57600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215613d7a57600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115613da057600080fd5b613dac88838901613adc565b93506060870135915080821115613dc257600080fd5b50613dcf87828801613adc565b91505092959194509250565b60008060408385031215613dee57600080fd5b613df78361392e565b9150613e056020840161392e565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d2f57610d2f613e0e565b600181811c90821680613e4b57607f821691505b602082108103613e6b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b600082613e9657613e96613e71565b500490565b8082028115828204841417610d2f57610d2f613e0e565b600082613ec157613ec1613e71565b500690565b80820180821115610d2f57610d2f613e0e565b634e487b7160e01b600052603260045260246000fd5b600060018201613f0157613f01613e0e565b5060010190565b600060208284031215613f1a57600080fd5b5051919050565b600181815b80851115613f5c578160001904821115613f4257613f42613e0e565b80851615613f4f57918102915b93841c9390800290613f26565b509250929050565b600082613f7357506001610d2f565b81613f8057506000610d2f565b8160018114613f965760028114613fa057613fbc565b6001915050610d2f565b60ff841115613fb157613fb1613e0e565b50506001821b610d2f565b5060208310610133831016604e8410600b8410161715613fdf575081810a610d2f565b613fe98383613f21565b8060001904821115613ffd57613ffd613e0e565b029392505050565b600061326f60ff841683613f64565b60208082526039908201527f4f6e6c79206d696e74206f6e20736c6f77426c6f636b732025205f424c4f434b60408201527f535f5045525f524541444a5553544d454e542f38203d3d203000000000000000606082015260800190565b600061326f8383613f64565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252602e908201527f4f6c64206368616c6c656e67655f646967657374206f722077726f6e6720636860408201526d185b1b195b99d957d91a59d95cdd60921b606082015260800190565b60208082526028908201527f446967657374206d75737420626520736d616c6c6572207468616e206d696e696040820152671b99d5185c99d95d60c21b606082015260800190565b6020808252605a908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f726573206574682c20636865636b20686f774d75636845544828292066756e6360608201527f74696f6e20746f2066696e6420616d6f756e74206e6565646564000000000000608082015260a00190565b6020808252606f908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f7265732065746820756e74696c203630782074617267657454696d652c20636860608201527f65636b20686f774d75636845544828292066756e6374696f6e20746f2066696e60808201526e1908185b5bdd5b9d081b9959591959608a1b60a082015260c00190565b6020808252603a908201527f4d696e74546f2068617320746f206861766520616e206578747261206164647260408201527f65737320636f6d706172656420746f20457874726146756e6473000000000000606082015260800190565b6020808252601b908201527f4e6f207072696e74696e67205468652073616d6520746f6b656e730000000000604082015260600190565b6000602082840312156142ff57600080fd5b8151801515811461326f57600080fd5b634e487b7160e01b600052600160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122071e9ef78024eb4834277a390da30104b57ebfd0816c68d6436d099cb420b937c64736f6c63430008110033417262697472756d20426974636f696e20616e64205374616b696e6720546f6b656e

Deployed Bytecode

0x60806040526004361061041b5760003560e01c806370a082311161021c578063a7ef6b8f11610122578063d0f66e4b116100b0578063f23a6e6111610077578063f23a6e61146104e9578063f2f3bf2d14610bd5578063f56f8d3614610be8578063f7a5f15514610bfc578063f95d391914610c0f57005b8063d0f66e4b14610b20578063dc6e9cf914610b50578063dd62ed3e14610b66578063ddfbd8dd14610bac578063e932012b14610bbf57005b8063c76ae540116100f4578063c76ae54014610aad578063c8a1465c14610ac2578063cb9ae70714610ad5578063cfcb52d414610aeb578063d0856d1614610b0b57005b8063a7ef6b8f14610a42578063a9059cbb14610a62578063b5ade81b14610a82578063c0abebe014610a9857005b80638ae0368b116101aa57806397566aa01161017157806397566aa0146109c057806399f584b3146109e05780639e96a23a146109f6578063a2ac4c3714610a0c578063a68eb88e14610a2c57005b80638ae0368b146109275780638c0838ab1461093d5780638da5cb5b1461095057806394b939ef1461097057806395d89b411461099057005b8063819c9d9e116101ee578063819c9d9e146108bd578063829965cc146108d257806387a2a9d6146108e85780638a083c98146108fe5780638a769d351461091157005b806370a082311461083f578063757991a81461087557806377ed6b141461088a57806381269a561461089d57005b80632d38bf7a1161032157806345d8a232116102af5780634ef37628116102765780634ef37628146107c95780634fa972e1146107de578063653517ef146107f457806369d3e5df146108095780636de9f32b1461082957005b806345d8a23214610762578063467d809e1461077857806347353b691461078b578063490203a71461079e5780634cbf68fe146107b357005b806334d5b131116102f357806334d5b131146106ec57806335b80bfb146107015780633c953615146107215780633dc8a068146107375780634513e1441461074d57005b80632d38bf7a146106625780632f104e0c14610678578063313ce567146106b057806332e99708146106d757005b80631763a089116103a9578063237ef7db11610370578063237ef7db146105ec5780632381a60e1461060257806323b872dd14610618578063240c3b70146106385780632b112e491461064d57005b80631763a0891461058657806317da485f1461059b5780631801fbe5146105b057806318160ddd146105c35780631fccb33c146105d957005b80630a891b83116103ed5780630a891b83146104b45780630c97e564146104e9578063102943171461052f578063111f95d814610545578063150b7a021461055a57005b8063012d3edf1461042457806305411d881461044d57806306fdde0314610462578063095ea7b31461048457005b3661042257005b005b34801561043057600080fd5b5061043a601b5481565b6040519081526020015b60405180910390f35b34801561045957600080fd5b5061043a610c25565b34801561046e57600080fd5b50610477610c3a565b60405161044491906138e0565b34801561049057600080fd5b506104a461049f36600461394a565b610cc8565b6040519015158152602001610444565b3480156104c057600080fd5b506104c9610d35565b604080519485526020850193909352918301526060820152608001610444565b3480156104f557600080fd5b506105166105043660046139bd565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b03199091168152602001610444565b34801561053b57600080fd5b5061043a60155481565b34801561055157600080fd5b5061043a610dbd565b34801561056657600080fd5b50610516610575366004613a35565b630a85bd0160e11b95945050505050565b34801561059257600080fd5b5061043a610f1c565b3480156105a757600080fd5b5061043a610f53565b6104a46105be366004613aa4565b610f6c565b3480156105cf57600080fd5b5061043a60055481565b6104a46105e7366004613b7e565b610f83565b3480156105f857600080fd5b5061043a60095481565b34801561060e57600080fd5b5061043a60115481565b34801561062457600080fd5b506104a4610633366004613bdf565b611046565b34801561064457600080fd5b506104c9611132565b34801561065957600080fd5b5061043a6111a2565b34801561066e57600080fd5b5061043a600f5481565b34801561068457600080fd5b50600454610698906001600160a01b031681565b6040516001600160a01b039091168152602001610444565b3480156106bc57600080fd5b506106c5601281565b60405160ff9091168152602001610444565b3480156106e357600080fd5b50600d5461043a565b3480156106f857600080fd5b5061043a61122d565b34801561070d57600080fd5b5061043a61071c366004613c1b565b611330565b34801561072d57600080fd5b5061043a601c5481565b34801561074357600080fd5b5061043a60145481565b34801561075957600080fd5b5061043a611414565b34801561076e57600080fd5b5061043a60015481565b6104a4610786366004613aa4565b611427565b6104a4610799366004613c34565b611434565b3480156107aa57600080fd5b5061043a611511565b3480156107bf57600080fd5b5061043a601a5481565b3480156107d557600080fd5b50600e5461043a565b3480156107ea57600080fd5b5061043a60105481565b34801561080057600080fd5b5061043a611569565b34801561081557600080fd5b506104a4610824366004613c6d565b61158b565b34801561083557600080fd5b5061043a60175481565b34801561084b57600080fd5b5061043a61085a366004613cb6565b6001600160a01b031660009081526018602052604090205490565b34801561088157600080fd5b5060085461043a565b6104a4610898366004613c34565b6115d7565b3480156108a957600080fd5b506104a46108b8366004613cd1565b611658565b3480156108c957600080fd5b5061043a6116a3565b3480156108de57600080fd5b5061043a60085481565b3480156108f457600080fd5b5061043a600b5481565b6104a461090c366004613b7e565b6116c1565b34801561091d57600080fd5b5061043a600d5481565b34801561093357600080fd5b5061043a600e5481565b61043a61094b366004613d03565b611777565b34801561095c57600080fd5b50600054610698906001600160a01b031681565b34801561097c57600080fd5b50600254610698906001600160a01b031681565b34801561099c57600080fd5b50610477604051806040016040528060048152602001634142415360e01b81525081565b3480156109cc57600080fd5b5061043a6109db366004613d38565b611aaa565b3480156109ec57600080fd5b5061043a60135481565b348015610a0257600080fd5b5061043a601d5481565b348015610a1857600080fd5b5061043a610a27366004613c1b565b611ae5565b348015610a3857600080fd5b5061043a60165481565b348015610a4e57600080fd5b50600354610698906001600160a01b031681565b348015610a6e57600080fd5b506104a4610a7d36600461394a565b611bb5565b348015610a8e57600080fd5b5061043a600a5481565b348015610aa457600080fd5b5060175461043a565b348015610ab957600080fd5b5061043a611c3a565b61043a610ad0366004613d64565b611c4c565b348015610ae157600080fd5b5061043a60205481565b348015610af757600080fd5b50610422610b06366004613ddb565b61204a565b348015610b1757600080fd5b5061042261220f565b348015610b2c57600080fd5b50610b356124bb565b60408051938452602084019290925290820152606001610444565b348015610b5c57600080fd5b5061043a600c5481565b348015610b7257600080fd5b5061043a610b81366004613ddb565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b61043a610bba366004613d03565b61253f565b348015610bcb57600080fd5b5061043a60075481565b61043a610be3366004613d64565b612920565b348015610bf457600080fd5b50333161043a565b61043a610c0a366004613d64565b612c92565b348015610c1b57600080fd5b5061043a60125481565b600060155442610c359190613e24565b905090565b601e8054610c4790613e37565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7390613e37565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b505050505081565b3360008181526019602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d239086815260200190565b60405180910390a35060015b92915050565b600080600080601b54600854610d4b9190613e24565b600003610d6357506000925082915081905080610db7565b6007544290600090610d759083613e24565b9050610d7f611c3a565b610d899082613e87565b9250610d9483611330565b93506301e13380610da58482613e87565b9550610db18686613e9b565b96505050505b90919293565b6000601b54600854610dcf9190613e24565b600003610de557600d54600b54610c3591613225565b6007544290600090610df79083613e24565b90506000601b54600854610e0b9190613e24565b9050600081600154610e1d9190613e9b565b9050600081841015610e93576000610e4085610e3a856064613276565b90613225565b90506000610e5b6103e8610e558460646132de565b9061332a565b9050610e8a610e8182610e7b6107d0600d5461322590919063ffffffff16565b90613276565b600d54906132de565b92505050610ee7565b6000610ea483610e3a876064613276565b90506000610eb96103e8610e558460646132de565b9050610ee2610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5490613342565b925050505b600c54811015610ef65750600c545b600b54811115610f055750600b545b600b54610f129082613225565b9550505050505090565b60006008600a54610f2d9190613e87565b601a54610f3a9190613eb2565b6008600a54610f499190613e87565b610c359190613e24565b6000610c35600d54600b5461322590919063ffffffff16565b6000610f7983833361253f565b5060019392505050565b60008083516001610f949190613ec6565b67ffffffffffffffff811115610fac57610fac613ac6565b604051908082528060200260200182016040528015610fd5578160200160208202803683370190505b50905060005b8451610fe8906001613ec6565b81101561102c578382828151811061100257611002613ed9565b6001600160a01b03909216602092830291909101909101528061102481613eef565b915050610fdb565b5061103986868684611c4c565b5060019695505050505050565b6001600160a01b03831660009081526018602052604081205461106990836132de565b6001600160a01b03851660009081526018602090815260408083209390935560198152828220338352905220546110a090836132de565b6001600160a01b0380861660009081526019602090815260408083203384528252808320949094559186168152601890915220546110de9083613342565b6001600160a01b038085166000818152601860205260409081902093909355915190861690600080516020614326833981519152906111209086815260200190565b60405180910390a35060019392505050565b6000806000806000611142610d35565b505050905061016d816111559190613e87565b91508160000361117357600080600080945094509450945050610db7565b816017546010546111849190613e24565b61118e9190613e87565b601054601754919650945092505090919293565b6003546040805160016224c73d60e11b0319815290516000926001600160a01b03169163ffb671869160048083019260209291908290030181865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190613f08565b6012546017546112239190613ec6565b610c359190613ec6565b6000601b5460085461123f9190613e24565b60000361126657601d546001036112575750600a5490565b6008600a54610c359190613e87565b60095442906000906112789083613e24565b905060006008600a5461128b9190613e87565b601b5460085461129b9190613e24565b6112a59190613eb2565b6001546112b29190613e9b565b905080821115611306576008600a546112cb9190613e87565b601b546008546112db9190613e24565b6112e59190613eb2565b6008600a546112f49190613e87565b6112fe9190613e24565b935050505090565b600a54601b546008546113199190613e24565b6113239190613eb2565b600a546112fe9190613e24565b600080600154836103786113449190613e9b565b61134e9190613e87565b90506000610378611360836064613e9b565b61136a9190613e87565b90506000610bb88210156113c65761138b610378610e3a856297bb70613e9b565b6113b5620c084061139d600287614005565b6113a890600f613e9b565b610e3a906207c2be613e9b565b6113bf9190613ec6565b90506113f5565b6113e46103786113d7856018613e9b565b610e3a90624d9b6c613e9b565b6113f29063ce09d1b0613ec6565b90505b61140b6305f5e10082601154610e3a9190613e9b565b95945050505050565b6000610c3560155442610a279190613e24565b6000610f79838333611777565b600061143e6116a3565b156114645760405162461bcd60e51b815260040161145b90614014565b60405180910390fd5b61146f83833361253f565b50604051635c46a7ef60e11b81523060048201523360248201526044810185905260806064820152600060848201526001600160a01b0386169063b88d4fde9060a4015b600060405180830381600087803b1580156114cd57600080fd5b505af11580156114e1573d6000803e3d6000fd5b505050506114ed6116a3565b60000361150657601a54611502906001613342565b601a555b506001949350505050565b60006008600f5410156115355761152a6012600a614071565b610c35906014613e9b565b610c356007600f546115479190613e24565b611552906002614071565b61155e6012600a614071565b610e3a906014613e9b565b6000806015544261157a9190613e24565b905061158581611330565b91505090565b6000808483886040516020016115a39392919061407d565b604051602081830303815290604052805190602001209050838160001c11156115cb57600080fd5b90941495945050505050565b60006115e16116a3565b156115fe5760405162461bcd60e51b815260040161145b90614014565b61160983833361253f565b50604051637921219560e11b8152306004820152336024820152604481018590526001606482015260a06084820152600060a48201526001600160a01b0386169063f242432a9060c4016114b3565b6000808333876040516020016116709392919061407d565b604051602081830303815290604052805190602001209050828160001c111561169857600080fd5b909314949350505050565b60006008600a546116b49190613e87565b601a54610c359190613eb2565b600080835160016116d29190613ec6565b67ffffffffffffffff8111156116ea576116ea613ac6565b604051908082528060200260200182016040528015611713578160200160208202803683370190505b50905060005b8451611726906001613ec6565b81101561176a578382828151811061174057611740613ed9565b6001600160a01b03909216602092830291909101909101528061176281613eef565b915050611719565b5061103986868684612920565b600080600e5433866040516020016117919392919061407d565b6040516020818303038152906040528051906020012090508381146117c85760405162461bcd60e51b815260040161145b906140a5565b600d5481106117e95760405162461bcd60e51b815260040161145b906140f3565b6117f1613390565b60155442116118425760405162461bcd60e51b815260206004820152601d60248201527f4e6f20736f6c766520666f722066697273742035207365636f6e64732e000000604482015260640161145b565b6000600154601554426118559190613e24565b61186190610378613e9b565b61186b9190613e87565b9050600061037861187d836064613e9b565b6118879190613e87565b905060648111156118a457601a546118a0906001613342565b601a555b610bb881101561192a576118c1610378610e3a846297bb70613e9b565b6118d3620c084061139d600286614005565b6118dd9190613ec6565b9350600a6118eb8282613ec6565b6118f59190613e87565b6119069066038d7ea4c68000613e87565b3410156119255760405162461bcd60e51b815260040161145b9061413b565b6119b5565b61193b6103786113d7846018613e9b565b6119499063ce09d1b0613ec6565b93506117708110156119b557611961610bb382613e24565b9050600a61196f8282613ec6565b6119799190613e87565b611985906101f4613e9b565b6119969066038d7ea4c68000613e87565b3410156119b55760405162461bcd60e51b815260040161145b906141be565b60006119cd6305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506119f39082613342565b6001600160a01b03871660008181526018602052604080822093909355915190919060008051602061432683398151915290611a329085815260200190565b60405180910390a3601754611a479082613342565b60175542601555600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d906060015b60405180910390a2505050509392505050565b600080600e543386604051602001611ac49392919061407d565b60408051808303601f19018152919052805160209091012095945050505050565b60008060015483610378611af99190613e9b565b611b039190613e87565b90506000610378611b15836064613e9b565b611b1f9190613e87565b9050610bb88110611b8857611770811015611b7e57611b40610bb382613e24565b9050600a611b4f826007613ec6565b611b599190613e87565b611b65906101f4613e9b565b611b769066038d7ea4c68000613e87565b949350505050565b5060009392505050565b6012811115611b9f57611b9c600382613e24565b90505b600a611bab8282613ec6565b611b659190613e87565b33600090815260186020526040812054611bcf90836132de565b33600090815260186020526040808220929092556001600160a01b03851681522054611bfb9083613342565b6001600160a01b03841660008181526018602052604090819020929092559051339060008051602061432683398151915290610d239086815260200190565b6000601b54600854610c359190613e24565b600080611c74868685600081518110611c6757611c67613ed9565b602002602001015161253f565b905060008111611cb35760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351611cc0906001613ec6565b835114611cdf5760405162461bcd60e51b815260040161145b90614259565b60005b8451811015611db657611cf6816001613ec6565b611d01906002614071565b600854611d0e9190613eb2565b600003611db6576000611d22826001613ec6565b90505b8551811015611da357858281518110611d4057611d40613ed9565b60200260200101516001600160a01b0316868281518110611d6357611d63613ed9565b60200260200101516001600160a01b031603611d915760405162461bcd60e51b815260040161145b906142b6565b80611d9b81613eef565b915050611d25565b5080611dae81613eef565b915050611ce2565b60008060005b83811015611fec57611dcf816001613ec6565b611dda906002614071565b600854611de79190613eb2565b600003611fda57878181518110611e0057611e00613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e749190613f08565b91508115611f1557611e87600382613eb2565b158015611e9357508015155b8015611ea2575063010c8e0085115b15611ee357611edc6501d1a94a20008684600f546002611ec29190614071565b611ecc9190613e9b565b611ed69190613e9b565b90613640565b9250611f15565b611f126501d1a94a20008684600f546002611efe9190614071565b611f089190613e9b565b610e3a9190613e9b565b92505b878181518110611f2757611f27613ed9565b60200260200101516001600160a01b031663a9059cbb88836001611f4b9190613ec6565b81518110611f5b57611f5b613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401611f959291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd891906142ed565b505b80611fe481613eef565b915050611dbc565b50600854600e5460408051928352602083019190915281018490526060810185905233907f87e5a7775b8ac2ead741e32752431bffeff76ec5f347cc202a6bad454653930b9060800160405180910390a25091979650505050505050565b6000546001600160a01b031633146120915760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b6021546a115eec47f6cf7e350000009060ff16156120b1576120b161430f565b6021805460ff19166001179055426015556120ce6012600a614071565b6120d9906014613e9b565b6011556000600f81905560178190556008819055601b55612102670de0b6b3a764000047613e87565b6013819055612114906203d090613e9b565b612121906203d090613ec6565b47600f5460026121319190614071565b61213b9190613e9b565b6121459190613e87565b601655600b54612157906103e8613225565b600d5542600755612166613390565b612171600282613e87565b6001600160a01b038416600081815260186020526040812092909255906000805160206143268339815191526121a8600285613e87565b60405190815260200160405180910390a3600280546001600160a01b03199081166001600160a01b038681169182179093556003805483169091179055600480549091169184169190911790556001601a5560085460145561220a60006136a8565b505050565b612221670de0b6b3a764000047613e87565b6013819055612233906203d090613e9b565b612240906203d090613ec6565b47600f5460026122509190614071565b61225a9190613e9b565b6122649190613e87565b601655601f546000906122779042613e24565b9050600060145460085461228b9190613e24565b905060006122998284613e87565b90506008600f5410156122c857600f546122b4906002614071565b6122c0906102d0613e9b565b6001556122de565b6122da6007600f546115479190613e24565b6011555b60006122f460015483610378611ed69190613e9b565b90506000610378612306836064613e9b565b6123109190613e87565b905060006107d082101561235457612331610378610e3a856297bb70613e9b565b612343620c084061139d600287614005565b61234d9190613ec6565b905061235b565b5063bebc20005b60006123746305f5e1008360115489611f089190613e9b565b6004546001600160a01b031660009081526018602052604090205490915061239c9082613342565b600480546001600160a01b039081166000908152601860205260408082209490945591549251921691600080516020614326833981519152906123e29085815260200190565b60405180910390a36012546123f79082613342565b601255600a5460165460049161240c91613e9b565b6124179060c8613e9b565b6124219190613e87565b4711156124a257600454601c546016546001600160a01b0390921691612451916305f5e10091611efe878c613e9b565b6040519093506001600160a01b0382169084156108fc029085906000818181858888f1935050505015801561248a573d6000803e3d6000fd5b50601d54612499906001613e9b565b601c55506124a8565b6000601c555b5050600854601455505042601f55505050565b60008060006124c8611c3a565b6000036124db5750600092839250829150565b60075442906000906124ed9083613e24565b905060006124f9611c3a565b6125039083613e87565b9050600061250f611132565b505050905060008282620151806125269190613e9b565b6125309190613e87565b98929750909550909350505050565b600080600e5433866040516020016125599392919061407d565b6040516020818303038152906040528051906020012090508381146125905760405162461bcd60e51b815260040161145b906140a5565b600d5481106125b15760405162461bcd60e51b815260040161145b906140f3565b6125b9613390565b60155442116126025760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b6000600154601554426126159190613e24565b61262190610378613e9b565b61262b9190613e87565b9050600061037861263d836064613e9b565b6126479190613e87565b9050606481111561266457601a54612660906001613342565b601a555b610bb88110156126ea57612681610378610e3a846297bb70613e9b565b612693620c084061139d600286614005565b61269d9190613ec6565b9350600a6126ab8282613ec6565b6126b59190613e87565b6126c69066038d7ea4c68000613e87565b3410156126e55760405162461bcd60e51b815260040161145b9061413b565b612779565b6126fb6103786113d7846018613e9b565b6127099063ce09d1b0613ec6565b9350611770811015612779576000612723610bb383613e24565b9050600a6127318282613ec6565b61273b9190613e87565b612747906101f4613e9b565b6127589066038d7ea4c68000613e87565b3410156127775760405162461bcd60e51b815260040161145b906141be565b505b60006127916305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506127b79082613342565b6001600160a01b038716600081815260186020526040808220939093559151909190600080516020614326833981519152906127f69085815260200190565b60405180910390a360175461280b9082613342565b60175542601555601c54156128d3576107d082101561287e576000869050806001600160a01b03166108fc61284f6305f5e100601c546016548b611f089190613e9b565b6040518115909202916000818181858888f19350505050158015612877573d6000803e3d6000fd5b50506128d3565b6000869050806001600160a01b03166108fc6128a8600a601c54601654610140611f089190613e9b565b6040518115909202916000818181858888f193505050501580156128d0573d6000803e3d6000fd5b50505b600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d90606001611a97565b60008061294886868560008151811061293b5761293b613ed9565b6020026020010151611777565b9050600081116129875760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351612994906001613ec6565b8351146129b35760405162461bcd60e51b815260040161145b90614259565b60005b8451811015612a8a576129ca816001613ec6565b6129d5906002614071565b6008546129e29190613eb2565b600003612a8a5760006129f6826001613ec6565b90505b8551811015612a7757858281518110612a1457612a14613ed9565b60200260200101516001600160a01b0316868281518110612a3757612a37613ed9565b60200260200101516001600160a01b031603612a655760405162461bcd60e51b815260040161145b906142b6565b80612a6f81613eef565b9150506129f9565b5080612a8281613eef565b9150506129b6565b60008060005b83811015611fec57612aa3816001613ec6565b612aae906002614071565b600854612abb9190613eb2565b600003612c8057878181518110612ad457612ad4613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b489190613f08565b91508115612bbb57612b5b600382613eb2565b158015612b6757508015155b8015612b76575063010c8e0085115b15612b9d57612b966501d1a94a20008684600f546002611ec29190614071565b9250612bbb565b612bb86501d1a94a20008684600f546002611efe9190614071565b92505b878181518110612bcd57612bcd613ed9565b60200260200101516001600160a01b031663a9059cbb88836001612bf19190613ec6565b81518110612c0157612c01613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401612c3b9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7e91906142ed565b505b80612c8a81613eef565b915050612a90565b600080600e543387604051602001612cac9392919061407d565b604051602081830303815290604052805190602001209050848114612ce35760405162461bcd60e51b815260040161145b906140a5565b600d548110612d045760405162461bcd60e51b815260040161145b906140f3565b612d0c613390565b6015544211612d555760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b8351835114612dcc5760405162461bcd60e51b815260206004820152603a60248201527f4d696e74546f2068617320746f20686176652073616d65206e756d626572206f60448201527f66206164647265737373657320617320457874726146756e6473000000000000606482015260840161145b565b60005b8451811015612ea357612de3816001613ec6565b612dee906002614071565b600854612dfb9190613eb2565b600003612ea3576000612e0f826001613ec6565b90505b8551811015612e9057858281518110612e2d57612e2d613ed9565b60200260200101516001600160a01b0316868281518110612e5057612e50613ed9565b60200260200101516001600160a01b031603612e7e5760405162461bcd60e51b815260040161145b906142b6565b80612e8881613eef565b915050612e12565b5080612e9b81613eef565b915050612dcf565b600060015460155442612eb69190613e24565b612ec290610378613e9b565b612ecc9190613e87565b90506000610378612ede836064613e9b565b612ee89190613e87565b905060006064821115612f0757601a54612f03906001613342565b601a555b610bb8821015612f8d57612f24610378610e3a856297bb70613e9b565b612f36620c084061139d600287614005565b612f409190613ec6565b9050600a612f4e8382613ec6565b612f589190613e87565b612f699066038d7ea4c68000613e87565b341015612f885760405162461bcd60e51b815260040161145b9061413b565b613018565b612f9e6103786113d7856018613e9b565b612fac9063ce09d1b0613ec6565b905061177082101561301857612fc4610bb383613e24565b9150600a612fd28382613ec6565b612fdc9190613e87565b612fe8906101f4613e9b565b612ff99066038d7ea4c68000613e87565b3410156130185760405162461bcd60e51b815260040161145b906141be565b6000805b858110156132125761302f856001613ec6565b61303a906002614071565b6008546130479190613eb2565b6000036132005789858151811061306057613060613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156130b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d49190613f08565b91508115613200576130e7600386613eb2565b1580156130f357508415155b8015613102575063010c8e0083115b15613129576131226501d1a94a20008484600f546002611ec29190614071565b9250613147565b6131446501d1a94a20008484600f546002611efe9190614071565b92505b89858151811061315957613159613ed9565b60200260200101516001600160a01b031663a9059cbb8a878151811061318157613181613ed9565b6020026020010151856040518363ffffffff1660e01b81526004016131bb9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156131da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fe91906142ed565b505b8061320a81613eef565b91505061301c565b5050426015559998505050505050505050565b6000816000036132655760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b61326f8284613e87565b9392505050565b60008260000361328857506000610d2f565b60006132948385613e9b565b9050826132a18583613e87565b1461326f5760405162461bcd60e51b815260206004820152600d60248201526c4d756c74206f766572666c6f7760981b604482015260640161145b565b6000818310156133205760405162461bcd60e51b815260206004820152600d60248201526c53756220756e646572666c6f7760981b604482015260640161145b565b61326f8284613e24565b60008183111561333b575080610d2f565b5090919050565b60008061334f8385613ec6565b90508381101561326f5760405162461bcd60e51b815260206004820152600c60248201526b416464206f766572666c6f7760a01b604482015260640161145b565b6010546011546017546133a291613342565b1180156133b05750600f8054105b1561348157600f546133c3906001613ec6565b600f8190556133eb906133d7906001613ec6565b6133e2906002614071565b60065490613225565b6006546133f89190613e24565b601055600f546008111561346b57600c54613414906002613225565b600c55600f54613425906002614071565b613431906102d0613e9b565b600155600f5460061115613466576010600a5411613453576008600a55613481565b6002600a546134629190613e87565b600a555b613481565b61347d6007600f546115479190613e24565b6011555b60085461348f906001613342565b6008908155600a546134a19190613e87565b601b546008546134b19190613e24565b6134bb9190613eb2565b60000361355d576134ca61220f565b6134dc600f5460016133d79190613ec6565b6006546134e99190613e24565b60105560095442906000906134fe9083613e24565b905060006008600a546135119190613e87565b60015461351e9190613e9b565b4260095590508082118061354c5750600a54601b546008546135409190613e24565b61354a9190613eb2565b155b1561355957613559613758565b5050505b60646001600160a01b0316632b407a82600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d29190613f08565b6135dc9190613e24565b6040518263ffffffff1660e01b81526004016135fa91815260200190565b602060405180830381865afa158015613617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363b9190613f08565b600e55565b6000816000036136805760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b600061368c8385613e87565b90506136988385613eb2565b1561326f57611b76816001613ec6565b6000546001600160a01b031633146136ef5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b600054604080516001600160a01b03928316815291831660208301527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600754429060009061376a9083613e24565b90506000601b5460085461377e9190613e24565b90506000816001546137909190613e9b565b600854601b559050808310156137f65760006137b184610e3a846064613276565b6001601d55905060006137cb6103e8610e558460646132de565b90506137eb610e8182610e7b6107d0600d5461322590919063ffffffff16565b600d55506138479050565b600061380782610e3a866064613276565b6002601d55905060006138216103e8610e558460646132de565b9050613841610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5550505b8360078190555060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190613f08565b602055600c54600d5410156138c757600c54600d555b600b54600d5411156138da57600b54600d555b50505050565b600060208083528351808285015260005b8181101561390d578581018301518582016040015282016138f1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461394557600080fd5b919050565b6000806040838503121561395d57600080fd5b6139668361392e565b946020939093013593505050565b60008083601f84011261398657600080fd5b50813567ffffffffffffffff81111561399e57600080fd5b6020830191508360208285010111156139b657600080fd5b9250929050565b60008060008060008060a087890312156139d657600080fd5b6139df8761392e565b95506139ed6020880161392e565b94506040870135935060608701359250608087013567ffffffffffffffff811115613a1757600080fd5b613a2389828a01613974565b979a9699509497509295939492505050565b600080600080600060808688031215613a4d57600080fd5b613a568661392e565b9450613a646020870161392e565b935060408601359250606086013567ffffffffffffffff811115613a8757600080fd5b613a9388828901613974565b969995985093965092949392505050565b60008060408385031215613ab757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613aed57600080fd5b8135602067ffffffffffffffff80831115613b0a57613b0a613ac6565b8260051b604051601f19603f83011681018181108482111715613b2f57613b2f613ac6565b604052938452858101830193838101925087851115613b4d57600080fd5b83870191505b84821015613b7357613b648261392e565b83529183019190830190613b53565b979650505050505050565b60008060008060808587031215613b9457600080fd5b8435935060208501359250604085013567ffffffffffffffff811115613bb957600080fd5b613bc587828801613adc565b925050613bd46060860161392e565b905092959194509250565b600080600060608486031215613bf457600080fd5b613bfd8461392e565b9250613c0b6020850161392e565b9150604084013590509250925092565b600060208284031215613c2d57600080fd5b5035919050565b60008060008060808587031215613c4a57600080fd5b613c538561392e565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215613c8557600080fd5b85359450602086013593506040860135925060608601359150613caa6080870161392e565b90509295509295909350565b600060208284031215613cc857600080fd5b61326f8261392e565b60008060008060808587031215613ce757600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613d1857600080fd5b8335925060208401359150613d2f6040850161392e565b90509250925092565b600080600060608486031215613d4d57600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215613d7a57600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115613da057600080fd5b613dac88838901613adc565b93506060870135915080821115613dc257600080fd5b50613dcf87828801613adc565b91505092959194509250565b60008060408385031215613dee57600080fd5b613df78361392e565b9150613e056020840161392e565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d2f57610d2f613e0e565b600181811c90821680613e4b57607f821691505b602082108103613e6b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b600082613e9657613e96613e71565b500490565b8082028115828204841417610d2f57610d2f613e0e565b600082613ec157613ec1613e71565b500690565b80820180821115610d2f57610d2f613e0e565b634e487b7160e01b600052603260045260246000fd5b600060018201613f0157613f01613e0e565b5060010190565b600060208284031215613f1a57600080fd5b5051919050565b600181815b80851115613f5c578160001904821115613f4257613f42613e0e565b80851615613f4f57918102915b93841c9390800290613f26565b509250929050565b600082613f7357506001610d2f565b81613f8057506000610d2f565b8160018114613f965760028114613fa057613fbc565b6001915050610d2f565b60ff841115613fb157613fb1613e0e565b50506001821b610d2f565b5060208310610133831016604e8410600b8410161715613fdf575081810a610d2f565b613fe98383613f21565b8060001904821115613ffd57613ffd613e0e565b029392505050565b600061326f60ff841683613f64565b60208082526039908201527f4f6e6c79206d696e74206f6e20736c6f77426c6f636b732025205f424c4f434b60408201527f535f5045525f524541444a5553544d454e542f38203d3d203000000000000000606082015260800190565b600061326f8383613f64565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252602e908201527f4f6c64206368616c6c656e67655f646967657374206f722077726f6e6720636860408201526d185b1b195b99d957d91a59d95cdd60921b606082015260800190565b60208082526028908201527f446967657374206d75737420626520736d616c6c6572207468616e206d696e696040820152671b99d5185c99d95d60c21b606082015260800190565b6020808252605a908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f726573206574682c20636865636b20686f774d75636845544828292066756e6360608201527f74696f6e20746f2066696e6420616d6f756e74206e6565646564000000000000608082015260a00190565b6020808252606f908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f7265732065746820756e74696c203630782074617267657454696d652c20636860608201527f65636b20686f774d75636845544828292066756e6374696f6e20746f2066696e60808201526e1908185b5bdd5b9d081b9959591959608a1b60a082015260c00190565b6020808252603a908201527f4d696e74546f2068617320746f206861766520616e206578747261206164647260408201527f65737320636f6d706172656420746f20457874726146756e6473000000000000606082015260800190565b6020808252601b908201527f4e6f207072696e74696e67205468652073616d6520746f6b656e730000000000604082015260600190565b6000602082840312156142ff57600080fd5b8151801515811461326f57600080fd5b634e487b7160e01b600052600160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122071e9ef78024eb4834277a390da30104b57ebfd0816c68d6436d099cb420b937c64736f6c63430008110033

Deployed Bytecode Sourcemap

18565:33506:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21549:24;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;21549:24:0;;;;;;;;38404:131;;;;;;;;;;;;;:::i;21690:57::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50445:204::-;;;;;;;;;;-1:-1:-1;50445:204:0;;;;;:::i;:::-;;:::i;:::-;;;1351:14:1;;1344:22;1326:41;;1314:2;1299:18;50445:204:0;1186:187:1;45019:662:0;;;;;;;;;;;;;:::i;:::-;;;;1609:25:1;;;1665:2;1650:18;;1643:34;;;;1693:18;;;1686:34;1751:2;1736:18;;1729:34;1596:3;1581:19;45019:662:0;1378:391:1;18982:173:0;;;;;;;;;;-1:-1:-1;18982:173:0;;;;;:::i;:::-;-1:-1:-1;;;18982:173:0;;;;;;;;;;;;-1:-1:-1;;;;;;2988:33:1;;;2970:52;;2958:2;2943:18;18982:173:0;2826:202:1;21139:49:0;;;;;;;;;;;;;;;;41980:1514;;;;;;;;;;;;;:::i;18628:167::-;;;;;;;;;;-1:-1:-1;18628:167:0;;;;;:::i;:::-;-1:-1:-1;;;18628:167:0;;;;;;;;25244:153;;;;;;;;;;;;;:::i;47597:109::-;;;;;;;;;;;;;:::i;25074:162::-;;;;;;:::i;:::-;;:::i;19685:64::-;;;;;;;;;;;;;;;;33274:391;;;;;;:::i;:::-;;:::i;20065:51::-;;;;;;;;;;;;;;;;20833:29;;;;;;;;;;;;;;;;51191:327;;;;;;;;;;-1:-1:-1;51191:327:0;;;;;:::i;:::-;;:::i;45689:391::-;;;;;;;;;;;;;:::i;47898:140::-;;;;;;;;;;;;;:::i;20710:25::-;;;;;;;;;;;;;;;;19303:30;;;;;;;;;;-1:-1:-1;19303:30:0;;;;-1:-1:-1;;;;;19303:30:0;;;;;;-1:-1:-1;;;;;6023:32:1;;;6005:51;;5993:2;5978:18;19303:30:0;5859:203:1;21799:35:0;;;;;;;;;;;;21832:2;21799:35;;;;;6239:4:1;6227:17;;;6209:36;;6197:2;6182:18;21799:35:0;6067:184:1;47713:86:0;;;;;;;;;;-1:-1:-1;47781:12:0;;47713:86;;39349:784;;;;;;;;;;;;;:::i;38719:493::-;;;;;;;;;;-1:-1:-1;38719:493:0;;;;;:::i;:::-;;:::i;21617:22::-;;;;;;;;;;;;;;;;21057:25;;;;;;;;;;;;;;;;29368:135;;;;;;;;;;;;;:::i;19164:32::-;;;;;;;;;;;;;;;;29622:177;;;;;;:::i;:::-;;:::i;25519:438::-;;;;;;:::i;:::-;;:::i;48287:318::-;;;;;;;;;;;;;:::i;21478:26::-;;;;;;;;;;;;;;;;47413:96;;;;;;;;;;-1:-1:-1;47487:15:0;;47413:96;;20742:84;;;;;;;;;;;;;;;;38540:173;;;;;;;;;;;;;:::i;46969:354::-;;;;;;;;;;-1:-1:-1;46969:354:0;;;;;:::i;:::-;;:::i;21310:28::-;;;;;;;;;;;;;;;;49199:124;;;;;;;;;;-1:-1:-1;49199:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;49296:20:0;49268:12;49296:20;;;:8;:20;;;;;;;49199:124;48612:79;;;;;;;;;;-1:-1:-1;48673:10:0;;48612:79;;25962:444;;;;;;:::i;:::-;;:::i;46632:332::-;;;;;;;;;;-1:-1:-1;46632:332:0;;;;;:::i;:::-;;:::i;25403:110::-;;;;;;;;;;;;;:::i;20009:26::-;;;;;;;;;;;;;;;;20192:37;;;;;;;;;;;;;;;;35275:407;;;;;;:::i;:::-;;:::i;20348:63::-;;;;;;;;;;;;;;;;20482:170;;;;;;;;;;;;;;;;29804:1876;;;;;;:::i;:::-;;:::i;2668:20::-;;;;;;;;;;-1:-1:-1;2668:20:0;;;;-1:-1:-1;;;;;2668:20:0;;;19228:29;;;;;;;;;;-1:-1:-1;19228:29:0;;;;-1:-1:-1;;;;;19228:29:0;;;21754:38;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21754:38:0;;;;;48729:246;;;;;;;;;;-1:-1:-1;48729:246:0;;;;;:::i;:::-;;:::i;20959:25::-;;;;;;;;;;;;;;;;21646:20;;;;;;;;;;;;;;;;28820:496;;;;;;;;;;-1:-1:-1;28820:496:0;;;;;:::i;:::-;;:::i;21217:40::-;;;;;;;;;;;;;;;;19264:32;;;;;;;;;;-1:-1:-1;19264:32:0;;;;-1:-1:-1;;;;;19264:32:0;;;49673:257;;;;;;;;;;-1:-1:-1;49673:257:0;;;;;:::i;:::-;;:::i;20124:43::-;;;;;;;;;;;;;;;;47806:83;;;;;;;;;;-1:-1:-1;47872:12:0;;47806:83;;39217:126;;;;;;;;;;;;;:::i;31687:1582::-;;;;;;:::i;:::-;;:::i;21884:111::-;;;;;;;;;;;;;;;;22207:1067;;;;;;;;;;-1:-1:-1;22207:1067:0;;;;;:::i;:::-;;:::i;23312:1731::-;;;;;;;;;;;;;:::i;46088:508::-;;;;;;;;;;;;;:::i;:::-;;;;10147:25:1;;;10203:2;10188:18;;10181:34;;;;10231:18;;;10224:34;10135:2;10120:18;46088:508:0;9945:319:1;20236:61:0;;;;;;;;;;;;;;;;51805:151;;;;;;;;;;-1:-1:-1;51805:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;51921:19:0;;;51891:14;51921:19;;;:7;:19;;;;;;;;:28;;;;;;;;;;;;;51805:151;26411:2403;;;;;;:::i;:::-;;:::i;19909:60::-;;;;;;;;;;;;;;;;33672:1598;;;;;;:::i;:::-;;:::i;29509:108::-;;;;;;;;;;-1:-1:-1;29593:10:0;29592:20;29509:108;;35711:2688;;;;;;:::i;:::-;;:::i;20899:24::-;;;;;;;;;;;;;;;;38404:131;38454:12;38497:17;;38479:15;:35;;;;:::i;:::-;38472:42;;38404:131;:::o;21690:57::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50445:204::-;50546:10;50517:12;50538:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;50538:28:0;;;;;;;;;;:37;;;50587;50517:12;;50538:28;;50587:37;;;;50569:6;160:25:1;;148:2;133:18;;14:177;50587:37:0;;;;;;;;-1:-1:-1;50638:4:0;50445:204;;;;;:::o;45019:662::-;45067:20;45089:18;45109;45129:17;45168:8;;45155:10;;:21;;;;:::i;:::-;45180:1;45155:26;45152:61;;-1:-1:-1;45196:1:0;;-1:-1:-1;45196:1:0;;-1:-1:-1;45196:1:0;;-1:-1:-1;45196:1:0;45188:19;;45152:61;45313:30;;45240:15;;45217:20;;45298:45;;45240:15;45298:45;:::i;:::-;45260:83;;45408:20;:18;:20::i;:::-;45375:53;;:30;:53;:::i;:::-;45360:68;;45450:26;45463:12;45450;:26::i;:::-;45434:42;-1:-1:-1;45493:18:0;45532:19;45539:12;45493:18;45532:19;:::i;:::-;45516:35;-1:-1:-1;45574:29:0;45516:35;45574:13;:29;:::i;:::-;45556:47;;45608:68;;;45019:662;;;;;:::o;41980:1514::-;42038:15;42076:8;;42063:10;;:21;;;;:::i;:::-;42088:1;42063:26;42060:82;;42123:12;;42103:15;;:33;;:19;:33::i;42060:82::-;42242:30;;42169:15;;42146:20;;42227:45;;42169:15;42227:45;:::i;:::-;42189:83;;42277:15;42308:8;;42295:10;;:21;;;;:::i;:::-;42277:39;;42321:24;42362:10;42348;;:24;;;;:::i;:::-;42321:51;;42384:18;42512:19;42479:30;:52;42475:737;;;42543:21;42567:69;42604:30;42568:29;:19;42593:3;42568:24;:29::i;:::-;42567:35;;:69::i;:::-;42543:93;-1:-1:-1;42642:27:0;42672:45;42712:4;42672:25;42543:93;42693:3;42672:20;:25::i;:::-;:39;;:45::i;:::-;42642:75;;42761:69;42778:51;42806:22;42778;42795:4;42778:12;;:16;;:22;;;;:::i;:::-;:27;;:51::i;:::-;42761:12;;;:16;:69::i;:::-;42745:85;;42537:317;;42475:737;;;42864:23;42890:69;42938:19;42891:40;:30;42927:3;42891:35;:40::i;42890:69::-;42864:95;-1:-1:-1;42967:29:0;42999:47;43041:4;42999:27;42864:95;43022:3;42999:22;:27::i;:47::-;42967:79;;43117:70;43134:52;43161:24;43134:21;43151:3;43134:12;;:16;;:21;;;;:::i;:52::-;43117:12;;;:16;:70::i;:::-;43101:86;;42858:354;;42475:737;43237:15;;43221:13;:31;43218:99;;;-1:-1:-1;43296:15:0;;43218:99;43340:15;;43324:13;:31;43321:94;;;-1:-1:-1;43394:15:0;;43321:94;43432:15;;:34;;43452:13;43432:19;:34::i;:::-;43419:47;;43472:17;;;;;41980:1514;:::o;25244:153::-;25297:8;25388:1;25363:24;;:26;;;;:::i;:::-;25349:10;;:42;;;;:::i;:::-;25344:1;25319:24;;:26;;;;:::i;:::-;:73;;;;:::i;47597:109::-;47649:4;47668:33;47688:12;;47668:15;;:19;;:33;;;;:::i;25074:162::-;25153:12;25172:43;25179:5;25186:16;25204:10;25172:6;:43::i;:::-;-1:-1:-1;25227:4:0;;25074:162;-1:-1:-1;;;25074:162:0:o;33274:391::-;33415:12;33434:19;33470:10;:17;33490:1;33470:21;;;;:::i;:::-;33456:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33456:36:0;;33434:58;;33504:6;33500:76;33518:17;;:21;;33538:1;33518:21;:::i;:::-;33514:1;:26;33500:76;;;33564:6;33556:2;33559:1;33556:5;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33556:14:0;;;:5;;;;;;;;;;;:14;33542:3;;;;:::i;:::-;;;;33500:76;;;;33584:58;33602:5;33609:16;33627:10;33639:2;33584:17;:58::i;:::-;-1:-1:-1;33656:4:0;;33274:391;-1:-1:-1;;;;;;33274:391:0:o;51191:327::-;-1:-1:-1;;;;;51315:14:0;;51277:12;51315:14;;;:8;:14;;;;;;:26;;51334:6;51315:18;:26::i;:::-;-1:-1:-1;;;;;51298:14:0;;;;;;:8;:14;;;;;;;;:43;;;;51374:7;:13;;;;;51388:10;51374:25;;;;;;:37;;51404:6;51374:29;:37::i;:::-;-1:-1:-1;;;;;51346:13:0;;;;;;;:7;:13;;;;;;;;51360:10;51346:25;;;;;;;:65;;;;51431:12;;;;;:8;:12;;;;;:24;;51448:6;51431:16;:24::i;:::-;-1:-1:-1;;;;;51416:12:0;;;;;;;:8;:12;;;;;;;:39;;;;51467:26;;;;;;-1:-1:-1;;;;;;;;;;;51467:26:0;;;51486:6;160:25:1;;148:2;133:18;;14:177;51467:26:0;;;;;;;;-1:-1:-1;51507:4:0;51191:327;;;;;:::o;45689:391::-;45736:18;45756:21;45779:18;45799:13;45827;45847:16;:14;:16::i;:::-;45826:37;;;;;45892:3;45881:8;:14;;;;:::i;:::-;45868:27;;45903:8;45915:1;45903:13;45900:44;;45930:1;45932;45934;45936;45923:15;;;;;;;;;;;45900:44;45999:8;45983:12;;45965:15;;:30;;;;:::i;:::-;45964:43;;;;:::i;:::-;46035:15;;46052:12;;45948:59;;-1:-1:-1;46035:15:0;-1:-1:-1;46052:12:0;-1:-1:-1;;45689:391:0;;;;:::o;47898:140::-;48002:10;;:27;;;-1:-1:-1;;;;;;48002:27:0;;;;47951:4;;-1:-1:-1;;;;;48002:10:0;;:25;;:27;;;;;;;;;;;;;;:10;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47991:8;;47976:12;;:23;;;;:::i;:::-;:53;;;;:::i;39349:784::-;39398:11;39432:8;;39419:10;;:21;;;;:::i;:::-;39445:1;39418:28;39415:158;;39456:4;;39464:1;39456:9;39453:115;;-1:-1:-1;39481:24:0;;;39349:784::o;39453:115::-;39559:1;39532:24;;:28;;;;:::i;39453:115::-;39673:21;;39600:15;;39577:20;;39658:36;;39600:15;39658:36;:::i;:::-;39620:74;;39699:24;39792:1;39767:24;;:26;;;;:::i;:::-;39754:8;;39741:10;;:21;;;;:::i;:::-;39740:54;;;;:::i;:::-;39726:10;;:69;;;;:::i;:::-;39699:96;;39840:19;39807:30;:52;39803:323;;;39962:1;39937:24;;:26;;;;:::i;:::-;39924:8;;39911:10;;:21;;;;:::i;:::-;39910:54;;;;:::i;:::-;39905:1;39880:24;;:26;;;;:::i;:::-;:85;;;;:::i;:::-;39871:94;;39972:15;;;39349:784;:::o;39803:323::-;40070:24;;40058:8;;40045:10;;:21;;;;:::i;:::-;40044:50;;;;:::i;:::-;40016:24;;:79;;;;:::i;38719:493::-;38783:15;38804:9;38841:10;;38817:14;38834:3;38817:20;;;;:::i;:::-;38816:35;;;;:::i;:::-;38804:47;-1:-1:-1;38856:10:0;38879:3;38869:7;38804:47;38873:3;38869:7;:::i;:::-;:13;;;;:::i;:::-;38856:26;;38888:14;38978:4;38970:5;:12;38967:161;;;39035:24;39055:3;39036:13;39047:1;39036:7;:13;:::i;39035:24::-;39001:32;39024:8;39013:4;39016:1;39013;:4;:::i;:::-;39010:7;;:2;:7;:::i;:::-;39002:16;;:6;:16;:::i;39001:32::-;:58;;;;:::i;:::-;38989:70;;38967:161;;;39088:23;39107:3;39089:4;39092:1;39089:2;:4;:::i;:::-;:12;;39094:7;39089:12;:::i;39088:23::-;:34;;39112:10;39088:34;:::i;:::-;39076:46;;38967:161;39144:42;39176:9;39161;39145:13;;:25;;;;:::i;39144:42::-;39134:52;38719:493;-1:-1:-1;;;;;38719:493:0:o;29368:135::-;29411:19;29443:55;29479:17;;29461:15;:35;;;;:::i;29622:177::-;29709:12;29727:51;29742:5;29749:16;29767:10;29727:14;:51::i;25519:438::-;25637:12;25664:11;:9;:11::i;:::-;:16;25656:86;;;;-1:-1:-1;;;25656:86:0;;;;;;;:::i;:::-;;;;;;;;;25747:43;25754:5;25761:16;25779:10;25747:6;:43::i;:::-;-1:-1:-1;25795:75:0;;-1:-1:-1;;;25795:75:0;;25837:4;25795:75;;;14171:34:1;25844:10:0;14221:18:1;;;14214:43;14273:18;;;14266:34;;;14336:3;14316:18;;;14309:31;-1:-1:-1;14356:19:1;;;14349:30;-1:-1:-1;;;;;25795:33:0;;;;;14396:19:1;;25795:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25878:11;:9;:11::i;:::-;25893:1;25878:16;25875:62;;25914:10;;:17;;25929:1;25914:14;:17::i;:::-;25901:10;:30;25875:62;-1:-1:-1;25948:4:0;25519:438;;;;;;:::o;48287:318::-;48335:4;48476:1;48464:9;;:13;48461:139;;;48498:18;21832:2;48498;:18;:::i;:::-;48493:23;;:2;:23;:::i;48461:139::-;48540:54;48588:1;48576:9;;:13;;;;:::i;:::-;48572:20;;:1;:20;:::i;:::-;48547:18;21832:2;48547;:18;:::i;:::-;48542:23;;:2;:23;:::i;38540:173::-;38592:14;38612:9;38643:17;;38625:15;:35;;;;:::i;:::-;38612:49;;38675:15;38688:1;38675:12;:15::i;:::-;38666:24;;38695:13;38540:173;:::o;46969:354::-;47127:12;47146:14;47198:16;47215:6;47222:5;47181:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47171:58;;;;;;47146:84;;47256:10;47246:6;47238:15;;:28;47235:41;;;47268:8;;;47235:41;47291:26;;;;46969:354;-1:-1:-1;;;;;46969:354:0:o;25962:444::-;26081:12;26108:11;:9;:11::i;:::-;:16;26100:86;;;;-1:-1:-1;;;26100:86:0;;;;;;;:::i;:::-;26191:43;26198:5;26205:16;26223:10;26191:6;:43::i;:::-;-1:-1:-1;26239:80:0;;-1:-1:-1;;;26239:80:0;;26282:4;26239:80;;;15267:34:1;26289:10:0;15317:18:1;;;15310:43;15369:18;;;15362:34;;;26312:1:0;15412:18:1;;;15405:34;15247:3;15455:19;;;15448:32;-1:-1:-1;15496:19:1;;;15489:30;-1:-1:-1;;;;;26239:34:0;;;;;15536:19:1;;26239:80:0;14926:635:1;46632:332:0;46764:12;46783:14;46835:16;46852:10;46863:5;46818:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46808:62;;;;;;46783:88;;46897:10;46887:6;46879:15;;:28;46876:41;;;46909:8;;;46876:41;46932:26;;;;46632:332;-1:-1:-1;;;;46632:332:0:o;25403:110::-;25445:8;25506:1;25481:24;;:26;;;;:::i;:::-;25467:10;;:41;;;;:::i;35275:407::-;35424:12;35443:19;35479:10;:17;35499:1;35479:21;;;;:::i;:::-;35465:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35465:36:0;;35443:58;;35513:6;35509:76;35527:17;;:21;;35547:1;35527:21;:::i;:::-;35523:1;:26;35509:76;;;35573:6;35565:2;35568:1;35565:5;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35565:14:0;;;:5;;;;;;;;;;;:14;35551:3;;;;:::i;:::-;;;;35509:76;;;;35593:66;35619:5;35626:16;35644:10;35656:2;35593:25;:66::i;29804:1876::-;29916:17;29942:14;29987:15;;30004:10;30016:5;29970:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29960:63;;;;;;29942:81;;30098:16;30088:6;:26;30080:85;;;;-1:-1:-1;;;30080:85:0;;;;;;;:::i;:::-;30246:12;;30228:30;;30220:83;;;;-1:-1:-1;;;30220:83:0;;;;;;;:::i;:::-;30308:22;:20;:22::i;:::-;30363:17;;30345:15;:35;30337:77;;;;-1:-1:-1;;;30337:77:0;;16592:2:1;30337:77:0;;;16574:21:1;16631:2;16611:18;;;16604:30;16670:31;16650:18;;;16643:59;16719:18;;30337:77:0;16390:353:1;30337:77:0;30477:9;30537:10;;30509:17;;30491:15;:35;;;;:::i;:::-;30490:43;;30530:3;30490:43;:::i;:::-;30489:58;;;;:::i;:::-;30477:70;-1:-1:-1;30552:10:0;30575:3;30565:7;30477:70;30569:3;30565:7;:::i;:::-;:13;;;;:::i;:::-;30552:26;;30603:3;30595:5;:11;30592:67;;;30631:10;;:17;;30646:1;30631:14;:17::i;:::-;30618:10;:30;30592:67;30730:4;30722:5;:12;30719:556;;;30787:24;30807:3;30788:13;30799:1;30788:7;:13;:::i;30787:24::-;30753:32;30776:8;30765:4;30768:1;30765;:4;:::i;30753:32::-;:58;;;;:::i;:::-;30741:70;-1:-1:-1;30866:2:0;30856:8;:5;30866:2;30856:8;:::i;:::-;30855:13;;;;:::i;:::-;30839:30;;30840:10;30839:30;:::i;:::-;30825:9;:45;;30817:148;;;;-1:-1:-1;;;30817:148:0;;;;;;;:::i;:::-;30719:556;;;30994:23;31013:3;30995:4;30998:1;30995:2;:4;:::i;30994:23::-;:34;;31018:10;30994:34;:::i;:::-;30982:46;;31045:4;31037:5;:12;31034:236;;;31065:12;31073:4;31065:5;:12;:::i;:::-;31057:20;-1:-1:-1;31136:2:0;31124:8;31057:20;31136:2;31124:8;:::i;:::-;31123:15;;;;:::i;:::-;31122:23;;31142:3;31122:23;:::i;:::-;31106:40;;31107:10;31106:40;:::i;:::-;31092:9;:55;;31084:179;;;;-1:-1:-1;;;31084:179:0;;;;;;;:::i;:::-;31281:18;31302:42;31334:9;31319;31303:13;;:25;;;;:::i;31302:42::-;-1:-1:-1;;;;;31379:23:0;;;;;;:8;:23;;;;;;31281:63;;-1:-1:-1;31379:42:0;;31281:63;31379:27;:42::i;:::-;-1:-1:-1;;;;;31353:23:0;;;;;;:8;:23;;;;;;:68;;;;31431:50;;31353:23;;;-1:-1:-1;;;;;;;;;;;31431:50:0;;;31467:13;160:25:1;;148:2;133:18;;14:177;31431:50:0;;;;;;;;31503:12;;:31;;31520:13;31503:16;:31::i;:::-;31488:12;:46;31559:15;31539:17;:35;31621:10;;31633:15;;31586:64;;;10147:25:1;;;10203:2;10188:18;;10181:34;;;;10231:18;;10224:34;-1:-1:-1;;;;;31586:64:0;;;;;10135:2:1;10120:18;31586:64:0;;;;;;;;31657:16;;;;29804:1876;;;;;:::o;48729:246::-;48840:18;48867:14;48912:15;;48929:10;48941:5;48895:52;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;48895:52:0;;;;;;48885:63;;48895:52;48885:63;;;;;48729:246;-1:-1:-1;;;;;48729:246:0:o;28820:496::-;28893:19;28918:9;28962:10;;28932:19;28955:3;28931:27;;;;:::i;:::-;28930:42;;;;:::i;:::-;28918:54;-1:-1:-1;28977:10:0;29000:3;28990:7;28918:54;28994:3;28990:7;:::i;:::-;:13;;;;:::i;:::-;28977:26;;29028:4;29019:5;:13;29016:254;;29050:4;29042:5;:12;29039:106;;;29070:12;29078:4;29070:5;:12;:::i;:::-;29062:20;-1:-1:-1;29126:2:0;29115:7;29062:20;29121:1;29115:7;:::i;:::-;29114:14;;;;:::i;:::-;29113:22;;29132:3;29113:22;:::i;:::-;29097:39;;29098:10;29097:39;:::i;:::-;29089:48;28820:496;-1:-1:-1;;;;28820:496:0:o;29039:106::-;-1:-1:-1;29157:1:0;;28820:496;-1:-1:-1;;;28820:496:0:o;29016:254::-;29180:2;29172:5;:10;29169:101;;;29255:9;29263:1;29255:5;:9;:::i;:::-;29247:17;;29169:101;29307:2;29297:8;:5;29307:2;29297:8;:::i;:::-;29296:13;;;;:::i;49673:257::-;49794:10;49741:12;49785:20;;;:8;:20;;;;;;:32;;49810:6;49785:24;:32::i;:::-;49771:10;49762:20;;;;:8;:20;;;;;;:55;;;;-1:-1:-1;;;;;49837:12:0;;;;;;:24;;49854:6;49837:16;:24::i;:::-;-1:-1:-1;;;;;49822:12:0;;;;;;:8;:12;;;;;;;:39;;;;49873:32;;49882:10;;-1:-1:-1;;;;;;;;;;;49873:32:0;;;49898:6;160:25:1;;148:2;133:18;;14:177;39217:126:0;39268:14;39311:8;;39298:10;;:21;;;;:::i;31687:1582::-;31833:12;31852:15;31870:41;31877:5;31883:16;31901:6;31908:1;31901:9;;;;;;;;:::i;:::-;;;;;;;31870:6;:41::i;:::-;31852:59;;31934:1;31924:7;:11;31916:34;;;;-1:-1:-1;;;31916:34:0;;18334:2:1;31916:34:0;;;18316:21:1;18373:2;18353:18;;;18346:30;-1:-1:-1;;;18392:18:1;;;18385:40;18442:18;;31916:34:0;18132:334:1;31916:34:0;31982:17;;:21;;32002:1;31982:21;:::i;:::-;31965:6;:13;:38;31957:108;;;;-1:-1:-1;;;31957:108:0;;;;;;;:::i;:::-;32070:7;32084:240;32100:10;:17;32096:2;:21;32084:240;;;32155:4;:2;32158:1;32155:4;:::i;:::-;32151:9;;:1;:9;:::i;:::-;32137:10;;:24;;;;:::i;:::-;32165:1;32137:29;32174:5;32134:52;32195:6;32202:4;:2;32205:1;32202:4;:::i;:::-;32195:11;;32191:128;32211:10;:17;32208:1;:20;32191:128;;;32266:10;32277:2;32266:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32249:31:0;:10;32260:1;32249:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32249:31:0;;32241:71;;;;-1:-1:-1;;;32241:71:0;;;;;;;:::i;:::-;32230:3;;;;:::i;:::-;;;;32191:128;;;-1:-1:-1;32119:4:0;;;;:::i;:::-;;;;32084:240;;;32332:17;32358:18;32389:6;32385:759;32401:2;32399:1;:4;32385:759;;;32700:3;:1;32702;32700:3;:::i;:::-;32696:8;;:1;:8;:::i;:::-;32682:10;;:23;;;;:::i;:::-;32709:1;32682:28;32679:460;;32738:10;32749:1;32738:13;;;;;;;;:::i;:::-;;;;;;;;;;;32731:46;;-1:-1:-1;;;32731:46:0;;32771:4;32731:46;;;6005:51:1;-1:-1:-1;;;;;32731:31:0;;;;;;5978:18:1;;32731:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32718:59;-1:-1:-1;32787:15:0;;32784:285;;32815:5;32819:1;32815;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;32829:6:0;;;32815:20;:42;;;;;32849:8;32839:7;:18;32815:42;32811:251;;;32879:68;32929:17;32911:7;32898:10;32886:9;;32882:1;:13;;;;:::i;:::-;32881:27;;;;:::i;:::-;:37;;;;:::i;:::-;32879:49;;:68::i;:::-;32867:80;;32811:251;;;32989:64;33035:17;33022:7;33009:10;32996:9;;32992:1;:13;;;;:::i;:::-;32991:28;;;;:::i;:::-;:38;;;;:::i;32989:64::-;32977:76;;32811:251;33085:10;33096:1;33085:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;33078:30:0;;33109:6;33116:1;33118;33116:3;;;;:::i;:::-;33109:11;;;;;;;;:::i;:::-;;;;;;;33122:9;33078:54;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:32:1;;;;19428:51;;19510:2;19495:18;;19488:34;19416:2;19401:18;;19254:274;33078:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32679:460;32405:3;;;;:::i;:::-;;;;32385:759;;;-1:-1:-1;33196:10:0;;33208:15;;33175:63;;;1609:25:1;;;1665:2;1650:18;;1643:34;;;;1693:18;;1686:34;;;1751:2;1736:18;;1729:34;;;33184:10:0;;33175:63;;1596:3:1;1581:19;33175:63:0;;;;;;;-1:-1:-1;33252:7:0;;31687:1582;-1:-1:-1;;;;;;;31687:1582:0:o;22207:1067::-;2927:5;;-1:-1:-1;;;;;2927:5:0;2913:10;:19;2905:42;;;;-1:-1:-1;;;2905:42:0;;20413:2:1;2905:42:0;;;20395:21:1;20452:2;20432:18;;;20425:30;-1:-1:-1;;;20471:18:1;;;20464:40;20521:18;;2905:42:0;20211:334:1;2905:42:0;22374:7:::1;::::0;22301:26:::1;::::0;22374:7:::1;;22373:8;22366:16;;;;:::i;:::-;22393:7;:14:::0;;-1:-1:-1;;22393:14:0::1;22403:4;22393:14;::::0;;22431:15:::1;22411:17;:35:::0;22471:18:::1;21832:2;22471;:18;:::i;:::-;22466:23;::::0;:2:::1;:23;:::i;:::-;22450:13;:39:::0;22509:1:::1;22497:9;:13:::0;;;22514:12:::1;:16:::0;;;22534:10:::1;:14:::0;;;22552:8:::1;:12:::0;22580:38:::1;22605:12;22580:21;:38;:::i;:::-;22568:9;:50:::0;;;22688:18:::1;::::0;:6:::1;:18;:::i;:::-;22679:27;::::0;:6:::1;:27;:::i;:::-;22654:21;22641:9;;22637:1;:13;;;;:::i;:::-;22636:39;;;;:::i;:::-;:71;;;;:::i;:::-;22624:9;:83:::0;22775:15:::1;::::0;:25:::1;::::0;22795:4:::1;22775:19;:25::i;:::-;22760:12;:40:::0;22844:15:::1;22811:30;:48:::0;22867:22:::1;:20;:22::i;:::-;22973:3;22975:1;22973::::0;:3:::1;:::i;:::-;-1:-1:-1::0;;;;;22945:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:31;;;;:25;-1:-1:-1;;;;;;;;;;;23033:3:0::1;23035:1;23033::::0;:3:::1;:::i;:::-;22995:42;::::0;160:25:1;;;148:2;133:18;22995:42:0::1;;;;;;;23048:14;:32:::0;;-1:-1:-1;;;;;;23048:32:0;;::::1;-1:-1:-1::0;;;;;23048:32:0;;::::1;::::0;;::::1;::::0;;;23091:10:::1;:43:::0;;;::::1;::::0;;::::1;::::0;;23145:15:::1;:35:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;23185:10:0::1;:14:::0;23222:10:::1;::::0;23210:9:::1;:22:::0;23239:20:::1;-1:-1:-1::0;23239:8:0::1;:20::i;:::-;22281:993;22207:1067:::0;;:::o;23312:1731::-;23408:38;23433:12;23408:21;:38;:::i;:::-;23396:9;:50;;;23517:18;;:6;:18;:::i;:::-;23508:27;;:6;:27;:::i;:::-;23483:21;23470:9;;23466:1;:13;;;;:::i;:::-;23465:39;;;;:::i;:::-;:71;;;;:::i;:::-;23453:9;:83;23619:7;;23586:12;;23601:25;;:15;:25;:::i;:::-;23586:40;;23633:18;23667:9;;23654:10;;:22;;;;:::i;:::-;23633:43;-1:-1:-1;23698:20:0;23721:17;23633:43;23721:4;:17;:::i;:::-;23698:40;;23758:1;23746:9;;:13;23743:159;;;23800:9;;23797:12;;:1;:12;:::i;:::-;23785:24;;23786:7;23785:24;:::i;:::-;23771:10;:39;23743:159;;;23842:54;23890:1;23878:9;;:13;;;;:::i;23842:54::-;23826:13;:70;23743:159;23906:9;23918:41;23948:10;;23919:12;23934:3;23919:18;;;;:::i;23918:41::-;23906:53;-1:-1:-1;23964:13:0;23990:3;23980:7;23906:53;23984:3;23980:7;:::i;:::-;:13;;;;:::i;:::-;23964:29;;23998:17;24036:4;24028:5;:12;24025:140;;;24093:24;24113:3;24094:13;24105:1;24094:7;:13;:::i;24093:24::-;24059:32;24082:8;24071:4;24074:1;24071;:4;:::i;24059:32::-;:58;;;;:::i;:::-;24047:70;;24025:140;;;-1:-1:-1;24148:10:0;24025:140;24172:18;24193:55;24238:9;24223;24207:13;;24194:10;:26;;;;:::i;24193:55::-;24290:15;;-1:-1:-1;;;;;24290:15:0;24281:25;;;;:8;:25;;;;;;24172:76;;-1:-1:-1;24281:44:0;;24172:76;24281:29;:44::i;:::-;24262:15;;;-1:-1:-1;;;;;24262:15:0;;;24253:25;;;;:8;:25;;;;;;:72;;;;24356:15;;24335:52;;24356:15;;;-1:-1:-1;;;;;;;;;;;24335:52:0;;;24373:13;160:25:1;;148:2;133:18;;14:177;24335:52:0;;;;;;;;24403:8;;:27;;24416:13;24403:12;:27::i;:::-;24392:8;:38;24483:24;;24471:9;;24509:1;;24471:36;;;:::i;:::-;24464:44;;:3;:44;:::i;:::-;:46;;;;:::i;:::-;24439:21;:72;24435:524;;;24759:15;;24834:6;;24822:9;;-1:-1:-1;;;;;24759:15:0;;;;24794:62;;24846:9;;24795:24;24810:9;24796:10;24795:24;:::i;24794:62::-;24871:22;;24782:74;;-1:-1:-1;;;;;;24871:11:0;;;:22;;;;;24782:74;;24871:22;;;;24782:74;24871:11;:22;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24923:4:0;;24919:8;;:1;:8;:::i;:::-;24910:6;:17;-1:-1:-1;24435:524:0;;;24952:1;24943:6;:10;24435:524;-1:-1:-1;;24979:10:0;;24967:9;:22;-1:-1:-1;;25023:15:0;25013:7;:25;-1:-1:-1;;;23312:1731:0:o;46088:508::-;46138:11;46151:14;46167:18;46194:20;:18;:20::i;:::-;46218:1;46194:25;46191:61;;-1:-1:-1;46234:1:0;;;;-1:-1:-1;46234:1:0;;-1:-1:-1;46088:508:0:o;46191:61::-;46358:30;;46279:15;;46256:20;;46343:45;;46279:15;46343:45;:::i;:::-;46305:83;;46393:17;46446:20;:18;:20::i;:::-;46413:53;;:30;:53;:::i;:::-;46393:73;;46472:10;46489:15;:13;:15::i;:::-;46471:33;;;;;46509:8;46541:12;46520:5;46529:8;46520:18;;;;:::i;:::-;:33;;;;:::i;:::-;46509:44;46571:12;;-1:-1:-1;46585:5:0;;-1:-1:-1;46088:508:0;;-1:-1:-1;;;;46088:508:0:o;26411:2403::-;26515:17;26541:14;26586:15;;26603:10;26615:5;26569:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26559:63;;;;;;26541:81;;26697:16;26687:6;:26;26679:85;;;;-1:-1:-1;;;26679:85:0;;;;;;;:::i;:::-;26845:12;;26827:30;;26819:83;;;;-1:-1:-1;;;26819:83:0;;;;;;;:::i;:::-;26907:22;:20;:22::i;:::-;26962:17;;26944:15;:35;26936:69;;;;-1:-1:-1;;;26936:69:0;;20884:2:1;26936:69:0;;;20866:21:1;20923:2;20903:18;;;20896:30;-1:-1:-1;;;20942:18:1;;;20935:51;21003:18;;26936:69:0;20682:345:1;26936:69:0;27068:9;27128:10;;27100:17;;27082:15;:35;;;;:::i;:::-;27081:43;;27121:3;27081:43;:::i;:::-;27080:58;;;;:::i;:::-;27068:70;-1:-1:-1;27143:10:0;27166:3;27156:7;27068:70;27160:3;27156:7;:::i;:::-;:13;;;;:::i;:::-;27143:26;;27193:3;27185:5;:11;27182:67;;;27221:10;;:17;;27236:1;27221:14;:17::i;:::-;27208:10;:30;27182:67;27320:4;27312:5;:12;27309:567;;;27377:24;27397:3;27378:13;27389:1;27378:7;:13;:::i;27377:24::-;27343:32;27366:8;27355:4;27358:1;27355;:4;:::i;27343:32::-;:58;;;;:::i;:::-;27331:70;-1:-1:-1;27456:2:0;27446:8;:5;27456:2;27446:8;:::i;:::-;27445:13;;;;:::i;:::-;27429:30;;27430:10;27429:30;:::i;:::-;27415:9;:45;;27407:148;;;;-1:-1:-1;;;27407:148:0;;;;;;;:::i;:::-;27309:567;;;27584:23;27603:3;27585:4;27588:1;27585:2;:4;:::i;27584:23::-;:34;;27608:10;27584:34;:::i;:::-;27572:46;;27635:4;27627:5;:12;27624:247;;;27647:13;27663:12;27671:4;27663:5;:12;:::i;:::-;27647:28;-1:-1:-1;27737:2:0;27722:11;27647:28;27737:2;27722:11;:::i;:::-;27721:18;;;;:::i;:::-;27720:26;;27743:3;27720:26;:::i;:::-;27704:43;;27705:10;27704:43;:::i;:::-;27690:9;:58;;27682:182;;;;-1:-1:-1;;;27682:182:0;;;;;;;:::i;:::-;27640:231;27624:247;27882:18;27903:42;27935:9;27920;27904:13;;:25;;;;:::i;27903:42::-;-1:-1:-1;;;;;27980:23:0;;;;;;:8;:23;;;;;;27882:63;;-1:-1:-1;27980:42:0;;27882:63;27980:27;:42::i;:::-;-1:-1:-1;;;;;27954:23:0;;;;;;:8;:23;;;;;;:68;;;;28032:50;;27954:23;;;-1:-1:-1;;;;;;;;;;;28032:50:0;;;28068:13;160:25:1;;148:2;133:18;;14:177;28032:50:0;;;;;;;;28106:12;;:31;;28123:13;28106:16;:31::i;:::-;28091:12;:46;28162:15;28142:17;:35;28185:6;;:10;28182:527;;28213:4;28205:5;:12;28202:502;;;28236:18;28265:13;28236:43;;28298:2;-1:-1:-1;;;;;28298:11:0;:60;28310:47;28347:9;28335:6;;28323:9;;28311;:21;;;;:::i;28310:47::-;28298:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28218:252;28202:502;;;28495:18;28524:13;28495:43;;28559:2;-1:-1:-1;;;;;28559:11:0;:47;28571:34;28602:2;28590:6;;28578:9;;28572:3;:15;;;;:::i;28571:34::-;28559:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28474:230;28202:502;28755:10;;28767:15;;28720:64;;;10147:25:1;;;10203:2;10188:18;;10181:34;;;;10231:18;;10224:34;-1:-1:-1;;;;;28720:64:0;;;;;10135:2:1;10120:18;28720:64:0;9945:319:1;33672:1598:0;33826:12;33845:15;33863:49;33878:5;33884:16;33902:6;33909:1;33902:9;;;;;;;;:::i;:::-;;;;;;;33863:14;:49::i;:::-;33845:67;;33935:1;33925:7;:11;33917:34;;;;-1:-1:-1;;;33917:34:0;;18334:2:1;33917:34:0;;;18316:21:1;18373:2;18353:18;;;18346:30;-1:-1:-1;;;18392:18:1;;;18385:40;18442:18;;33917:34:0;18132:334:1;33917:34:0;33983:17;;:21;;34003:1;33983:21;:::i;:::-;33966:6;:13;:38;33958:108;;;;-1:-1:-1;;;33958:108:0;;;;;;;:::i;:::-;34071:7;34085:240;34101:10;:17;34097:2;:21;34085:240;;;34156:4;:2;34159:1;34156:4;:::i;:::-;34152:9;;:1;:9;:::i;:::-;34138:10;;:24;;;;:::i;:::-;34166:1;34138:29;34175:5;34135:52;34196:6;34203:4;:2;34206:1;34203:4;:::i;:::-;34196:11;;34192:128;34212:10;:17;34209:1;:20;34192:128;;;34267:10;34278:2;34267:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34250:31:0;:10;34261:1;34250:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34250:31:0;;34242:71;;;;-1:-1:-1;;;34242:71:0;;;;;;;:::i;:::-;34231:3;;;;:::i;:::-;;;;34192:128;;;-1:-1:-1;34120:4:0;;;;:::i;:::-;;;;34085:240;;;34333:17;34359:18;34390:6;34386:759;34402:2;34400:1;:4;34386:759;;;34701:3;:1;34703;34701:3;:::i;:::-;34697:8;;:1;:8;:::i;:::-;34683:10;;:23;;;;:::i;:::-;34710:1;34683:28;34680:460;;34739:10;34750:1;34739:13;;;;;;;;:::i;:::-;;;;;;;;;;;34732:46;;-1:-1:-1;;;34732:46:0;;34772:4;34732:46;;;6005:51:1;-1:-1:-1;;;;;34732:31:0;;;;;;5978:18:1;;34732:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34719:59;-1:-1:-1;34788:15:0;;34785:285;;34816:5;34820:1;34816;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;34830:6:0;;;34816:20;:42;;;;;34850:8;34840:7;:18;34816:42;34812:251;;;34880:68;34930:17;34912:7;34899:10;34887:9;;34883:1;:13;;;;:::i;34880:68::-;34868:80;;34812:251;;;34990:64;35036:17;35023:7;35010:10;34997:9;;34993:1;:13;;;;:::i;34990:64::-;34978:76;;34812:251;35086:10;35097:1;35086:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;35079:30:0;;35110:6;35117:1;35119;35117:3;;;;:::i;:::-;35110:11;;;;;;;;:::i;:::-;;;;;;;35123:9;35079:54;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:32:1;;;;19428:51;;19510:2;19495:18;;19488:34;19416:2;19401:18;;19254:274;35079:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34680:460;34406:3;;;;:::i;:::-;;;;34386:759;;35711:2688;35852:12;35871:14;35916:15;;35933:10;35945:5;35899:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35889:63;;;;;;35871:81;;36027:16;36017:6;:26;36009:85;;;;-1:-1:-1;;;36009:85:0;;;;;;;:::i;:::-;36175:12;;36157:30;;36149:83;;;;-1:-1:-1;;;36149:83:0;;;;;;;:::i;:::-;36237:22;:20;:22::i;:::-;36292:17;;36274:15;:35;36266:69;;;;-1:-1:-1;;;36266:69:0;;20884:2:1;36266:69:0;;;20866:21:1;20923:2;20903:18;;;20896:30;-1:-1:-1;;;20942:18:1;;;20935:51;21003:18;;36266:69:0;20682:345:1;36266:69:0;36365:10;:17;36348:6;:13;:34;36340:104;;;;-1:-1:-1;;;36340:104:0;;21234:2:1;36340:104:0;;;21216:21:1;21273:2;21253:18;;;21246:30;21312:34;21292:18;;;21285:62;21383:28;21363:18;;;21356:56;21429:19;;36340:104:0;21032:422:1;36340:104:0;36451:7;36465:240;36481:10;:17;36477:2;:21;36465:240;;;36536:4;:2;36539:1;36536:4;:::i;:::-;36532:9;;:1;:9;:::i;:::-;36518:10;;:24;;;;:::i;:::-;36546:1;36518:29;36555:5;36515:52;36576:6;36583:4;:2;36586:1;36583:4;:::i;:::-;36576:11;;36572:128;36592:10;:17;36589:1;:20;36572:128;;;36647:10;36658:2;36647:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;36630:31:0;:10;36641:1;36630:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;36630:31:0;;36622:71;;;;-1:-1:-1;;;36622:71:0;;;;;;;:::i;:::-;36611:3;;;;:::i;:::-;;;;36572:128;;;-1:-1:-1;36500:4:0;;;;:::i;:::-;;;;36465:240;;;36711:9;36771:10;;36743:17;;36725:15;:35;;;;:::i;:::-;36724:43;;36764:3;36724:43;:::i;:::-;36723:58;;;;:::i;:::-;36711:70;-1:-1:-1;36786:10:0;36809:3;36799:7;36711:70;36803:3;36799:7;:::i;:::-;:13;;;;:::i;:::-;36786:26;;36818:14;36858:3;36850:5;:11;36847:67;;;36886:10;;:17;;36901:1;36886:14;:17::i;:::-;36873:10;:30;36847:67;36984:4;36976:5;:12;36973:556;;;37041:24;37061:3;37042:13;37053:1;37042:7;:13;:::i;37041:24::-;37007:32;37030:8;37019:4;37022:1;37019;:4;:::i;37007:32::-;:58;;;;:::i;:::-;36995:70;-1:-1:-1;37120:2:0;37110:8;:5;37120:2;37110:8;:::i;:::-;37109:13;;;;:::i;:::-;37093:30;;37094:10;37093:30;:::i;:::-;37079:9;:45;;37071:148;;;;-1:-1:-1;;;37071:148:0;;;;;;;:::i;:::-;36973:556;;;37248:23;37267:3;37249:4;37252:1;37249:2;:4;:::i;37248:23::-;:34;;37272:10;37248:34;:::i;:::-;37236:46;;37299:4;37291:5;:12;37288:236;;;37319:12;37327:4;37319:5;:12;:::i;:::-;37311:20;-1:-1:-1;37390:2:0;37378:8;37311:20;37390:2;37378:8;:::i;:::-;37377:15;;;;:::i;:::-;37376:23;;37396:3;37376:23;:::i;:::-;37360:40;;37361:10;37360:40;:::i;:::-;37346:9;:55;;37338:179;;;;-1:-1:-1;;;37338:179:0;;;;;;;:::i;:::-;37535:18;;37558:773;37574:2;37572:1;:4;37558:773;;;37868:3;:1;37870;37868:3;:::i;:::-;37864:8;;:1;:8;:::i;:::-;37850:10;;:23;;;;:::i;:::-;37877:1;37850:28;37847:479;;37906:10;37917:1;37906:13;;;;;;;;:::i;:::-;;;;;;;;;;;37899:46;;-1:-1:-1;;;37899:46:0;;37939:4;37899:46;;;6005:51:1;-1:-1:-1;;;;;37899:31:0;;;;;;5978:18:1;;37899:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37886:59;-1:-1:-1;37955:15:0;;37952:362;;37983:5;37987:1;37983;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;37997:6:0;;;37983:20;:44;;;;;38019:8;38007:9;:20;37983:44;37979:254;;;38049:71;38102:17;38082:9;38069:10;38056:9;;38052:1;:13;;;;:::i;38049:71::-;38037:83;;37979:254;;;38154:67;38202:17;38187:9;38174:10;38161:9;;38157:1;:13;;;;:::i;38154:67::-;38142:79;;37979:254;38250:10;38261:1;38250:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;38243:30:0;;38274:6;38281:1;38274:9;;;;;;;;:::i;:::-;;;;;;;38285;38243:52;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:32:1;;;;19428:51;;19510:2;19495:18;;19488:34;19416:2;19401:18;;19254:274;38243:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37952:362;37578:3;;;;:::i;:::-;;;;37558:773;;;-1:-1:-1;;38355:15:0;38335:17;:35;38382:9;35711:2688;-1:-1:-1;;;;;;;;;35711:2688:0:o;5085:139::-;5143:7;5171:1;5176;5171:6;5163:30;;;;-1:-1:-1;;;5163:30:0;;21661:2:1;5163:30:0;;;21643:21:1;21700:2;21680:18;;;21673:30;-1:-1:-1;;;21719:18:1;;;21712:41;21770:18;;5163:30:0;21459:335:1;5163:30:0;5211:5;5215:1;5211;:5;:::i;:::-;5204:12;5085:139;-1:-1:-1;;;5085:139:0:o;4848:229::-;4907:7;4931:1;4936;4931:6;4927:47;;-1:-1:-1;4961:1:0;4954:8;;4927:47;4986:9;4998:5;5002:1;4998;:5;:::i;:::-;4986:17;-1:-1:-1;5031:1:0;5022:5;5026:1;4986:17;5022:5;:::i;:::-;:10;5014:36;;;;-1:-1:-1;;;5014:36:0;;22001:2:1;5014:36:0;;;21983:21:1;22040:2;22020:18;;;22013:30;-1:-1:-1;;;22059:18:1;;;22052:43;22112:18;;5014:36:0;21799:337:1;4699:141:0;4757:7;4790:1;4785;:6;;4777:32;;;;-1:-1:-1;;;4777:32:0;;22343:2:1;4777:32:0;;;22325:21:1;22382:2;22362:18;;;22355:30;-1:-1:-1;;;22401:18:1;;;22394:43;22454:18;;4777:32:0;22141:337:1;4777:32:0;4827:5;4831:1;4827;:5;:::i;5594:132::-;5656:6;5684:1;5680;:5;5677:18;;;-1:-1:-1;5694:1:0;5687:8;;5677:18;-1:-1:-1;5715:1:0;;5594:132;-1:-1:-1;5594:132:0:o;4527:164::-;4585:7;;4617:5;4621:1;4617;:5;:::i;:::-;4605:17;;4646:1;4641;:6;;4633:31;;;;-1:-1:-1;;;4633:31:0;;22685:2:1;4633:31:0;;;22667:21:1;22724:2;22704:18;;;22697:30;-1:-1:-1;;;22743:18:1;;;22736:42;22795:18;;4633:31:0;22483:336:1;40140:1833:0;40395:15;;40378:13;;40361:12;;:31;;:16;:31::i;:::-;:49;:67;;;;;40426:2;40414:9;;:14;40361:67;40357:594;;;40451:9;;:13;;40463:1;40451:13;:::i;:::-;40439:9;:25;;;40503:37;;40525:13;;40537:1;40525:13;:::i;:::-;40521:18;;:1;:18;:::i;:::-;40503:12;;;:16;:37::i;:::-;40488:12;;:52;;;;:::i;:::-;40470:15;:70;40549:9;;40561:1;-1:-1:-1;40546:400:0;;;40588:15;;:22;;40608:1;40588:19;:22::i;:::-;40570:15;:40;40646:9;;40643:12;;:1;:12;:::i;:::-;40631:24;;40632:7;40631:24;:::i;:::-;40617:10;:39;40666:9;;40678:1;-1:-1:-1;40663:189:0;;;40719:2;40691:24;;:30;40688:157;;40758:1;40731:24;:28;40546:400;;40688:157;40835:1;40808:24;;:28;;;;:::i;:::-;40781:24;:55;40688:157;40546:400;;;40885:54;40933:1;40921:9;;:13;;;;:::i;40885:54::-;40869:13;:70;40546:400;41128:10;;:17;;41143:1;41128:14;:17::i;:::-;41115:10;:30;;;41253:24;;:28;;41115:10;41253:28;:::i;:::-;41240:8;;41227:10;;:21;;;;:::i;:::-;41226:56;;;;:::i;:::-;41286:1;41226:61;41223:586;;41298:15;:13;:15::i;:::-;41352:37;41374:9;;41386:1;41374:13;;;;:::i;41352:37::-;41337:12;;:52;;;;:::i;:::-;41319:15;:70;41494:21;;41420:15;;41397:20;;41479:36;;41420:15;41479:36;:::i;:::-;41441:74;;41521:24;41590:1;41563:24;;:28;;;;:::i;:::-;41548:10;;:44;;;;:::i;:::-;41624:15;41600:21;:39;41521:71;-1:-1:-1;41651:52:0;;;;:111;;;41733:24;;41721:8;;41708:10;;:21;;;;:::i;:::-;41707:50;;;;:::i;:::-;:55;41651:111;41647:157;;;41776:21;:19;:21::i;:::-;41292:517;;;41223:586;41838:42;-1:-1:-1;;;;;41831:63:0;;41966:1;41903:42;-1:-1:-1;;;;;41896:65:0;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;;;:::i;:::-;41831:137;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;41831:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41813:15;:155;40140:1833::o;5232:232::-;5295:7;5323:1;5328;5323:6;5315:30;;;;-1:-1:-1;;;5315:30:0;;21661:2:1;5315:30:0;;;21643:21:1;21700:2;21680:18;;;21673:30;-1:-1:-1;;;21719:18:1;;;21712:41;21770:18;;5315:30:0;21459:335:1;5315:30:0;5356:9;5368:5;5372:1;5368;:5;:::i;:::-;5356:17;-1:-1:-1;5388:5:0;5392:1;5388;:5;:::i;:::-;:10;5384:52;;5419:5;:1;5423;5419:5;:::i;2975:134::-;2927:5;;-1:-1:-1;;;;;2927:5:0;2913:10;:19;2905:42;;;;-1:-1:-1;;;2905:42:0;;20413:2:1;2905:42:0;;;20395:21:1;20452:2;20432:18;;;20425:30;-1:-1:-1;;;20471:18:1;;;20464:40;20521:18;;2905:42:0;20211:334:1;2905:42:0;3062:5:::1;::::0;3044:32:::1;::::0;;-1:-1:-1;;;;;3062:5:0;;::::1;23225:34:1::0;;23295:15;;;23290:2;23275:18;;23268:43;3044:32:0::1;::::0;23160:18:1;3044:32:0::1;;;;;;;3087:5;:14:::0;;-1:-1:-1;;;;;;3087:14:0::1;-1:-1:-1::0;;;;;3087:14:0;;;::::1;::::0;;;::::1;::::0;;2975:134::o;43501:1491::-;43642:30;;43569:15;;43546:20;;43627:45;;43569:15;43627:45;:::i;:::-;43589:83;;43677:15;43708:8;;43695:10;;:21;;;;:::i;:::-;43677:39;;43721:24;43762:10;43748;;:24;;;;:::i;:::-;43789:10;;43778:8;:21;43721:51;-1:-1:-1;43874:52:0;;;43870:761;;;43938:21;43962:69;43999:30;43963:29;:19;43988:3;43963:24;:29::i;43962:69::-;44044:1;44037:4;:8;43938:93;-1:-1:-1;44051:27:0;44081:45;44121:4;44081:25;43938:93;44102:3;44081:20;:25::i;:45::-;44051:75;;44169:69;44186:51;44214:22;44186;44203:4;44186:12;;:16;;:22;;;;:::i;44169:69::-;44154:12;:84;-1:-1:-1;43870:761:0;;-1:-1:-1;43870:761:0;;44272:23;44298:69;44346:19;44299:40;:30;44335:3;44299:35;:40::i;44298:69::-;44380:1;44373:4;:8;44272:95;-1:-1:-1;44387:29:0;44419:47;44461:4;44419:27;44272:95;44442:3;44419:22;:27::i;:47::-;44387:79;;44536:70;44553:52;44580:24;44553:21;44570:3;44553:12;;:16;;:21;;;;:::i;44536:70::-;44521:12;:85;-1:-1:-1;;43870:761:0;44670:12;44637:30;:45;;;;44726:42;-1:-1:-1;;;;;44719:65:0;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44687:29;:99;44809:15;;44794:12;;:30;44791:97;;;44867:15;;44852:12;:30;44791:97;44910:15;;44895:12;;:30;44892:92;;;44963:15;;44948:12;:30;44892:92;43541:1451;;;;43501:1491::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:173::-;817:20;;-1:-1:-1;;;;;866:31:1;;856:42;;846:70;;912:1;909;902:12;846:70;749:173;;;:::o;927:254::-;995:6;1003;1056:2;1044:9;1035:7;1031:23;1027:32;1024:52;;;1072:1;1069;1062:12;1024:52;1095:29;1114:9;1095:29;:::i;:::-;1085:39;1171:2;1156:18;;;;1143:32;;-1:-1:-1;;;927:254:1:o;1774:347::-;1825:8;1835:6;1889:3;1882:4;1874:6;1870:17;1866:27;1856:55;;1907:1;1904;1897:12;1856:55;-1:-1:-1;1930:20:1;;1973:18;1962:30;;1959:50;;;2005:1;2002;1995:12;1959:50;2042:4;2034:6;2030:17;2018:29;;2094:3;2087:4;2078:6;2070;2066:19;2062:30;2059:39;2056:59;;;2111:1;2108;2101:12;2056:59;1774:347;;;;;:::o;2126:695::-;2232:6;2240;2248;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:53;;;2342:1;2339;2332:12;2293:53;2365:29;2384:9;2365:29;:::i;:::-;2355:39;;2413:38;2447:2;2436:9;2432:18;2413:38;:::i;:::-;2403:48;;2498:2;2487:9;2483:18;2470:32;2460:42;;2549:2;2538:9;2534:18;2521:32;2511:42;;2604:3;2593:9;2589:19;2576:33;2632:18;2624:6;2621:30;2618:50;;;2664:1;2661;2654:12;2618:50;2703:58;2753:7;2744:6;2733:9;2729:22;2703:58;:::i;:::-;2126:695;;;;-1:-1:-1;2126:695:1;;-1:-1:-1;2126:695:1;;2780:8;;2126:695;-1:-1:-1;;;2126:695:1:o;3033:626::-;3130:6;3138;3146;3154;3162;3215:3;3203:9;3194:7;3190:23;3186:33;3183:53;;;3232:1;3229;3222:12;3183:53;3255:29;3274:9;3255:29;:::i;:::-;3245:39;;3303:38;3337:2;3326:9;3322:18;3303:38;:::i;:::-;3293:48;;3388:2;3377:9;3373:18;3360:32;3350:42;;3443:2;3432:9;3428:18;3415:32;3470:18;3462:6;3459:30;3456:50;;;3502:1;3499;3492:12;3456:50;3541:58;3591:7;3582:6;3571:9;3567:22;3541:58;:::i;:::-;3033:626;;;;-1:-1:-1;3033:626:1;;-1:-1:-1;3618:8:1;;3515:84;3033:626;-1:-1:-1;;;3033:626:1:o;3664:248::-;3732:6;3740;3793:2;3781:9;3772:7;3768:23;3764:32;3761:52;;;3809:1;3806;3799:12;3761:52;-1:-1:-1;;3832:23:1;;;3902:2;3887:18;;;3874:32;;-1:-1:-1;3664:248:1:o;3917:127::-;3978:10;3973:3;3969:20;3966:1;3959:31;4009:4;4006:1;3999:15;4033:4;4030:1;4023:15;4049:908;4103:5;4156:3;4149:4;4141:6;4137:17;4133:27;4123:55;;4174:1;4171;4164:12;4123:55;4210:6;4197:20;4236:4;4259:18;4296:2;4292;4289:10;4286:36;;;4302:18;;:::i;:::-;4348:2;4345:1;4341:10;4380:2;4374:9;4443:2;4439:7;4434:2;4430;4426:11;4422:25;4414:6;4410:38;4498:6;4486:10;4483:22;4478:2;4466:10;4463:18;4460:46;4457:72;;;4509:18;;:::i;:::-;4545:2;4538:22;4595:18;;;4671:15;;;4667:24;;;4629:15;;;;-1:-1:-1;4703:15:1;;;4700:35;;;4731:1;4728;4721:12;4700:35;4767:2;4759:6;4755:15;4744:26;;4779:148;4795:6;4790:3;4787:15;4779:148;;;4861:23;4880:3;4861:23;:::i;:::-;4849:36;;4905:12;;;;4812;;;;4779:148;;;4945:6;4049:908;-1:-1:-1;;;;;;;4049:908:1:o;4962:559::-;5073:6;5081;5089;5097;5150:3;5138:9;5129:7;5125:23;5121:33;5118:53;;;5167:1;5164;5157:12;5118:53;5203:9;5190:23;5180:33;;5260:2;5249:9;5245:18;5232:32;5222:42;;5315:2;5304:9;5300:18;5287:32;5342:18;5334:6;5331:30;5328:50;;;5374:1;5371;5364:12;5328:50;5397:61;5450:7;5441:6;5430:9;5426:22;5397:61;:::i;:::-;5387:71;;;5477:38;5511:2;5500:9;5496:18;5477:38;:::i;:::-;5467:48;;4962:559;;;;;;;:::o;5526:328::-;5603:6;5611;5619;5672:2;5660:9;5651:7;5647:23;5643:32;5640:52;;;5688:1;5685;5678:12;5640:52;5711:29;5730:9;5711:29;:::i;:::-;5701:39;;5759:38;5793:2;5782:9;5778:18;5759:38;:::i;:::-;5749:48;;5844:2;5833:9;5829:18;5816:32;5806:42;;5526:328;;;;;:::o;6256:180::-;6315:6;6368:2;6356:9;6347:7;6343:23;6339:32;6336:52;;;6384:1;6381;6374:12;6336:52;-1:-1:-1;6407:23:1;;6256:180;-1:-1:-1;6256:180:1:o;6441:391::-;6527:6;6535;6543;6551;6604:3;6592:9;6583:7;6579:23;6575:33;6572:53;;;6621:1;6618;6611:12;6572:53;6644:29;6663:9;6644:29;:::i;:::-;6634:39;6720:2;6705:18;;6692:32;;-1:-1:-1;6771:2:1;6756:18;;6743:32;;6822:2;6807:18;6794:32;;-1:-1:-1;6441:391:1;-1:-1:-1;;;6441:391:1:o;7019:460::-;7114:6;7122;7130;7138;7146;7199:3;7187:9;7178:7;7174:23;7170:33;7167:53;;;7216:1;7213;7206:12;7167:53;7252:9;7239:23;7229:33;;7309:2;7298:9;7294:18;7281:32;7271:42;;7360:2;7349:9;7345:18;7332:32;7322:42;;7411:2;7400:9;7396:18;7383:32;7373:42;;7434:39;7468:3;7457:9;7453:19;7434:39;:::i;:::-;7424:49;;7019:460;;;;;;;;:::o;7484:186::-;7543:6;7596:2;7584:9;7575:7;7571:23;7567:32;7564:52;;;7612:1;7609;7602:12;7564:52;7635:29;7654:9;7635:29;:::i;7675:385::-;7761:6;7769;7777;7785;7838:3;7826:9;7817:7;7813:23;7809:33;7806:53;;;7855:1;7852;7845:12;7806:53;-1:-1:-1;;7878:23:1;;;7948:2;7933:18;;7920:32;;-1:-1:-1;7999:2:1;7984:18;;7971:32;;8050:2;8035:18;8022:32;;-1:-1:-1;7675:385:1;-1:-1:-1;7675:385:1:o;8065:322::-;8142:6;8150;8158;8211:2;8199:9;8190:7;8186:23;8182:32;8179:52;;;8227:1;8224;8217:12;8179:52;8263:9;8250:23;8240:33;;8320:2;8309:9;8305:18;8292:32;8282:42;;8343:38;8377:2;8366:9;8362:18;8343:38;:::i;:::-;8333:48;;8065:322;;;;;:::o;8392:316::-;8469:6;8477;8485;8538:2;8526:9;8517:7;8513:23;8509:32;8506:52;;;8554:1;8551;8544:12;8506:52;-1:-1:-1;;8577:23:1;;;8647:2;8632:18;;8619:32;;-1:-1:-1;8698:2:1;8683:18;;;8670:32;;8392:316;-1:-1:-1;8392:316:1:o;8943:732::-;9079:6;9087;9095;9103;9156:3;9144:9;9135:7;9131:23;9127:33;9124:53;;;9173:1;9170;9163:12;9124:53;9209:9;9196:23;9186:33;;9266:2;9255:9;9251:18;9238:32;9228:42;;9321:2;9310:9;9306:18;9293:32;9344:18;9385:2;9377:6;9374:14;9371:34;;;9401:1;9398;9391:12;9371:34;9424:61;9477:7;9468:6;9457:9;9453:22;9424:61;:::i;:::-;9414:71;;9538:2;9527:9;9523:18;9510:32;9494:48;;9567:2;9557:8;9554:16;9551:36;;;9583:1;9580;9573:12;9551:36;;9606:63;9661:7;9650:8;9639:9;9635:24;9606:63;:::i;:::-;9596:73;;;8943:732;;;;;;;:::o;9680:260::-;9748:6;9756;9809:2;9797:9;9788:7;9784:23;9780:32;9777:52;;;9825:1;9822;9815:12;9777:52;9848:29;9867:9;9848:29;:::i;:::-;9838:39;;9896:38;9930:2;9919:9;9915:18;9896:38;:::i;:::-;9886:48;;9680:260;;;;;:::o;10269:127::-;10330:10;10325:3;10321:20;10318:1;10311:31;10361:4;10358:1;10351:15;10385:4;10382:1;10375:15;10401:128;10468:9;;;10489:11;;;10486:37;;;10503:18;;:::i;10534:380::-;10613:1;10609:12;;;;10656;;;10677:61;;10731:4;10723:6;10719:17;10709:27;;10677:61;10784:2;10776:6;10773:14;10753:18;10750:38;10747:161;;10830:10;10825:3;10821:20;10818:1;10811:31;10865:4;10862:1;10855:15;10893:4;10890:1;10883:15;10747:161;;10534:380;;;:::o;10919:127::-;10980:10;10975:3;10971:20;10968:1;10961:31;11011:4;11008:1;11001:15;11035:4;11032:1;11025:15;11051:120;11091:1;11117;11107:35;;11122:18;;:::i;:::-;-1:-1:-1;11156:9:1;;11051:120::o;11176:168::-;11249:9;;;11280;;11297:15;;;11291:22;;11277:37;11267:71;;11318:18;;:::i;11349:112::-;11381:1;11407;11397:35;;11412:18;;:::i;:::-;-1:-1:-1;11446:9:1;;11349:112::o;11466:125::-;11531:9;;;11552:10;;;11549:36;;;11565:18;;:::i;11596:127::-;11657:10;11652:3;11648:20;11645:1;11638:31;11688:4;11685:1;11678:15;11712:4;11709:1;11702:15;11728:135;11767:3;11788:17;;;11785:43;;11808:18;;:::i;:::-;-1:-1:-1;11855:1:1;11844:13;;11728:135::o;11868:184::-;11938:6;11991:2;11979:9;11970:7;11966:23;11962:32;11959:52;;;12007:1;12004;11997:12;11959:52;-1:-1:-1;12030:16:1;;11868:184;-1:-1:-1;11868:184:1:o;12057:422::-;12146:1;12189:5;12146:1;12203:270;12224:7;12214:8;12211:21;12203:270;;;12283:4;12279:1;12275:6;12271:17;12265:4;12262:27;12259:53;;;12292:18;;:::i;:::-;12342:7;12332:8;12328:22;12325:55;;;12362:16;;;;12325:55;12441:22;;;;12401:15;;;;12203:270;;;12207:3;12057:422;;;;;:::o;12484:806::-;12533:5;12563:8;12553:80;;-1:-1:-1;12604:1:1;12618:5;;12553:80;12652:4;12642:76;;-1:-1:-1;12689:1:1;12703:5;;12642:76;12734:4;12752:1;12747:59;;;;12820:1;12815:130;;;;12727:218;;12747:59;12777:1;12768:10;;12791:5;;;12815:130;12852:3;12842:8;12839:17;12836:43;;;12859:18;;:::i;:::-;-1:-1:-1;;12915:1:1;12901:16;;12930:5;;12727:218;;13029:2;13019:8;13016:16;13010:3;13004:4;13001:13;12997:36;12991:2;12981:8;12978:16;12973:2;12967:4;12964:12;12960:35;12957:77;12954:159;;;-1:-1:-1;13066:19:1;;;13098:5;;12954:159;13145:34;13170:8;13164:4;13145:34;:::i;:::-;13215:6;13211:1;13207:6;13203:19;13194:7;13191:32;13188:58;;;13226:18;;:::i;:::-;13264:20;;12484:806;-1:-1:-1;;;12484:806:1:o;13295:140::-;13353:5;13382:47;13423:4;13413:8;13409:19;13403:4;13382:47;:::i;13440:421::-;13642:2;13624:21;;;13681:2;13661:18;;;13654:30;13720:34;13715:2;13700:18;;13693:62;13791:27;13786:2;13771:18;;13764:55;13851:3;13836:19;;13440:421::o;14426:131::-;14486:5;14515:36;14542:8;14536:4;14515:36;:::i;14562:359::-;14747:19;;;14804:2;14800:15;;;;-1:-1:-1;;14796:53:1;14791:2;14782:12;;14775:75;14875:2;14866:12;;14859:28;14912:2;14903:12;;14562:359::o;15566:410::-;15768:2;15750:21;;;15807:2;15787:18;;;15780:30;15846:34;15841:2;15826:18;;15819:62;-1:-1:-1;;;15912:2:1;15897:18;;15890:44;15966:3;15951:19;;15566:410::o;15981:404::-;16183:2;16165:21;;;16222:2;16202:18;;;16195:30;16261:34;16256:2;16241:18;;16234:62;-1:-1:-1;;;16327:2:1;16312:18;;16305:38;16375:3;16360:19;;15981:404::o;16748:494::-;16950:2;16932:21;;;16989:2;16969:18;;;16962:30;17028:34;17023:2;17008:18;;17001:62;17099:34;17094:2;17079:18;;17072:62;17171:28;17165:3;17150:19;;17143:57;17232:3;17217:19;;16748:494::o;17247:556::-;17449:2;17431:21;;;17488:3;17468:18;;;17461:31;17528:34;17523:2;17508:18;;17501:62;17599:34;17594:2;17579:18;;17572:62;17671:34;17665:3;17650:19;;17643:63;-1:-1:-1;;;17737:3:1;17722:19;;17715:46;17793:3;17778:19;;17247:556::o;18471:422::-;18673:2;18655:21;;;18712:2;18692:18;;;18685:30;18751:34;18746:2;18731:18;;18724:62;18822:28;18817:2;18802:18;;18795:56;18883:3;18868:19;;18471:422::o;18898:351::-;19100:2;19082:21;;;19139:2;19119:18;;;19112:30;19178:29;19173:2;19158:18;;19151:57;19240:2;19225:18;;18898:351::o;19533:277::-;19600:6;19653:2;19641:9;19632:7;19628:23;19624:32;19621:52;;;19669:1;19666;19659:12;19621:52;19701:9;19695:16;19754:5;19747:13;19740:21;19733:5;19730:32;19720:60;;19776:1;19773;19766:12;20550:127;20611:10;20606:3;20602:20;20599:1;20592:31;20642:4;20639:1;20632:15;20666:4;20663:1;20656:15

Swarm Source

ipfs://71e9ef78024eb4834277a390da30104b57ebfd0816c68d6436d099cb420b937c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.