Contract 0xe798079cdbe8c6c922f240b55de51403cb9e30e2 5

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0a934c3bf9077ff39b2d2bbb42b33c6e4f1cf7e881d92bbbad338d4dca945389Deposit NF Ts147892182022-01-29 13:02:1415 secs ago0x62519add50c3b2863ef81da4bf303302f29dcc29 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.01705087
0xf4763994e0a1dcbb9d6857e02abf911a2de27e03ccaa2700c2683cff335eb7e2Deposit NF Ts147891962022-01-29 13:01:081 min ago0x4e594e140ed518a90c4d95f762a6c8971982b2e0 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00296798
0xb5b7b16b574b4e21e308dc38f94a6c5e82a62c7245171eb5d84a5868470123eaDeposit NF Ts147891662022-01-29 12:59:382 mins ago0xc08dc5634fc3f3876a5fe56978921b28daf18202 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.01940998
0x843c2c45950d5b69ad885257605515776c4682a9ebf6da40ed528f5c2e075d33Join Pool147891572022-01-29 12:59:113 mins ago0xc08dc5634fc3f3876a5fe56978921b28daf18202 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00063593
0xcb2910a3d60675cdc8121bf93f12a90d0cf64e844713ef90a8624906610b9fb0Deposit NF Ts147891092022-01-29 12:56:475 mins ago0x0a19b2ac2da8b86de5d34fcdc98f029c28b1becb IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00141821
0x3f96d4c3efa6c30a93ba6af47c8eb73c9b8f17bef117f61bad8982984f0b6d71Deposit NF Ts147891032022-01-29 12:56:296 mins ago0xb9d644d35d66409608da455682326e918091b00e IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.005053585
0xce754e18ada5874b94bb4ddf600591851902c9137726ba3d299ba5ab5dc85d8eWithdraw NF Ts147890812022-01-29 12:55:237 mins ago0x3b30d44df9afffc07a51457e18410c4ca0f90896 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.002475785
0x9e89a2fbc3932bc79781b762036cc53ad2a1dde4e1c90b2471fa7238350f91c8Deposit NF Ts147890052022-01-29 12:51:3510 mins ago0x0a19b2ac2da8b86de5d34fcdc98f029c28b1becb IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.020792275
0x63206ac79dba5ada7b21f09098e12ece4a55daeb979d3193ca91245877a03666Join Pool147889802022-01-29 12:50:2012 mins ago0x0a19b2ac2da8b86de5d34fcdc98f029c28b1becb IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.000821115
0xafd310a698d6cf8e6c84f36d337b9ac65f3ffbf7de3be0705fe681f5dfc803f5Withdraw NF Ts147888852022-01-29 12:45:3516 mins ago0xb9d644d35d66409608da455682326e918091b00e IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.001952615
0x09482484d932325dc4f5b8ac7b4b2d9ffaa2aac0171831102d90f60fc29e5687Deposit NF Ts147888732022-01-29 12:44:5917 mins ago0x87173f057032e952dc63dfd33b2bd4c946729283 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.021420345
0x6a4eb9f7e417282cda312869c6ac247b948a37fd2f0c9a9d9f4787209600deaaWithdraw NF Ts147887892022-01-29 12:40:4721 mins ago0x62519add50c3b2863ef81da4bf303302f29dcc29 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.006711685
0xf97ce1763b53e35976f1d01846a04451ab462f8e919632cc2b75e4550a107f4bDeposit NF Ts147887292022-01-29 12:37:4724 mins ago0x43e963487cd3599e8f58cfe9e34b2eed59451e97 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00212039
0x187e816d5d60d5902f2463419c6255c6d6edc084df6daaabc5864c95cc86a8a6Deposit NF Ts147886612022-01-29 12:34:2328 mins ago0x87cb0b2a5ec35895b9ddd3b8862fa60c74016403 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00305553
0x489c10edb335971c5fe7af4e0be161e41f9c0b077fc3d345f50dc2ca9b0d6c1eWithdraw NF Ts147886512022-01-29 12:33:5328 mins ago0x43e963487cd3599e8f58cfe9e34b2eed59451e97 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.0008489
0x403bf5b0c3895a68f16da4e37357b721472152254cb3e72faea7a49d3d818696Withdraw NF Ts147885842022-01-29 12:30:3231 mins ago0x46f5c3c665185342db3d52012f41a0df46581bd9 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00593559
0x736f1e9ee0de3002c984bfed71ab86df085b7afec882a5b2dfc4bbc7036fda44Withdraw NF Ts147884292022-01-29 12:22:4739 mins ago0xb55de17158ec4afac20b851507420f0483a639ac IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00116558
0xb575f872472edec6c7f8e979c5540abd5b2006d6804b6797ee8a79293a6719e8Claim Pending Re...147884192022-01-29 12:22:1740 mins ago0xbb4d7aaa32ed6c7723048ebfc7a5f351b499b83d IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.001511205
0xc4805f3c86e288f3cac5f374c9c2e7746faae564391bdbd79e4e0f025eefda8cClaim Pending Re...147884142022-01-29 12:22:0240 mins ago0xbb4d7aaa32ed6c7723048ebfc7a5f351b499b83d IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.001511205
0x1b7f364c479e2adc8aad20249d1b6ef41609f6190402a0a068d5e42a0dca18e1Claim Pending Re...147884092022-01-29 12:21:4740 mins ago0xbb4d7aaa32ed6c7723048ebfc7a5f351b499b83d IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.001511205
0xfdd44b1c9fa5d1cdc714767e0573fc638aae0366700c26fa0f9f5e0bd9d6783aDeposit NF Ts147883932022-01-29 12:20:5941 mins ago0x7c6920db78d2a712fd9f63cc80d34955355f7752 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00139868
0x2756ac37630065cdabe9113baa976373aea7c4d06fe630d075b22a7256a42988Join Pool147883462022-01-29 12:18:3843 mins ago0x87cb0b2a5ec35895b9ddd3b8862fa60c74016403 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.000821115
0x182bba9c5bfcd24b53d270fe97395990a57acc024d3569ce6208c10e1263e4ccClaim Pending Re...147883142022-01-29 12:17:0245 mins ago0x7c6920db78d2a712fd9f63cc80d34955355f7752 IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.001403205
0xd57eaddc2150e58fb4605d49785e577ac507248e405486cd50d2c3e58bf2589aDeposit NF Ts147880352022-01-29 12:03:0559 mins ago0xa2b09a81356d90a78553a197609635077fbb5a8b IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00718503
0x6b5bc26e3c6ae3b4dc996f13cf5bab40639ac06341de0b4d641c4bc130e29dfeDeposit NF Ts147878522022-01-29 11:53:561 hr 8 mins ago0x60420a1cd72b038982a6cc1fb5923373eb56f53c IN  0xe798079cdbe8c6c922f240b55de51403cb9e30e20 BNB0.00133937
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MasterChefV4

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 25000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-10-23
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

interface IERC20 {
    function totalSupply() external view returns (uint);
    function balanceOf(address account) external view returns (uint);
    function transfer(address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

interface IERC721 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
    event Transfer(address indexed from, address indexed to, uint indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) external view returns (uint balance);
    function ownerOf(uint tokenId) external view returns (address owner);
    function safeTransferFrom(address from, address to, uint tokenId) external;
    function transferFrom(address from, address to, uint tokenId) external;
    function approve(address to, uint tokenId) external;
    function getApproved(uint tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function safeTransferFrom(address from, address to, uint tokenId, bytes calldata data) external;
}

interface IEpicHeroNFT is IERC721{
    function tokenOfOwnerByIndex(address owner, uint index) external view returns (uint tokenId);
    function getHero(uint tokenId) external view returns (uint8 level, uint8 rarity);
}

interface IReferral {
    function recordReferral(address user, address referrer) external;
    function recordReferralCommission(address referrer, uint256 commission) external;
    function getReferrer(address user) external view returns (address);
}

interface IStrategy {
    function calculateShares(address _user, uint256[] memory _tokenIds) external view returns (uint256);
    function calculateShares2(address _user, uint256[] memory _tokenIds) external view returns (uint256);
}

interface ITreasury {
    function claimTokens(address _token, uint256 _amount, address _receiver) external;
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
    unchecked {
        uint256 oldAllowance = token.allowance(address(this), spender);
        require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
        uint256 newAllowance = oldAllowance - value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

library SafeMathExt {
    function add128(uint128 a, uint128 b) internal pure returns (uint128) {
        uint128 c = a + b;
        require(c >= a, "uint128: addition overflow");

        return c;
    }

    function sub128(uint128 a, uint128 b) internal pure returns (uint128) {
        require(b <= a, "uint128: subtraction overflow");
        uint128 c = a - b;

        return c;
    }

    function add64(uint64 a, uint64 b) internal pure returns (uint64) {
        uint64 c = a + b;
        require(c >= a, "uint64: addition overflow");

        return c;
    }

    function sub64(uint64 a, uint64 b) internal pure returns (uint64) {
        require(b <= a, "uint64: subtraction overflow");
        uint64 c = a - b;

        return c;
    }

    function safe128(uint256 a) internal pure returns(uint128) {
        require(a < 0x0100000000000000000000000000000000, "uint128: number overflow");
        return uint128(a);
    }

    function safe64(uint256 a) internal pure returns(uint64) {
        require(a < 0x010000000000000000, "uint64: number overflow");
        return uint64(a);
    }

    function safe32(uint256 a) internal pure returns(uint32) {
        require(a < 0x0100000000, "uint32: number overflow");
        return uint32(a);
    }

    function safe16(uint256 a) internal pure returns(uint16) {
        require(a < 0x010000, "uint32: number overflow");
        return uint16(a);
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}

abstract contract Auth {
    address owner;
    mapping (address => bool) private authorizations;

    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true;
    }

    modifier onlyOwner() {
        require(isOwner(msg.sender)); _;
    }

    modifier authorized() {
        require(isAuthorized(msg.sender)); _;
    }

    function authorize(address adr) public onlyOwner {
        authorizations[adr] = true;
        emit Authorized(adr);
    }

    function unauthorize(address adr) public onlyOwner {
        authorizations[adr] = false;
        emit Unauthorized(adr);
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }

    function transferOwnership(address payable adr) public onlyOwner {
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);
    }

    event OwnershipTransferred(address owner);
    event Authorized(address adr);
    event Unauthorized(address adr);
}

contract MasterChefV4 is Auth, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    uint256 public constant MAX_EPICHERO_PER_BLOCK = 2000 * 10 ** 18;
    uint256 public constant BONUS_MULTIPLIER = 1;
    uint256 public constant MAXIMUM_HARVEST_INTERVAL = 365 days;
    uint16 public constant MAXIMUM_REFERRAL_RATE = 1000;
    uint16 public constant MAXIMUM_FEE_RATE = 9000;

    struct UserInfo {
        uint256 amount;
        uint256 rewardDebt;
        uint256 rewardLockedUp;
        uint256 nextHarvestUntil;
        uint256 countNft;
        uint256 countNft2;
        bool canDeposit;
    }

    struct PoolInfo {
        address lpToken;
        address lpToken2;
        address strat;

        uint256 allocPoint;
        uint256 lastRewardBlock;
        uint256 accEpicHeroPerShare;
        uint16 depositFeeBP;
        uint256 harvestInterval;
        uint256 totalLp;
        uint256 countNft;
        uint256 countNft2;

        uint8 maxNft;
        bool paused;
    }

    struct NftOwner {
        address addr;
        uint256 pid;
        uint64  index;
    }

    IERC20 public feeToken;
    IERC20 public epicHero;
    ITreasury treasury;
    IReferral public referral;

    uint16 public referralRate = 0;
    uint16 public devFeeRate = 0;
    uint16 public demiFeeDividend = 20;

    uint256 public joinPoolFee = 1000 * 10 ** 18;

    address public devAddress = 0x8E377Cc27aBfB273313791097bcCe590a84F1F97;
    address public feeAddress = 0x618cBeb39560B08E820cbc47B3DE1028d3b75810;

    PoolInfo[] public poolInfo;
    
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;
    mapping (address => uint256[]) _stakingHeroArray;
    mapping (uint256 => NftOwner) _heroIdToOwnerAndIndex;

    mapping (address => uint256[]) _stakingHeroArray2;
    mapping (uint256 => NftOwner) _heroIdToOwnerAndIndex2;

    uint256 public startBlock;
    uint256 public totalAllocPoint = 0;
    uint256 public totalLockedUpRewards;

    uint256 public epicHeroPerBlock;

    bool public isPaused = false;
    
    constructor(
        address _epicHero,
        address _feeToken,
        address _treasury,
        address _referral,
        uint256 _epicHeroPerBlock
    ) Auth(msg.sender) ReentrancyGuard(){
        
        startBlock = block.number + (10 * 365 * 24 * 60 * 60);

        epicHero = IERC20(_epicHero);
        feeToken = IERC20(_feeToken);
        treasury = ITreasury(_treasury);
        referral = IReferral(_referral);

        epicHeroPerBlock = _epicHeroPerBlock;
    }
    
    // Set farming start, can call only once
    function startFarming() public onlyOwner {
        require(block.number < startBlock, "Error::Farm started already");

        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            PoolInfo storage pool = poolInfo[pid];
            pool.lastRewardBlock = block.number;
        }

        startBlock = block.number;
    }

    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    function add(
        uint256 _allocPoint,
        address _lpToken,
        address _lpToken2,
        uint16 _depositFeeBP,
        uint256 _harvestInterval,
        uint8 _maxNft,
        address _strat,
        bool _paused,
        bool _withUpdate
    ) public authorized {
        require(_depositFeeBP <= MAXIMUM_FEE_RATE, "add: deposit fee too high");
        require(_harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "add: invalid harvest interval");
        if (_withUpdate) {
            massUpdatePools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolInfo.push(PoolInfo({
        lpToken : _lpToken,
        lpToken2 : _lpToken2,
        strat: _strat,

        allocPoint : _allocPoint,
        lastRewardBlock : lastRewardBlock,
        accEpicHeroPerShare : 0,
        depositFeeBP : _depositFeeBP,
        harvestInterval : _harvestInterval,
        totalLp : 0,
        countNft: 0,
        countNft2: 0,
        maxNft: _maxNft,
        paused: _paused
        }));
    }

    function set(
        uint256 _pid,
        uint256 _allocPoint,
        uint16 _depositFeeBP,
        uint256 _harvestInterval,
        uint8 _maxNft,
        address _strat,
        bool _paused,
        bool _withUpdate
    ) public authorized {
        require(_depositFeeBP <= MAXIMUM_FEE_RATE, "set: deposit fee too high");
        require(_harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "set: invalid harvest interval");
        if (_withUpdate) {
            massUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
        poolInfo[_pid].depositFeeBP = _depositFeeBP;
        poolInfo[_pid].harvestInterval = _harvestInterval;
        poolInfo[_pid].paused = _paused;
        poolInfo[_pid].maxNft = _maxNft;
        poolInfo[_pid].strat = _strat;
    }

    function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) {
        return _to.sub(_from).mul(BONUS_MULTIPLIER);
    }

    function pendingEpicHero(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accEpicHeroPerShare = pool.accEpicHeroPerShare;
        uint256 lpSupply = pool.totalLp;

        if (block.number > pool.lastRewardBlock && lpSupply != 0) {
            uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
            uint256 epicHeroReward = multiplier.mul(epicHeroPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
            accEpicHeroPerShare = accEpicHeroPerShare.add(epicHeroReward.mul(1e12).div(lpSupply));
        }
        uint256 pending = user.amount.mul(accEpicHeroPerShare).div(1e12).sub(user.rewardDebt);
        return pending.add(user.rewardLockedUp);
    }

    function canHarvest(uint256 _pid, address _user) public view returns (bool) {
        UserInfo storage user = userInfo[_pid][_user];
        return block.number >= startBlock && block.timestamp >= user.nextHarvestUntil;
    }

    function getNftStaking(address _user) external view returns (uint256[] memory) {
        return _stakingHeroArray[_user];
    }

    function getNftStaking2(address _user) external view returns (uint256[] memory) {
        return _stakingHeroArray2[_user];
    }

    function getNftOwner(uint256 _heroId) external view returns (address){
        return _heroIdToOwnerAndIndex[_heroId].addr;
    }

    function getNftOwner2(uint256 _heroId) external view returns (address){
        return _heroIdToOwnerAndIndex2[_heroId].addr;
    }

    function countNftInPool(uint256 _pid, address _user) public view returns (uint256){
        UserInfo storage user = userInfo[_pid][_user];
        return user.countNft;
    }

    function countNftInPool2(uint256 _pid, address _user) public view returns (uint256){
        UserInfo storage user = userInfo[_pid][_user];
        return user.countNft2;
    }

    function getNftInPool(uint256 _pid, address _user) public view returns (uint256[] memory) {
        uint256[] storage _heroIds = _stakingHeroArray[_user];

        uint256[] memory ownerHeroIds = new uint256[](countNftInPool(_pid, _user));

        uint256 index = 0;
        for(uint i = 0; i < _heroIds.length; i++) {
            NftOwner storage _nftOwner = _heroIdToOwnerAndIndex[_heroIds[i]];
            if( _nftOwner.pid == _pid && _nftOwner.addr == _user ){
                ownerHeroIds[index] = _heroIds[i];
                index++;
            }
        }

        return ownerHeroIds;
    }

    function getNftInPool2(uint256 _pid, address _user) public view returns (uint256[] memory) {
        uint256[] storage _heroIds2 = _stakingHeroArray2[_user];

        uint256[] memory ownerHeroIds2 = new uint256[](countNftInPool2(_pid, _user));

        uint256 index = 0;
        for(uint i = 0; i < _heroIds2.length; i++) {
            NftOwner storage _nftOwner = _heroIdToOwnerAndIndex2[_heroIds2[i]];
            if( _nftOwner.pid == _pid && _nftOwner.addr == _user ){
                ownerHeroIds2[index] = _heroIds2[i];
                index++;
            }
        }

        return ownerHeroIds2;
    }

    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        uint256 totalReward = 0;

        for (uint256 pid = 0; pid < length; ++pid) {
            PoolInfo storage pool = poolInfo[pid];
            if (block.number <= pool.lastRewardBlock) {
                continue;
            }

            if (pool.totalLp == 0 || pool.allocPoint == 0) {
                pool.lastRewardBlock = block.number;
                continue;
            }

            uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
            uint256 epicHeroReward = multiplier.mul(epicHeroPerBlock).mul(pool.allocPoint).div(totalAllocPoint);

            pool.accEpicHeroPerShare = pool.accEpicHeroPerShare.add(epicHeroReward.mul(1e12).div(pool.totalLp));
            pool.lastRewardBlock = block.number;

            totalReward.add(epicHeroReward.mul(devFeeRate).div(10000));
        }
        if(totalReward > 0){
            safeEpicHeroTransfer(devAddress, totalReward);
        }
    }

    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.number <= pool.lastRewardBlock) {
            return;
        }

        if (pool.totalLp == 0 || pool.allocPoint == 0) {
            pool.lastRewardBlock = block.number;
            return;
        }

        uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
        uint256 epicHeroReward = multiplier.mul(epicHeroPerBlock).mul(pool.allocPoint).div(totalAllocPoint);

        pool.accEpicHeroPerShare = pool.accEpicHeroPerShare.add(epicHeroReward.mul(1e12).div(pool.totalLp));
        pool.lastRewardBlock = block.number;

        if(devFeeRate > 0){
            safeEpicHeroTransfer(devAddress, epicHeroReward.mul(devFeeRate).div(10000));
        }
    }

    function depositNFTs(uint256 _pid, uint256[] memory _heroIds, uint256[] memory _heroIds2, address _referrer) public nonReentrant {
        require(block.number >= startBlock, "MasterChef: Can not deposit before farm start");

        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        require(!isPaused && !pool.paused, "Pool: Paused");

        if(_heroIds.length.add(_heroIds2.length) > 0){
            require(user.countNft.add(user.countNft2).add(_heroIds.length).add(_heroIds2.length) <= pool.maxNft, "Invalid maxNft");
            require(joinPoolFee == 0 || user.canDeposit, "Join fee not paid");
        }

        updatePool(_pid);

        if (_heroIds.length > 0 && address(referral) != address(0) && _referrer != address(0) && _referrer != msg.sender) {
            referral.recordReferral(msg.sender, _referrer);
        }

        payOrLockupPendingEpicHero(_pid);

        if (pool.depositFeeBP > 0) {
            uint256 depositFee = _heroIds.length.mul(pool.depositFeeBP).add( _heroIds2.length.mul(pool.depositFeeBP).div(demiFeeDividend) );
            feeToken.safeTransferFrom(address(msg.sender), feeAddress, depositFee);
        }

        if (_heroIds.length > 0) {
            IEpicHeroNFT nftContract = IEpicHeroNFT(pool.lpToken);

            uint256[] storage heroIds = _stakingHeroArray[msg.sender];

            for(uint i = 0; i < _heroIds.length; i++) {
                (uint8 level, uint8 rarity) = nftContract.getHero(_heroIds[i]);

                require(level > 0, "Require higher level");
                require(rarity > 0, "Require higher rarity");

                nftContract.safeTransferFrom(
                    address(msg.sender),
                    address(this),
                    _heroIds[i]
                );

                _heroIdToOwnerAndIndex[_heroIds[i]] = NftOwner(msg.sender, _pid, SafeMathExt.safe64(heroIds.length));
                heroIds.push(_heroIds[i]);
            }

            uint256 sharesAdded = IStrategy(pool.strat).calculateShares(msg.sender, _heroIds);

            user.amount = user.amount.add(sharesAdded);
            user.countNft = user.countNft.add(_heroIds.length);

            pool.totalLp = pool.totalLp.add(sharesAdded);
            pool.countNft = pool.countNft.add(_heroIds.length);
        }

        if (_heroIds2.length > 0) {
            IEpicHeroNFT nftContract2 = IEpicHeroNFT(pool.lpToken2);

            uint256[] storage heroIds2 = _stakingHeroArray2[msg.sender];

            for(uint i = 0; i < _heroIds2.length; i++) {
                (uint8 level, uint8 rarity) = nftContract2.getHero(_heroIds2[i]);

                require(level > 0, "Require higher level");
                require(rarity > 0, "Require higher rarity");

                nftContract2.safeTransferFrom(
                    address(msg.sender),
                    address(this),
                    _heroIds2[i]
                );

                _heroIdToOwnerAndIndex2[_heroIds2[i]] = NftOwner(msg.sender, _pid, SafeMathExt.safe64(heroIds2.length));
                heroIds2.push(_heroIds2[i]);
            }

            uint256 sharesAdded2 = IStrategy(pool.strat).calculateShares2(msg.sender, _heroIds2);

            user.amount = user.amount.add(sharesAdded2);
            user.countNft2 = user.countNft2.add(_heroIds2.length);

            pool.totalLp = pool.totalLp.add(sharesAdded2);
            pool.countNft2 = pool.countNft2.add(_heroIds2.length);
        }

        user.rewardDebt = user.amount.mul(pool.accEpicHeroPerShare).div(1e12);
        emit DepositNFT(msg.sender, _pid, _heroIds, _heroIds2);
    }

    function withdrawNFTs(uint256 _pid, uint256[] memory _heroIds, uint256[] memory _heroIds2) public nonReentrant{
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        require(user.countNft > 0 || user.countNft2 > 0, "Withdraw: User nft not enough");
        require(pool.countNft > 0 || pool.countNft2 > 0, "Withdraw: Pool nft not enough");

        updatePool(_pid);
        payOrLockupPendingEpicHero(_pid);

        if(_heroIds.length > 0){
            uint256 sharesRemoved = IStrategy(pool.strat).calculateShares(msg.sender, _heroIds);

            if (sharesRemoved > user.amount) {
                user.amount = 0;
            } else {
                user.amount = user.amount.sub(sharesRemoved);
            }

            if(pool.totalLp > sharesRemoved){
                pool.totalLp = pool.totalLp.sub(sharesRemoved);
            }else{
                pool.totalLp = 0;
            }

            if(pool.countNft > _heroIds.length){
                pool.countNft = pool.countNft.sub(_heroIds.length);
            }else{
                pool.countNft = 0;
            }

            if(user.countNft > _heroIds.length){
                user.countNft = user.countNft.sub(_heroIds.length);
            }else{
                user.countNft = 0;
            }

            uint256[] storage heroIds = _stakingHeroArray[msg.sender];
            for(uint i = 0; i < _heroIds.length; i++) {
                NftOwner storage _nftOwner = _heroIdToOwnerAndIndex[_heroIds[i]];
                require(msg.sender == address(_nftOwner.addr), "Invalid NFT owner");
                require(_pid == _nftOwner.pid, "Invalid NFT pool");

                if(uint256(_nftOwner.index) != heroIds.length.sub(1)){
                    heroIds[uint256(_nftOwner.index)] = heroIds[heroIds.length.sub(1)];
                    _heroIdToOwnerAndIndex[heroIds[uint256(_nftOwner.index)]].index = _nftOwner.index;
                }

                heroIds.pop();

                delete _heroIdToOwnerAndIndex[_heroIds[i]];

                IEpicHeroNFT(pool.lpToken).transferFrom(
                    address(this),
                    address(msg.sender),
                    _heroIds[i]
                );
            }
        }

        if(_heroIds2.length > 0){
            uint256 sharesRemoved2 = IStrategy(pool.strat).calculateShares2(msg.sender, _heroIds2);

            if (sharesRemoved2 > user.amount) {
                user.amount = 0;
            } else {
                user.amount = user.amount.sub(sharesRemoved2);
            }

            if(pool.totalLp > sharesRemoved2){
                pool.totalLp = pool.totalLp.sub(sharesRemoved2);
            }else{
                pool.totalLp = 0;
            }

            if(pool.countNft2 > _heroIds2.length){
                pool.countNft2 = pool.countNft2.sub(_heroIds2.length);
            }else{
                pool.countNft2 = 0;
            }

            if(user.countNft2 > _heroIds2.length){
                user.countNft2 = user.countNft2.sub(_heroIds2.length);
            }else{
                user.countNft2 = 0;
            }

            uint256[] storage heroIds2 = _stakingHeroArray2[msg.sender];
            for(uint i = 0; i < _heroIds2.length; i++) {
                NftOwner storage _nftOwner = _heroIdToOwnerAndIndex2[_heroIds2[i]];
                require(msg.sender == address(_nftOwner.addr), "Invalid NFT owner");
                require(_pid == _nftOwner.pid, "Invalid NFT pool");

                if(uint256(_nftOwner.index) != heroIds2.length.sub(1)){
                    heroIds2[uint256(_nftOwner.index)] = heroIds2[heroIds2.length.sub(1)];
                    _heroIdToOwnerAndIndex2[heroIds2[uint256(_nftOwner.index)]].index = _nftOwner.index;
                }

                heroIds2.pop();

                delete _heroIdToOwnerAndIndex2[_heroIds2[i]];

                IEpicHeroNFT(pool.lpToken2).transferFrom(
                    address(this),
                    address(msg.sender),
                    _heroIds2[i]
                );
            }
        }

        user.rewardDebt = user.amount.mul(pool.accEpicHeroPerShare).div(1e12);
        emit WithdrawNFT(msg.sender, _pid, _heroIds, _heroIds2);
    }

    function joinPool(uint256 _pid) public nonReentrant{
        require(block.number >= startBlock, "MasterChef: Can not deposit before farm start");

        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        require(!isPaused && !pool.paused, "Pool: Paused");
        require(!user.canDeposit,"Already joined this pool");

        if(joinPoolFee > 0){
            feeToken.safeTransferFrom(address(msg.sender), feeAddress, joinPoolFee);
            user.canDeposit = true;
        }

        emit JoinPool(msg.sender, _pid);
    }

    function payOrLockupPendingEpicHero(uint256 _pid) internal {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        if (user.nextHarvestUntil == 0 && block.number >= startBlock) {
            user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval);
        }

        uint256 pending = user.amount.mul(pool.accEpicHeroPerShare).div(1e12).sub(user.rewardDebt);

        if (pending > 0) {
            user.rewardLockedUp = user.rewardLockedUp.add(pending);
            totalLockedUpRewards = totalLockedUpRewards.add(pending);
        }
    }

    function claimPendingReward(uint256 _pid) public nonReentrant {
        updatePool(_pid);

        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        if (user.nextHarvestUntil == 0 && block.number >= startBlock) {
            user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval);
        }

        uint256 pending = user.amount.mul(pool.accEpicHeroPerShare).div(1e12).sub(user.rewardDebt);
        if (canHarvest(_pid, msg.sender)) {
            if (pending > 0 || user.rewardLockedUp > 0) {
                uint256 totalRewards = pending.add(user.rewardLockedUp);

                // reset lockup
                totalLockedUpRewards = totalLockedUpRewards.sub(user.rewardLockedUp);
                user.rewardLockedUp = 0;
                user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval);

                // send rewards
                safeEpicHeroTransfer(msg.sender, totalRewards);
                payReferralCommission(msg.sender, totalRewards);
            }
        }

        user.rewardDebt = user.amount.mul(pool.accEpicHeroPerShare).div(1e12);
    }

    function payReferralCommission(address _user, uint256 _pending) internal {
        if (address(referral) != address(0) && referralRate > 0) {
            address referrer = referral.getReferrer(_user);
            uint256 commissionAmount = _pending.mul(referralRate).div(10000);

            if (referrer != address(0) && commissionAmount > 0) {
                safeEpicHeroTransfer(referrer, commissionAmount);
                referral.recordReferralCommission(referrer, commissionAmount);
                emit ReferralCommissionPaid(_user, referrer, commissionAmount);
            }
        }
    }

    function safeEpicHeroTransfer(address _to, uint256 _amount) internal {
        require(epicHero.balanceOf(address(treasury)) >= _amount,"Treasury not enough _amount");
        treasury.claimTokens(address(epicHero), _amount, _to);
    }

    function setDevAddress(address _devAddress) public onlyOwner{
        require(_devAddress != address(0), "setDevAddress: ZERO");
        devAddress = _devAddress;
    }

    function setFeeAddress(address _feeAddress) public onlyOwner{
        require(_feeAddress != address(0), "setFeeAddress: ZERO");
        feeAddress = _feeAddress;
    }

    function setFeeToken(address _feeToken) public onlyOwner{
        require(_feeToken != address(0), "setFeeToken: ZERO");
        feeToken = IERC20(_feeToken);
    }

    function setTreasury(address _treasuryAddress) public onlyOwner{
        require(_treasuryAddress != address(0), "setTreasury: ZERO");
        treasury = ITreasury(_treasuryAddress);
    }

    function setReferral(address _referralAddress) public onlyOwner {
        require(_referralAddress != address(0), "setReferral: ZERO");
        referral = IReferral(_referralAddress);
    }

    function setReferralRate(uint16 _referralRate) public onlyOwner {
        require(_referralRate <= MAXIMUM_REFERRAL_RATE, "Invalid referralRate");
        referralRate = _referralRate;
    }

    function setDevFeeRate(uint16 _devFeeRate) public onlyOwner {
        require(_devFeeRate <= MAXIMUM_FEE_RATE, "Invalid devFeeRate");
        devFeeRate = _devFeeRate;
    }

    function setJoinPoolFee(uint256 _joinFee) public onlyOwner {
        joinPoolFee = _joinFee;
    }

    function setPaused(bool value) external authorized {
        require(value != isPaused, "Same");
        isPaused = value;
    }

    function retrieveBNB(uint _amount) external onlyOwner{
        uint balance = address(this).balance;

        if(_amount > balance){
            _amount = balance;
        }

        (bool success,) = payable(msg.sender).call{ value: _amount }("");
        require(success, "Failed");
    }

    function emergencyRetrieveTokens(address _token, uint _amount) external onlyOwner {
        uint balance = IERC20(_token).balanceOf(address(this));

        if(_amount > balance){
            _amount = balance;
        }

        require(IERC20(_token).transfer(msg.sender, _amount), "Transfer failed");
    }

    function emergencyRetrieveNfts(address _ntfAddress, uint256[] memory _heroIds) external onlyOwner {
        for (uint i = 0; i < _heroIds.length; i++) {
            IEpicHeroNFT(_ntfAddress).safeTransferFrom(address(this), msg.sender, _heroIds[i]);
        }
    }

    function emergencyRetrieveAllNfts(address _ntfAddress) external onlyOwner {
        IEpicHeroNFT nftContract = IEpicHeroNFT(_ntfAddress);

        uint256 balance = nftContract.balanceOf(address(this));
        uint256[] memory heroIds = new uint256[](balance);

        for (uint i = 0; i < balance; i++) {
            heroIds[i] = nftContract.tokenOfOwnerByIndex(address(this), i);
        }

        for (uint i = 0; i < heroIds.length; i++) {
            nftContract.safeTransferFrom(address(this), msg.sender, heroIds[i]);
        }
    }

    function emergencyReturnAllNfts(address _ntfAddress) external onlyOwner {
        IEpicHeroNFT nftContract = IEpicHeroNFT(_ntfAddress);

        uint256 balance = nftContract.balanceOf(address(this));
        uint256[] memory heroIds = new uint256[](balance);

        for (uint i = 0; i < balance; i++) {
            heroIds[i] = nftContract.tokenOfOwnerByIndex(address(this), i);
        }

        for (uint i = 0; i < heroIds.length; i++) {
            NftOwner storage _nftOwner = _heroIdToOwnerAndIndex[heroIds[i]];
            nftContract.safeTransferFrom(address(this), _nftOwner.addr, heroIds[i]);
        }
    }

    function emergencyReturnAllNfts2(address _ntfAddress) external onlyOwner {
        IEpicHeroNFT nftContract = IEpicHeroNFT(_ntfAddress);

        uint256 balance = nftContract.balanceOf(address(this));
        uint256[] memory heroIds = new uint256[](balance);

        for (uint i = 0; i < balance; i++) {
            heroIds[i] = nftContract.tokenOfOwnerByIndex(address(this), i);
        }

        for (uint i = 0; i < heroIds.length; i++) {
            NftOwner storage _nftOwner = _heroIdToOwnerAndIndex2[heroIds[i]];
            nftContract.safeTransferFrom(address(this), _nftOwner.addr, heroIds[i]);
        }
    }

    function updateEmissionRate(uint256 _epicHeroPerBlock) external authorized {
        require(_epicHeroPerBlock <= MAX_EPICHERO_PER_BLOCK, "EPICHERO per block too high");
        massUpdatePools();

        emit EmissionRateUpdated(msg.sender, epicHeroPerBlock, _epicHeroPerBlock);
        epicHeroPerBlock = _epicHeroPerBlock;
    }

    function updateAllocPoint(uint256 _pid, uint256 _allocPoint, bool _withUpdate) external authorized {
        if (_withUpdate) {
            massUpdatePools();
        }

        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
    }

    function updatePoolPaused(uint256 _pid, bool _paused) external authorized {
        require(poolInfo[_pid].paused != _paused,"Same");
        poolInfo[_pid].paused = _paused;
    }

    function onERC721Received(address, address, uint, bytes calldata) public pure returns (bytes4) {
        return 0x150b7a02;
    }

    event DepositNFT(address indexed user, uint256 indexed pid, uint256[] heroIds, uint256[] heroIds2);
    event WithdrawNFT(address indexed user, uint256 indexed pid, uint256[] heroIds, uint256[] heroIds2);
    event JoinPool(address indexed user, uint256 indexed pid);
    event EmissionRateUpdated(address indexed caller, uint256 previousAmount, uint256 newAmount);
    event ReferralCommissionPaid(address indexed user, address indexed referrer, uint256 commissionAmount);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_epicHero","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_referral","type":"address"},{"internalType":"uint256","name":"_epicHeroPerBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adr","type":"address"}],"name":"Authorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"heroIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"heroIds2","type":"uint256[]"}],"name":"DepositNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"EmissionRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"JoinPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"commissionAmount","type":"uint256"}],"name":"ReferralCommissionPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adr","type":"address"}],"name":"Unauthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"heroIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"heroIds2","type":"uint256[]"}],"name":"WithdrawNFT","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_FEE_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_REFERRAL_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EPICHERO_PER_BLOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_lpToken2","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"uint8","name":"_maxNft","type":"uint8"},{"internalType":"address","name":"_strat","type":"address"},{"internalType":"bool","name":"_paused","type":"bool"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claimPendingReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"countNftInPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"countNftInPool2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demiFeeDividend","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_heroIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_heroIds2","type":"uint256[]"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"depositNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ntfAddress","type":"address"}],"name":"emergencyRetrieveAllNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ntfAddress","type":"address"},{"internalType":"uint256[]","name":"_heroIds","type":"uint256[]"}],"name":"emergencyRetrieveNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRetrieveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ntfAddress","type":"address"}],"name":"emergencyReturnAllNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ntfAddress","type":"address"}],"name":"emergencyReturnAllNfts2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epicHero","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epicHeroPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getNftInPool","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getNftInPool2","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_heroId","type":"uint256"}],"name":"getNftOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_heroId","type":"uint256"}],"name":"getNftOwner2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNftStaking","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNftStaking2","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"joinPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"joinPoolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingEpicHero","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"address","name":"lpToken2","type":"address"},{"internalType":"address","name":"strat","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accEpicHeroPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"internalType":"uint256","name":"totalLp","type":"uint256"},{"internalType":"uint256","name":"countNft","type":"uint256"},{"internalType":"uint256","name":"countNft2","type":"uint256"},{"internalType":"uint8","name":"maxNft","type":"uint8"},{"internalType":"bool","name":"paused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referral","outputs":[{"internalType":"contract IReferral","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"retrieveBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"uint8","name":"_maxNft","type":"uint8"},{"internalType":"address","name":"_strat","type":"address"},{"internalType":"bool","name":"_paused","type":"bool"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_devFeeRate","type":"uint16"}],"name":"setDevFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeToken","type":"address"}],"name":"setFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_joinFee","type":"uint256"}],"name":"setJoinPoolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referralAddress","type":"address"}],"name":"setReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_referralRate","type":"uint16"}],"name":"setReferralRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"updateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_epicHeroPerBlock","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_paused","type":"bool"}],"name":"updatePoolPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"},{"internalType":"uint256","name":"nextHarvestUntil","type":"uint256"},{"internalType":"uint256","name":"countNft","type":"uint256"},{"internalType":"uint256","name":"countNft2","type":"uint256"},{"internalType":"bool","name":"canDeposit","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_heroIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_heroIds2","type":"uint256[]"}],"name":"withdrawNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260068054600560c21b65ffffffffffff60a01b19909116179055683635c9adc5dea00000600755600880546001600160a01b0319908116738e377cc27abfb273313791097bcce590a84f1f97179091556009805490911673618cbeb39560b08e820cbc47b3de1028d3b7581017905560006011556014805460ff191690553480156200008f57600080fd5b506040516200612738038062006127833981016040819052620000b29162000168565b600080546001600160a01b0319163390811782558152600160208190526040909120805460ff191682179055600255620000f1436312cc0300620001ce565b601055600480546001600160a01b03199081166001600160a01b03978816179091556003805482169587169590951790945560058054851693861693909317909255600680549093169316929092179055601355620001f3565b80516001600160a01b03811681146200016357600080fd5b919050565b600080600080600060a0868803121562000180578081fd5b6200018b866200014b565b94506200019b602087016200014b565b9350620001ab604087016200014b565b9250620001bb606087016200014b565b9150608086015190509295509295909350565b60008219821115620001ee57634e487b7160e01b81526011600452602481fd5b500190565b615f2480620002036000396000f3fe608060405234801561001057600080fd5b50600436106104065760003560e01c80635a9756cd1161021a578063afbcfea111610135578063d371ed83116100c8578063f0b37c0411610097578063f2fde38b1161007c578063f2fde38b14610a40578063f958e2b714610a53578063fe9fbb8014610a6657600080fd5b8063f0b37c0414610a1a578063f0f4426014610a2d57600080fd5b8063d371ed83146109d6578063de73149d146109e9578063e687d21f146109f4578063ef13546a14610a0757600080fd5b8063bda1003f11610104578063bda1003f1461098a578063bde4aeca1461099d578063c143644f146109b0578063d0d41fe1146109c357600080fd5b8063afbcfea11461094f578063b187bd2614610957578063b21ab8cf14610964578063b6a5d7de1461097757600080fd5b80638ad2d5a7116101ad5780639acd7ab71161017c5780639acd7ab7146108b35780639e5914da146108dd578063a053ce1f146108f0578063ad6d87b41461091657600080fd5b80638ad2d5a7146107de5780638dbb1e3a1461080757806393f1a40b1461081a57806395679d86146108aa57600080fd5b8063763bbf3d116101e9578063763bbf3d1461079d5780638705fcd4146107b057806389c8c832146107c35780638aa28550146107d657600080fd5b80635a9756cd1461075c5780635c1162cd1461076f578063630b5ba114610782578063647846a51461078a57600080fd5b80632c57cc24116103255780633ad10ef6116102b8578063497d451b1161028757806351eb05a61161026c57806351eb05a6146106fd578063574ed4ca146107105780635929afe11461074957600080fd5b8063497d451b146106d757806349a9fdc7146106ea57600080fd5b80633ad10ef61461069f57806341275358146106b2578063474fa630146106c557806348cd4cb1146106ce57600080fd5b80633237712c116102f45780633237712c1461063d57806334e7a19f1461066657806338c9f39e146106795780633959aaef1461068c57600080fd5b80632c57cc24146105c85780632e6c998d146105d85780632f54bf6e146105fb57806330c23abf1461061d57600080fd5b80631526fe271161039d5780631ae3a94a1161036c5780631ae3a94a1461055e5780631cc6646414610599578063254e5c94146105ac57806329e47843146105b557600080fd5b80631526fe271461050357806315cce2241461052f57806316c38b3c1461054257806317caf6f11461055557600080fd5b80630eda8537116103d95780630eda85371461045d5780630fb5e127146104665780631441a5a91461046f578063150b7a021461049a57600080fd5b8063063b0cb41461040b578063081e3eda14610420578063097e7479146104375780630ba84cd21461044a575b600080fd5b61041e610419366004615b44565b610a92565b005b600a545b6040519081526020015b60405180910390f35b61041e61044536600461573d565b610d73565b61041e6104583660046158da565b61108d565b61042460075481565b61042460135481565b600654610482906001600160a01b031681565b6040516001600160a01b03909116815260200161042e565b6104d26104a8366004615775565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161042e565b6105166105113660046158da565b61114d565b60405161042e9d9c9b9a99989796959493929190615c53565b61041e61053d36600461573d565b6111de565b61041e610550366004615888565b611285565b61042460115481565b60065461058690760100000000000000000000000000000000000000000000900461ffff1681565b60405161ffff909116815260200161042e565b61041e6105a73660046158da565b61132d565b61058661232881565b61041e6105c33660046158c0565b611349565b610424686c6b935b8bbd40000081565b6105eb6105e636600461590a565b611403565b604051901515815260200161042e565b6105eb61060936600461573d565b6000546001600160a01b0391821691161490565b61063061062b36600461590a565b611445565b60405161042e9190615d0a565b61048261064b3660046158da565b6000908152600f60205260409020546001600160a01b031690565b61041e6106743660046158da565b6115c2565b61063061068736600461573d565b61182a565b61041e61069a3660046158da565b611896565b600854610482906001600160a01b031681565b600954610482906001600160a01b031681565b61042460125481565b61042460105481565b61041e6106e53660046158c0565b611a64565b6106306106f836600461573d565b611b20565b61041e61070b3660046158da565b611b8a565b61042461071e36600461590a565b6000918252600b602090815260408084206001600160a01b0393909316845291905290206004015490565b61041e61075736600461573d565b611cdc565b61041e61076a36600461585d565b611f99565b600454610482906001600160a01b031681565b61041e61213b565b600354610482906001600160a01b031681565b61041e6107ab36600461573d565b61228e565b61041e6107be36600461573d565b6125a1565b61041e6107d1366004615939565b612648565b610424600181565b6104826107ec3660046158da565b6000908152600d60205260409020546001600160a01b031690565b610424610815366004615aeb565b612936565b61087361082836600461590a565b600b6020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919060ff1687565b604080519788526020880196909652948601939093526060850191909152608084015260a0830152151560c082015260e00161042e565b6105866103e881565b600654610586907801000000000000000000000000000000000000000000000000900461ffff1681565b61041e6108eb36600461573d565b61294e565b6006546105869074010000000000000000000000000000000000000000900461ffff1681565b61042461092436600461590a565b6000918252600b602090815260408084206001600160a01b0393909316845291905290206005015490565b61041e6129f5565b6014546105eb9060ff1681565b61041e610972366004615a4a565b612ac1565b61041e61098536600461573d565b613802565b61063061099836600461590a565b613893565b61041e6109ab366004615b0c565b613a05565b61041e6109be3660046158da565b613a99565b61041e6109d136600461573d565b613b55565b6104246109e436600461590a565b613bfc565b6104246301e1338081565b61041e610a0236600461580f565b613d20565b61041e610a15366004615ac7565b613e11565b61041e610a2836600461573d565b613f10565b61041e610a3b36600461573d565b613f96565b61041e610a4e36600461573d565b61403d565b61041e610a613660046159e0565b6140f0565b6105eb610a7436600461573d565b6001600160a01b031660009081526001602052604090205460ff1690565b3360009081526001602052604090205460ff16610aae57600080fd5b61232861ffff87161115610b095760405162461bcd60e51b815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f20686967680000000000000060448201526064015b60405180910390fd5b6301e13380851115610b5d5760405162461bcd60e51b815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610b00565b8015610b6b57610b6b61213b565b610bbc87610bb6600a8b81548110610b9357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c020160030154601154614d0390919063ffffffff16565b90614d5f565b60118190555086600a8981548110610be457634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c02016003018190555085600a8981548110610c1b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c020160060160006101000a81548161ffff021916908361ffff16021790555084600a8981548110610c6857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c02016007018190555081600a8981548110610c9f57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c0201600b0160016101000a81548160ff02191690831515021790555083600a8981548110610ce957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c0201600b0160006101000a81548160ff021916908360ff16021790555082600a8981548110610d3457634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c020160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050505050565b6000546001600160a01b03163314610d8a57600080fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015610de757600080fd5b505afa158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f91906158f2565b905060008167ffffffffffffffff811115610e4a57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e73578160200160208202803683370190505b50905060005b82811015610f55576040517f2f745c59000000000000000000000000000000000000000000000000000000008152306004820152602481018290526001600160a01b03851690632f745c599060440160206040518083038186803b158015610ee057600080fd5b505afa158015610ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1891906158f2565b828281518110610f3857634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610f4d81615e54565b915050610e79565b5060005b8151811015611086576000600d6000848481518110610f8857634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000209050846001600160a01b03166342842e0e308360000160009054906101000a90046001600160a01b0316868681518110610fe857634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561105a57600080fd5b505af115801561106e573d6000803e3d6000fd5b5050505050808061107e90615e54565b915050610f59565b5050505050565b3360009081526001602052604090205460ff166110a957600080fd5b686c6b935b8bbd4000008111156111025760405162461bcd60e51b815260206004820152601b60248201527f455049434845524f2070657220626c6f636b20746f6f206869676800000000006044820152606401610b00565b61110a61213b565b601354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2601355565b600a818154811061115d57600080fd5b60009182526020909120600c9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b909b01546001600160a01b039a8b169c50988a169a979099169895979496939561ffff90931694919390929160ff808216916101009004168d565b6000546001600160a01b031633146111f557600080fd5b6001600160a01b03811661124b5760405162461bcd60e51b815260206004820152601160248201527f736574466565546f6b656e3a205a45524f0000000000000000000000000000006044820152606401610b00565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b3360009081526001602052604090205460ff166112a157600080fd5b60145460ff16151581151514156112fc5760405162461bcd60e51b8152600401610b009060208082526004908201527f53616d6500000000000000000000000000000000000000000000000000000000604082015260600190565b601480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000546001600160a01b0316331461134457600080fd5b600755565b6000546001600160a01b0316331461136057600080fd5b6103e861ffff821611156113b65760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420726566657272616c526174650000000000000000000000006044820152606401610b00565b6006805461ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000828152600b602090815260408083206001600160a01b03851684529091528120601054431080159061143b575080600301544210155b9150505b92915050565b6001600160a01b0381166000818152600e60209081526040808320868452600b835281842094845293909152812060050154606092919067ffffffffffffffff8111156114a257634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156114cb578160200160208202803683370190505b5090506000805b83548110156115b7576000600f600086848154811061150157634e487b7160e01b600052603260045260246000fd5b90600052602060002001548152602001908152602001600020905087816001015414801561153b575080546001600160a01b038881169116145b156115a45784828154811061156057634e487b7160e01b600052603260045260246000fd5b906000526020600020015484848151811061158b57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152826115a081615e54565b9350505b50806115af81615e54565b9150506114d2565b509095945050505050565b6002805414156116145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b00565b600280556010544310156116905760405162461bcd60e51b815260206004820152602d60248201527f4d6173746572436865663a2043616e206e6f74206465706f736974206265666f60448201527f7265206661726d207374617274000000000000000000000000000000000000006064820152608401610b00565b6000600a82815481106116b357634e487b7160e01b600052603260045260246000fd5b60009182526020808320858452600b825260408085203386529092529220601454600c909202909201925060ff161580156116f85750600b820154610100900460ff16155b6117445760405162461bcd60e51b815260206004820152600c60248201527f506f6f6c3a2050617573656400000000000000000000000000000000000000006044820152606401610b00565b600681015460ff16156117995760405162461bcd60e51b815260206004820152601860248201527f416c7265616479206a6f696e6564207468697320706f6f6c00000000000000006044820152606401610b00565b600754156117f3576009546007546003546117c5926001600160a01b0391821692339290911690614dbe565b6006810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b604051839033907f34d439447c7d29c98b78f8eff0f6cfa0e414030aa600733e84c0bc0a08a5cfda90600090a35050600160025550565b6001600160a01b0381166000908152600e602090815260409182902080548351818402810184019094528084526060939283018282801561188a57602002820191906000526020600020905b815481526020019060010190808311611876575b50505050509050919050565b6002805414156118e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b00565b600280556118f581611b8a565b6000600a828154811061191857634e487b7160e01b600052603260045260246000fd5b60009182526020808320858452600b8252604080852033865290925292206003810154600c909202909201925015801561195457506010544310155b1561196f576007820154611969904290614d5f565b60038201555b60006119a982600101546119a364e8d4a5100061199d87600501548760000154614e4690919063ffffffff16565b90614ee1565b90614d03565b90506119b58433611403565b15611a3b5760008111806119cd575060008260020154115b15611a3b5760006119eb836002015483614d5f90919063ffffffff16565b9050611a068360020154601254614d0390919063ffffffff16565b601255600060028401556007840154611a20904290614d5f565b6003840155611a2f3382614f3c565b611a3933826150b8565b505b60058301548254611a569164e8d4a510009161199d91614e46565b600192830155506002555050565b6000546001600160a01b03163314611a7b57600080fd5b61232861ffff82161115611ad15760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964206465764665655261746500000000000000000000000000006044820152606401610b00565b6006805461ffff909216760100000000000000000000000000000000000000000000027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561188a57602002820191906000526020600020908154815260200190600101908083116118765750505050509050919050565b6000600a8281548110611bad57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c0201905080600401544311611bcc575050565b60088101541580611bdf57506003810154155b15611bee574360049091015550565b6000611bfe826004015443612936565b90506000611c2b60115461199d8560030154611c2560135487614e4690919063ffffffff16565b90614e46565b9050611c5b611c50846008015461199d64e8d4a5100085614e4690919063ffffffff16565b600585015490614d5f565b6005840155436004840155600654760100000000000000000000000000000000000000000000900461ffff1615611cd657600854600654611cd6916001600160a01b031690611cd1906127109061199d908690760100000000000000000000000000000000000000000000900461ffff16614e46565b614f3c565b50505050565b6000546001600160a01b03163314611cf357600080fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015611d5057600080fd5b505afa158015611d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8891906158f2565b905060008167ffffffffffffffff811115611db357634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611ddc578160200160208202803683370190505b50905060005b82811015611ebe576040517f2f745c59000000000000000000000000000000000000000000000000000000008152306004820152602481018290526001600160a01b03851690632f745c599060440160206040518083038186803b158015611e4957600080fd5b505afa158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8191906158f2565b828281518110611ea157634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611eb681615e54565b915050611de2565b5060005b815181101561108657836001600160a01b03166342842e0e3033858581518110611efc57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611f6e57600080fd5b505af1158015611f82573d6000803e3d6000fd5b505050508080611f9190615e54565b915050611ec2565b6000546001600160a01b03163314611fb057600080fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b15801561200b57600080fd5b505afa15801561201f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204391906158f2565b905080821115612051578091505b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390526001600160a01b0384169063a9059cbb90604401602060405180830381600087803b1580156120b257600080fd5b505af11580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea91906158a4565b6121365760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610b00565b505050565b600a546000805b8281101561226d576000600a828154811061216d57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c020190508060040154431161218e575061225d565b600881015415806121a157506003810154155b156121b2574360049091015561225d565b60006121c2826004015443612936565b905060006121e960115461199d8560030154611c2560135487614e4690919063ffffffff16565b905061220e611c50846008015461199d64e8d4a5100085614e4690919063ffffffff16565b600584015543600484015560065461225890612251906127109061199d908590760100000000000000000000000000000000000000000000900461ffff16614e46565b8690614d5f565b505050505b61226681615e54565b9050612142565b50801561228a5760085461228a906001600160a01b031682614f3c565b5050565b6000546001600160a01b031633146122a557600080fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561230257600080fd5b505afa158015612316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233a91906158f2565b905060008167ffffffffffffffff81111561236557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561238e578160200160208202803683370190505b50905060005b82811015612470576040517f2f745c59000000000000000000000000000000000000000000000000000000008152306004820152602481018290526001600160a01b03851690632f745c599060440160206040518083038186803b1580156123fb57600080fd5b505afa15801561240f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243391906158f2565b82828151811061245357634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061246881615e54565b915050612394565b5060005b8151811015611086576000600f60008484815181106124a357634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000209050846001600160a01b03166342842e0e308360000160009054906101000a90046001600160a01b031686868151811061250357634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561257557600080fd5b505af1158015612589573d6000803e3d6000fd5b5050505050808061259990615e54565b915050612474565b6000546001600160a01b031633146125b857600080fd5b6001600160a01b03811661260e5760405162461bcd60e51b815260206004820152601360248201527f736574466565416464726573733a205a45524f000000000000000000000000006044820152606401610b00565b600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b3360009081526001602052604090205460ff1661266457600080fd5b61232861ffff871611156126ba5760405162461bcd60e51b815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610b00565b6301e1338085111561270e5760405162461bcd60e51b815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610b00565b801561271c5761271c61213b565b6000601054431161272f57601054612731565b435b601154909150612741908b614d5f565b601181905550600a604051806101a001604052808b6001600160a01b031681526020018a6001600160a01b03168152602001866001600160a01b031681526020018c8152602001838152602001600081526020018961ffff1681526020018881526020016000815260200160008152602001600081526020018760ff16815260200185151581525090806001815401808255809150506001900390600052602060002090600c020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548161ffff021916908361ffff16021790555060e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b0160006101000a81548160ff021916908360ff16021790555061018082015181600b0160016101000a81548160ff021916908315150217905550505050505050505050505050565b60006129476001611c258486614d03565b9392505050565b6000546001600160a01b0316331461296557600080fd5b6001600160a01b0381166129bb5760405162461bcd60e51b815260206004820152601160248201527f736574526566657272616c3a205a45524f0000000000000000000000000000006044820152606401610b00565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612a0c57600080fd5b6010544310612a5d5760405162461bcd60e51b815260206004820152601b60248201527f4572726f723a3a4661726d207374617274656420616c726561647900000000006044820152606401610b00565b600a5460005b81811015612ab9576000600a8281548110612a8e57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c020190504381600401819055505080612ab290615e54565b9050612a63565b505043601055565b600280541415612b135760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b00565b60028055601054431015612b8f5760405162461bcd60e51b815260206004820152602d60248201527f4d6173746572436865663a2043616e206e6f74206465706f736974206265666f60448201527f7265206661726d207374617274000000000000000000000000000000000000006064820152608401610b00565b6000600a8581548110612bb257634e487b7160e01b600052603260045260246000fd5b60009182526020808320888452600b825260408085203386529092529220601454600c909202909201925060ff16158015612bf75750600b820154610100900460ff16155b612c435760405162461bcd60e51b815260206004820152600c60248201527f506f6f6c3a2050617573656400000000000000000000000000000000000000006044820152606401610b00565b6000612c5a85518751614d5f90919063ffffffff16565b1115612d3857600b820154845186516005840154600485015460ff90941693612c8b9392610bb69290918391614d5f565b1115612cd95760405162461bcd60e51b815260206004820152600e60248201527f496e76616c6964206d61784e66740000000000000000000000000000000000006044820152606401610b00565b6007541580612cec5750600681015460ff165b612d385760405162461bcd60e51b815260206004820152601160248201527f4a6f696e20666565206e6f7420706169640000000000000000000000000000006044820152606401610b00565b612d4186611b8a565b60008551118015612d5c57506006546001600160a01b031615155b8015612d7057506001600160a01b03831615155b8015612d8557506001600160a01b0383163314155b15612e09576006546040517f0c7f7b6b0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03858116602483015290911690630c7f7b6b90604401600060405180830381600087803b158015612df057600080fd5b505af1158015612e04573d6000803e3d6000fd5b505050505b612e12866152be565b600682015461ffff1615612e9a5760068054908301548551600092612e7692612e629261ffff780100000000000000000000000000000000000000000000000090930483169261199d9216614e46565b60068501548851610bb69161ffff16614e46565b600954600354919250612e98916001600160a01b039081169133911684614dbe565b505b845115613317578154336000908152600c602052604081206001600160a01b0390921691905b875181101561322557600080846001600160a01b03166321d801118b8581518110612efb57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401612f2191815260200190565b604080518083038186803b158015612f3857600080fd5b505afa158015612f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f709190615bcf565b9150915060008260ff1611612fc75760405162461bcd60e51b815260206004820152601460248201527f5265717569726520686967686572206c6576656c0000000000000000000000006044820152606401610b00565b60008160ff161161301a5760405162461bcd60e51b815260206004820152601560248201527f52657175697265206869676865722072617269747900000000000000000000006044820152606401610b00565b846001600160a01b03166342842e0e33308d878151811061304b57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156130bd57600080fd5b505af11580156130d1573d6000803e3d6000fd5b505050506040518060600160405280336001600160a01b031681526020018c81526020016131028680549050615398565b67ffffffffffffffff16815250600d60008c868151811061313357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252818101929092526040908101600020835181547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039091161781559183015160018301559190910151600290910180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff909216919091179055895184908b90859081106131f157634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529190922001555081905061321d81615e54565b915050612ec0565b5060028401546040517fe43cca530000000000000000000000000000000000000000000000000000000081526000916001600160a01b03169063e43cca53906132749033908c90600401615ce8565b60206040518083038186803b15801561328c57600080fd5b505afa1580156132a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c491906158f2565b84549091506132d39082614d5f565b8455875160048501546132e591614d5f565b600485015560088501546132f99082614d5f565b60088601558751600986015461330e91614d5f565b60098601555050505b835115613797576001820154336000908152600e602052604081206001600160a01b0390921691905b86518110156136a557600080846001600160a01b03166321d801118a858151811061337b57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016133a191815260200190565b604080518083038186803b1580156133b857600080fd5b505afa1580156133cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f09190615bcf565b9150915060008260ff16116134475760405162461bcd60e51b815260206004820152601460248201527f5265717569726520686967686572206c6576656c0000000000000000000000006044820152606401610b00565b60008160ff161161349a5760405162461bcd60e51b815260206004820152601560248201527f52657175697265206869676865722072617269747900000000000000000000006044820152606401610b00565b846001600160a01b03166342842e0e33308c87815181106134cb57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561353d57600080fd5b505af1158015613551573d6000803e3d6000fd5b505050506040518060600160405280336001600160a01b031681526020018c81526020016135828680549050615398565b67ffffffffffffffff16815250600f60008b86815181106135b357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252818101929092526040908101600020835181547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039091161781559183015160018301559190910151600290910180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff909216919091179055885184908a908590811061367157634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529190922001555081905061369d81615e54565b915050613340565b5060028401546040517f3e6f12490000000000000000000000000000000000000000000000000000000081526000916001600160a01b031690633e6f1249906136f49033908b90600401615ce8565b60206040518083038186803b15801561370c57600080fd5b505afa158015613720573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374491906158f2565b84549091506137539082614d5f565b84558651600585015461376591614d5f565b600585015560088501546137799082614d5f565b60088601558651600a86015461378e91614d5f565b600a8601555050505b600582015481546137b29164e8d4a510009161199d91614e46565b6001820155604051869033907f9ee88cdec6fcca2b4a83c9f7f6da7d9de1fd9caf6fa97d05eb6f5484e991d6a5906137ed9089908990615d1d565b60405180910390a35050600160025550505050565b6000546001600160a01b0316331461381957600080fd5b6001600160a01b03811660008181526001602081815260409283902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690921790915590519182527fdc84e3a4c83602050e3865df792a4e6800211a79ac60db94e703a820ce89292491015b60405180910390a150565b6001600160a01b0381166000818152600c60209081526040808320868452600b835281842094845293909152812060040154606092919067ffffffffffffffff8111156138f057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613919578160200160208202803683370190505b5090506000805b83548110156115b7576000600d600086848154811061394f57634e487b7160e01b600052603260045260246000fd5b906000526020600020015481526020019081526020016000209050878160010154148015613989575080546001600160a01b038881169116145b156139f2578482815481106139ae57634e487b7160e01b600052603260045260246000fd5b90600052602060002001548484815181106139d957634e487b7160e01b600052603260045260246000fd5b6020908102919091010152826139ee81615e54565b9350505b50806139fd81615e54565b915050613920565b3360009081526001602052604090205460ff16613a2157600080fd5b8015613a2f57613a2f61213b565b613a5782610bb6600a8681548110610b9357634e487b7160e01b600052603260045260246000fd5b60118190555081600a8481548110613a7f57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c020160030181905550505050565b6000546001600160a01b03163314613ab057600080fd5b4780821115613abd578091505b604051600090339084908381818185875af1925050503d8060008114613aff576040519150601f19603f3d011682016040523d82523d6000602084013e613b04565b606091505b50509050806121365760405162461bcd60e51b815260206004820152600660248201527f4661696c656400000000000000000000000000000000000000000000000000006044820152606401610b00565b6000546001600160a01b03163314613b6c57600080fd5b6001600160a01b038116613bc25760405162461bcd60e51b815260206004820152601360248201527f736574446576416464726573733a205a45524f000000000000000000000000006044820152606401610b00565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600080600a8481548110613c2057634e487b7160e01b600052603260045260246000fd5b60009182526020808320878452600b825260408085206001600160a01b038916865290925292206005600c9092029092019081015460088201546004830154929450909143118015613c7157508015155b15613cd1576000613c86856004015443612936565b90506000613cad60115461199d8860030154611c2560135487614e4690919063ffffffff16565b9050613ccc613cc58461199d8464e8d4a51000614e46565b8590614d5f565b935050505b6000613cfb84600101546119a364e8d4a5100061199d878960000154614e4690919063ffffffff16565b9050613d14846002015482614d5f90919063ffffffff16565b98975050505050505050565b6000546001600160a01b03163314613d3757600080fd5b60005b815181101561213657826001600160a01b03166342842e0e3033858581518110613d7457634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015613de657600080fd5b505af1158015613dfa573d6000803e3d6000fd5b505050508080613e0990615e54565b915050613d3a565b3360009081526001602052604090205460ff16613e2d57600080fd5b801515600a8381548110613e5157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c0201600b0160019054906101000a900460ff1615151415613ec25760405162461bcd60e51b8152600401610b009060208082526004908201527f53616d6500000000000000000000000000000000000000000000000000000000604082015260600190565b80600a8381548110613ee457634e487b7160e01b600052603260045260246000fd5b90600052602060002090600c0201600b0160016101000a81548160ff0219169083151502179055505050565b6000546001600160a01b03163314613f2757600080fd5b6001600160a01b03811660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f8e4a23d6a5d81f013eca4bc92aeb9214ccafcaebd1f097c350c922d6e19122d59101613888565b6000546001600160a01b03163314613fad57600080fd5b6001600160a01b0381166140035760405162461bcd60e51b815260206004820152601160248201527f73657454726561737572793a205a45524f0000000000000000000000000000006044820152606401610b00565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461405457600080fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811782558082526001602081815260409384902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639101613888565b6002805414156141425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b00565b600280819055506000600a848154811061416c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320878452600b8252604080852033865290925292206004810154600c90920290920192501515806141aa575060008160050154115b6141f65760405162461bcd60e51b815260206004820152601d60248201527f57697468647261773a2055736572206e6674206e6f7420656e6f7567680000006044820152606401610b00565b60008260090154118061420d5750600082600a0154115b6142595760405162461bcd60e51b815260206004820152601d60248201527f57697468647261773a20506f6f6c206e6674206e6f7420656e6f7567680000006044820152606401610b00565b61426285611b8a565b61426b856152be565b8351156147815760028201546040517fe43cca530000000000000000000000000000000000000000000000000000000081526000916001600160a01b03169063e43cca53906142c09033908990600401615ce8565b60206040518083038186803b1580156142d857600080fd5b505afa1580156142ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431091906158f2565b82549091508111156143255760008255614334565b81546143319082614d03565b82555b808360080154111561435957600883015461434f9082614d03565b6008840155614361565b600060088401555b845183600901541115614388578451600984015461437e91614d03565b6009840155614390565b600060098401555b8451826004015411156143b757845160048301546143ad91614d03565b60048301556143bf565b600060048301555b336000908152600c60205260408120905b865181101561477d576000600d60008984815181106143ff57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825281019190915260400160002080549091506001600160a01b031633146144755760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964204e4654206f776e65720000000000000000000000000000006044820152606401610b00565b806001015489146144c85760405162461bcd60e51b815260206004820152601060248201527f496e76616c6964204e465420706f6f6c000000000000000000000000000000006044820152606401610b00565b82546144d5906001614d03565b600282015467ffffffffffffffff16146145da57825483906144f8906001614d03565b8154811061451657634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460028201548454859167ffffffffffffffff1690811061455257634e487b7160e01b600052603260045260246000fd5b60009182526020822001919091556002820154845467ffffffffffffffff90911691600d9186908490811061459757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b828054806145f857634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055600d600089848151811061463257634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252810191909152604001600090812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181019190915560020180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055855488516001600160a01b03909116906323b872dd90309033908c90879081106146df57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561475157600080fd5b505af1158015614765573d6000803e3d6000fd5b5050505050808061477590615e54565b9150506143d0565b5050505b825115614c995760028201546040517f3e6f12490000000000000000000000000000000000000000000000000000000081526000916001600160a01b031690633e6f1249906147d69033908890600401615ce8565b60206040518083038186803b1580156147ee57600080fd5b505afa158015614802573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061482691906158f2565b825490915081111561483b576000825561484a565b81546148479082614d03565b82555b808360080154111561486f5760088301546148659082614d03565b6008840155614877565b600060088401555b835183600a0154111561489e578351600a84015461489491614d03565b600a8401556148a6565b6000600a8401555b8351826005015411156148cd57835160058301546148c391614d03565b60058301556148d5565b600060058301555b336000908152600e60205260408120905b8551811015614c95576000600f600088848151811061491557634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825281019190915260400160002080549091506001600160a01b0316331461498b5760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964204e4654206f776e65720000000000000000000000000000006044820152606401610b00565b806001015489146149de5760405162461bcd60e51b815260206004820152601060248201527f496e76616c6964204e465420706f6f6c000000000000000000000000000000006044820152606401610b00565b82546149eb906001614d03565b600282015467ffffffffffffffff1614614af05782548390614a0e906001614d03565b81548110614a2c57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460028201548454859167ffffffffffffffff16908110614a6857634e487b7160e01b600052603260045260246000fd5b60009182526020822001919091556002820154845467ffffffffffffffff90911691600f91869084908110614aad57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b82805480614b0e57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055600f6000888481518110614b4857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252810191909152604001600090812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018082019290925560020180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905586015487516001600160a01b03909116906323b872dd90309033908b9087908110614bf757634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015614c6957600080fd5b505af1158015614c7d573d6000803e3d6000fd5b50505050508080614c8d90615e54565b9150506148e6565b5050505b60058201548154614cb49164e8d4a510009161199d91614e46565b6001820155604051859033907ffe97ff047498b341d228e6dc3bab6a0358f7531e349b09b73a13b1334010d1a390614cef9088908890615d1d565b60405180910390a350506001600255505050565b600082821115614d555760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610b00565b6129478284615e11565b600080614d6c8385615d9c565b9050838110156129475760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b00565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611cd69085906153f6565b600082614e555750600061143f565b6000614e618385615dd4565b905082614e6e8583615db4565b146129475760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610b00565b6000808211614f325760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610b00565b6129478284615db4565b600480546005546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182169381019390935283929116906370a082319060240160206040518083038186803b158015614fa157600080fd5b505afa158015614fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fd991906158f2565b10156150275760405162461bcd60e51b815260206004820152601b60248201527f5472656173757279206e6f7420656e6f756768205f616d6f756e7400000000006044820152606401610b00565b600554600480546040517f01f3c01e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821692810192909252602482018490528481166044830152909116906301f3c01e90606401600060405180830381600087803b15801561509c57600080fd5b505af11580156150b0573d6000803e3d6000fd5b505050505050565b6006546001600160a01b0316158015906150ef575060065474010000000000000000000000000000000000000000900461ffff1615155b1561228a576006546040517f4a9fefc70000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000921690634a9fefc79060240160206040518083038186803b15801561515357600080fd5b505afa158015615167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061518b9190615759565b6006549091506000906151c3906127109061199d90869074010000000000000000000000000000000000000000900461ffff16614e46565b90506001600160a01b038216158015906151dd5750600081115b15611cd6576151ec8282614f3c565b6006546040517fdc1694b80000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529091169063dc1694b890604401600060405180830381600087803b15801561525357600080fd5b505af1158015615267573d6000803e3d6000fd5b50505050816001600160a01b0316846001600160a01b03167f86ddab457291316e0f5496737e5ca67c4037234c32c3be04c48ae96186893a7b836040516152b091815260200190565b60405180910390a350505050565b6000600a82815481106152e157634e487b7160e01b600052603260045260246000fd5b60009182526020808320858452600b8252604080852033865290925292206003810154600c909202909201925015801561531d57506010544310155b15615338576007820154615332904290614d5f565b60038201555b600061536682600101546119a364e8d4a5100061199d87600501548760000154614e4690919063ffffffff16565b90508015611cd657600282015461537d9082614d5f565b600283015560125461538f9082614d5f565b60125550505050565b60006801000000000000000082106153f25760405162461bcd60e51b815260206004820152601760248201527f75696e7436343a206e756d626572206f766572666c6f770000000000000000006044820152606401610b00565b5090565b600061544b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166154db9092919063ffffffff16565b805190915015612136578080602001905181019061546991906158a4565b6121365760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b00565b60606154ea84846000856154f2565b949350505050565b60608247101561556a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b00565b843b6155b85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b00565b600080866001600160a01b031685876040516155d49190615c37565b60006040518083038185875af1925050503d8060008114615611576040519150601f19603f3d011682016040523d82523d6000602084013e615616565b606091505b5091509150615626828286615631565b979650505050505050565b60608315615640575081612947565b8251156156505782518084602001fd5b8160405162461bcd60e51b8152600401610b009190615d4b565b600082601f83011261567a578081fd5b8135602067ffffffffffffffff8083111561569757615697615ea3565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811084821117156156da576156da615ea3565b604052848152838101925086840182880185018910156156f8578687fd5b8692505b8583101561571a5780358452928401926001929092019184016156fc565b50979650505050505050565b803561ffff8116811461573857600080fd5b919050565b60006020828403121561574e578081fd5b813561294781615eb9565b60006020828403121561576a578081fd5b815161294781615eb9565b60008060008060006080868803121561578c578081fd5b853561579781615eb9565b945060208601356157a781615eb9565b935060408601359250606086013567ffffffffffffffff808211156157ca578283fd5b818801915088601f8301126157dd578283fd5b8135818111156157eb578384fd5b8960208285010111156157fc578384fd5b9699959850939650602001949392505050565b60008060408385031215615821578182fd5b823561582c81615eb9565b9150602083013567ffffffffffffffff811115615847578182fd5b6158538582860161566a565b9150509250929050565b6000806040838503121561586f578182fd5b823561587a81615eb9565b946020939093013593505050565b600060208284031215615899578081fd5b813561294781615ed1565b6000602082840312156158b5578081fd5b815161294781615ed1565b6000602082840312156158d1578081fd5b61294782615726565b6000602082840312156158eb578081fd5b5035919050565b600060208284031215615903578081fd5b5051919050565b6000806040838503121561591c578182fd5b82359150602083013561592e81615eb9565b809150509250929050565b60008060008060008060008060006101208a8c031215615957578384fd5b8935985060208a013561596981615eb9565b975060408a013561597981615eb9565b965061598760608b01615726565b955060808a0135945060a08a013561599e81615edf565b935060c08a01356159ae81615eb9565b925060e08a01356159be81615ed1565b91506101008a01356159cf81615ed1565b809150509295985092959850929598565b6000806000606084860312156159f4578081fd5b83359250602084013567ffffffffffffffff80821115615a12578283fd5b615a1e8783880161566a565b93506040860135915080821115615a33578283fd5b50615a408682870161566a565b9150509250925092565b60008060008060808587031215615a5f578182fd5b84359350602085013567ffffffffffffffff80821115615a7d578384fd5b615a898883890161566a565b94506040870135915080821115615a9e578384fd5b50615aab8782880161566a565b9250506060850135615abc81615eb9565b939692955090935050565b60008060408385031215615ad9578182fd5b82359150602083013561592e81615ed1565b60008060408385031215615afd578182fd5b50508035926020909101359150565b600080600060608486031215615b20578081fd5b83359250602084013591506040840135615b3981615ed1565b809150509250925092565b600080600080600080600080610100898b031215615b60578182fd5b8835975060208901359650615b7760408a01615726565b9550606089013594506080890135615b8e81615edf565b935060a0890135615b9e81615eb9565b925060c0890135615bae81615ed1565b915060e0890135615bbe81615ed1565b809150509295985092959890939650565b60008060408385031215615be1578182fd5b8251615bec81615edf565b602084015190925061592e81615edf565b6000815180845260208085019450808401835b83811015615c2c57815187529582019590820190600101615c10565b509495945050505050565b60008251615c49818460208701615e28565b9190910192915050565b60006101a0820190506001600160a01b038f1682526001600160a01b038e1660208301526001600160a01b038d1660408301528b60608301528a60808301528960a083015261ffff891660c08301528760e083015286610100830152856101208301528461014083015260ff8416610160830152615cd661018083018415159052565b9e9d5050505050505050505050505050565b6001600160a01b03831681526040602082015260006154ea6040830184615bfd565b6020815260006129476020830184615bfd565b604081526000615d306040830185615bfd565b8281036020840152615d428185615bfd565b95945050505050565b6020815260008251806020840152615d6a816040850160208701615e28565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115615daf57615daf615e8d565b500190565b600082615dcf57634e487b7160e01b81526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615e0c57615e0c615e8d565b500290565b600082821015615e2357615e23615e8d565b500390565b60005b83811015615e43578181015183820152602001615e2b565b83811115611cd65750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615e8657615e86615e8d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114615ece57600080fd5b50565b8015158114615ece57600080fd5b60ff81168114615ece57600080fdfea2646970667358221220e1e4d50a38225e1f5a04f18ad8b7766c22a038d1da2528cf6e62037a807bfb9364736f6c6343000804003300000000000000000000000047cc5334f65611ea6be9e933c49485c88c17f5f0000000000000000000000000580de58c1bd593a43dadcf0a739d504621817c05000000000000000000000000952e14cefe00eb1c7142a4d5826918a43c0505ff00000000000000000000000054d2f6937546547e51d76a0f5be022370b0120fe00000000000000000000000000000000000000000000000000038d7ea4c68000

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

00000000000000000000000047cc5334f65611ea6be9e933c49485c88c17f5f0000000000000000000000000580de58c1bd593a43dadcf0a739d504621817c05000000000000000000000000952e14cefe00eb1c7142a4d5826918a43c0505ff00000000000000000000000054d2f6937546547e51d76a0f5be022370b0120fe00000000000000000000000000000000000000000000000000038d7ea4c68000

-----Decoded View---------------
Arg [0] : _epicHero (address): 0x47cc5334f65611ea6be9e933c49485c88c17f5f0
Arg [1] : _feeToken (address): 0x580de58c1bd593a43dadcf0a739d504621817c05
Arg [2] : _treasury (address): 0x952e14cefe00eb1c7142a4d5826918a43c0505ff
Arg [3] : _referral (address): 0x54d2f6937546547e51d76a0f5be022370b0120fe
Arg [4] : _epicHeroPerBlock (uint256): 1000000000000000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000047cc5334f65611ea6be9e933c49485c88c17f5f0
Arg [1] : 000000000000000000000000580de58c1bd593a43dadcf0a739d504621817c05
Arg [2] : 000000000000000000000000952e14cefe00eb1c7142a4d5826918a43c0505ff
Arg [3] : 00000000000000000000000054d2f6937546547e51d76a0f5be022370b0120fe
Arg [4] : 00000000000000000000000000000000000000000000000000038d7ea4c68000


Deployed ByteCode Sourcemap

19544:27770:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23884:894;;;;;;:::i;:::-;;:::i;:::-;;22627:95;22699:8;:15;22627:95;;;30454:25:1;;;30442:2;30427:18;22627:95:0;;;;;;;;44538:636;;;;;;:::i;:::-;;:::i;45828:338::-;;;;;;:::i;:::-;;:::i;20939:44::-;;;;;;21609:31;;;;;;20790:25;;;;;-1:-1:-1;;;;;20790:25:0;;;;;;-1:-1:-1;;;;;11450:55:1;;;11432:74;;11420:2;11405:18;20790:25:0;11387:125:1;46695:131:0;;;;;;:::i;:::-;46801:17;46695:131;;;;;;;;;;;15902:66:1;15890:79;;;15872:98;;15860:2;15845:18;46695:131:0;15827:149:1;21148:26:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;41860:167::-;;;;;;:::i;:::-;;:::i;42927:131::-;;;;;;:::i;:::-;;:::i;21524:34::-;;;;;;20861:28;;;;;;;;;;;;;;;30289:6:1;30277:19;;;30259:38;;30247:2;30232:18;20861:28:0;30214:89:1;42819:100:0;;;;;;:::i;:::-;;:::i;19912:46::-;;19954:4;19912:46;;42434:193;;;;;;:::i;:::-;;:::i;19666:64::-;;19715:15;19666:64;;25778:228;;;;;;:::i;:::-;;:::i;:::-;;;15701:14:1;;15694:22;15676:41;;15664:2;15649:18;25778:228:0;15631:92:1;19014:103:0;;;;;;:::i;:::-;19069:4;19104:5;-1:-1:-1;;;;;19093:16:0;;;19104:5;;19093:16;;19014:103;27566:627;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26429:133::-;;;;;;:::i;:::-;26491:7;26517:32;;;:23;:32;;;;;:37;-1:-1:-1;;;;;26517:37:0;;26429:133;38204:602;;;;;;:::i;:::-;;:::i;26151:131::-;;;;;;:::i;:::-;;:::i;39449:1178::-;;;;;;:::i;:::-;;:::i;20992:70::-;;;;;-1:-1:-1;;;;;20992:70:0;;;21069;;;;;-1:-1:-1;;;;;21069:70:0;;;21565:35;;;;;;21492:25;;;;;;42635:176;;;;;;:::i;:::-;;:::i;26014:129::-;;;;;;:::i;:::-;;:::i;29249:808::-;;;;;;:::i;:::-;;:::i;26570:177::-;;;;;;:::i;:::-;26644:7;26687:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;26687:21:0;;;;;;;;;;;26726:13;;;;26570:177;43974:556;;;;;;:::i;:::-;;:::i;43373:317::-;;;;;;:::i;:::-;;:::i;20736:22::-;;;;;-1:-1:-1;;;;;20736:22:0;;;28201:1040;;;:::i;20707:22::-;;;;;-1:-1:-1;;;;;20707:22:0;;;45182:638;;;;;;:::i;:::-;;:::i;41681:171::-;;;;;;:::i;:::-;;:::i;22730:1146::-;;;;;;:::i;:::-;;:::i;19737:44::-;;19780:1;19737:44;;26290:131;;;;;;:::i;:::-;26351:7;26377:31;;;:22;:31;;;;;:36;-1:-1:-1;;;;;26377:36:0;;26290:131;24786:143;;;;;;:::i;:::-;;:::i;21187:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31052:25:1;;;31108:2;31093:18;;31086:34;;;;31136:18;;;31129:34;;;;31194:2;31179:18;;31172:34;;;;31237:3;31222:19;;31215:35;31281:3;31266:19;;31259:35;31338:14;31331:22;31325:3;31310:19;;31303:51;31039:3;31024:19;21187:64:0;31006:354:1;19854:51:0;;19901:4;19854:51;;20896:34;;;;;;;;;;;;42234:192;;;;;;:::i;:::-;;:::i;20824:30::-;;;;;;;;;;;;26755:179;;;;;;:::i;:::-;26830:7;26873:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;26873:21:0;;;;;;;;;;;26912:14;;;;26755:179;22244:375;;;:::i;21649:28::-;;;;;;;;;30065:3743;;;;;;:::i;:::-;;:::i;18743:125::-;;;;;;:::i;:::-;;:::i;26942:616::-;;;;;;:::i;:::-;;:::i;46174:322::-;;;;;;:::i;:::-;;:::i;43066:299::-;;;;;;:::i;:::-;;:::i;41502:171::-;;;;;;:::i;:::-;;:::i;24937:833::-;;;;;;:::i;:::-;;:::i;19788:59::-;;19839:8;19788:59;;43698:268;;;;;;:::i;:::-;;:::i;46504:183::-;;;;;;:::i;:::-;;:::i;18876:130::-;;;;;;:::i;:::-;;:::i;42035:191::-;;;;;;:::i;:::-;;:::i;19240:173::-;;;;;;:::i;:::-;;:::i;33816:4380::-;;;;;;:::i;:::-;;:::i;19125:107::-;;;;;;:::i;:::-;-1:-1:-1;;;;;19205:19:0;19181:4;19205:19;;;:14;:19;;;;;;;;;19125:107;23884:894;18712:10;19181:4;19205:19;;;:14;:19;;;;;;;;18691:33;;;;;;19954:4:::1;24159:33;::::0;::::1;;;24151:71;;;::::0;-1:-1:-1;;;24151:71:0;;17122:2:1;24151:71:0::1;::::0;::::1;17104:21:1::0;17161:2;17141:18;;;17134:30;17200:27;17180:18;;;17173:55;17245:18;;24151:71:0::1;;;;;;;;;19839:8;24241:16;:44;;24233:86;;;::::0;-1:-1:-1;;;24233:86:0;;24582:2:1;24233:86:0::1;::::0;::::1;24564:21:1::0;24621:2;24601:18;;;24594:30;24660:31;24640:18;;;24633:59;24709:18;;24233:86:0::1;24554:179:1::0;24233:86:0::1;24334:11;24330:61;;;24362:17;:15;:17::i;:::-;24419:63;24470:11;24419:46;24439:8;24448:4;24439:14;;;;;;-1:-1:-1::0;;;24439:14:0::1;;;;;;;;;;;;;;;;;;;:25;;;24419:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:63::i;:::-;24401:15;:81;;;;24521:11;24493:8;24502:4;24493:14;;;;;;-1:-1:-1::0;;;24493:14:0::1;;;;;;;;;;;;;;;;;;;:25;;:39;;;;24573:13;24543:8;24552:4;24543:14;;;;;;-1:-1:-1::0;;;24543:14:0::1;;;;;;;;;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;24630:16;24597:8;24606:4;24597:14;;;;;;-1:-1:-1::0;;;24597:14:0::1;;;;;;;;;;;;;;;;;;;:30;;:49;;;;24681:7;24657:8;24666:4;24657:14;;;;;;-1:-1:-1::0;;;24657:14:0::1;;;;;;;;;;;;;;;;;;;:21;;;:31;;;;;;;;;;;;;;;;;;24723:7;24699:8;24708:4;24699:14;;;;;;-1:-1:-1::0;;;24699:14:0::1;;;;;;;;;;;;;;;;;;;:21;;;:31;;;;;;;;;;;;;;;;;;24764:6;24741:8;24750:4;24741:14;;;;;;-1:-1:-1::0;;;24741:14:0::1;;;;;;;;;;;;;;;;;;;:20;;;:29;;;;;-1:-1:-1::0;;;;;24741:29:0::1;;;;;-1:-1:-1::0;;;;;24741:29:0::1;;;;;;23884:894:::0;;;;;;;;:::o;44538:636::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;44704:36:::1;::::0;;;;44734:4:::1;44704:36;::::0;::::1;11432:74:1::0;44661:11:0;;44621:24:::1;::::0;-1:-1:-1;;;;;44704:21:0;::::1;::::0;::::1;::::0;11405:18:1;;44704:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44686:54;;44751:24;44792:7;44778:22;;;;;;-1:-1:-1::0;;;44778:22:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;44778:22:0::1;;44751:49;;44818:6;44813:124;44834:7;44830:1;:11;44813:124;;;44876:49;::::0;;;;44916:4:::1;44876:49;::::0;::::1;14269:74:1::0;14359:18;;;14352:34;;;-1:-1:-1;;;;;44876:31:0;::::1;::::0;::::1;::::0;14242:18:1;;44876:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44863:7;44871:1;44863:10;;;;;;-1:-1:-1::0;;;44863:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;:62;44843:3;::::1;::::0;::::1;:::i;:::-;;;;44813:124;;;;44954:6;44949:218;44970:7;:14;44966:1;:18;44949:218;;;45006:26;45035:22;:34;45058:7;45066:1;45058:10;;;;;;-1:-1:-1::0;;;45058:10:0::1;;;;;;;;;;;;;;;45035:34;;;;;;;;;;;45006:63;;45084:11;-1:-1:-1::0;;;;;45084:28:0::1;;45121:4;45128:9;:14;;;;;;;;;;-1:-1:-1::0;;;;;45128:14:0::1;45144:7;45152:1;45144:10;;;;;;-1:-1:-1::0;;;45144:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;45084:71:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;13587:15:1;;;45084:71:0::1;::::0;::::1;13569:34:1::0;13639:15;;;;13619:18;;;13612:43;13671:18;;;13664:34;13481:18;;45084:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44949:218;44986:3;;;;;:::i;:::-;;;;44949:218;;;;18641:1;;;44538:636:::0;:::o;45828:338::-;18712:10;19181:4;19205:19;;;:14;:19;;;;;;;;18691:33;;;;;;19715:15:::1;45922:17;:43;;45914:83;;;::::0;-1:-1:-1;;;45914:83:0;;22432:2:1;45914:83:0::1;::::0;::::1;22414:21:1::0;22471:2;22451:18;;;22444:30;22510:29;22490:18;;;22483:57;22557:18;;45914:83:0::1;22404:177:1::0;45914:83:0::1;46008:17;:15;:17::i;:::-;46075:16;::::0;46043:68:::1;::::0;;30664:25:1;;;30720:2;30705:18;;30698:34;;;46063:10:0::1;::::0;46043:68:::1;::::0;30637:18:1;46043:68:0::1;;;;;;;46122:16;:36:::0;45828:338::o;21148:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21148:26:0;;;;-1:-1:-1;21148:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41860:167::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;-1:-1:-1;;;;;41935:23:0;::::1;41927:53;;;::::0;-1:-1:-1;;;41927:53:0;;23137:2:1;41927:53:0::1;::::0;::::1;23119:21:1::0;23176:2;23156:18;;;23149:30;23215:19;23195:18;;;23188:47;23252:18;;41927:53:0::1;23109:167:1::0;41927:53:0::1;41991:8;:28:::0;;;::::1;-1:-1:-1::0;;;;;41991:28:0;;;::::1;::::0;;;::::1;::::0;;41860:167::o;42927:131::-;18712:10;19181:4;19205:19;;;:14;:19;;;;;;;;18691:33;;;;;;43006:8:::1;::::0;::::1;;42997:17;;::::0;::::1;;;;42989:34;;;;-1:-1:-1::0;;;42989:34:0::1;;;;;;28100:2:1::0;28082:21;;;28139:1;28119:18;;;28112:29;28177:6;28172:2;28157:18;;28150:34;28216:2;28201:18;;28072:153;42989:34:0::1;43034:8;:16:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;42927:131::o;42819:100::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;42889:11:::1;:22:::0;42819:100::o;42434:193::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;19901:4:::1;42517:38;::::0;::::1;;;42509:71;;;::::0;-1:-1:-1;;;42509:71:0;;22788:2:1;42509:71:0::1;::::0;::::1;22770:21:1::0;22827:2;22807:18;;;22800:30;22866:22;22846:18;;;22839:50;22906:18;;42509:71:0::1;22760:170:1::0;42509:71:0::1;42591:12;:28:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;42434:193::o;25778:228::-;25848:4;25889:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;25889:21:0;;;;;;;;;25944:10;;25928:12;:26;;;;:70;;;25977:4;:21;;;25958:15;:40;;25928:70;25921:77;;;25778:228;;;;;:::o;27566:627::-;-1:-1:-1;;;;;27698:25:0;;27668:27;27698:25;;;:18;:25;;;;;;;;26873:14;;;:8;:14;;;;;:21;;;;;;;;;26912:14;;;27639:16;;27698:25;27668:27;27769:43;;;;;;-1:-1:-1;;;27769:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27769:43:0;;27736:76;;27825:13;27857:6;27853:300;27873:16;;27869:20;;27853:300;;;27911:26;27940:23;:37;27964:9;27974:1;27964:12;;;;;;-1:-1:-1;;;27964:12:0;;;;;;;;;;;;;;;;;27940:37;;;;;;;;;;;27911:66;;28013:4;27996:9;:13;;;:21;:48;;;;-1:-1:-1;28021:14:0;;-1:-1:-1;;;;;28021:23:0;;;:14;;:23;27996:48;27992:150;;;28088:9;28098:1;28088:12;;;;;;-1:-1:-1;;;28088:12:0;;;;;;;;;;;;;;;;;28065:13;28079:5;28065:20;;;;;;-1:-1:-1;;;28065:20:0;;;;;;;;;;;;;;;;;;:35;28119:7;;;;:::i;:::-;;;;27992:150;-1:-1:-1;27891:3:0;;;;:::i;:::-;;;;27853:300;;;-1:-1:-1;28172:13:0;;27566:627;-1:-1:-1;;;;;27566:627:0:o;38204:602::-;18066:1;18215:7;;:19;;18207:63;;;;-1:-1:-1;;;18207:63:0;;29611:2:1;18207:63:0;;;29593:21:1;29650:2;29630:18;;;29623:30;29689:33;29669:18;;;29662:61;29740:18;;18207:63:0;29583:181:1;18207:63:0;18066:1;18281:18;;38290:10:::1;::::0;38274:12:::1;:26;;38266:84;;;::::0;-1:-1:-1;;;38266:84:0;;28432:2:1;38266:84:0::1;::::0;::::1;28414:21:1::0;28471:2;28451:18;;;28444:30;28510:34;28490:18;;;28483:62;28581:15;28561:18;;;28554:43;28614:19;;38266:84:0::1;28404:235:1::0;38266:84:0::1;38363:21;38387:8;38396:4;38387:14;;;;;;-1:-1:-1::0;;;38387:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;38436;;;:8:::1;:14:::0;;;;;;38451:10:::1;38436:26:::0;;;;;;;38484:8:::1;::::0;38387:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;38484:8:0::1;;38483:9;:25:::0;::::1;;;-1:-1:-1::0;38497:11:0::1;::::0;::::1;::::0;::::1;::::0;::::1;;;38496:12;38483:25;38475:50;;;::::0;-1:-1:-1;;;38475:50:0;;26360:2:1;38475:50:0::1;::::0;::::1;26342:21:1::0;26399:2;26379:18;;;26372:30;26438:14;26418:18;;;26411:42;26470:18;;38475:50:0::1;26332:162:1::0;38475:50:0::1;38545:15;::::0;::::1;::::0;::::1;;38544:16;38536:52;;;::::0;-1:-1:-1;;;38536:52:0;;20612:2:1;38536:52:0::1;::::0;::::1;20594:21:1::0;20651:2;20631:18;;;20624:30;20690:26;20670:18;;;20663:54;20734:18;;38536:52:0::1;20584:174:1::0;38536:52:0::1;38604:11;::::0;:15;38601:154:::1;;38682:10;::::0;38694:11:::1;::::0;38635:8:::1;::::0;:71:::1;::::0;-1:-1:-1;;;;;38635:8:0;;::::1;::::0;38669:10:::1;::::0;38682;;::::1;::::0;38635:25:::1;:71::i;:::-;38721:15;::::0;::::1;:22:::0;;;::::1;38739:4;38721:22;::::0;;38601:154:::1;38772:26;::::0;38793:4;;38781:10:::1;::::0;38772:26:::1;::::0;;;::::1;-1:-1:-1::0;;18022:1:0;18326:7;:22;-1:-1:-1;38204:602:0:o;26151:131::-;-1:-1:-1;;;;;26249:25:0;;;;;;:18;:25;;;;;;;;;26242:32;;;;;;;;;;;;;;;;;26213:16;;26242:32;;;26249:25;26242:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26151:131;;;:::o;39449:1178::-;18066:1;18215:7;;:19;;18207:63;;;;-1:-1:-1;;;18207:63:0;;29611:2:1;18207:63:0;;;29593:21:1;29650:2;29630:18;;;29623:30;29689:33;29669:18;;;29662:61;29740:18;;18207:63:0;29583:181:1;18207:63:0;18066:1;18281:18;;39522:16:::1;39533:4:::0;39522:10:::1;:16::i;:::-;39551:21;39575:8;39584:4;39575:14;;;;;;-1:-1:-1::0;;;39575:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;39624;;;:8:::1;:14:::0;;;;;;39639:10:::1;39624:26:::0;;;;;;;39667:21:::1;::::0;::::1;::::0;39575:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;39667:26:0;:56;::::1;;;;39713:10;;39697:12;:26;;39667:56;39663:154;;;39784:20;::::0;::::1;::::0;39764:41:::1;::::0;:15:::1;::::0;:19:::1;:41::i;:::-;39740:21;::::0;::::1;:65:::0;39663:154:::1;39829:15;39847:72;39903:4;:15;;;39847:51;39893:4;39847:41;39863:4;:24;;;39847:4;:11;;;:15;;:41;;;;:::i;:::-;:45:::0;::::1;:51::i;:::-;:55:::0;::::1;:72::i;:::-;39829:90;;39934:28;39945:4;39951:10;39934;:28::i;:::-;39930:608;;;39993:1;39983:7;:11;:38;;;;40020:1;39998:4;:19;;;:23;39983:38;39979:548;;;40042:20;40065:32;40077:4;:19;;;40065:7;:11;;:32;;;;:::i;:::-;40042:55;;40174:45;40199:4;:19;;;40174:20;;:24;;:45;;;;:::i;:::-;40151:20;:68:::0;40260:1:::1;40238:19;::::0;::::1;:23:::0;40324:20:::1;::::0;::::1;::::0;40304:41:::1;::::0;:15:::1;::::0;:19:::1;:41::i;:::-;40280:21;::::0;::::1;:65:::0;40399:46:::1;40420:10;40432:12:::0;40399:20:::1;:46::i;:::-;40464:47;40486:10;40498:12;40464:21;:47::i;:::-;39979:548;;40584:24;::::0;::::1;::::0;40568:11;;:51:::1;::::0;40614:4:::1;::::0;40568:41:::1;::::0;:15:::1;:41::i;:51::-;40550:15;::::0;;::::1;:69:::0;-1:-1:-1;18326:7:0;:22;-1:-1:-1;;39449:1178:0:o;42635:176::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;19954:4:::1;42714:31;::::0;::::1;;;42706:62;;;::::0;-1:-1:-1;;;42706:62:0;;27753:2:1;42706:62:0::1;::::0;::::1;27735:21:1::0;27792:2;27772:18;;;27765:30;27831:20;27811:18;;;27804:48;27869:18;;42706:62:0::1;27725:168:1::0;42706:62:0::1;42779:10;:24:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;42635:176::o;26014:129::-;-1:-1:-1;;;;;26111:24:0;;;;;;:17;:24;;;;;;;;;26104:31;;;;;;;;;;;;;;;;;26075:16;;26104:31;;;26111:24;26104:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26014:129;;;:::o;29249:808::-;29301:21;29325:8;29334:4;29325:14;;;;;;-1:-1:-1;;;29325:14:0;;;;;;;;;;;;;;;;;;;29301:38;;29370:4;:20;;;29354:12;:36;29350:75;;29407:7;29249:808;:::o;29350:75::-;29441:12;;;;:17;;:41;;-1:-1:-1;29462:15:0;;;;:20;29441:41;29437:130;;;29522:12;29499:20;;;;:35;-1:-1:-1;29249:808:0:o;29437:130::-;29579:18;29600:49;29614:4;:20;;;29636:12;29600:13;:49::i;:::-;29579:70;;29660:22;29685:74;29743:15;;29685:53;29722:4;:15;;;29685:32;29700:16;;29685:10;:14;;:32;;;;:::i;:::-;:36;;:53::i;:74::-;29660:99;;29799:72;29828:42;29857:4;:12;;;29828:24;29847:4;29828:14;:18;;:24;;;;:::i;:42::-;29799:24;;;;;:28;:72::i;:::-;29772:24;;;:99;29905:12;29882:20;;;:35;29933:10;;;;;;;:14;29930:120;;29984:10;;30015;;29963:75;;-1:-1:-1;;;;;29984:10:0;;29996:41;;30031:5;;29996:30;;:14;;30015:10;;;;;29996:18;:30::i;:41::-;29963:20;:75::i;:::-;29249:808;;;;:::o;43974:556::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;44142:36:::1;::::0;;;;44172:4:::1;44142:36;::::0;::::1;11432:74:1::0;44099:11:0;;44059:24:::1;::::0;-1:-1:-1;;;;;44142:21:0;::::1;::::0;::::1;::::0;11405:18:1;;44142:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44124:54;;44189:24;44230:7;44216:22;;;;;;-1:-1:-1::0;;;44216:22:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;44216:22:0::1;;44189:49;;44256:6;44251:124;44272:7;44268:1;:11;44251:124;;;44314:49;::::0;;;;44354:4:::1;44314:49;::::0;::::1;14269:74:1::0;14359:18;;;14352:34;;;-1:-1:-1;;;;;44314:31:0;::::1;::::0;::::1;::::0;14242:18:1;;44314:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44301:7;44309:1;44301:10;;;;;;-1:-1:-1::0;;;44301:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;:62;44281:3;::::1;::::0;::::1;:::i;:::-;;;;44251:124;;;;44392:6;44387:136;44408:7;:14;44404:1;:18;44387:136;;;44444:11;-1:-1:-1::0;;;;;44444:28:0::1;;44481:4;44488:10;44500:7;44508:1;44500:10;;;;;;-1:-1:-1::0;;;44500:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;44444:67:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;13587:15:1;;;44444:67:0::1;::::0;::::1;13569:34:1::0;13639:15;;;;13619:18;;;13612:43;13671:18;;;13664:34;13481:18;;44444:67:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44424:3;;;;;:::i;:::-;;;;44387:136;;43373:317:::0;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;43481:39:::1;::::0;;;;43514:4:::1;43481:39;::::0;::::1;11432:74:1::0;43466:12:0::1;::::0;-1:-1:-1;;;;;43481:24:0;::::1;::::0;::::1;::::0;11405:18:1;;43481:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43466:54;;43546:7;43536;:17;43533:65;;;43579:7;43569:17;;43533:65;43618:44;::::0;;;;43642:10:::1;43618:44;::::0;::::1;14269:74:1::0;14359:18;;;14352:34;;;-1:-1:-1;;;;;43618:23:0;::::1;::::0;::::1;::::0;14242:18:1;;43618:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43610:72;;;::::0;-1:-1:-1;;;43610:72:0;;18175:2:1;43610:72:0::1;::::0;::::1;18157:21:1::0;18214:2;18194:18;;;18187:30;18253:17;18233:18;;;18226:45;18288:18;;43610:72:0::1;18147:165:1::0;43610:72:0::1;18641:1;43373:317:::0;;:::o;28201:1040::-;28263:8;:15;28246:14;;28325:808;28353:6;28347:3;:12;28325:808;;;28383:21;28407:8;28416:3;28407:13;;;;;;-1:-1:-1;;;28407:13:0;;;;;;;;;;;;;;;;;;;28383:37;;28455:4;:20;;;28439:12;:36;28435:85;;28496:8;;;28435:85;28540:12;;;;:17;;:41;;-1:-1:-1;28561:15:0;;;;:20;28540:41;28536:144;;;28625:12;28602:20;;;;:35;28656:8;;28536:144;28696:18;28717:49;28731:4;:20;;;28753:12;28717:13;:49::i;:::-;28696:70;;28781:22;28806:74;28864:15;;28806:53;28843:4;:15;;;28806:32;28821:16;;28806:10;:14;;:32;;;;:::i;:74::-;28781:99;;28924:72;28953:42;28982:4;:12;;;28953:24;28972:4;28953:14;:18;;:24;;;;:::i;28924:72::-;28897:24;;;:99;29034:12;29011:20;;;:35;29098:10;;29063:58;;29079:41;;29114:5;;29079:30;;:14;;29098:10;;;;;29079:18;:30::i;:41::-;29063:11;;:15;:58::i;:::-;;28325:808;;;;28361:5;;;:::i;:::-;;;28325:808;;;-1:-1:-1;29146:15:0;;29143:91;;29198:10;;29177:45;;-1:-1:-1;;;;;29198:10:0;29210:11;29177:20;:45::i;:::-;28201:1040;;:::o;45182:638::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;45349:36:::1;::::0;;;;45379:4:::1;45349:36;::::0;::::1;11432:74:1::0;45306:11:0;;45266:24:::1;::::0;-1:-1:-1;;;;;45349:21:0;::::1;::::0;::::1;::::0;11405:18:1;;45349:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45331:54;;45396:24;45437:7;45423:22;;;;;;-1:-1:-1::0;;;45423:22:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;45423:22:0::1;;45396:49;;45463:6;45458:124;45479:7;45475:1;:11;45458:124;;;45521:49;::::0;;;;45561:4:::1;45521:49;::::0;::::1;14269:74:1::0;14359:18;;;14352:34;;;-1:-1:-1;;;;;45521:31:0;::::1;::::0;::::1;::::0;14242:18:1;;45521:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45508:7;45516:1;45508:10;;;;;;-1:-1:-1::0;;;45508:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;:62;45488:3;::::1;::::0;::::1;:::i;:::-;;;;45458:124;;;;45599:6;45594:219;45615:7;:14;45611:1;:18;45594:219;;;45651:26;45680:23;:35;45704:7;45712:1;45704:10;;;;;;-1:-1:-1::0;;;45704:10:0::1;;;;;;;;;;;;;;;45680:35;;;;;;;;;;;45651:64;;45730:11;-1:-1:-1::0;;;;;45730:28:0::1;;45767:4;45774:9;:14;;;;;;;;;;-1:-1:-1::0;;;;;45774:14:0::1;45790:7;45798:1;45790:10;;;;;;-1:-1:-1::0;;;45790:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;45730:71:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;13587:15:1;;;45730:71:0::1;::::0;::::1;13569:34:1::0;13639:15;;;;13619:18;;;13612:43;13671:18;;;13664:34;13481:18;;45730:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45594:219;45631:3;;;;;:::i;:::-;;;;45594:219;;41681:171:::0;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;-1:-1:-1;;;;;41760:25:0;::::1;41752:57;;;::::0;-1:-1:-1;;;41752:57:0;;19557:2:1;41752:57:0::1;::::0;::::1;19539:21:1::0;19596:2;19576:18;;;19569:30;19635:21;19615:18;;;19608:49;19674:18;;41752:57:0::1;19529:169:1::0;41752:57:0::1;41820:10;:24:::0;;;::::1;-1:-1:-1::0;;;;;41820:24:0;;;::::1;::::0;;;::::1;::::0;;41681:171::o;22730:1146::-;18712:10;19181:4;19205:19;;;:14;:19;;;;;;;;18691:33;;;;;;19954:4:::1;23037:33;::::0;::::1;;;23029:71;;;::::0;-1:-1:-1;;;23029:71:0;;29257:2:1;23029:71:0::1;::::0;::::1;29239:21:1::0;29296:2;29276:18;;;29269:30;29335:27;29315:18;;;29308:55;29380:18;;23029:71:0::1;29229:175:1::0;23029:71:0::1;19839:8;23119:16;:44;;23111:86;;;::::0;-1:-1:-1;;;23111:86:0;;19905:2:1;23111:86:0::1;::::0;::::1;19887:21:1::0;19944:2;19924:18;;;19917:30;19983:31;19963:18;;;19956:59;20032:18;;23111:86:0::1;19877:179:1::0;23111:86:0::1;23212:11;23208:61;;;23240:17;:15;:17::i;:::-;23279:23;23320:10;;23305:12;:25;:53;;23348:10;;23305:53;;;23333:12;23305:53;23387:15;::::0;23279:79;;-1:-1:-1;23387:32:0::1;::::0;23407:11;23387:19:::1;:32::i;:::-;23369:15;:50;;;;23430:8;23444:423;;;;;;;;23474:8;-1:-1:-1::0;;;;;23444:423:0::1;;;;;23504:9;-1:-1:-1::0;;;;;23444:423:0::1;;;;;23531:6;-1:-1:-1::0;;;;;23444:423:0::1;;;;;23563:11;23444:423;;;;23603:15;23444:423;;;;23651:1;23444:423;;;;23678:13;23444:423;;;;;;23720:16;23444:423;;;;23757:1;23444:423;;;;23779:1;23444:423;;;;23802:1;23444:423;;;;23822:7;23444:423;;;;;;23848:7;23444:423;;;;::::0;23430:438:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23430:438:0::1;;;;;-1:-1:-1::0;;;;;23430:438:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23430:438:0::1;;;;;-1:-1:-1::0;;;;;23430:438:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23430:438:0::1;;;;;-1:-1:-1::0;;;;;23430:438:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18726:1;22730:1146:::0;;;;;;;;;:::o;24786:143::-;24858:7;24885:36;19780:1;24885:14;:3;24893:5;24885:7;:14::i;:36::-;24878:43;24786:143;-1:-1:-1;;;24786:143:0:o;42234:192::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;-1:-1:-1;;;;;42317:30:0;::::1;42309:60;;;::::0;-1:-1:-1;;;42309:60:0;;25656:2:1;42309:60:0::1;::::0;::::1;25638:21:1::0;25695:2;25675:18;;;25668:30;25734:19;25714:18;;;25707:47;25771:18;;42309:60:0::1;25628:167:1::0;42309:60:0::1;42380:8;:38:::0;;;::::1;-1:-1:-1::0;;;;;42380:38:0;;;::::1;::::0;;;::::1;::::0;;42234:192::o;22244:375::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;22319:10:::1;;22304:12;:25;22296:65;;;::::0;-1:-1:-1;;;22296:65:0;;17819:2:1;22296:65:0::1;::::0;::::1;17801:21:1::0;17858:2;17838:18;;;17831:30;17897:29;17877:18;;;17870:57;17944:18;;22296:65:0::1;17791:177:1::0;22296:65:0::1;22391:8;:15:::0;22374:14:::1;22417:157;22445:6;22439:3;:12;22417:157;;;22475:21;22499:8;22508:3;22499:13;;;;;;-1:-1:-1::0;;;22499:13:0::1;;;;;;;;;;;;;;;;;;;22475:37;;22550:12;22527:4;:20;;:35;;;;22417:157;22453:5;;;;:::i;:::-;;;22417:157;;;-1:-1:-1::0;;22599:12:0::1;22586:10;:25:::0;22244:375::o;30065:3743::-;18066:1;18215:7;;:19;;18207:63;;;;-1:-1:-1;;;18207:63:0;;29611:2:1;18207:63:0;;;29593:21:1;29650:2;29630:18;;;29623:30;29689:33;29669:18;;;29662:61;29740:18;;18207:63:0;29583:181:1;18207:63:0;18066:1;18281:18;;30229:10:::1;::::0;30213:12:::1;:26;;30205:84;;;::::0;-1:-1:-1;;;30205:84:0;;28432:2:1;30205:84:0::1;::::0;::::1;28414:21:1::0;28471:2;28451:18;;;28444:30;28510:34;28490:18;;;28483:62;28581:15;28561:18;;;28554:43;28614:19;;30205:84:0::1;28404:235:1::0;30205:84:0::1;30302:21;30326:8;30335:4;30326:14;;;;;;-1:-1:-1::0;;;30326:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;30375;;;:8:::1;:14:::0;;;;;;30390:10:::1;30375:26:::0;;;;;;;30423:8:::1;::::0;30326:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;30423:8:0::1;;30422:9;:25:::0;::::1;;;-1:-1:-1::0;30436:11:0::1;::::0;::::1;::::0;::::1;::::0;::::1;;;30435:12;30422:25;30414:50;;;::::0;-1:-1:-1;;;30414:50:0;;26360:2:1;30414:50:0::1;::::0;::::1;26342:21:1::0;26399:2;26379:18;;;26372:30;26438:14;26418:18;;;26411:42;26470:18;;30414:50:0::1;26332:162:1::0;30414:50:0::1;30520:1;30480:37;30500:9;:16;30480:8;:15;:19;;:37;;;;:::i;:::-;:41;30477:270;;;30625:11;::::0;::::1;::::0;30604:16;;30583:15;;30563:14:::1;::::0;::::1;::::0;30545:13:::1;::::0;::::1;::::0;30625:11:::1;::::0;;::::1;::::0;30545:76:::1;::::0;30604:16;30545:54:::1;::::0;30583:15;;30545:54;;:17:::1;:33::i;:76::-;:91;;30537:118;;;::::0;-1:-1:-1;;;30537:118:0;;17476:2:1;30537:118:0::1;::::0;::::1;17458:21:1::0;17515:2;17495:18;;;17488:30;17554:16;17534:18;;;17527:44;17588:18;;30537:118:0::1;17448:164:1::0;30537:118:0::1;30678:11;::::0;:16;;:35:::1;;-1:-1:-1::0;30698:15:0::1;::::0;::::1;::::0;::::1;;30678:35;30670:65;;;::::0;-1:-1:-1;;;30670:65:0;;20965:2:1;30670:65:0::1;::::0;::::1;20947:21:1::0;21004:2;20984:18;;;20977:30;21043:19;21023:18;;;21016:47;21080:18;;30670:65:0::1;20937:167:1::0;30670:65:0::1;30759:16;30770:4;30759:10;:16::i;:::-;30810:1;30792:8;:15;:19;:54;;;;-1:-1:-1::0;30823:8:0::1;::::0;-1:-1:-1;;;;;30823:8:0::1;30815:31:::0;::::1;30792:54;:81;;;;-1:-1:-1::0;;;;;;30850:23:0;::::1;::::0;::::1;30792:81;:108;;;;-1:-1:-1::0;;;;;;30877:23:0;::::1;30890:10;30877:23;;30792:108;30788:187;;;30917:8;::::0;:46:::1;::::0;;;;30941:10:::1;30917:46;::::0;::::1;11991:34:1::0;-1:-1:-1;;;;;12061:15:1;;;12041:18;;;12034:43;30917:8:0;;::::1;::::0;:23:::1;::::0;11903:18:1;;30917:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30788:187;30987:32;31014:4;30987:26;:32::i;:::-;31036:17;::::0;::::1;::::0;::::1;;:21:::0;31032:266:::1;;31183:15;::::0;;31160:17;;::::1;::::0;31139:16;;31074:18:::1;::::0;31095:106:::1;::::0;31139:60:::1;::::0;31183:15:::1;::::0;;;::::1;::::0;::::1;::::0;31139:39:::1;::::0;31160:17:::1;31139:20;:39::i;:60::-;31115:17;::::0;::::1;::::0;31095:15;;:38:::1;::::0;31115:17:::1;;31095:19;:38::i;:106::-;31263:10;::::0;31216:8:::1;::::0;31074:127;;-1:-1:-1;31216:70:0::1;::::0;-1:-1:-1;;;;;31216:8:0;;::::1;::::0;31250:10:::1;::::0;31263::::1;31074:127:::0;31216:25:::1;:70::i;:::-;31032:266;;31314:15:::0;;:19;31310:1153:::1;;31390:12:::0;;31466:10:::1;31350:24;31448:29:::0;;;:17:::1;:29;::::0;;;;-1:-1:-1;;;;;31390:12:0;;::::1;::::0;31448:29;31494:610:::1;31514:8;:15;31510:1;:19;31494:610;;;31556:11;31569:12:::0;31585:11:::1;-1:-1:-1::0;;;;;31585:19:0::1;;31605:8;31614:1;31605:11;;;;;;-1:-1:-1::0;;;31605:11:0::1;;;;;;;;;;;;;;;31585:32;;;;;;;;;;;;;30454:25:1::0;;30442:2;30427:18;;30409:76;31585:32:0::1;;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31555:62;;;;31654:1;31646:5;:9;;;31638:42;;;::::0;-1:-1:-1;;;31638:42:0;;20263:2:1;31638:42:0::1;::::0;::::1;20245:21:1::0;20302:2;20282:18;;;20275:30;20341:22;20321:18;;;20314:50;20381:18;;31638:42:0::1;20235:170:1::0;31638:42:0::1;31716:1;31707:6;:10;;;31699:44;;;::::0;-1:-1:-1;;;31699:44:0;;27057:2:1;31699:44:0::1;::::0;::::1;27039:21:1::0;27096:2;27076:18;;;27069:30;27135:23;27115:18;;;27108:51;27176:18;;31699:44:0::1;27029:171:1::0;31699:44:0::1;31764:11;-1:-1:-1::0;;;;;31764:28:0::1;;31823:10;31865:4;31893:8;31902:1;31893:11;;;;;;-1:-1:-1::0;;;31893:11:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;31764:159:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;13587:15:1;;;31764:159:0::1;::::0;::::1;13569:34:1::0;13639:15;;;;13619:18;;;13612:43;13671:18;;;13664:34;13481:18;;31764:159:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31982:62;;;;;;;;31991:10;-1:-1:-1::0;;;;;31982:62:0::1;;;;;32003:4;31982:62;;;;32009:34;32028:7;:14;;;;32009:18;:34::i;:::-;31982:62;;;;::::0;31944:22:::1;:35;31967:8;31976:1;31967:11;;;;;;-1:-1:-1::0;;;31967:11:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;31944:35;;;;::::1;::::0;;;;;;;;-1:-1:-1;31944:35:0;:100;;;;;::::1;-1:-1:-1::0;;;;;31944:100:0;;::::1;;::::0;;;;::::1;::::0;-1:-1:-1;31944:100:0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;32076:11;;32063:7;;32076:11;;32085:1;;32076:11;::::1;;;-1:-1:-1::0;;;32076:11:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;32063:25;;::::1;::::0;::::1;::::0;;-1:-1:-1;32063:25:0;;;;;;;::::1;::::0;-1:-1:-1;31531:3:0;;-1:-1:-1;31531:3:0::1;::::0;::::1;:::i;:::-;;;;31494:610;;;-1:-1:-1::0;32152:10:0::1;::::0;::::1;::::0;32142:59:::1;::::0;;;;32120:19:::1;::::0;-1:-1:-1;;;;;32152:10:0::1;::::0;32142:37:::1;::::0;:59:::1;::::0;32180:10:::1;::::0;32192:8;;32142:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32232:11:::0;;32120:81;;-1:-1:-1;32232:28:0::1;::::0;32120:81;32232:15:::1;:28::i;:::-;32218:42:::0;;32309:15;;32291:13:::1;::::0;::::1;::::0;:34:::1;::::0;:17:::1;:34::i;:::-;32275:13;::::0;::::1;:50:::0;32357:12:::1;::::0;::::1;::::0;:29:::1;::::0;32374:11;32357:16:::1;:29::i;:::-;32342:12;::::0;::::1;:44:::0;32435:15;;32417:13:::1;::::0;::::1;::::0;:34:::1;::::0;:17:::1;:34::i;:::-;32401:13;::::0;::::1;:50:::0;-1:-1:-1;;;31310:1153:0::1;32479:16:::0;;:20;32475:1179:::1;;32557:13;::::0;::::1;::::0;32636:10:::1;32516:25;32617:30:::0;;;:18:::1;:30;::::0;;;;-1:-1:-1;;;;;32557:13:0;;::::1;::::0;32617:30;32664:620:::1;32684:9;:16;32680:1;:20;32664:620;;;32727:11;32740:12:::0;32756::::1;-1:-1:-1::0;;;;;32756:20:0::1;;32777:9;32787:1;32777:12;;;;;;-1:-1:-1::0;;;32777:12:0::1;;;;;;;;;;;;;;;32756:34;;;;;;;;;;;;;30454:25:1::0;;30442:2;30427:18;;30409:76;32756:34:0::1;;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32726:64;;;;32827:1;32819:5;:9;;;32811:42;;;::::0;-1:-1:-1;;;32811:42:0;;20263:2:1;32811:42:0::1;::::0;::::1;20245:21:1::0;20302:2;20282:18;;;20275:30;20341:22;20321:18;;;20314:50;20381:18;;32811:42:0::1;20235:170:1::0;32811:42:0::1;32889:1;32880:6;:10;;;32872:44;;;::::0;-1:-1:-1;;;32872:44:0;;27057:2:1;32872:44:0::1;::::0;::::1;27039:21:1::0;27096:2;27076:18;;;27069:30;27135:23;27115:18;;;27108:51;27176:18;;32872:44:0::1;27029:171:1::0;32872:44:0::1;32937:12;-1:-1:-1::0;;;;;32937:29:0::1;;32997:10;33039:4;33067:9;33077:1;33067:12;;;;;;-1:-1:-1::0;;;33067:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;32937:161:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;13587:15:1;;;32937:161:0::1;::::0;::::1;13569:34:1::0;13639:15;;;;13619:18;;;13612:43;13671:18;;;13664:34;13481:18;;32937:161:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33159:63;;;;;;;;33168:10;-1:-1:-1::0;;;;;33159:63:0::1;;;;;33180:4;33159:63;;;;33186:35;33205:8;:15;;;;33186:18;:35::i;:::-;33159:63;;;;::::0;33119:23:::1;:37;33143:9;33153:1;33143:12;;;;;;-1:-1:-1::0;;;33143:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;33119:37;;;;::::1;::::0;;;;;;;;-1:-1:-1;33119:37:0;:103;;;;;::::1;-1:-1:-1::0;;;;;33119:103:0;;::::1;;::::0;;;;::::1;::::0;-1:-1:-1;33119:103:0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;33255:12;;33241:8;;33255:12;;33265:1;;33255:12;::::1;;;-1:-1:-1::0;;;33255:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;33241:27;;::::1;::::0;::::1;::::0;;-1:-1:-1;33241:27:0;;;;;;;::::1;::::0;-1:-1:-1;32702:3:0;;-1:-1:-1;32702:3:0::1;::::0;::::1;:::i;:::-;;;;32664:620;;;-1:-1:-1::0;33333:10:0::1;::::0;::::1;::::0;33323:61:::1;::::0;;;;33300:20:::1;::::0;-1:-1:-1;;;;;33333:10:0::1;::::0;33323:38:::1;::::0;:61:::1;::::0;33362:10:::1;::::0;33374:9;;33323:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33415:11:::0;;33300:84;;-1:-1:-1;33415:29:0::1;::::0;33300:84;33415:15:::1;:29::i;:::-;33401:43:::0;;33495:16;;33476:14:::1;::::0;::::1;::::0;:36:::1;::::0;:18:::1;:36::i;:::-;33459:14;::::0;::::1;:53:::0;33544:12:::1;::::0;::::1;::::0;:30:::1;::::0;33561:12;33544:16:::1;:30::i;:::-;33529:12;::::0;::::1;:45:::0;33625:16;;33606:14:::1;::::0;::::1;::::0;:36:::1;::::0;:18:::1;:36::i;:::-;33589:14;::::0;::::1;:53:::0;-1:-1:-1;;;32475:1179:0::1;33700:24;::::0;::::1;::::0;33684:11;;:51:::1;::::0;33730:4:::1;::::0;33684:41:::1;::::0;:15:::1;:41::i;:51::-;33666:15;::::0;::::1;:69:::0;33751:49:::1;::::0;33774:4;;33762:10:::1;::::0;33751:49:::1;::::0;::::1;::::0;33780:8;;33790:9;;33751:49:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;18022:1:0;18326:7;:22;-1:-1:-1;;;;30065:3743:0:o;18743:125::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;-1:-1:-1;;;;;18803:19:0;::::1;;::::0;;;18825:4:::1;18803:19;::::0;;;;;;;;:26;;;::::1;::::0;;::::1;::::0;;;18845:15;;11432:74:1;;;18845:15:0::1;::::0;11405:18:1;18845:15:0::1;;;;;;;;18743:125:::0;:::o;26942:616::-;-1:-1:-1;;;;;27072:24:0;;27043:26;27072:24;;;:17;:24;;;;;;;;26687:14;;;:8;:14;;;;;:21;;;;;;;;;26726:13;;;27014:16;;27072:24;27043:26;27141:42;;;;;;-1:-1:-1;;;27141:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27141:42:0;;27109:74;;27196:13;27228:6;27224:295;27244:15;;27240:19;;27224:295;;;27281:26;27310:22;:35;27333:8;27342:1;27333:11;;;;;;-1:-1:-1;;;27333:11:0;;;;;;;;;;;;;;;;;27310:35;;;;;;;;;;;27281:64;;27381:4;27364:9;:13;;;:21;:48;;;;-1:-1:-1;27389:14:0;;-1:-1:-1;;;;;27389:23:0;;;:14;;:23;27364:48;27360:148;;;27455:8;27464:1;27455:11;;;;;;-1:-1:-1;;;27455:11:0;;;;;;;;;;;;;;;;;27433:12;27446:5;27433:19;;;;;;-1:-1:-1;;;27433:19:0;;;;;;;;;;;;;;;;;;:33;27485:7;;;;:::i;:::-;;;;27360:148;-1:-1:-1;27261:3:0;;;;:::i;:::-;;;;27224:295;;46174:322;18712:10;19181:4;19205:19;;;:14;:19;;;;;;;;18691:33;;;;;;46288:11:::1;46284:61;;;46316:17;:15;:17::i;:::-;46375:63;46426:11;46375:46;46395:8;46404:4;46395:14;;;;;;-1:-1:-1::0;;;46395:14:0::1;;;;;;;;46375:63;46357:15;:81;;;;46477:11;46449:8;46458:4;46449:14;;;;;;-1:-1:-1::0;;;46449:14:0::1;;;;;;;;;;;;;;;;;;;:25;;:39;;;;46174:322:::0;;;:::o;43066:299::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;43145:21:::1;43182:17:::0;;::::1;43179:65;;;43225:7;43215:17;;43179:65;43274:46;::::0;43257:12:::1;::::0;43282:10:::1;::::0;43307:7;;43257:12;43274:46;43257:12;43274:46;43307:7;43282:10;43274:46:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43256:64;;;43339:7;43331:26;;;::::0;-1:-1:-1;;;43331:26:0;;19223:2:1;43331:26:0::1;::::0;::::1;19205:21:1::0;19262:1;19242:18;;;19235:29;19300:8;19280:18;;;19273:36;19326:18;;43331:26:0::1;19195:155:1::0;41502:171:0;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;-1:-1:-1;;;;;41581:25:0;::::1;41573:57;;;::::0;-1:-1:-1;;;41573:57:0;;18519:2:1;41573:57:0::1;::::0;::::1;18501:21:1::0;18558:2;18538:18;;;18531:30;18597:21;18577:18;;;18570:49;18636:18;;41573:57:0::1;18491:169:1::0;41573:57:0::1;41641:10;:24:::0;;;::::1;-1:-1:-1::0;;;;;41641:24:0;;;::::1;::::0;;;::::1;::::0;;41502:171::o;24937:833::-;25014:7;25034:21;25058:8;25067:4;25058:14;;;;;;-1:-1:-1;;;25058:14:0;;;;;;;;;;;;;;;;;25107;;;:8;:14;;;;;;-1:-1:-1;;;;;25107:21:0;;;;;;;;;25169:24;25058:14;;;;;;;25169:24;;;;25223:12;;;;25267:20;;;;25058:14;;-1:-1:-1;25169:24:0;;25252:12;:35;:52;;;;-1:-1:-1;25291:13:0;;;25252:52;25248:369;;;25321:18;25342:49;25356:4;:20;;;25378:12;25342:13;:49::i;:::-;25321:70;;25406:22;25431:74;25489:15;;25431:53;25468:4;:15;;;25431:32;25446:16;;25431:10;:14;;:32;;;;:::i;:74::-;25406:99;-1:-1:-1;25542:63:0;25566:38;25595:8;25566:24;25406:99;25585:4;25566:18;:24::i;:38::-;25542:19;;:23;:63::i;:::-;25520:85;;25248:369;;;25627:15;25645:67;25696:4;:15;;;25645:46;25686:4;25645:36;25661:19;25645:4;:11;;;:15;;:36;;;;:::i;:67::-;25627:85;;25730:32;25742:4;:19;;;25730:7;:11;;:32;;;;:::i;:::-;25723:39;24937:833;-1:-1:-1;;;;;;;;24937:833:0:o;43698:268::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;43812:6:::1;43807:152;43828:8;:15;43824:1;:19;43807:152;;;43878:11;-1:-1:-1::0;;;;;43865:42:0::1;;43916:4;43923:10;43935:8;43944:1;43935:11;;;;;;-1:-1:-1::0;;;43935:11:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;43865:82:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;13587:15:1;;;43865:82:0::1;::::0;::::1;13569:34:1::0;13639:15;;;;13619:18;;;13612:43;13671:18;;;13664:34;13481:18;;43865:82:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43845:3;;;;;:::i;:::-;;;;43807:152;;46504:183:::0;18712:10;19181:4;19205:19;;;:14;:19;;;;;;;;18691:33;;;;;;46622:7:::1;46597:32;;:8;46606:4;46597:14;;;;;;-1:-1:-1::0;;;46597:14:0::1;;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:32;;;;46589:48;;;;-1:-1:-1::0;;;46589:48:0::1;;;;;;28100:2:1::0;28082:21;;;28139:1;28119:18;;;28112:29;28177:6;28172:2;28157:18;;28150:34;28216:2;28201:18;;28072:153;46589:48:0::1;46672:7;46648:8;46657:4;46648:14;;;;;;-1:-1:-1::0;;;46648:14:0::1;;;;;;;;;;;;;;;;;;;:21;;;:31;;;;;;;;;;;;;;;;;;46504:183:::0;;:::o;18876:130::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;-1:-1:-1;;;;;18938:19:0;::::1;18960:5;18938:19:::0;;;:14:::1;:19;::::0;;;;;;;;:27;;;::::1;::::0;;18981:17;;11432:74:1;;;18981:17:0::1;::::0;11405:18:1;18981:17:0::1;11387:125:1::0;42035:191:0;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;-1:-1:-1;;;;;42117:30:0;::::1;42109:60;;;::::0;-1:-1:-1;;;42109:60:0;;27407:2:1;42109:60:0::1;::::0;::::1;27389:21:1::0;27446:2;27426:18;;;27419:30;27485:19;27465:18;;;27458:47;27522:18;;42109:60:0::1;27379:167:1::0;42109:60:0::1;42180:8;:38:::0;;;::::1;-1:-1:-1::0;;;;;42180:38:0;;;::::1;::::0;;;::::1;::::0;;42035:191::o;19240:173::-;19069:4;19104:5;-1:-1:-1;;;;;19104:5:0;18627:10;19093:16;18611:28;;;;;;19316:5:::1;:11:::0;;;::::1;-1:-1:-1::0;;;;;19316:11:0;::::1;::::0;;::::1;::::0;;19338:19;;;-1:-1:-1;19338:19:0::1;::::0;;;;;;;;:26;;;::::1;::::0;;::::1;::::0;;;19380:25;;11432:74:1;;;19380:25:0::1;::::0;11405:18:1;19380:25:0::1;11387:125:1::0;33816:4380:0;18066:1;18215:7;;:19;;18207:63;;;;-1:-1:-1;;;18207:63:0;;29611:2:1;18207:63:0;;;29593:21:1;29650:2;29630:18;;;29623:30;29689:33;29669:18;;;29662:61;29740:18;;18207:63:0;29583:181:1;18207:63:0;18066:1;18281:7;:18;;;;33937:21:::1;33961:8;33970:4;33961:14;;;;;;-1:-1:-1::0;;;33961:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;34010;;;:8:::1;:14:::0;;;;;;34025:10:::1;34010:26:::0;;;;;;;34057:13:::1;::::0;::::1;::::0;33961:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;34057:17:0;;;:39:::1;;;34095:1;34078:4;:14;;;:18;34057:39;34049:81;;;::::0;-1:-1:-1;;;34049:81:0;;24940:2:1;34049:81:0::1;::::0;::::1;24922:21:1::0;24979:2;24959:18;;;24952:30;25018:31;24998:18;;;24991:59;25067:18;;34049:81:0::1;24912:179:1::0;34049:81:0::1;34165:1;34149:4;:13;;;:17;:39;;;;34187:1;34170:4;:14;;;:18;34149:39;34141:81;;;::::0;-1:-1:-1;;;34141:81:0;;25298:2:1;34141:81:0::1;::::0;::::1;25280:21:1::0;25337:2;25317:18;;;25310:30;25376:31;25356:18;;;25349:59;25425:18;;34141:81:0::1;25270:179:1::0;34141:81:0::1;34235:16;34246:4;34235:10;:16::i;:::-;34262:32;34289:4;34262:26;:32::i;:::-;34310:15:::0;;:19;34307:1843:::1;;34379:10;::::0;::::1;::::0;34369:59:::1;::::0;;;;34345:21:::1;::::0;-1:-1:-1;;;;;34379:10:0::1;::::0;34369:37:::1;::::0;:59:::1;::::0;34407:10:::1;::::0;34419:8;;34369:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34465:11:::0;;34345:83;;-1:-1:-1;34449:27:0;::::1;34445:168;;;34511:1;34497:15:::0;;34445:168:::1;;;34567:11:::0;;:30:::1;::::0;34583:13;34567:15:::1;:30::i;:::-;34553:44:::0;;34445:168:::1;34647:13;34632:4;:12;;;:28;34629:168;;;34695:12;::::0;::::1;::::0;:31:::1;::::0;34712:13;34695:16:::1;:31::i;:::-;34680:12;::::0;::::1;:46:::0;34629:168:::1;;;34780:1;34765:12;::::0;::::1;:16:::0;34629:168:::1;34832:8;:15;34816:4;:13;;;:31;34813:176;;;34901:15:::0;;34883:13:::1;::::0;::::1;::::0;:34:::1;::::0;:17:::1;:34::i;:::-;34867:13;::::0;::::1;:50:::0;34813:176:::1;;;34972:1;34956:13;::::0;::::1;:17:::0;34813:176:::1;35024:8;:15;35008:4;:13;;;:31;35005:176;;;35093:15:::0;;35075:13:::1;::::0;::::1;::::0;:34:::1;::::0;:17:::1;:34::i;:::-;35059:13;::::0;::::1;:50:::0;35005:176:::1;;;35164:1;35148:13;::::0;::::1;:17:::0;35005:176:::1;35243:10;35197:25;35225:29:::0;;;:17:::1;:29;::::0;;;;;35269:870:::1;35289:8;:15;35285:1;:19;35269:870;;;35330:26;35359:22;:35;35382:8;35391:1;35382:11;;;;;;-1:-1:-1::0;;;35382:11:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;35359:35;;;::::1;::::0;;;;;;-1:-1:-1;35359:35:0;35443:14;;35359:35;;-1:-1:-1;;;;;;35443:14:0::1;35421:10;:37;35413:67;;;::::0;-1:-1:-1;;;35413:67:0;;29971:2:1;35413:67:0::1;::::0;::::1;29953:21:1::0;30010:2;29990:18;;;29983:30;30049:19;30029:18;;;30022:47;30086:18;;35413:67:0::1;29943:167:1::0;35413:67:0::1;35515:9;:13;;;35507:4;:21;35499:50;;;::::0;-1:-1:-1;;;35499:50:0;;23835:2:1;35499:50:0::1;::::0;::::1;23817:21:1::0;23874:2;23854:18;;;23847:30;23913:18;23893;;;23886:46;23949:18;;35499:50:0::1;23807:166:1::0;35499:50:0::1;35601:14:::0;;:21:::1;::::0;35620:1:::1;35601:18;:21::i;:::-;35581:15;::::0;::::1;::::0;::::1;;35573:49;35570:266;;35690:14:::0;;35682:7;;35690:21:::1;::::0;35709:1:::1;35690:18;:21::i;:::-;35682:30;;;;;;-1:-1:-1::0;;;35682:30:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;35662:15:::1;::::0;::::1;::::0;35646:33;;:7;;35662:15:::1;;::::0;35646:33;::::1;;;-1:-1:-1::0;;;35646:33:0::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;:66:::0;;;;35801:15:::1;::::0;::::1;::::0;35758:33;;35801:15:::1;::::0;;::::1;::::0;35735:22:::1;::::0;35758:7;;35801:15;;35758:33;::::1;;;-1:-1:-1::0;;;35758:33:0::1;;;;;;;;;;;;;;;;;35735:57;;;;;;;;;;;:63;;;:81;;;;;;;;;;;;;;;;;;35570:266;35856:7;:13;;;;;-1:-1:-1::0;;;35856:13:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;35897:22;:35;35920:8;35929:1;35920:11;;;;;;-1:-1:-1::0;;;35920:11:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;35897:35;;;::::1;::::0;;;;;;-1:-1:-1;35897:35:0;;;35890:42;;;::::1;::::0;;-1:-1:-1;35890:42:0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;35966:12;;36093:11;;-1:-1:-1;;;;;35966:12:0;;::::1;::::0;35953:39:::1;::::0;36023:4:::1;::::0;36059:10:::1;::::0;36093:11;;36102:1;;36093:11;::::1;;;-1:-1:-1::0;;;36093:11:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;35953:170:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;13587:15:1;;;35953:170:0::1;::::0;::::1;13569:34:1::0;13639:15;;;;13619:18;;;13612:43;13671:18;;;13664:34;13481:18;;35953:170:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35269:870;35306:3;;;;;:::i;:::-;;;;35269:870;;;;34307:1843;;;36165:16:::0;;:20;36162:1879:::1;;36236:10;::::0;::::1;::::0;36226:61:::1;::::0;;;;36201:22:::1;::::0;-1:-1:-1;;;;;36236:10:0::1;::::0;36226:38:::1;::::0;:61:::1;::::0;36265:10:::1;::::0;36277:9;;36226:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36325:11:::0;;36201:86;;-1:-1:-1;36308:28:0;::::1;36304:170;;;36371:1;36357:15:::0;;36304:170:::1;;;36427:11:::0;;:31:::1;::::0;36443:14;36427:15:::1;:31::i;:::-;36413:45:::0;;36304:170:::1;36508:14;36493:4;:12;;;:29;36490:170;;;36557:12;::::0;::::1;::::0;:32:::1;::::0;36574:14;36557:16:::1;:32::i;:::-;36542:12;::::0;::::1;:47:::0;36490:170:::1;;;36643:1;36628:12;::::0;::::1;:16:::0;36490:170:::1;36696:9;:16;36679:4;:14;;;:33;36676:182;;;36768:16:::0;;36749:14:::1;::::0;::::1;::::0;:36:::1;::::0;:18:::1;:36::i;:::-;36732:14;::::0;::::1;:53:::0;36676:182:::1;;;36841:1;36824:14;::::0;::::1;:18:::0;36676:182:::1;36894:9;:16;36877:4;:14;;;:33;36874:182;;;36966:16:::0;;36947:14:::1;::::0;::::1;::::0;:36:::1;::::0;:18:::1;:36::i;:::-;36930:14;::::0;::::1;:53:::0;36874:182:::1;;;37039:1;37022:14;::::0;::::1;:18:::0;36874:182:::1;37120:10;37072:26;37101:30:::0;;;:18:::1;:30;::::0;;;;;37146:884:::1;37166:9;:16;37162:1;:20;37146:884;;;37208:26;37237:23;:37;37261:9;37271:1;37261:12;;;;;;-1:-1:-1::0;;;37261:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;37237:37;;;::::1;::::0;;;;;;-1:-1:-1;37237:37:0;37323:14;;37237:37;;-1:-1:-1;;;;;;37323:14:0::1;37301:10;:37;37293:67;;;::::0;-1:-1:-1;;;37293:67:0;;29971:2:1;37293:67:0::1;::::0;::::1;29953:21:1::0;30010:2;29990:18;;;29983:30;30049:19;30029:18;;;30022:47;30086:18;;37293:67:0::1;29943:167:1::0;37293:67:0::1;37395:9;:13;;;37387:4;:21;37379:50;;;::::0;-1:-1:-1;;;37379:50:0;;23835:2:1;37379:50:0::1;::::0;::::1;23817:21:1::0;23874:2;23854:18;;;23847:30;23913:18;23893;;;23886:46;23949:18;;37379:50:0::1;23807:166:1::0;37379:50:0::1;37481:15:::0;;:22:::1;::::0;37501:1:::1;37481:19;:22::i;:::-;37461:15;::::0;::::1;::::0;::::1;;37453:50;37450:272;;37573:15:::0;;37564:8;;37573:22:::1;::::0;37593:1:::1;37573:19;:22::i;:::-;37564:32;;;;;;-1:-1:-1::0;;;37564:32:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;37544:15:::1;::::0;::::1;::::0;37527:34;;:8;;37544:15:::1;;::::0;37527:34;::::1;;;-1:-1:-1::0;;;37527:34:0::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;:69:::0;;;;37687:15:::1;::::0;::::1;::::0;37643:34;;37687:15:::1;::::0;;::::1;::::0;37619:23:::1;::::0;37643:8;;37687:15;;37643:34;::::1;;;-1:-1:-1::0;;;37643:34:0::1;;;;;;;;;;;;;;;;;37619:59;;;;;;;;;;;:65;;;:83;;;;;;;;;;;;;;;;;;37450:272;37742:8;:14;;;;;-1:-1:-1::0;;;37742:14:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;37784:23;:37;37808:9;37818:1;37808:12;;;;;;-1:-1:-1::0;;;37808:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;37784:37;;;::::1;::::0;;;;;;-1:-1:-1;37784:37:0;;;37777:44;;;::::1;::::0;;-1:-1:-1;37777:44:0;;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;37855:13;::::1;::::0;37983:12;;-1:-1:-1;;;;;37855:13:0;;::::1;::::0;37842:40:::1;::::0;37913:4:::1;::::0;37949:10:::1;::::0;37983:12;;37993:1;;37983:12;::::1;;;-1:-1:-1::0;;;37983:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;37842:172:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;13587:15:1;;;37842:172:0::1;::::0;::::1;13569:34:1::0;13639:15;;;;13619:18;;;13612:43;13671:18;;;13664:34;13481:18;;37842:172:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37146:884;37184:3;;;;;:::i;:::-;;;;37146:884;;;;36162:1879;;;38087:24;::::0;::::1;::::0;38071:11;;:51:::1;::::0;38117:4:::1;::::0;38071:41:::1;::::0;:15:::1;:41::i;:51::-;38053:15;::::0;::::1;:69:::0;38138:50:::1;::::0;38162:4;;38150:10:::1;::::0;38138:50:::1;::::0;::::1;::::0;38168:8;;38178:9;;38138:50:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;18022:1:0;18326:7;:22;-1:-1:-1;;;33816:4380:0:o;3980:158::-;4038:7;4071:1;4066;:6;;4058:49;;;;-1:-1:-1;;;4058:49:0;;21311:2:1;4058:49:0;;;21293:21:1;21350:2;21330:18;;;21323:30;21389:32;21369:18;;;21362:60;21439:18;;4058:49:0;21283:180:1;4058:49:0;4125:5;4129:1;4125;:5;:::i;3795:179::-;3853:7;;3885:5;3889:1;3885;:5;:::i;:::-;3873:17;;3914:1;3909;:6;;3901:46;;;;-1:-1:-1;;;3901:46:0;;18867:2:1;3901:46:0;;;18849:21:1;18906:2;18886:18;;;18879:30;18945:29;18925:18;;;18918:57;18992:18;;3901:46:0;18839:177:1;13420:248:0;13591:68;;;-1:-1:-1;;;;;13587:15:1;;;13591:68:0;;;13569:34:1;13639:15;;13619:18;;;13612:43;13671:18;;;;13664:34;;;13591:68:0;;;;;;;;;;13481:18:1;;;;13591:68:0;;;;;;;;;;13614:27;13591:68;;;13564:96;;13584:5;;13564:19;:96::i;4144:220::-;4202:7;4226:6;4222:20;;-1:-1:-1;4241:1:0;4234:8;;4222:20;4253:9;4265:5;4269:1;4265;:5;:::i;:::-;4253:17;-1:-1:-1;4298:1:0;4289:5;4293:1;4253:17;4289:5;:::i;:::-;:10;4281:56;;;;-1:-1:-1;;;4281:56:0;;24180:2:1;4281:56:0;;;24162:21:1;24219:2;24199:18;;;24192:30;24258:34;24238:18;;;24231:62;24329:3;24309:18;;;24302:31;24350:19;;4281:56:0;24152:223:1;4370:153:0;4428:7;4460:1;4456;:5;4448:44;;;;-1:-1:-1;;;4448:44:0;;22077:2:1;4448:44:0;;;22059:21:1;22116:2;22096:18;;;22089:30;22155:28;22135:18;;;22128:56;22201:18;;4448:44:0;22049:176:1;4448:44:0;4510:5;4514:1;4510;:5;:::i;41255:239::-;41343:8;;;41370;;41343:37;;;;;-1:-1:-1;;;;;41370:8:0;;;41343:37;;;11432:74:1;;;;41384:7:0;;41343:8;;;:18;;11405::1;;41343:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;41335:87;;;;-1:-1:-1;;;41335:87:0;;26701:2:1;41335:87:0;;;26683:21:1;26740:2;26720:18;;;26713:30;26779:29;26759:18;;;26752:57;26826:18;;41335:87:0;26673:177:1;41335:87:0;41433:8;;41462;;;41433:53;;;;;-1:-1:-1;;;;;41462:8:0;;;41433:53;;;14660:34:1;;;;14710:18;;;14703:34;;;14773:15;;;14753:18;;;14746:43;41433:8:0;;;;:20;;14572:18:1;;41433:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41255:239;;:::o;40635:612::-;40731:8;;-1:-1:-1;;;;;40731:8:0;40723:31;;;;:51;;-1:-1:-1;40758:12:0;;;;;;;:16;;40723:51;40719:521;;;40810:8;;:27;;;;;-1:-1:-1;;;;;11450:55:1;;;40810:27:0;;;11432:74:1;40791:16:0;;40810:8;;:20;;11405:18:1;;40810:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40892:12;;40791:46;;-1:-1:-1;40852:24:0;;40879:37;;40910:5;;40879:26;;:8;;40892:12;;;;;40879;:26::i;:37::-;40852:64;-1:-1:-1;;;;;;40937:22:0;;;;;;:46;;;40982:1;40963:16;:20;40937:46;40933:296;;;41004:48;41025:8;41035:16;41004:20;:48::i;:::-;41071:8;;:61;;;;;-1:-1:-1;;;;;14287:55:1;;;41071:61:0;;;14269:74:1;14359:18;;;14352:34;;;41071:8:0;;;;:33;;14242:18:1;;41071:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41186:8;-1:-1:-1;;;;;41156:57:0;41179:5;-1:-1:-1;;;;;41156:57:0;;41196:16;41156:57;;;;30454:25:1;;30442:2;30427:18;;30409:76;41156:57:0;;;;;;;;40719:521;;40635:612;;:::o;38814:627::-;38884:21;38908:8;38917:4;38908:14;;;;;;-1:-1:-1;;;38908:14:0;;;;;;;;;;;;;;;;;38957;;;:8;:14;;;;;;38972:10;38957:26;;;;;;;39000:21;;;;38908:14;;;;;;;;-1:-1:-1;39000:26:0;:56;;;;;39046:10;;39030:12;:26;;39000:56;38996:154;;;39117:20;;;;39097:41;;:15;;:19;:41::i;:::-;39073:21;;;:65;38996:154;39162:15;39180:72;39236:4;:15;;;39180:51;39226:4;39180:41;39196:4;:24;;;39180:4;:11;;;:15;;:41;;;;:::i;:72::-;39162:90;-1:-1:-1;39269:11:0;;39265:169;;39319:19;;;;:32;;39343:7;39319:23;:32::i;:::-;39297:19;;;:54;39389:20;;:33;;39414:7;39389:24;:33::i;:::-;39366:20;:56;38814:627;;;;:::o;17449:163::-;17498:6;17529:20;17525:1;:24;17517:60;;;;-1:-1:-1;;;17517:60:0;;23483:2:1;17517:60:0;;;23465:21:1;23522:2;23502:18;;;23495:30;23561:25;23541:18;;;23534:53;23604:18;;17517:60:0;23455:173:1;17517:60:0;-1:-1:-1;17602:1:0;17449:163::o;15750:716::-;16174:23;16200:69;16228:4;16200:69;;;;;;;;;;;;;;;;;16208:5;-1:-1:-1;;;;;16200:27:0;;;:69;;;;;:::i;:::-;16284:17;;16174:95;;-1:-1:-1;16284:21:0;16280:179;;16381:10;16370:30;;;;;;;;;;;;:::i;:::-;16362:85;;;;-1:-1:-1;;;16362:85:0;;28846:2:1;16362:85:0;;;28828:21:1;28885:2;28865:18;;;28858:30;28924:34;28904:18;;;28897:62;28995:12;28975:18;;;28968:40;29025:19;;16362:85:0;28818:232:1;8617:229:0;8754:12;8786:52;8808:6;8816:4;8822:1;8825:12;8786:21;:52::i;:::-;8779:59;8617:229;-1:-1:-1;;;;8617:229:0:o;9737:510::-;9907:12;9965:5;9940:21;:30;;9932:81;;;;-1:-1:-1;;;9932:81:0;;21670:2:1;9932:81:0;;;21652:21:1;21709:2;21689:18;;;21682:30;21748:34;21728:18;;;21721:62;21819:8;21799:18;;;21792:36;21845:19;;9932:81:0;21642:228:1;9932:81:0;6134:20;;10024:60;;;;-1:-1:-1;;;10024:60:0;;26002:2:1;10024:60:0;;;25984:21:1;26041:2;26021:18;;;26014:30;26080:31;26060:18;;;26053:59;26129:18;;10024:60:0;25974:179:1;10024:60:0;10098:12;10112:23;10139:6;-1:-1:-1;;;;;10139:11:0;10158:5;10165:4;10139:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10097:73;;;;10188:51;10205:7;10214:10;10226:12;10188:16;:51::i;:::-;10181:58;9737:510;-1:-1:-1;;;;;;;9737:510:0:o;12423:712::-;12573:12;12602:7;12598:530;;;-1:-1:-1;12633:10:0;12626:17;;12598:530;12747:17;;:21;12743:374;;12945:10;12939:17;13006:15;12993:10;12989:2;12985:19;12978:44;12893:148;13088:12;13081:20;;-1:-1:-1;;;13081:20:0;;;;;;;;:::i;14:992:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:2;;143:5;136;129:20;88:2;183:6;170:20;209:4;232:18;269:2;265;262:10;259:2;;;275:18;;:::i;:::-;321:2;318:1;314:10;353:2;347:9;412:66;407:2;403;399:11;395:84;387:6;383:97;530:6;518:10;515:22;510:2;498:10;495:18;492:46;489:2;;;541:18;;:::i;:::-;577:2;570:22;627:18;;;661:15;;;;-1:-1:-1;696:15:1;;;730;;;726:24;;723:33;-1:-1:-1;720:2:1;;;773:5;766;759:20;720:2;799:5;790:14;;813:163;827:2;824:1;821:9;813:163;;;884:17;;872:30;;922:12;;;;845:1;838:9;;;;;954:12;;813:163;;;-1:-1:-1;994:6:1;78:928;-1:-1:-1;;;;;;;78:928:1:o;1011:159::-;1078:20;;1138:6;1127:18;;1117:29;;1107:2;;1160:1;1157;1150:12;1107:2;1059:111;;;:::o;1175:257::-;1234:6;1287:2;1275:9;1266:7;1262:23;1258:32;1255:2;;;1308:6;1300;1293:22;1255:2;1352:9;1339:23;1371:31;1396:5;1371:31;:::i;1437:261::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:2;;;1581:6;1573;1566:22;1528:2;1618:9;1612:16;1637:31;1662:5;1637:31;:::i;1973:986::-;2070:6;2078;2086;2094;2102;2155:3;2143:9;2134:7;2130:23;2126:33;2123:2;;;2177:6;2169;2162:22;2123:2;2221:9;2208:23;2240:31;2265:5;2240:31;:::i;:::-;2290:5;-1:-1:-1;2347:2:1;2332:18;;2319:32;2360:33;2319:32;2360:33;:::i;:::-;2412:7;-1:-1:-1;2466:2:1;2451:18;;2438:32;;-1:-1:-1;2521:2:1;2506:18;;2493:32;2544:18;2574:14;;;2571:2;;;2606:6;2598;2591:22;2571:2;2649:6;2638:9;2634:22;2624:32;;2694:7;2687:4;2683:2;2679:13;2675:27;2665:2;;2721:6;2713;2706:22;2665:2;2766;2753:16;2792:2;2784:6;2781:14;2778:2;;;2813:6;2805;2798:22;2778:2;2863:7;2858:2;2849:6;2845:2;2841:15;2837:24;2834:37;2831:2;;;2889:6;2881;2874:22;2831:2;2113:846;;;;-1:-1:-1;2113:846:1;;-1:-1:-1;2925:2:1;2917:11;;2947:6;2113:846;-1:-1:-1;;;2113:846:1:o;2964:503::-;3057:6;3065;3118:2;3106:9;3097:7;3093:23;3089:32;3086:2;;;3139:6;3131;3124:22;3086:2;3183:9;3170:23;3202:31;3227:5;3202:31;:::i;:::-;3252:5;-1:-1:-1;3308:2:1;3293:18;;3280:32;3335:18;3324:30;;3321:2;;;3372:6;3364;3357:22;3321:2;3400:61;3453:7;3444:6;3433:9;3429:22;3400:61;:::i;:::-;3390:71;;;3076:391;;;;;:::o;3472:325::-;3540:6;3548;3601:2;3589:9;3580:7;3576:23;3572:32;3569:2;;;3622:6;3614;3607:22;3569:2;3666:9;3653:23;3685:31;3710:5;3685:31;:::i;:::-;3735:5;3787:2;3772:18;;;;3759:32;;-1:-1:-1;;;3559:238:1:o;3802:251::-;3858:6;3911:2;3899:9;3890:7;3886:23;3882:32;3879:2;;;3932:6;3924;3917:22;3879:2;3976:9;3963:23;3995:28;4017:5;3995:28;:::i;4058:255::-;4125:6;4178:2;4166:9;4157:7;4153:23;4149:32;4146:2;;;4199:6;4191;4184:22;4146:2;4236:9;4230:16;4255:28;4277:5;4255:28;:::i;4318:194::-;4376:6;4429:2;4417:9;4408:7;4404:23;4400:32;4397:2;;;4450:6;4442;4435:22;4397:2;4478:28;4496:9;4478:28;:::i;4517:190::-;4576:6;4629:2;4617:9;4608:7;4604:23;4600:32;4597:2;;;4650:6;4642;4635:22;4597:2;-1:-1:-1;4678:23:1;;4587:120;-1:-1:-1;4587:120:1:o;4712:194::-;4782:6;4835:2;4823:9;4814:7;4810:23;4806:32;4803:2;;;4856:6;4848;4841:22;4803:2;-1:-1:-1;4884:16:1;;4793:113;-1:-1:-1;4793:113:1:o;4911:325::-;4979:6;4987;5040:2;5028:9;5019:7;5015:23;5011:32;5008:2;;;5061:6;5053;5046:22;5008:2;5102:9;5089:23;5079:33;;5162:2;5151:9;5147:18;5134:32;5175:31;5200:5;5175:31;:::i;:::-;5225:5;5215:15;;;4998:238;;;;;:::o;5241:1160::-;5363:6;5371;5379;5387;5395;5403;5411;5419;5427;5480:3;5468:9;5459:7;5455:23;5451:33;5448:2;;;5502:6;5494;5487:22;5448:2;5543:9;5530:23;5520:33;;5603:2;5592:9;5588:18;5575:32;5616:31;5641:5;5616:31;:::i;:::-;5666:5;-1:-1:-1;5723:2:1;5708:18;;5695:32;5736:33;5695:32;5736:33;:::i;:::-;5788:7;-1:-1:-1;5814:37:1;5847:2;5832:18;;5814:37;:::i;:::-;5804:47;;5898:3;5887:9;5883:19;5870:33;5860:43;;5955:3;5944:9;5940:19;5927:33;5969:31;5992:7;5969:31;:::i;:::-;6019:7;-1:-1:-1;6078:3:1;6063:19;;6050:33;6092;6050;6092;:::i;:::-;6144:7;-1:-1:-1;6203:3:1;6188:19;;6175:33;6217:30;6175:33;6217:30;:::i;:::-;6266:7;-1:-1:-1;6325:3:1;6310:19;;6297:33;6339:30;6297:33;6339:30;:::i;:::-;6388:7;6378:17;;;5438:963;;;;;;;;;;;:::o;6406:693::-;6533:6;6541;6549;6602:2;6590:9;6581:7;6577:23;6573:32;6570:2;;;6623:6;6615;6608:22;6570:2;6664:9;6651:23;6641:33;;6725:2;6714:9;6710:18;6697:32;6748:18;6789:2;6781:6;6778:14;6775:2;;;6810:6;6802;6795:22;6775:2;6838:61;6891:7;6882:6;6871:9;6867:22;6838:61;:::i;:::-;6828:71;;6952:2;6941:9;6937:18;6924:32;6908:48;;6981:2;6971:8;6968:16;6965:2;;;7002:6;6994;6987:22;6965:2;;7030:63;7085:7;7074:8;7063:9;7059:24;7030:63;:::i;:::-;7020:73;;;6560:539;;;;;:::o;7104:829::-;7240:6;7248;7256;7264;7317:3;7305:9;7296:7;7292:23;7288:33;7285:2;;;7339:6;7331;7324:22;7285:2;7380:9;7367:23;7357:33;;7441:2;7430:9;7426:18;7413:32;7464:18;7505:2;7497:6;7494:14;7491:2;;;7526:6;7518;7511:22;7491:2;7554:61;7607:7;7598:6;7587:9;7583:22;7554:61;:::i;:::-;7544:71;;7668:2;7657:9;7653:18;7640:32;7624:48;;7697:2;7687:8;7684:16;7681:2;;;7718:6;7710;7703:22;7681:2;;7746:63;7801:7;7790:8;7779:9;7775:24;7746:63;:::i;:::-;7736:73;;;7859:2;7848:9;7844:18;7831:32;7872:31;7897:5;7872:31;:::i;:::-;7275:658;;;;-1:-1:-1;7275:658:1;;-1:-1:-1;;7275:658:1:o;7938:319::-;8003:6;8011;8064:2;8052:9;8043:7;8039:23;8035:32;8032:2;;;8085:6;8077;8070:22;8032:2;8126:9;8113:23;8103:33;;8186:2;8175:9;8171:18;8158:32;8199:28;8221:5;8199:28;:::i;8262:258::-;8330:6;8338;8391:2;8379:9;8370:7;8366:23;8362:32;8359:2;;;8412:6;8404;8397:22;8359:2;-1:-1:-1;;8440:23:1;;;8510:2;8495:18;;;8482:32;;-1:-1:-1;8349:171:1:o;8525:387::-;8599:6;8607;8615;8668:2;8656:9;8647:7;8643:23;8639:32;8636:2;;;8689:6;8681;8674:22;8636:2;8730:9;8717:23;8707:33;;8787:2;8776:9;8772:18;8759:32;8749:42;;8841:2;8830:9;8826:18;8813:32;8854:28;8876:5;8854:28;:::i;:::-;8901:5;8891:15;;;8626:286;;;;;:::o;8917:945::-;9030:6;9038;9046;9054;9062;9070;9078;9086;9139:3;9127:9;9118:7;9114:23;9110:33;9107:2;;;9161:6;9153;9146:22;9107:2;9202:9;9189:23;9179:33;;9259:2;9248:9;9244:18;9231:32;9221:42;;9282:37;9315:2;9304:9;9300:18;9282:37;:::i;:::-;9272:47;;9366:2;9355:9;9351:18;9338:32;9328:42;;9420:3;9409:9;9405:19;9392:33;9434:29;9457:5;9434:29;:::i;:::-;9482:5;-1:-1:-1;9539:3:1;9524:19;;9511:33;9553;9511;9553;:::i;:::-;9605:7;-1:-1:-1;9664:3:1;9649:19;;9636:33;9678:30;9636:33;9678:30;:::i;:::-;9727:7;-1:-1:-1;9786:3:1;9771:19;;9758:33;9800:30;9758:33;9800:30;:::i;:::-;9849:7;9839:17;;;9097:765;;;;;;;;;;;:::o;9867:387::-;9942:6;9950;10003:2;9991:9;9982:7;9978:23;9974:32;9971:2;;;10024:6;10016;10009:22;9971:2;10061:9;10055:16;10080:29;10103:5;10080:29;:::i;:::-;10178:2;10163:18;;10157:25;10128:5;;-1:-1:-1;10191:31:1;10157:25;10191:31;:::i;10259:437::-;10312:3;10350:5;10344:12;10377:6;10372:3;10365:19;10403:4;10432:2;10427:3;10423:12;10416:19;;10469:2;10462:5;10458:14;10490:3;10502:169;10516:6;10513:1;10510:13;10502:169;;;10577:13;;10565:26;;10611:12;;;;10646:15;;;;10538:1;10531:9;10502:169;;;-1:-1:-1;10687:3:1;;10320:376;-1:-1:-1;;;;;10320:376:1:o;10797:274::-;10926:3;10964:6;10958:13;10980:53;11026:6;11021:3;11014:4;11006:6;11002:17;10980:53;:::i;:::-;11049:16;;;;;10934:137;-1:-1:-1;;10934:137:1:o;12088:1213::-;12507:4;12549:3;12538:9;12534:19;12526:27;;-1:-1:-1;;;;;12584:6:1;12580:55;12569:9;12562:74;-1:-1:-1;;;;;12676:6:1;12672:55;12667:2;12656:9;12652:18;12645:83;-1:-1:-1;;;;;12768:6:1;12764:55;12759:2;12748:9;12744:18;12737:83;12856:6;12851:2;12840:9;12836:18;12829:34;12900:6;12894:3;12883:9;12879:19;12872:35;12944:6;12938:3;12927:9;12923:19;12916:35;13000:6;12992;12988:19;12982:3;12971:9;12967:19;12960:48;13045:6;13039:3;13028:9;13024:19;13017:35;13089:6;13083:3;13072:9;13068:19;13061:35;13133:6;13127:3;13116:9;13112:19;13105:35;13177:7;13171:3;13160:9;13156:19;13149:36;13235:4;13226:7;13222:18;13216:3;13205:9;13201:19;13194:47;13250:45;13290:3;13279:9;13275:19;13266:7;10771:13;10764:21;10752:34;;10742:50;13250:45;12516:785;;;;;;;;;;;;;;;;:::o;13709:381::-;-1:-1:-1;;;;;13920:6:1;13916:55;13905:9;13898:74;14008:2;14003;13992:9;13988:18;13981:30;13879:4;14028:56;14080:2;14069:9;14065:18;14057:6;14028:56;:::i;14800:261::-;14979:2;14968:9;14961:21;14942:4;14999:56;15051:2;15040:9;15036:18;15028:6;14999:56;:::i;15066:465::-;15323:2;15312:9;15305:21;15286:4;15349:56;15401:2;15390:9;15386:18;15378:6;15349:56;:::i;:::-;15453:9;15445:6;15441:22;15436:2;15425:9;15421:18;15414:50;15481:44;15518:6;15510;15481:44;:::i;:::-;15473:52;15295:236;-1:-1:-1;;;;;15295:236:1:o;16473:442::-;16622:2;16611:9;16604:21;16585:4;16654:6;16648:13;16697:6;16692:2;16681:9;16677:18;16670:34;16713:66;16772:6;16767:2;16756:9;16752:18;16747:2;16739:6;16735:15;16713:66;:::i;:::-;16831:2;16819:15;16836:66;16815:88;16800:104;;;;16906:2;16796:113;;16594:321;-1:-1:-1;;16594:321:1:o;31365:128::-;31405:3;31436:1;31432:6;31429:1;31426:13;31423:2;;;31442:18;;:::i;:::-;-1:-1:-1;31478:9:1;;31413:80::o;31498:274::-;31538:1;31564;31554:2;;-1:-1:-1;;;31596:1:1;31589:88;31700:4;31697:1;31690:15;31728:4;31725:1;31718:15;31554:2;-1:-1:-1;31757:9:1;;31544:228::o;31777:::-;31817:7;31943:1;31875:66;31871:74;31868:1;31865:81;31860:1;31853:9;31846:17;31842:105;31839:2;;;31950:18;;:::i;:::-;-1:-1:-1;31990:9:1;;31829:176::o;32010:125::-;32050:4;32078:1;32075;32072:8;32069:2;;;32083:18;;:::i;:::-;-1:-1:-1;32120:9:1;;32059:76::o;32140:258::-;32212:1;32222:113;32236:6;32233:1;32230:13;32222:113;;;32312:11;;;32306:18;32293:11;;;32286:39;32258:2;32251:10;32222:113;;;32353:6;32350:1;32347:13;32344:2;;;-1:-1:-1;;32388:1:1;32370:16;;32363:27;32193:205::o;32403:195::-;32442:3;32473:66;32466:5;32463:77;32460:2;;;32543:18;;:::i;:::-;-1:-1:-1;32590:1:1;32579:13;;32450:148::o;32603:184::-;-1:-1:-1;;;32652:1:1;32645:88;32752:4;32749:1;32742:15;32776:4;32773:1;32766:15;32792:184;-1:-1:-1;;;32841:1:1;32834:88;32941:4;32938:1;32931:15;32965:4;32962:1;32955:15;32981:154;-1:-1:-1;;;;;33060:5:1;33056:54;33049:5;33046:65;33036:2;;33125:1;33122;33115:12;33036:2;33026:109;:::o;33140:118::-;33226:5;33219:13;33212:21;33205:5;33202:32;33192:2;;33248:1;33245;33238:12;33263:114;33347:4;33340:5;33336:16;33329:5;33326:27;33316:2;;33367:1;33364;33357:12

Swarm Source

ipfs://e1e4d50a38225e1f5a04f18ad8b7766c22a038d1da2528cf6e62037a807bfb93
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.