ETH Price: $3,086.02 (-0.08%)
Gas: 5 Gwei

Empower Women Planet (EWP)
 

Overview

TokenID

1167

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
EmpowerWomenPlanet

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-26
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/EWP/Pausable.sol


pragma solidity ^0.8.4;


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
    event Pause();
    event Unpause();

    bool public paused = false;

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!paused, "Transaction is not available");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(paused, "Transaction is available");
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyOwner whenNotPaused {
        paused = true;
        emit Pause();
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyOwner whenPaused {
        paused = false;
        emit Unpause();
    }
}
// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
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");
        }
    }
}

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

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

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

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

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

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

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

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

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

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

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

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

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

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

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

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

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

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

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

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

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

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

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

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

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

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

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

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

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

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

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

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

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/EWP/EmpowerWomenPlanet.sol


pragma solidity ^0.8.4;






contract EmpowerWomenPlanet is ERC721Enumerable, Pausable, PaymentSplitter {
    using Counters for Counters.Counter;

    uint256 public maxTotalSupply = 8888;
    uint256 public maxGiftSupply = 333;
    uint256 public price = 200000000000000000;
    uint256 public maxCount = 5; 
    uint256 public giftCount;
    uint256 public presaleCount;
    uint256 public totalNFT;
    bool public isBurnEnabled;
    string public baseURI;
    Counters.Counter private _tokenIds;
    uint256[] private _teamShares = [4, 6, 90];
    address[] private _team = [
        0x43879Fc71422bf0940334a0A37c029B75C7fEb90,     //dev
        0xC2A29502a69C7cCF804514FEf6c647B86069D40c,     //cofounder
        0xbFc8802A7238CA2593f6acF1A7eA04F4c76a8c00    //founder
    ];
    mapping(address => bool) private _presaleList;
    mapping(address => uint256) public _presaleClaimed;
    mapping(address => uint256) public _giftClaimed;
    mapping(address => uint256) public _saleClaimed;
    mapping(address => uint256) public _totalClaimed;

    enum WorkflowStatus {
        CheckOnPresale,
        Presale,
        Sale,
        SoldOut
    }
    WorkflowStatus public workflow;
    event ChangePresaleConfig(
        bool _isChanged
    );
    event ChangeSaleConfig(bool _isChanged);
    event ChangeIsBurnEnabled(bool _isBurnEnabled);
    event ChangeBaseURI(string _baseURI);
    event GiftMint(address indexed _recipient, uint256 _amount);
    event PresaleMint(address indexed _minter, uint256 _amount);
    event SaleMint(address indexed _minter, uint256 _amount);
    event WorkflowStatusChange(
        WorkflowStatus previousStatus,
        WorkflowStatus newStatus
    );

    constructor()
        ERC721("Empower Women Planet", "EWP")
        PaymentSplitter(_team, _teamShares)
    {}

    function setBaseURI(string calldata _tokenBaseURI) external onlyOwner {
        baseURI = _tokenBaseURI;
        emit ChangeBaseURI(_tokenBaseURI);
    }

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

    function addToPresaleList(address[] calldata _addresses)
        external
        onlyOwner
    {
        for (uint256 ind = 0; ind < _addresses.length; ind++) {
            require(
                _addresses[ind] != address(0),
                "Empower Women Planet: Can't add a zero address"
            );
            if (_presaleList[_addresses[ind]] == false) {
                _presaleList[_addresses[ind]] = true;
            }
        }
    }

    function isOnPresaleList(address _address) external view returns (bool) {
        return _presaleList[_address];
    }

    function removeFromPresaleList(address[] calldata _addresses)
        external
        onlyOwner
    {
        for (uint256 ind = 0; ind < _addresses.length; ind++) {
            require(
                _addresses[ind] != address(0),
                "Empower Women Planet: Can't remove a zero address"
            );
            if (_presaleList[_addresses[ind]] == true) {
                _presaleList[_addresses[ind]] = false;
            }
        }
    }

    function setUpPresale() external onlyOwner {
        require(
            workflow == WorkflowStatus.CheckOnPresale,
            "Empower Women Planet: Unauthorized Transaction"
        );
        emit ChangePresaleConfig(true);
        workflow = WorkflowStatus.Presale;
        emit WorkflowStatusChange(
            WorkflowStatus.CheckOnPresale,
            WorkflowStatus.Presale
        );
    }

    function setUpSale() external onlyOwner {
        require(
            workflow == WorkflowStatus.Presale,
            "Empower Women Planet: Unauthorized Transaction"
        );
        emit ChangePresaleConfig(false);
        emit ChangeSaleConfig(true);
        workflow = WorkflowStatus.Sale;
        emit WorkflowStatusChange(WorkflowStatus.Presale, WorkflowStatus.Sale);
    }

    function getPrice() public view returns (uint256) {
        return price;
    }

    function setPrice(uint256 _amount) external onlyOwner {
        price = _amount;
    }

    function getMaxCount() public view returns (uint256) {
        return maxCount;
    }

    function setMaxCount(uint256 _amount) external onlyOwner {
        maxCount = _amount;
    }

    function setIsBurnEnabled(bool _isBurnEnabled) external onlyOwner {
        isBurnEnabled = _isBurnEnabled;
        emit ChangeIsBurnEnabled(_isBurnEnabled);
    }

    function giftMint(address[] calldata _addresses)
        external
        onlyOwner
        whenNotPaused
    {
        require(
            totalNFT + _addresses.length <= maxTotalSupply,
            "Empower Women Planet: max total supply exceeded"
        );

        require(
            giftCount + _addresses.length <= maxGiftSupply,
            "Empower Women Planet: max gift supply exceeded"
        );

        uint256 _newItemId;
        for (uint256 ind = 0; ind < _addresses.length; ind++) {
            require(
                _addresses[ind] != address(0),
                "Empower Women Planet: recepient is the null address"
            );
            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(_addresses[ind], _newItemId);
            _giftClaimed[_addresses[ind]] = _giftClaimed[_addresses[ind]] + 1;
            _totalClaimed[_addresses[ind]] = _totalClaimed[_addresses[ind]] + 1;
            totalNFT = totalNFT + 1;
            giftCount = giftCount + 1;
        }
    }


    function Mint(address _address, uint256 _amount)
        external
        onlyOwner
        whenNotPaused
    {
        require(
            totalNFT + _amount <= maxTotalSupply,
            "Empower Women Planet: max total supply exceeded"
        );
        
        require(
                _address != address(0),
                "Empower Women Planet: recepient is the null address"
            );

        uint256 _newItemId;
        for (uint256 ind = 0; ind < _amount; ind++) {

            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(_address, _newItemId);
            _totalClaimed[_address] = _totalClaimed[_address] + 1;
            totalNFT = totalNFT + 1;
        }
    }

    function presaleMint(uint256 _amount) internal {
        require(workflow == WorkflowStatus.Presale,
            "Empower Women Planet: Presale is ended"
        );
        require(
            _presaleList[msg.sender] == true,
            " Caller is not on the presale list"
        );
        uint256 _maxCount = getMaxCount();
        require(
            _presaleClaimed[msg.sender] + _amount <= _maxCount,
            "Empower Women Planet: Can only mint 2 tokens per adress"
        );
        require(
            totalNFT + _amount <= maxTotalSupply,
            "Empower Women Planet: max supply exceeded"
        );
        uint256 _price = getPrice();
        require(
            _price * _amount <= msg.value,
            "Empower Women Planet: Ether value sent is not correct"
        );
        uint256 _newItemId;
        for (uint256 ind = 0; ind < _amount; ind++) {
            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(msg.sender, _newItemId);
            _presaleClaimed[msg.sender] = _presaleClaimed[msg.sender] + _amount;
            _totalClaimed[msg.sender] = _totalClaimed[msg.sender] + _amount;
            totalNFT = totalNFT + 1;
            presaleCount = presaleCount + 1;
        }
        emit PresaleMint(msg.sender, _amount);
    }

    function saleMint(uint256 _amount) internal {
        require(_amount > 0, "Empower Women Planet: zero amount");
        require(workflow == WorkflowStatus.Sale, "Empower Women Planet: sale is not active");
        uint256 _maxCount = getMaxCount();
        require(
            _saleClaimed[msg.sender] + _amount <=  _maxCount,
            "Empower Women Planet:  Can only mint 5 tokens per adress"
        );
        require(
            totalNFT + _amount <= maxTotalSupply,
            "Empower Women Planet: max supply exceeded"
        );
        uint256 _price = getPrice();
        require(
            _price * _amount <= msg.value,
            "Empower Women Planet: Ether value sent is not correct"
        );
        uint256 _newItemId;
        for (uint256 ind = 0; ind < _amount; ind++) {
            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(msg.sender, _newItemId);
            _saleClaimed[msg.sender] = _saleClaimed[msg.sender] + _amount;
            _totalClaimed[msg.sender] = _totalClaimed[msg.sender] + _amount;
            totalNFT = totalNFT + 1;
        }
        emit SaleMint(msg.sender, _amount);
    }

    function mainMint(uint256 _amount) external payable whenNotPaused {
        require(
            workflow != WorkflowStatus.SoldOut,
            "Empower Women Planet: sold out"
        );
        require(
            workflow != WorkflowStatus.CheckOnPresale,
            "Empower Women Planet: presale not started"
        );
        if (
            workflow == WorkflowStatus.Presale
        ) {
            presaleMint(_amount);
        } else {
            saleMint(_amount);
        }
        if (totalNFT + _amount == maxTotalSupply) {
            workflow = WorkflowStatus.SoldOut;
            emit WorkflowStatusChange(
                WorkflowStatus.Sale,
                WorkflowStatus.SoldOut
            );
        }
    }

    function burn(uint256 tokenId) external {
        require(isBurnEnabled, "Empower Women Planet: burning disabled");
        require(
            _isApprovedOrOwner(msg.sender, tokenId),
            "Empower Women Planet: burn caller is not owner nor approved"
        );
        _burn(tokenId);
        totalNFT = totalNFT - 1;
    }

    function getWorkflowStatus() public view returns (uint256) {
        uint256 _status;
        if (workflow == WorkflowStatus.CheckOnPresale) {
            _status = 1;
        }
        if (workflow == WorkflowStatus.Presale) {
            _status = 2;
        }
        if (workflow == WorkflowStatus.Sale) {
            _status = 3;
        }
        if (workflow == WorkflowStatus.SoldOut) {
            _status = 4;
        }
        return _status;
    }

     function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }
    
    function withdrawAll() external onlyOwner {
        for (uint256 i = 0; i < _team.length; i++) {
            address payable wallet = payable(_team[i]);
            release(wallet);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_baseURI","type":"string"}],"name":"ChangeBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"ChangeIsBurnEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isChanged","type":"bool"}],"name":"ChangePresaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isChanged","type":"bool"}],"name":"ChangeSaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"GiftMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"PresaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum EmpowerWomenPlanet.WorkflowStatus","name":"previousStatus","type":"uint8"},{"indexed":false,"internalType":"enum EmpowerWomenPlanet.WorkflowStatus","name":"newStatus","type":"uint8"}],"name":"WorkflowStatusChange","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_giftClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_presaleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_saleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWorkflowStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giftCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"giftMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isOnPresaleList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mainMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maxCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"setIsBurnEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"workflow","outputs":[{"internalType":"enum EmpowerWomenPlanet.WorkflowStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

600a805460ff60a01b191690556122b860125561014d6013556702c68af0bb140000601455600560155560e060405260046080908152600660a052605a60c0526200004f90601c90600362000589565b50604080516060810182527343879fc71422bf0940334a0a37c029b75c7feb90815273c2a29502a69c7ccf804514fef6c647b86069d40c602082015273bfc8802a7238ca2593f6acf1a7ea04f4c76a8c0091810191909152620000b790601d906003620005de565b50348015620000c557600080fd5b50601d8054806020026020016040519081016040528092919081815260200182805480156200011e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620000ff575b5050505050601c8054806020026020016040519081016040528092919081815260200182805480156200017157602002820191906000526020600020905b8154815260200190600101908083116200015c575b5050604080518082018252601481527f456d706f77657220576f6d656e20506c616e657400000000000000000000000060208083019182528351808501909452600384526204557560ec1b908401528151919550919350620001d892506000919062000636565b508051620001ee90600190602084019062000636565b5050506200020b620002056200034560201b60201c565b62000349565b80518251146200027d5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620002d05760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000274565b60005b82518110156200033c5762000327838281518110620002f657620002f662000756565b602002602001015183838151811062000313576200031362000756565b60200260200101516200039b60201b60201c565b80620003338162000722565b915050620002d3565b5050506200076c565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004085760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000274565b600081116200045a5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000274565b6001600160a01b0382166000908152600d602052604090205415620004d65760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000274565b600f8054600181019091557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0384169081179091556000908152600d60205260409020819055600b5462000540908290620006ca565b600b55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b828054828255906000526020600020908101928215620005cc579160200282015b82811115620005cc578251829060ff16905591602001919060010190620005aa565b50620005da929150620006b3565b5090565b828054828255906000526020600020908101928215620005cc579160200282015b82811115620005cc57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620005ff565b8280546200064490620006e5565b90600052602060002090601f016020900481019282620006685760008555620005cc565b82601f106200068357805160ff1916838001178555620005cc565b82800160010185558215620005cc579182015b82811115620005cc57825182559160200191906001019062000696565b5b80821115620005da5760008155600101620006b4565b60008219821115620006e057620006e062000740565b500190565b600181811c90821680620006fa57607f821691505b602082108114156200071c57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000739576200073962000740565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6145b2806200077c6000396000f3fe6080604052600436106103bb5760003560e01c8063715018a6116101f2578063a33441251161010d578063d79779b2116100a0578063ed7003741161006f578063ed70037414610bc7578063f2fde38b14610bdd578063f578d9df14610bfd578063f75d64a614610c1057600080fd5b8063d79779b214610afa578063de00a68b14610b30578063e33b7de314610b69578063e985e9c514610b7e57600080fd5b8063b88d4fde116100dc578063b88d4fde14610a6e578063c87b56dd14610a8e578063cde27a3514610aae578063ce7c2ac214610ac457600080fd5b8063a3344125146109e7578063a35e617f14610a0e578063a5fd7bec14610a2e578063b179e06014610a4e57600080fd5b80638da5cb5b1161018557806398d5fdca1161015457806398d5fdca146109865780639ef2d87a1461099b578063a035b1fe146109b1578063a22cb465146109c757600080fd5b80638da5cb5b146108fd57806391b7f5ed1461091b57806395d89b411461093b5780639852595c1461095057600080fd5b80638456cb59116101c15780638456cb5914610886578063853828b61461089b5780638b83209b146108b05780638cc4de19146108d057600080fd5b8063715018a61461080f5780637204a3c9146108245780637f674f4814610844578063816cbdf81461087157600080fd5b80633a98ef39116102e257806352d728d9116102755780636352211e116102445780636352211e1461079a5780636c0360eb146107ba5780636e0e5b19146107cf57806370a08231146107ef57600080fd5b806352d728d91461071757806355f804b3146107435780635c975abb146107635780635edbc28c1461078457600080fd5b806342966c68116102b157806342966c681461068a578063438b6300146106aa57806348b75044146106d75780634f6ccce7146106f757600080fd5b80633a98ef39146105fa5780633f4ba83a1461060f578063406072a91461062457806342842e0e1461066a57600080fd5b80630f6798a51161035a5780631f2898c3116103295780631f2898c31461058f57806323b872dd146105a45780632ab4d052146105c45780632f745c59146105da57600080fd5b80630f6798a51461052557806315c316fc1461054557806318160ddd1461055a578063191655871461056f57600080fd5b806307ebec271161039657806307ebec2714610484578063081812fc1461049e578063095ea7b3146104d657806309c3fbb7146104f857600080fd5b80624563791461040957806301ffc9a71461043257806306fdde031461046257600080fd5b36610404577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561041557600080fd5b5061041f60185481565b6040519081526020015b60405180910390f35b34801561043e57600080fd5b5061045261044d366004613e48565b610c25565b6040519015158152602001610429565b34801561046e57600080fd5b50610477610c50565b6040516104299190614086565b34801561049057600080fd5b506019546104529060ff1681565b3480156104aa57600080fd5b506104be6104b9366004613ee2565b610ce2565b6040516001600160a01b039091168152602001610429565b3480156104e257600080fd5b506104f66104f1366004613d6d565b610d7c565b005b34801561050457600080fd5b5061041f610513366004613bc8565b60216020526000908152604090205481565b34801561053157600080fd5b506104f6610540366004613d6d565b610e92565b34801561055157600080fd5b506104f6610fca565b34801561056657600080fd5b5060085461041f565b34801561057b57600080fd5b506104f661058a366004613bc8565b6110aa565b34801561059b57600080fd5b506104f66111d8565b3480156105b057600080fd5b506104f66105bf366004613c1e565b6112e2565b3480156105d057600080fd5b5061041f60125481565b3480156105e657600080fd5b5061041f6105f5366004613d6d565b611313565b34801561060657600080fd5b50600b5461041f565b34801561061b57600080fd5b506104f66113a9565b34801561063057600080fd5b5061041f61063f366004613be5565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b34801561067657600080fd5b506104f6610685366004613c1e565b611464565b34801561069657600080fd5b506104f66106a5366004613ee2565b61147f565b3480156106b657600080fd5b506106ca6106c5366004613bc8565b61157a565b6040516104299190613fea565b3480156106e357600080fd5b506104f66106f2366004613be5565b61161c565b34801561070357600080fd5b5061041f610712366004613ee2565b611805565b34801561072357600080fd5b5061041f610732366004613bc8565b602080526000908152604090205481565b34801561074f57600080fd5b506104f661075e366004613e82565b611898565b34801561076f57600080fd5b50600a5461045290600160a01b900460ff1681565b34801561079057600080fd5b5061041f60135481565b3480156107a657600080fd5b506104be6107b5366004613ee2565b61190c565b3480156107c657600080fd5b50610477611983565b3480156107db57600080fd5b506104f66107ea366004613e0e565b611a11565b3480156107fb57600080fd5b5061041f61080a366004613bc8565b611a83565b34801561081b57600080fd5b506104f6611b0a565b34801561083057600080fd5b506104f661083f366004613d99565b611b40565b34801561085057600080fd5b5061041f61085f366004613bc8565b60226020526000908152604090205481565b34801561087d57600080fd5b5060155461041f565b34801561089257600080fd5b506104f6611cc0565b3480156108a757600080fd5b506104f6611d52565b3480156108bc57600080fd5b506104be6108cb366004613ee2565b611dd4565b3480156108dc57600080fd5b5061041f6108eb366004613bc8565b601f6020526000908152604090205481565b34801561090957600080fd5b50600a546001600160a01b03166104be565b34801561092757600080fd5b506104f6610936366004613ee2565b611e04565b34801561094757600080fd5b50610477611e33565b34801561095c57600080fd5b5061041f61096b366004613bc8565b6001600160a01b03166000908152600e602052604090205490565b34801561099257600080fd5b5060145461041f565b3480156109a757600080fd5b5061041f60155481565b3480156109bd57600080fd5b5061041f60145481565b3480156109d357600080fd5b506104f66109e2366004613d3f565b611e42565b3480156109f357600080fd5b50602354610a019060ff1681565b604051610429919061402e565b348015610a1a57600080fd5b506104f6610a29366004613ee2565b611e51565b348015610a3a57600080fd5b506104f6610a49366004613d99565b611e80565b348015610a5a57600080fd5b506104f6610a69366004613d99565b612180565b348015610a7a57600080fd5b506104f6610a89366004613c5f565b612309565b348015610a9a57600080fd5b50610477610aa9366004613ee2565b61233b565b348015610aba57600080fd5b5061041f60175481565b348015610ad057600080fd5b5061041f610adf366004613bc8565b6001600160a01b03166000908152600d602052604090205490565b348015610b0657600080fd5b5061041f610b15366004613bc8565b6001600160a01b031660009081526010602052604090205490565b348015610b3c57600080fd5b50610452610b4b366004613bc8565b6001600160a01b03166000908152601e602052604090205460ff1690565b348015610b7557600080fd5b50600c5461041f565b348015610b8a57600080fd5b50610452610b99366004613be5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610bd357600080fd5b5061041f60165481565b348015610be957600080fd5b506104f6610bf8366004613bc8565b612416565b6104f6610c0b366004613ee2565b6124ae565b348015610c1c57600080fd5b5061041f612647565b60006001600160e01b0319821663780e9d6360e01b1480610c4a5750610c4a826126da565b92915050565b606060008054610c5f90614455565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8b90614455565b8015610cd85780601f10610cad57610100808354040283529160200191610cd8565b820191906000526020600020905b815481529060010190602001808311610cbb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d605760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610d878261190c565b9050806001600160a01b0316836001600160a01b03161415610df55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d57565b336001600160a01b0382161480610e115750610e118133610b99565b610e835760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d57565b610e8d838361272a565b505050565b600a546001600160a01b03163314610ebc5760405162461bcd60e51b8152600401610d57906141ca565b600a54600160a01b900460ff1615610ee65760405162461bcd60e51b8152600401610d5790614390565b60125481601854610ef791906143c7565b1115610f155760405162461bcd60e51b8152600401610d5790614250565b6001600160a01b038216610f3b5760405162461bcd60e51b8152600401610d57906142f4565b6000805b82811015610fc457610f55601b80546001019055565b601b549150610f648483612798565b6001600160a01b038416600090815260226020526040902054610f889060016143c7565b6001600160a01b038516600090815260226020526040902055601854610faf9060016143c7565b60185580610fbc81614490565b915050610f3f565b50505050565b600a546001600160a01b03163314610ff45760405162461bcd60e51b8152600401610d57906141ca565b600060235460ff16600381111561100d5761100d6144eb565b1461102a5760405162461bcd60e51b8152600401610d579061417c565b604051600181527ff1f3538b5bb0b8696538d7bf169b91c85f74a95f8a31eb9d55a6fa4d25a456cd9060200160405180910390a16023805460ff191660019081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916110a0916000919061403c565b60405180910390a1565b6001600160a01b0381166000908152600d60205260409020546110df5760405162461bcd60e51b8152600401610d57906140eb565b60006110ea600c5490565b6110f490476143c7565b90506000611121838361111c866001600160a01b03166000908152600e602052604090205490565b6127b2565b9050806111405760405162461bcd60e51b8152600401610d5790614131565b6001600160a01b0383166000908152600e6020526040812080548392906111689084906143c7565b9250508190555080600c600082825461118191906143c7565b90915550611191905083826127f8565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b600a546001600160a01b031633146112025760405162461bcd60e51b8152600401610d57906141ca565b600160235460ff16600381111561121b5761121b6144eb565b146112385760405162461bcd60e51b8152600401610d579061417c565b604051600081527ff1f3538b5bb0b8696538d7bf169b91c85f74a95f8a31eb9d55a6fa4d25a456cd9060200160405180910390a1604051600181527f44d774f4acdcb54e7850226a6f0207aa2db6b779d9359122dbad6773178a0eed9060200160405180910390a16023805460ff191660029081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916110a0916001919061403c565b6112ec3382612911565b6113085760405162461bcd60e51b8152600401610d57906141ff565b610e8d838383612a07565b600061131e83611a83565b82106113805760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d57565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146113d35760405162461bcd60e51b8152600401610d57906141ca565b600a54600160a01b900460ff1661142c5760405162461bcd60e51b815260206004820152601860248201527f5472616e73616374696f6e20697320617661696c61626c6500000000000000006044820152606401610d57565b600a805460ff60a01b191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b610e8d83838360405180602001604052806000815250612309565b60195460ff166114e05760405162461bcd60e51b815260206004820152602660248201527f456d706f77657220576f6d656e20506c616e65743a206275726e696e672064696044820152651cd8589b195960d21b6064820152608401610d57565b6114ea3382612911565b61155c5760405162461bcd60e51b815260206004820152603b60248201527f456d706f77657220576f6d656e20506c616e65743a206275726e2063616c6c6560448201527f72206973206e6f74206f776e6572206e6f7220617070726f76656400000000006064820152608401610d57565b61156581612bb2565b60016018546115749190614412565b60185550565b6060600061158783611a83565b905060008167ffffffffffffffff8111156115a4576115a461452d565b6040519080825280602002602001820160405280156115cd578160200160208202803683370190505b50905060005b82811015611614576115e58582611313565b8282815181106115f7576115f7614517565b60209081029190910101528061160c81614490565b9150506115d3565b509392505050565b6001600160a01b0381166000908152600d60205260409020546116515760405162461bcd60e51b8152600401610d57906140eb565b6001600160a01b0382166000908152601060205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b1580156116a957600080fd5b505afa1580156116bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e19190613efb565b6116eb91906143c7565b90506000611724838361111c87876001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b9050806117435760405162461bcd60e51b8152600401610d5790614131565b6001600160a01b0380851660009081526011602090815260408083209387168352929052908120805483929061177a9084906143c7565b90915550506001600160a01b038416600090815260106020526040812080548392906117a79084906143c7565b909155506117b89050848483612c59565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a91015b60405180910390a250505050565b600061181060085490565b82106118735760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d57565b6008828154811061188657611886614517565b90600052602060002001549050919050565b600a546001600160a01b031633146118c25760405162461bcd60e51b8152600401610d57906141ca565b6118ce601a8383613b2f565b507f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db00937678282604051611900929190614057565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610c4a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d57565b601a805461199090614455565b80601f01602080910402602001604051908101604052809291908181526020018280546119bc90614455565b8015611a095780601f106119de57610100808354040283529160200191611a09565b820191906000526020600020905b8154815290600101906020018083116119ec57829003601f168201915b505050505081565b600a546001600160a01b03163314611a3b5760405162461bcd60e51b8152600401610d57906141ca565b6019805460ff19168215159081179091556040519081527f0343da01ca2a51743bc3a245ccf8007e27e6b919fb27b0f83cb5d60c2e8634f3906020015b60405180910390a150565b60006001600160a01b038216611aee5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d57565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611b345760405162461bcd60e51b8152600401610d57906141ca565b611b3e6000612cab565b565b600a546001600160a01b03163314611b6a5760405162461bcd60e51b8152600401610d57906141ca565b60005b81811015610e8d576000838383818110611b8957611b89614517565b9050602002016020810190611b9e9190613bc8565b6001600160a01b03161415611c0c5760405162461bcd60e51b815260206004820152602e60248201527f456d706f77657220576f6d656e20506c616e65743a2043616e2774206164642060448201526d61207a65726f206164647265737360901b6064820152608401610d57565b601e6000848484818110611c2257611c22614517565b9050602002016020810190611c379190613bc8565b6001600160a01b0316815260208101919091526040016000205460ff16611cae576001601e6000858585818110611c7057611c70614517565b9050602002016020810190611c859190613bc8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611cb881614490565b915050611b6d565b600a546001600160a01b03163314611cea5760405162461bcd60e51b8152600401610d57906141ca565b600a54600160a01b900460ff1615611d145760405162461bcd60e51b8152600401610d5790614390565b600a805460ff60a01b1916600160a01b1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600a546001600160a01b03163314611d7c5760405162461bcd60e51b8152600401610d57906141ca565b60005b601d54811015611dd1576000601d8281548110611d9e57611d9e614517565b6000918252602090912001546001600160a01b03169050611dbe816110aa565b5080611dc981614490565b915050611d7f565b50565b6000600f8281548110611de957611de9614517565b6000918252602090912001546001600160a01b031692915050565b600a546001600160a01b03163314611e2e5760405162461bcd60e51b8152600401610d57906141ca565b601455565b606060018054610c5f90614455565b611e4d338383612cfd565b5050565b600a546001600160a01b03163314611e7b5760405162461bcd60e51b8152600401610d57906141ca565b601555565b600a546001600160a01b03163314611eaa5760405162461bcd60e51b8152600401610d57906141ca565b600a54600160a01b900460ff1615611ed45760405162461bcd60e51b8152600401610d5790614390565b601254601854611ee59083906143c7565b1115611f035760405162461bcd60e51b8152600401610d5790614250565b601354601654611f149083906143c7565b1115611f795760405162461bcd60e51b815260206004820152602e60248201527f456d706f77657220576f6d656e20506c616e65743a206d61782067696674207360448201526d1d5c1c1b1e48195e18d95959195960921b6064820152608401610d57565b6000805b82811015610fc4576000848483818110611f9957611f99614517565b9050602002016020810190611fae9190613bc8565b6001600160a01b03161415611fd55760405162461bcd60e51b8152600401610d57906142f4565b611fe3601b80546001019055565b601b549150612018848483818110611ffd57611ffd614517565b90506020020160208101906120129190613bc8565b83612798565b6020600085858481811061202e5761202e614517565b90506020020160208101906120439190613bc8565b6001600160a01b031681526020810191909152604001600020546120689060016143c7565b6020600086868581811061207e5761207e614517565b90506020020160208101906120939190613bc8565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550602260008585848181106120cd576120cd614517565b90506020020160208101906120e29190613bc8565b6001600160a01b031681526020810191909152604001600020546121079060016143c7565b6022600086868581811061211d5761211d614517565b90506020020160208101906121329190613bc8565b6001600160a01b0316815260208101919091526040016000205560185461215a9060016143c7565b60185560165461216b9060016143c7565b6016558061217881614490565b915050611f7d565b600a546001600160a01b031633146121aa5760405162461bcd60e51b8152600401610d57906141ca565b60005b81811015610e8d5760008383838181106121c9576121c9614517565b90506020020160208101906121de9190613bc8565b6001600160a01b0316141561224f5760405162461bcd60e51b815260206004820152603160248201527f456d706f77657220576f6d656e20506c616e65743a2043616e27742072656d6f60448201527076652061207a65726f206164647265737360781b6064820152608401610d57565b601e600084848481811061226557612265614517565b905060200201602081019061227a9190613bc8565b6001600160a01b0316815260208101919091526040016000205460ff161515600114156122f7576000601e60008585858181106122b9576122b9614517565b90506020020160208101906122ce9190613bc8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061230181614490565b9150506121ad565b6123133383612911565b61232f5760405162461bcd60e51b8152600401610d57906141ff565b610fc484848484612dcc565b6000818152600260205260409020546060906001600160a01b03166123ba5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d57565b60006123c4612dff565b905060008151116123e4576040518060200160405280600081525061240f565b806123ee84612e0e565b6040516020016123ff929190613f7e565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146124405760405162461bcd60e51b8152600401610d57906141ca565b6001600160a01b0381166124a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d57565b611dd181612cab565b600a54600160a01b900460ff16156124d85760405162461bcd60e51b8152600401610d5790614390565b600360235460ff1660038111156124f1576124f16144eb565b141561253f5760405162461bcd60e51b815260206004820152601e60248201527f456d706f77657220576f6d656e20506c616e65743a20736f6c64206f757400006044820152606401610d57565b600060235460ff166003811115612558576125586144eb565b14156125b85760405162461bcd60e51b815260206004820152602960248201527f456d706f77657220576f6d656e20506c616e65743a2070726573616c65206e6f6044820152681d081cdd185c9d195960ba1b6064820152608401610d57565b600160235460ff1660038111156125d1576125d16144eb565b14156125e5576125e081612f0c565b6125ee565b6125ee816131d6565b601254816018546125ff91906143c7565b1415611dd1576023805460ff191660039081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f91611a78916002919061403c565b6000808060235460ff166003811115612662576126626144eb565b141561266c575060015b600160235460ff166003811115612685576126856144eb565b141561268f575060025b600260235460ff1660038111156126a8576126a86144eb565b14156126b2575060035b600360235460ff1660038111156126cb576126cb6144eb565b14156126d5575060045b919050565b60006001600160e01b031982166380ac58cd60e01b148061270b57506001600160e01b03198216635b5e139f60e01b145b80610c4a57506301ffc9a760e01b6001600160e01b0319831614610c4a565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061275f8261190c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611e4d82826040518060200160405280600081525061347c565b600b546001600160a01b0384166000908152600d6020526040812054909183916127dc90866143f3565b6127e691906143df565b6127f09190614412565b949350505050565b804710156128485760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d57565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612895576040519150601f19603f3d011682016040523d82523d6000602084013e61289a565b606091505b5050905080610e8d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d57565b6000818152600260205260408120546001600160a01b031661298a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d57565b60006129958361190c565b9050806001600160a01b0316846001600160a01b031614806129d05750836001600160a01b03166129c584610ce2565b6001600160a01b0316145b806127f057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316612a1a8261190c565b6001600160a01b031614612a825760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610d57565b6001600160a01b038216612ae45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d57565b612aef8383836134af565b612afa60008261272a565b6001600160a01b0383166000908152600360205260408120805460019290612b23908490614412565b90915550506001600160a01b0382166000908152600360205260408120805460019290612b519084906143c7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612bbd8261190c565b9050612bcb816000846134af565b612bd660008361272a565b6001600160a01b0381166000908152600360205260408120805460019290612bff908490614412565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e8d908490613567565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612d5f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d57565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612dd7848484612a07565b612de384848484613639565b610fc45760405162461bcd60e51b8152600401610d5790614099565b6060601a8054610c5f90614455565b606081612e325750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e5c5780612e4681614490565b9150612e559050600a836143df565b9150612e36565b60008167ffffffffffffffff811115612e7757612e7761452d565b6040519080825280601f01601f191660200182016040528015612ea1576020820181803683370190505b5090505b84156127f057612eb6600183614412565b9150612ec3600a866144ab565b612ece9060306143c7565b60f81b818381518110612ee357612ee3614517565b60200101906001600160f81b031916908160001a905350612f05600a866143df565b9450612ea5565b600160235460ff166003811115612f2557612f256144eb565b14612f815760405162461bcd60e51b815260206004820152602660248201527f456d706f77657220576f6d656e20506c616e65743a2050726573616c6520697360448201526508195b99195960d21b6064820152608401610d57565b336000908152601e602052604090205460ff161515600114612ff05760405162461bcd60e51b815260206004820152602260248201527f2043616c6c6572206973206e6f74206f6e207468652070726573616c65206c696044820152611cdd60f21b6064820152608401610d57565b6000612ffb60155490565b336000908152601f6020526040902054909150819061301b9084906143c7565b111561308f5760405162461bcd60e51b815260206004820152603760248201527f456d706f77657220576f6d656e20506c616e65743a2043616e206f6e6c79206d60448201527f696e74203220746f6b656e7320706572206164726573730000000000000000006064820152608401610d57565b601254826018546130a091906143c7565b11156130be5760405162461bcd60e51b8152600401610d5790614347565b60006130c960145490565b9050346130d684836143f3565b11156130f45760405162461bcd60e51b8152600401610d579061429f565b6000805b848110156131a35761310e601b80546001019055565b601b54915061311d3383612798565b336000908152601f60205260409020546131389086906143c7565b336000908152601f602090815260408083209390935560229052205461315f9086906143c7565b3360009081526022602052604090205560185461317d9060016143c7565b60185560175461318e9060016143c7565b6017558061319b81614490565b9150506130f8565b5060405184815233907ff5df7d07fef0d8ac7581015ebd1a3b7b7760da84b12f0c8174ae0dcd639cb6a3906020016117f7565b600081116132305760405162461bcd60e51b815260206004820152602160248201527f456d706f77657220576f6d656e20506c616e65743a207a65726f20616d6f756e6044820152601d60fa1b6064820152608401610d57565b600260235460ff166003811115613249576132496144eb565b146132a75760405162461bcd60e51b815260206004820152602860248201527f456d706f77657220576f6d656e20506c616e65743a2073616c65206973206e6f604482015267742061637469766560c01b6064820152608401610d57565b60006132b260155490565b3360009081526021602052604090205490915081906132d29084906143c7565b11156133465760405162461bcd60e51b815260206004820152603860248201527f456d706f77657220576f6d656e20506c616e65743a202043616e206f6e6c792060448201527f6d696e74203520746f6b656e73207065722061647265737300000000000000006064820152608401610d57565b6012548260185461335791906143c7565b11156133755760405162461bcd60e51b8152600401610d5790614347565b600061338060145490565b90503461338d84836143f3565b11156133ab5760405162461bcd60e51b8152600401610d579061429f565b6000805b84811015613449576133c5601b80546001019055565b601b5491506133d43383612798565b336000908152602160205260409020546133ef9086906143c7565b336000908152602160209081526040808320939093556022905220546134169086906143c7565b336000908152602260205260409020556018546134349060016143c7565b6018558061344181614490565b9150506133af565b5060405184815233907f35b6d348af664cd334c7ec2746e1ab49907efa953fa3f622552cd0b19a828b3f906020016117f7565b6134868383613746565b6134936000848484613639565b610e8d5760405162461bcd60e51b8152600401610d5790614099565b6001600160a01b03831661350a5761350581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61352d565b816001600160a01b0316836001600160a01b03161461352d5761352d8382613894565b6001600160a01b03821661354457610e8d81613931565b826001600160a01b0316826001600160a01b031614610e8d57610e8d82826139e0565b60006135bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a249092919063ffffffff16565b805190915015610e8d57808060200190518101906135da9190613e2b565b610e8d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d57565b60006001600160a01b0384163b1561373b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061367d903390899088908890600401613fad565b602060405180830381600087803b15801561369757600080fd5b505af19250505080156136c7575060408051601f3d908101601f191682019092526136c491810190613e65565b60015b613721573d8080156136f5576040519150601f19603f3d011682016040523d82523d6000602084013e6136fa565b606091505b5080516137195760405162461bcd60e51b8152600401610d5790614099565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506127f0565b506001949350505050565b6001600160a01b03821661379c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d57565b6000818152600260205260409020546001600160a01b0316156138015760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d57565b61380d600083836134af565b6001600160a01b03821660009081526003602052604081208054600192906138369084906143c7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016138a184611a83565b6138ab9190614412565b6000838152600760205260409020549091508082146138fe576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061394390600190614412565b6000838152600960205260408120546008805493945090928490811061396b5761396b614517565b90600052602060002001549050806008838154811061398c5761398c614517565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806139c4576139c4614501565b6001900381819060005260206000200160009055905550505050565b60006139eb83611a83565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60606127f0848460008585843b613a7d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d57565b600080866001600160a01b03168587604051613a999190613f62565b60006040518083038185875af1925050503d8060008114613ad6576040519150601f19603f3d011682016040523d82523d6000602084013e613adb565b606091505b5091509150613aeb828286613af6565b979650505050505050565b60608315613b0557508161240f565b825115613b155782518084602001fd5b8160405162461bcd60e51b8152600401610d579190614086565b828054613b3b90614455565b90600052602060002090601f016020900481019282613b5d5760008555613ba3565b82601f10613b765782800160ff19823516178555613ba3565b82800160010185558215613ba3579182015b82811115613ba3578235825591602001919060010190613b88565b50613baf929150613bb3565b5090565b5b80821115613baf5760008155600101613bb4565b600060208284031215613bda57600080fd5b813561240f81614543565b60008060408385031215613bf857600080fd5b8235613c0381614543565b91506020830135613c1381614543565b809150509250929050565b600080600060608486031215613c3357600080fd5b8335613c3e81614543565b92506020840135613c4e81614543565b929592945050506040919091013590565b60008060008060808587031215613c7557600080fd5b8435613c8081614543565b93506020850135613c9081614543565b925060408501359150606085013567ffffffffffffffff80821115613cb457600080fd5b818701915087601f830112613cc857600080fd5b813581811115613cda57613cda61452d565b604051601f8201601f19908116603f01168101908382118183101715613d0257613d0261452d565b816040528281528a6020848701011115613d1b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215613d5257600080fd5b8235613d5d81614543565b91506020830135613c1381614558565b60008060408385031215613d8057600080fd5b8235613d8b81614543565b946020939093013593505050565b60008060208385031215613dac57600080fd5b823567ffffffffffffffff80821115613dc457600080fd5b818501915085601f830112613dd857600080fd5b813581811115613de757600080fd5b8660208260051b8501011115613dfc57600080fd5b60209290920196919550909350505050565b600060208284031215613e2057600080fd5b813561240f81614558565b600060208284031215613e3d57600080fd5b815161240f81614558565b600060208284031215613e5a57600080fd5b813561240f81614566565b600060208284031215613e7757600080fd5b815161240f81614566565b60008060208385031215613e9557600080fd5b823567ffffffffffffffff80821115613ead57600080fd5b818501915085601f830112613ec157600080fd5b813581811115613ed057600080fd5b866020828501011115613dfc57600080fd5b600060208284031215613ef457600080fd5b5035919050565b600060208284031215613f0d57600080fd5b5051919050565b60008151808452613f2c816020860160208601614429565b601f01601f19169290920160200192915050565b60048110613f5e57634e487b7160e01b600052602160045260246000fd5b9052565b60008251613f74818460208701614429565b9190910192915050565b60008351613f90818460208801614429565b835190830190613fa4818360208801614429565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613fe090830184613f14565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561402257835183529284019291840191600101614006565b50909695505050505050565b60208101610c4a8284613f40565b6040810161404a8285613f40565b61240f6020830184613f40565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600061240f6020830184613f14565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252602e908201527f456d706f77657220576f6d656e20506c616e65743a20556e617574686f72697a60408201526d32b2102a3930b739b0b1ba34b7b760911b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602f908201527f456d706f77657220576f6d656e20506c616e65743a206d617820746f74616c2060408201526e1cdd5c1c1b1e48195e18d959591959608a1b606082015260800190565b60208082526035908201527f456d706f77657220576f6d656e20506c616e65743a2045746865722076616c7560408201527419481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b606082015260800190565b60208082526033908201527f456d706f77657220576f6d656e20506c616e65743a20726563657069656e7420604082015272697320746865206e756c6c206164647265737360681b606082015260800190565b60208082526029908201527f456d706f77657220576f6d656e20506c616e65743a206d617820737570706c7960408201526808195e18d95959195960ba1b606082015260800190565b6020808252601c908201527f5472616e73616374696f6e206973206e6f7420617661696c61626c6500000000604082015260600190565b600082198211156143da576143da6144bf565b500190565b6000826143ee576143ee6144d5565b500490565b600081600019048311821515161561440d5761440d6144bf565b500290565b600082821015614424576144246144bf565b500390565b60005b8381101561444457818101518382015260200161442c565b83811115610fc45750506000910152565b600181811c9082168061446957607f821691505b6020821081141561448a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144a4576144a46144bf565b5060010190565b6000826144ba576144ba6144d5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611dd157600080fd5b8015158114611dd157600080fd5b6001600160e01b031981168114611dd157600080fdfea2646970667358221220d83f6de0d90c044cb383f6e36ffb495aae181d6107ba65b2774f807d88e5975764736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103bb5760003560e01c8063715018a6116101f2578063a33441251161010d578063d79779b2116100a0578063ed7003741161006f578063ed70037414610bc7578063f2fde38b14610bdd578063f578d9df14610bfd578063f75d64a614610c1057600080fd5b8063d79779b214610afa578063de00a68b14610b30578063e33b7de314610b69578063e985e9c514610b7e57600080fd5b8063b88d4fde116100dc578063b88d4fde14610a6e578063c87b56dd14610a8e578063cde27a3514610aae578063ce7c2ac214610ac457600080fd5b8063a3344125146109e7578063a35e617f14610a0e578063a5fd7bec14610a2e578063b179e06014610a4e57600080fd5b80638da5cb5b1161018557806398d5fdca1161015457806398d5fdca146109865780639ef2d87a1461099b578063a035b1fe146109b1578063a22cb465146109c757600080fd5b80638da5cb5b146108fd57806391b7f5ed1461091b57806395d89b411461093b5780639852595c1461095057600080fd5b80638456cb59116101c15780638456cb5914610886578063853828b61461089b5780638b83209b146108b05780638cc4de19146108d057600080fd5b8063715018a61461080f5780637204a3c9146108245780637f674f4814610844578063816cbdf81461087157600080fd5b80633a98ef39116102e257806352d728d9116102755780636352211e116102445780636352211e1461079a5780636c0360eb146107ba5780636e0e5b19146107cf57806370a08231146107ef57600080fd5b806352d728d91461071757806355f804b3146107435780635c975abb146107635780635edbc28c1461078457600080fd5b806342966c68116102b157806342966c681461068a578063438b6300146106aa57806348b75044146106d75780634f6ccce7146106f757600080fd5b80633a98ef39146105fa5780633f4ba83a1461060f578063406072a91461062457806342842e0e1461066a57600080fd5b80630f6798a51161035a5780631f2898c3116103295780631f2898c31461058f57806323b872dd146105a45780632ab4d052146105c45780632f745c59146105da57600080fd5b80630f6798a51461052557806315c316fc1461054557806318160ddd1461055a578063191655871461056f57600080fd5b806307ebec271161039657806307ebec2714610484578063081812fc1461049e578063095ea7b3146104d657806309c3fbb7146104f857600080fd5b80624563791461040957806301ffc9a71461043257806306fdde031461046257600080fd5b36610404577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561041557600080fd5b5061041f60185481565b6040519081526020015b60405180910390f35b34801561043e57600080fd5b5061045261044d366004613e48565b610c25565b6040519015158152602001610429565b34801561046e57600080fd5b50610477610c50565b6040516104299190614086565b34801561049057600080fd5b506019546104529060ff1681565b3480156104aa57600080fd5b506104be6104b9366004613ee2565b610ce2565b6040516001600160a01b039091168152602001610429565b3480156104e257600080fd5b506104f66104f1366004613d6d565b610d7c565b005b34801561050457600080fd5b5061041f610513366004613bc8565b60216020526000908152604090205481565b34801561053157600080fd5b506104f6610540366004613d6d565b610e92565b34801561055157600080fd5b506104f6610fca565b34801561056657600080fd5b5060085461041f565b34801561057b57600080fd5b506104f661058a366004613bc8565b6110aa565b34801561059b57600080fd5b506104f66111d8565b3480156105b057600080fd5b506104f66105bf366004613c1e565b6112e2565b3480156105d057600080fd5b5061041f60125481565b3480156105e657600080fd5b5061041f6105f5366004613d6d565b611313565b34801561060657600080fd5b50600b5461041f565b34801561061b57600080fd5b506104f66113a9565b34801561063057600080fd5b5061041f61063f366004613be5565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b34801561067657600080fd5b506104f6610685366004613c1e565b611464565b34801561069657600080fd5b506104f66106a5366004613ee2565b61147f565b3480156106b657600080fd5b506106ca6106c5366004613bc8565b61157a565b6040516104299190613fea565b3480156106e357600080fd5b506104f66106f2366004613be5565b61161c565b34801561070357600080fd5b5061041f610712366004613ee2565b611805565b34801561072357600080fd5b5061041f610732366004613bc8565b602080526000908152604090205481565b34801561074f57600080fd5b506104f661075e366004613e82565b611898565b34801561076f57600080fd5b50600a5461045290600160a01b900460ff1681565b34801561079057600080fd5b5061041f60135481565b3480156107a657600080fd5b506104be6107b5366004613ee2565b61190c565b3480156107c657600080fd5b50610477611983565b3480156107db57600080fd5b506104f66107ea366004613e0e565b611a11565b3480156107fb57600080fd5b5061041f61080a366004613bc8565b611a83565b34801561081b57600080fd5b506104f6611b0a565b34801561083057600080fd5b506104f661083f366004613d99565b611b40565b34801561085057600080fd5b5061041f61085f366004613bc8565b60226020526000908152604090205481565b34801561087d57600080fd5b5060155461041f565b34801561089257600080fd5b506104f6611cc0565b3480156108a757600080fd5b506104f6611d52565b3480156108bc57600080fd5b506104be6108cb366004613ee2565b611dd4565b3480156108dc57600080fd5b5061041f6108eb366004613bc8565b601f6020526000908152604090205481565b34801561090957600080fd5b50600a546001600160a01b03166104be565b34801561092757600080fd5b506104f6610936366004613ee2565b611e04565b34801561094757600080fd5b50610477611e33565b34801561095c57600080fd5b5061041f61096b366004613bc8565b6001600160a01b03166000908152600e602052604090205490565b34801561099257600080fd5b5060145461041f565b3480156109a757600080fd5b5061041f60155481565b3480156109bd57600080fd5b5061041f60145481565b3480156109d357600080fd5b506104f66109e2366004613d3f565b611e42565b3480156109f357600080fd5b50602354610a019060ff1681565b604051610429919061402e565b348015610a1a57600080fd5b506104f6610a29366004613ee2565b611e51565b348015610a3a57600080fd5b506104f6610a49366004613d99565b611e80565b348015610a5a57600080fd5b506104f6610a69366004613d99565b612180565b348015610a7a57600080fd5b506104f6610a89366004613c5f565b612309565b348015610a9a57600080fd5b50610477610aa9366004613ee2565b61233b565b348015610aba57600080fd5b5061041f60175481565b348015610ad057600080fd5b5061041f610adf366004613bc8565b6001600160a01b03166000908152600d602052604090205490565b348015610b0657600080fd5b5061041f610b15366004613bc8565b6001600160a01b031660009081526010602052604090205490565b348015610b3c57600080fd5b50610452610b4b366004613bc8565b6001600160a01b03166000908152601e602052604090205460ff1690565b348015610b7557600080fd5b50600c5461041f565b348015610b8a57600080fd5b50610452610b99366004613be5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610bd357600080fd5b5061041f60165481565b348015610be957600080fd5b506104f6610bf8366004613bc8565b612416565b6104f6610c0b366004613ee2565b6124ae565b348015610c1c57600080fd5b5061041f612647565b60006001600160e01b0319821663780e9d6360e01b1480610c4a5750610c4a826126da565b92915050565b606060008054610c5f90614455565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8b90614455565b8015610cd85780601f10610cad57610100808354040283529160200191610cd8565b820191906000526020600020905b815481529060010190602001808311610cbb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d605760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610d878261190c565b9050806001600160a01b0316836001600160a01b03161415610df55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d57565b336001600160a01b0382161480610e115750610e118133610b99565b610e835760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d57565b610e8d838361272a565b505050565b600a546001600160a01b03163314610ebc5760405162461bcd60e51b8152600401610d57906141ca565b600a54600160a01b900460ff1615610ee65760405162461bcd60e51b8152600401610d5790614390565b60125481601854610ef791906143c7565b1115610f155760405162461bcd60e51b8152600401610d5790614250565b6001600160a01b038216610f3b5760405162461bcd60e51b8152600401610d57906142f4565b6000805b82811015610fc457610f55601b80546001019055565b601b549150610f648483612798565b6001600160a01b038416600090815260226020526040902054610f889060016143c7565b6001600160a01b038516600090815260226020526040902055601854610faf9060016143c7565b60185580610fbc81614490565b915050610f3f565b50505050565b600a546001600160a01b03163314610ff45760405162461bcd60e51b8152600401610d57906141ca565b600060235460ff16600381111561100d5761100d6144eb565b1461102a5760405162461bcd60e51b8152600401610d579061417c565b604051600181527ff1f3538b5bb0b8696538d7bf169b91c85f74a95f8a31eb9d55a6fa4d25a456cd9060200160405180910390a16023805460ff191660019081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916110a0916000919061403c565b60405180910390a1565b6001600160a01b0381166000908152600d60205260409020546110df5760405162461bcd60e51b8152600401610d57906140eb565b60006110ea600c5490565b6110f490476143c7565b90506000611121838361111c866001600160a01b03166000908152600e602052604090205490565b6127b2565b9050806111405760405162461bcd60e51b8152600401610d5790614131565b6001600160a01b0383166000908152600e6020526040812080548392906111689084906143c7565b9250508190555080600c600082825461118191906143c7565b90915550611191905083826127f8565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b600a546001600160a01b031633146112025760405162461bcd60e51b8152600401610d57906141ca565b600160235460ff16600381111561121b5761121b6144eb565b146112385760405162461bcd60e51b8152600401610d579061417c565b604051600081527ff1f3538b5bb0b8696538d7bf169b91c85f74a95f8a31eb9d55a6fa4d25a456cd9060200160405180910390a1604051600181527f44d774f4acdcb54e7850226a6f0207aa2db6b779d9359122dbad6773178a0eed9060200160405180910390a16023805460ff191660029081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916110a0916001919061403c565b6112ec3382612911565b6113085760405162461bcd60e51b8152600401610d57906141ff565b610e8d838383612a07565b600061131e83611a83565b82106113805760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d57565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146113d35760405162461bcd60e51b8152600401610d57906141ca565b600a54600160a01b900460ff1661142c5760405162461bcd60e51b815260206004820152601860248201527f5472616e73616374696f6e20697320617661696c61626c6500000000000000006044820152606401610d57565b600a805460ff60a01b191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b610e8d83838360405180602001604052806000815250612309565b60195460ff166114e05760405162461bcd60e51b815260206004820152602660248201527f456d706f77657220576f6d656e20506c616e65743a206275726e696e672064696044820152651cd8589b195960d21b6064820152608401610d57565b6114ea3382612911565b61155c5760405162461bcd60e51b815260206004820152603b60248201527f456d706f77657220576f6d656e20506c616e65743a206275726e2063616c6c6560448201527f72206973206e6f74206f776e6572206e6f7220617070726f76656400000000006064820152608401610d57565b61156581612bb2565b60016018546115749190614412565b60185550565b6060600061158783611a83565b905060008167ffffffffffffffff8111156115a4576115a461452d565b6040519080825280602002602001820160405280156115cd578160200160208202803683370190505b50905060005b82811015611614576115e58582611313565b8282815181106115f7576115f7614517565b60209081029190910101528061160c81614490565b9150506115d3565b509392505050565b6001600160a01b0381166000908152600d60205260409020546116515760405162461bcd60e51b8152600401610d57906140eb565b6001600160a01b0382166000908152601060205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b1580156116a957600080fd5b505afa1580156116bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e19190613efb565b6116eb91906143c7565b90506000611724838361111c87876001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b9050806117435760405162461bcd60e51b8152600401610d5790614131565b6001600160a01b0380851660009081526011602090815260408083209387168352929052908120805483929061177a9084906143c7565b90915550506001600160a01b038416600090815260106020526040812080548392906117a79084906143c7565b909155506117b89050848483612c59565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a91015b60405180910390a250505050565b600061181060085490565b82106118735760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d57565b6008828154811061188657611886614517565b90600052602060002001549050919050565b600a546001600160a01b031633146118c25760405162461bcd60e51b8152600401610d57906141ca565b6118ce601a8383613b2f565b507f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db00937678282604051611900929190614057565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610c4a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d57565b601a805461199090614455565b80601f01602080910402602001604051908101604052809291908181526020018280546119bc90614455565b8015611a095780601f106119de57610100808354040283529160200191611a09565b820191906000526020600020905b8154815290600101906020018083116119ec57829003601f168201915b505050505081565b600a546001600160a01b03163314611a3b5760405162461bcd60e51b8152600401610d57906141ca565b6019805460ff19168215159081179091556040519081527f0343da01ca2a51743bc3a245ccf8007e27e6b919fb27b0f83cb5d60c2e8634f3906020015b60405180910390a150565b60006001600160a01b038216611aee5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d57565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611b345760405162461bcd60e51b8152600401610d57906141ca565b611b3e6000612cab565b565b600a546001600160a01b03163314611b6a5760405162461bcd60e51b8152600401610d57906141ca565b60005b81811015610e8d576000838383818110611b8957611b89614517565b9050602002016020810190611b9e9190613bc8565b6001600160a01b03161415611c0c5760405162461bcd60e51b815260206004820152602e60248201527f456d706f77657220576f6d656e20506c616e65743a2043616e2774206164642060448201526d61207a65726f206164647265737360901b6064820152608401610d57565b601e6000848484818110611c2257611c22614517565b9050602002016020810190611c379190613bc8565b6001600160a01b0316815260208101919091526040016000205460ff16611cae576001601e6000858585818110611c7057611c70614517565b9050602002016020810190611c859190613bc8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611cb881614490565b915050611b6d565b600a546001600160a01b03163314611cea5760405162461bcd60e51b8152600401610d57906141ca565b600a54600160a01b900460ff1615611d145760405162461bcd60e51b8152600401610d5790614390565b600a805460ff60a01b1916600160a01b1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600a546001600160a01b03163314611d7c5760405162461bcd60e51b8152600401610d57906141ca565b60005b601d54811015611dd1576000601d8281548110611d9e57611d9e614517565b6000918252602090912001546001600160a01b03169050611dbe816110aa565b5080611dc981614490565b915050611d7f565b50565b6000600f8281548110611de957611de9614517565b6000918252602090912001546001600160a01b031692915050565b600a546001600160a01b03163314611e2e5760405162461bcd60e51b8152600401610d57906141ca565b601455565b606060018054610c5f90614455565b611e4d338383612cfd565b5050565b600a546001600160a01b03163314611e7b5760405162461bcd60e51b8152600401610d57906141ca565b601555565b600a546001600160a01b03163314611eaa5760405162461bcd60e51b8152600401610d57906141ca565b600a54600160a01b900460ff1615611ed45760405162461bcd60e51b8152600401610d5790614390565b601254601854611ee59083906143c7565b1115611f035760405162461bcd60e51b8152600401610d5790614250565b601354601654611f149083906143c7565b1115611f795760405162461bcd60e51b815260206004820152602e60248201527f456d706f77657220576f6d656e20506c616e65743a206d61782067696674207360448201526d1d5c1c1b1e48195e18d95959195960921b6064820152608401610d57565b6000805b82811015610fc4576000848483818110611f9957611f99614517565b9050602002016020810190611fae9190613bc8565b6001600160a01b03161415611fd55760405162461bcd60e51b8152600401610d57906142f4565b611fe3601b80546001019055565b601b549150612018848483818110611ffd57611ffd614517565b90506020020160208101906120129190613bc8565b83612798565b6020600085858481811061202e5761202e614517565b90506020020160208101906120439190613bc8565b6001600160a01b031681526020810191909152604001600020546120689060016143c7565b6020600086868581811061207e5761207e614517565b90506020020160208101906120939190613bc8565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550602260008585848181106120cd576120cd614517565b90506020020160208101906120e29190613bc8565b6001600160a01b031681526020810191909152604001600020546121079060016143c7565b6022600086868581811061211d5761211d614517565b90506020020160208101906121329190613bc8565b6001600160a01b0316815260208101919091526040016000205560185461215a9060016143c7565b60185560165461216b9060016143c7565b6016558061217881614490565b915050611f7d565b600a546001600160a01b031633146121aa5760405162461bcd60e51b8152600401610d57906141ca565b60005b81811015610e8d5760008383838181106121c9576121c9614517565b90506020020160208101906121de9190613bc8565b6001600160a01b0316141561224f5760405162461bcd60e51b815260206004820152603160248201527f456d706f77657220576f6d656e20506c616e65743a2043616e27742072656d6f60448201527076652061207a65726f206164647265737360781b6064820152608401610d57565b601e600084848481811061226557612265614517565b905060200201602081019061227a9190613bc8565b6001600160a01b0316815260208101919091526040016000205460ff161515600114156122f7576000601e60008585858181106122b9576122b9614517565b90506020020160208101906122ce9190613bc8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061230181614490565b9150506121ad565b6123133383612911565b61232f5760405162461bcd60e51b8152600401610d57906141ff565b610fc484848484612dcc565b6000818152600260205260409020546060906001600160a01b03166123ba5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d57565b60006123c4612dff565b905060008151116123e4576040518060200160405280600081525061240f565b806123ee84612e0e565b6040516020016123ff929190613f7e565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146124405760405162461bcd60e51b8152600401610d57906141ca565b6001600160a01b0381166124a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d57565b611dd181612cab565b600a54600160a01b900460ff16156124d85760405162461bcd60e51b8152600401610d5790614390565b600360235460ff1660038111156124f1576124f16144eb565b141561253f5760405162461bcd60e51b815260206004820152601e60248201527f456d706f77657220576f6d656e20506c616e65743a20736f6c64206f757400006044820152606401610d57565b600060235460ff166003811115612558576125586144eb565b14156125b85760405162461bcd60e51b815260206004820152602960248201527f456d706f77657220576f6d656e20506c616e65743a2070726573616c65206e6f6044820152681d081cdd185c9d195960ba1b6064820152608401610d57565b600160235460ff1660038111156125d1576125d16144eb565b14156125e5576125e081612f0c565b6125ee565b6125ee816131d6565b601254816018546125ff91906143c7565b1415611dd1576023805460ff191660039081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f91611a78916002919061403c565b6000808060235460ff166003811115612662576126626144eb565b141561266c575060015b600160235460ff166003811115612685576126856144eb565b141561268f575060025b600260235460ff1660038111156126a8576126a86144eb565b14156126b2575060035b600360235460ff1660038111156126cb576126cb6144eb565b14156126d5575060045b919050565b60006001600160e01b031982166380ac58cd60e01b148061270b57506001600160e01b03198216635b5e139f60e01b145b80610c4a57506301ffc9a760e01b6001600160e01b0319831614610c4a565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061275f8261190c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611e4d82826040518060200160405280600081525061347c565b600b546001600160a01b0384166000908152600d6020526040812054909183916127dc90866143f3565b6127e691906143df565b6127f09190614412565b949350505050565b804710156128485760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d57565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612895576040519150601f19603f3d011682016040523d82523d6000602084013e61289a565b606091505b5050905080610e8d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d57565b6000818152600260205260408120546001600160a01b031661298a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d57565b60006129958361190c565b9050806001600160a01b0316846001600160a01b031614806129d05750836001600160a01b03166129c584610ce2565b6001600160a01b0316145b806127f057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316612a1a8261190c565b6001600160a01b031614612a825760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610d57565b6001600160a01b038216612ae45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d57565b612aef8383836134af565b612afa60008261272a565b6001600160a01b0383166000908152600360205260408120805460019290612b23908490614412565b90915550506001600160a01b0382166000908152600360205260408120805460019290612b519084906143c7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612bbd8261190c565b9050612bcb816000846134af565b612bd660008361272a565b6001600160a01b0381166000908152600360205260408120805460019290612bff908490614412565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e8d908490613567565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612d5f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d57565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612dd7848484612a07565b612de384848484613639565b610fc45760405162461bcd60e51b8152600401610d5790614099565b6060601a8054610c5f90614455565b606081612e325750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e5c5780612e4681614490565b9150612e559050600a836143df565b9150612e36565b60008167ffffffffffffffff811115612e7757612e7761452d565b6040519080825280601f01601f191660200182016040528015612ea1576020820181803683370190505b5090505b84156127f057612eb6600183614412565b9150612ec3600a866144ab565b612ece9060306143c7565b60f81b818381518110612ee357612ee3614517565b60200101906001600160f81b031916908160001a905350612f05600a866143df565b9450612ea5565b600160235460ff166003811115612f2557612f256144eb565b14612f815760405162461bcd60e51b815260206004820152602660248201527f456d706f77657220576f6d656e20506c616e65743a2050726573616c6520697360448201526508195b99195960d21b6064820152608401610d57565b336000908152601e602052604090205460ff161515600114612ff05760405162461bcd60e51b815260206004820152602260248201527f2043616c6c6572206973206e6f74206f6e207468652070726573616c65206c696044820152611cdd60f21b6064820152608401610d57565b6000612ffb60155490565b336000908152601f6020526040902054909150819061301b9084906143c7565b111561308f5760405162461bcd60e51b815260206004820152603760248201527f456d706f77657220576f6d656e20506c616e65743a2043616e206f6e6c79206d60448201527f696e74203220746f6b656e7320706572206164726573730000000000000000006064820152608401610d57565b601254826018546130a091906143c7565b11156130be5760405162461bcd60e51b8152600401610d5790614347565b60006130c960145490565b9050346130d684836143f3565b11156130f45760405162461bcd60e51b8152600401610d579061429f565b6000805b848110156131a35761310e601b80546001019055565b601b54915061311d3383612798565b336000908152601f60205260409020546131389086906143c7565b336000908152601f602090815260408083209390935560229052205461315f9086906143c7565b3360009081526022602052604090205560185461317d9060016143c7565b60185560175461318e9060016143c7565b6017558061319b81614490565b9150506130f8565b5060405184815233907ff5df7d07fef0d8ac7581015ebd1a3b7b7760da84b12f0c8174ae0dcd639cb6a3906020016117f7565b600081116132305760405162461bcd60e51b815260206004820152602160248201527f456d706f77657220576f6d656e20506c616e65743a207a65726f20616d6f756e6044820152601d60fa1b6064820152608401610d57565b600260235460ff166003811115613249576132496144eb565b146132a75760405162461bcd60e51b815260206004820152602860248201527f456d706f77657220576f6d656e20506c616e65743a2073616c65206973206e6f604482015267742061637469766560c01b6064820152608401610d57565b60006132b260155490565b3360009081526021602052604090205490915081906132d29084906143c7565b11156133465760405162461bcd60e51b815260206004820152603860248201527f456d706f77657220576f6d656e20506c616e65743a202043616e206f6e6c792060448201527f6d696e74203520746f6b656e73207065722061647265737300000000000000006064820152608401610d57565b6012548260185461335791906143c7565b11156133755760405162461bcd60e51b8152600401610d5790614347565b600061338060145490565b90503461338d84836143f3565b11156133ab5760405162461bcd60e51b8152600401610d579061429f565b6000805b84811015613449576133c5601b80546001019055565b601b5491506133d43383612798565b336000908152602160205260409020546133ef9086906143c7565b336000908152602160209081526040808320939093556022905220546134169086906143c7565b336000908152602260205260409020556018546134349060016143c7565b6018558061344181614490565b9150506133af565b5060405184815233907f35b6d348af664cd334c7ec2746e1ab49907efa953fa3f622552cd0b19a828b3f906020016117f7565b6134868383613746565b6134936000848484613639565b610e8d5760405162461bcd60e51b8152600401610d5790614099565b6001600160a01b03831661350a5761350581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61352d565b816001600160a01b0316836001600160a01b03161461352d5761352d8382613894565b6001600160a01b03821661354457610e8d81613931565b826001600160a01b0316826001600160a01b031614610e8d57610e8d82826139e0565b60006135bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a249092919063ffffffff16565b805190915015610e8d57808060200190518101906135da9190613e2b565b610e8d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d57565b60006001600160a01b0384163b1561373b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061367d903390899088908890600401613fad565b602060405180830381600087803b15801561369757600080fd5b505af19250505080156136c7575060408051601f3d908101601f191682019092526136c491810190613e65565b60015b613721573d8080156136f5576040519150601f19603f3d011682016040523d82523d6000602084013e6136fa565b606091505b5080516137195760405162461bcd60e51b8152600401610d5790614099565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506127f0565b506001949350505050565b6001600160a01b03821661379c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d57565b6000818152600260205260409020546001600160a01b0316156138015760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d57565b61380d600083836134af565b6001600160a01b03821660009081526003602052604081208054600192906138369084906143c7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016138a184611a83565b6138ab9190614412565b6000838152600760205260409020549091508082146138fe576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061394390600190614412565b6000838152600960205260408120546008805493945090928490811061396b5761396b614517565b90600052602060002001549050806008838154811061398c5761398c614517565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806139c4576139c4614501565b6001900381819060005260206000200160009055905550505050565b60006139eb83611a83565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60606127f0848460008585843b613a7d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d57565b600080866001600160a01b03168587604051613a999190613f62565b60006040518083038185875af1925050503d8060008114613ad6576040519150601f19603f3d011682016040523d82523d6000602084013e613adb565b606091505b5091509150613aeb828286613af6565b979650505050505050565b60608315613b0557508161240f565b825115613b155782518084602001fd5b8160405162461bcd60e51b8152600401610d579190614086565b828054613b3b90614455565b90600052602060002090601f016020900481019282613b5d5760008555613ba3565b82601f10613b765782800160ff19823516178555613ba3565b82800160010185558215613ba3579182015b82811115613ba3578235825591602001919060010190613b88565b50613baf929150613bb3565b5090565b5b80821115613baf5760008155600101613bb4565b600060208284031215613bda57600080fd5b813561240f81614543565b60008060408385031215613bf857600080fd5b8235613c0381614543565b91506020830135613c1381614543565b809150509250929050565b600080600060608486031215613c3357600080fd5b8335613c3e81614543565b92506020840135613c4e81614543565b929592945050506040919091013590565b60008060008060808587031215613c7557600080fd5b8435613c8081614543565b93506020850135613c9081614543565b925060408501359150606085013567ffffffffffffffff80821115613cb457600080fd5b818701915087601f830112613cc857600080fd5b813581811115613cda57613cda61452d565b604051601f8201601f19908116603f01168101908382118183101715613d0257613d0261452d565b816040528281528a6020848701011115613d1b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215613d5257600080fd5b8235613d5d81614543565b91506020830135613c1381614558565b60008060408385031215613d8057600080fd5b8235613d8b81614543565b946020939093013593505050565b60008060208385031215613dac57600080fd5b823567ffffffffffffffff80821115613dc457600080fd5b818501915085601f830112613dd857600080fd5b813581811115613de757600080fd5b8660208260051b8501011115613dfc57600080fd5b60209290920196919550909350505050565b600060208284031215613e2057600080fd5b813561240f81614558565b600060208284031215613e3d57600080fd5b815161240f81614558565b600060208284031215613e5a57600080fd5b813561240f81614566565b600060208284031215613e7757600080fd5b815161240f81614566565b60008060208385031215613e9557600080fd5b823567ffffffffffffffff80821115613ead57600080fd5b818501915085601f830112613ec157600080fd5b813581811115613ed057600080fd5b866020828501011115613dfc57600080fd5b600060208284031215613ef457600080fd5b5035919050565b600060208284031215613f0d57600080fd5b5051919050565b60008151808452613f2c816020860160208601614429565b601f01601f19169290920160200192915050565b60048110613f5e57634e487b7160e01b600052602160045260246000fd5b9052565b60008251613f74818460208701614429565b9190910192915050565b60008351613f90818460208801614429565b835190830190613fa4818360208801614429565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613fe090830184613f14565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561402257835183529284019291840191600101614006565b50909695505050505050565b60208101610c4a8284613f40565b6040810161404a8285613f40565b61240f6020830184613f40565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600061240f6020830184613f14565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252602e908201527f456d706f77657220576f6d656e20506c616e65743a20556e617574686f72697a60408201526d32b2102a3930b739b0b1ba34b7b760911b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602f908201527f456d706f77657220576f6d656e20506c616e65743a206d617820746f74616c2060408201526e1cdd5c1c1b1e48195e18d959591959608a1b606082015260800190565b60208082526035908201527f456d706f77657220576f6d656e20506c616e65743a2045746865722076616c7560408201527419481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b606082015260800190565b60208082526033908201527f456d706f77657220576f6d656e20506c616e65743a20726563657069656e7420604082015272697320746865206e756c6c206164647265737360681b606082015260800190565b60208082526029908201527f456d706f77657220576f6d656e20506c616e65743a206d617820737570706c7960408201526808195e18d95959195960ba1b606082015260800190565b6020808252601c908201527f5472616e73616374696f6e206973206e6f7420617661696c61626c6500000000604082015260600190565b600082198211156143da576143da6144bf565b500190565b6000826143ee576143ee6144d5565b500490565b600081600019048311821515161561440d5761440d6144bf565b500290565b600082821015614424576144246144bf565b500390565b60005b8381101561444457818101518382015260200161442c565b83811115610fc45750506000910152565b600181811c9082168061446957607f821691505b6020821081141561448a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144a4576144a46144bf565b5060010190565b6000826144ba576144ba6144d5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611dd157600080fd5b8015158114611dd157600080fd5b6001600160e01b031981168114611dd157600080fdfea2646970667358221220d83f6de0d90c044cb383f6e36ffb495aae181d6107ba65b2774f807d88e5975764736f6c63430008070033

Deployed Bytecode Sourcemap

61610:11171:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26447:40;7277:10;26447:40;;;-1:-1:-1;;;;;8501:32:1;;;8483:51;;26477:9:0;8565:2:1;8550:18;;8543:34;8456:18;26447:40:0;;;;;;;61610:11171;;;;;61968:23;;;;;;;;;;;;;;;;;;;29614:25:1;;;29602:2;29587:18;61968:23:0;;;;;;;;55374:224;;;;;;;;;;-1:-1:-1;55374:224:0;;;;;:::i;:::-;;:::i;:::-;;;10162:14:1;;10155:22;10137:41;;10125:2;10110:18;55374:224:0;9997:187:1;42868:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61998:25::-;;;;;;;;;;-1:-1:-1;61998:25:0;;;;;;;;44427:221;;;;;;;;;;-1:-1:-1;44427:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8257:32:1;;;8239:51;;8227:2;8212:18;44427:221:0;8093:203:1;43950:411:0;;;;;;;;;;-1:-1:-1;43950:411:0;;;;;:::i;:::-;;:::i;:::-;;62549:47;;;;;;;;;;-1:-1:-1;62549:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;67254:756;;;;;;;;;;-1:-1:-1;67254:756:0;;;;;:::i;:::-;;:::i;64798:412::-;;;;;;;;;;;;;:::i;56014:113::-;;;;;;;;;;-1:-1:-1;56102:10:0;:17;56014:113;;28233:566;;;;;;;;;;-1:-1:-1;28233:566:0;;;;;:::i;:::-;;:::i;65218:391::-;;;;;;;;;;;;;:::i;45177:339::-;;;;;;;;;;-1:-1:-1;45177:339:0;;;;;:::i;:::-;;:::i;61736:36::-;;;;;;;;;;;;;;;;55682:256;;;;;;;;;;-1:-1:-1;55682:256:0;;;;;:::i;:::-;;:::i;26578:91::-;;;;;;;;;;-1:-1:-1;26649:12:0;;26578:91;;10949:105;;;;;;;;;;;;;:::i;27707:135::-;;;;;;;;;;-1:-1:-1;27707:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;27804:21:0;;;27777:7;27804:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;27707:135;45587:185;;;;;;;;;;-1:-1:-1;45587:185:0;;;;;:::i;:::-;;:::i;71355:341::-;;;;;;;;;;-1:-1:-1;71355:341:0;;;;;:::i;:::-;;:::i;72187:377::-;;;;;;;;;;-1:-1:-1;72187:377:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29067:641::-;;;;;;;;;;-1:-1:-1;29067:641:0;;;;;:::i;:::-;;:::i;56204:233::-;;;;;;;;;;-1:-1:-1;56204:233:0;;;;;:::i;:::-;;:::i;62495:47::-;;;;;;;;;;-1:-1:-1;62495:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;63446:156;;;;;;;;;;-1:-1:-1;63446:156:0;;;;;:::i;:::-;;:::i;10208:26::-;;;;;;;;;;-1:-1:-1;10208:26:0;;;;-1:-1:-1;;;10208:26:0;;;;;;61779:34;;;;;;;;;;;;;;;;42562:239;;;;;;;;;;-1:-1:-1;42562:239:0;;;;;:::i;:::-;;:::i;62030:21::-;;;;;;;;;;;;;:::i;65999:166::-;;;;;;;;;;-1:-1:-1;65999:166:0;;;;;:::i;:::-;;:::i;42292:208::-;;;;;;;;;;-1:-1:-1;42292:208:0;;;;;:::i;:::-;;:::i;9124:103::-;;;;;;;;;;;;;:::i;63718:464::-;;;;;;;;;;-1:-1:-1;63718:464:0;;;;;:::i;:::-;;:::i;62603:48::-;;;;;;;;;;-1:-1:-1;62603:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;65802:87;;;;;;;;;;-1:-1:-1;65873:8:0;;65802:87;;10751:103;;;;;;;;;;;;;:::i;72576:202::-;;;;;;;;;;;;;:::i;27933:100::-;;;;;;;;;;-1:-1:-1;27933:100:0;;;;;:::i;:::-;;:::i;62438:50::-;;;;;;;;;;-1:-1:-1;62438:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;8473:87;;;;;;;;;;-1:-1:-1;8546:6:0;;-1:-1:-1;;;;;8546:6:0;8473:87;;65706:88;;;;;;;;;;-1:-1:-1;65706:88:0;;;;;:::i;:::-;;:::i;43037:104::-;;;;;;;;;;;;;:::i;27429:109::-;;;;;;;;;;-1:-1:-1;27429:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;27512:18:0;27485:7;27512:18;;;:9;:18;;;;;;;27429:109;65617:81;;;;;;;;;;-1:-1:-1;65685:5:0;;65617:81;;61868:27;;;;;;;;;;;;;;;;61820:41;;;;;;;;;;;;;;;;44720:155;;;;;;;;;;-1:-1:-1;44720:155:0;;;;;:::i;:::-;;:::i;62769:30::-;;;;;;;;;;-1:-1:-1;62769:30:0;;;;;;;;;;;;;;;:::i;65897:94::-;;;;;;;;;;-1:-1:-1;65897:94:0;;;;;:::i;:::-;;:::i;66173:1071::-;;;;;;;;;;-1:-1:-1;66173:1071:0;;;;;:::i;:::-;;:::i;64318:472::-;;;;;;;;;;-1:-1:-1;64318:472:0;;;;;:::i;:::-;;:::i;45843:328::-;;;;;;;;;;-1:-1:-1;45843:328:0;;;;;:::i;:::-;;:::i;43212:334::-;;;;;;;;;;-1:-1:-1;43212:334:0;;;;;:::i;:::-;;:::i;61934:27::-;;;;;;;;;;;;;;;;27225:105;;;;;;;;;;-1:-1:-1;27225:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;27306:16:0;27279:7;27306:16;;;:7;:16;;;;;;;27225:105;27015:119;;;;;;;;;;-1:-1:-1;27015:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;27100:26:0;27073:7;27100:26;;;:19;:26;;;;;;;27015:119;64190:120;;;;;;;;;;-1:-1:-1;64190:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;64280:22:0;64256:4;64280:22;;;:12;:22;;;;;;;;;64190:120;26763:95;;;;;;;;;;-1:-1:-1;26836:14:0;;26763:95;;44946:164;;;;;;;;;;-1:-1:-1;44946:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;45067:25:0;;;45043:4;45067:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44946:164;61903:24;;;;;;;;;;;;;;;;9382:201;;;;;;;;;;-1:-1:-1;9382:201:0;;;;;:::i;:::-;;:::i;70588:759::-;;;;;;:::i;:::-;;:::i;71704:474::-;;;;;;;;;;;;;:::i;55374:224::-;55476:4;-1:-1:-1;;;;;;55500:50:0;;-1:-1:-1;;;55500:50:0;;:90;;;55554:36;55578:11;55554:23;:36::i;:::-;55493:97;55374:224;-1:-1:-1;;55374:224:0:o;42868:100::-;42922:13;42955:5;42948:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42868:100;:::o;44427:221::-;44503:7;47770:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47770:16:0;44523:73;;;;-1:-1:-1;;;44523:73:0;;22790:2:1;44523:73:0;;;22772:21:1;22829:2;22809:18;;;22802:30;22868:34;22848:18;;;22841:62;-1:-1:-1;;;22919:18:1;;;22912:42;22971:19;;44523:73:0;;;;;;;;;-1:-1:-1;44616:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;44616:24:0;;44427:221::o;43950:411::-;44031:13;44047:23;44062:7;44047:14;:23::i;:::-;44031:39;;44095:5;-1:-1:-1;;;;;44089:11:0;:2;-1:-1:-1;;;;;44089:11:0;;;44081:57;;;;-1:-1:-1;;;44081:57:0;;25228:2:1;44081:57:0;;;25210:21:1;25267:2;25247:18;;;25240:30;25306:34;25286:18;;;25279:62;-1:-1:-1;;;25357:18:1;;;25350:31;25398:19;;44081:57:0;25026:397:1;44081:57:0;7277:10;-1:-1:-1;;;;;44173:21:0;;;;:62;;-1:-1:-1;44198:37:0;44215:5;7277:10;44946:164;:::i;44198:37::-;44151:168;;;;-1:-1:-1;;;44151:168:0;;19537:2:1;44151:168:0;;;19519:21:1;19576:2;19556:18;;;19549:30;19615:34;19595:18;;;19588:62;19686:26;19666:18;;;19659:54;19730:19;;44151:168:0;19335:420:1;44151:168:0;44332:21;44341:2;44345:7;44332:8;:21::i;:::-;44020:341;43950:411;;:::o;67254:756::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;10394:6:::1;::::0;-1:-1:-1;;;10394:6:0;::::1;;;10393:7;10385:48;;;;-1:-1:-1::0;;;10385:48:0::1;;;;;;;:::i;:::-;67423:14:::2;;67412:7;67401:8;;:18;;;;:::i;:::-;:36;;67379:133;;;;-1:-1:-1::0;;;67379:133:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67559:22:0;::::2;67533:135;;;;-1:-1:-1::0;;;67533:135:0::2;;;;;;;:::i;:::-;67681:18;::::0;67710:293:::2;67738:7;67732:3;:13;67710:293;;;67771:21;:9;4012:19:::0;;4030:1;4012:19;;;3923:127;67771:21:::2;67820:9;3893:14:::0;67807:32:::2;;67854:31;67864:8;67874:10;67854:9;:31::i;:::-;-1:-1:-1::0;;;;;67926:23:0;::::2;;::::0;;;:13:::2;:23;::::0;;;;;:27:::2;::::0;67952:1:::2;67926:27;:::i;:::-;-1:-1:-1::0;;;;;67900:23:0;::::2;;::::0;;;:13:::2;:23;::::0;;;;:53;67979:8:::2;::::0;:12:::2;::::0;67990:1:::2;67979:12;:::i;:::-;67968:8;:23:::0;67747:5;::::2;::::0;::::2;:::i;:::-;;;;67710:293;;;;67368:642;67254:756:::0;;:::o;64798:412::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;64886:29:::1;64874:8;::::0;::::1;;:41;::::0;::::1;;;;;;:::i;:::-;;64852:137;;;;-1:-1:-1::0;;;64852:137:0::1;;;;;;;:::i;:::-;65005:25;::::0;65025:4:::1;10137:41:1::0;;65005:25:0::1;::::0;10125:2:1;10110:18;65005:25:0::1;;;;;;;65041:8;:33:::0;;-1:-1:-1;;65041:33:0::1;65052:22;65041:33:::0;;::::1;::::0;;;65090:112:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;65052:22:0;65090:112:::1;:::i;:::-;;;;;;;;64798:412::o:0;28233:566::-;-1:-1:-1;;;;;28309:16:0;;28328:1;28309:16;;;:7;:16;;;;;;28301:71;;;;-1:-1:-1;;;28301:71:0;;;;;;;:::i;:::-;28385:21;28433:15;26836:14;;;26763:95;28433:15;28409:39;;:21;:39;:::i;:::-;28385:63;;28459:15;28477:58;28493:7;28502:13;28517:17;28526:7;-1:-1:-1;;;;;27512:18:0;27485:7;27512:18;;;:9;:18;;;;;;;27429:109;28517:17;28477:15;:58::i;:::-;28459:76;-1:-1:-1;28556:12:0;28548:68;;;;-1:-1:-1;;;28548:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28629:18:0;;;;;;:9;:18;;;;;:29;;28651:7;;28629:18;:29;;28651:7;;28629:29;:::i;:::-;;;;;;;;28687:7;28669:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;28707:35:0;;-1:-1:-1;28725:7:0;28734;28707:17;:35::i;:::-;28758:33;;;-1:-1:-1;;;;;8501:32:1;;8483:51;;8565:2;8550:18;;8543:34;;;28758:33:0;;8456:18:1;28758:33:0;;;;;;;28290:509;;28233:566;:::o;65218:391::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;65303:22:::1;65291:8;::::0;::::1;;:34;::::0;::::1;;;;;;:::i;:::-;;65269:130;;;;-1:-1:-1::0;;;65269:130:0::1;;;;;;;:::i;:::-;65415:26;::::0;65435:5:::1;10137:41:1::0;;65415:26:0::1;::::0;10125:2:1;10110:18;65415:26:0::1;;;;;;;65457:22;::::0;65474:4:::1;10137:41:1::0;;65457:22:0::1;::::0;10125:2:1;10110:18;65457:22:0::1;;;;;;;65490:8;:30:::0;;-1:-1:-1;;65490:30:0::1;65501:19;65490:30:::0;;::::1;::::0;;;65536:65:::1;::::0;::::1;::::0;::::1;::::0;65490:30;;65501:19;65536:65:::1;:::i;45177:339::-:0;45372:41;7277:10;45405:7;45372:18;:41::i;:::-;45364:103;;;;-1:-1:-1;;;45364:103:0;;;;;;;:::i;:::-;45480:28;45490:4;45496:2;45500:7;45480:9;:28::i;55682:256::-;55779:7;55815:23;55832:5;55815:16;:23::i;:::-;55807:5;:31;55799:87;;;;-1:-1:-1;;;55799:87:0;;11986:2:1;55799:87:0;;;11968:21:1;12025:2;12005:18;;;11998:30;12064:34;12044:18;;;12037:62;-1:-1:-1;;;12115:18:1;;;12108:41;12166:19;;55799:87:0;11784:407:1;55799:87:0;-1:-1:-1;;;;;;55904:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;55682:256::o;10949:105::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;10604:6:::1;::::0;-1:-1:-1;;;10604:6:0;::::1;;;10596:43;;;::::0;-1:-1:-1;;;10596:43:0;;19184:2:1;10596:43:0::1;::::0;::::1;19166:21:1::0;19223:2;19203:18;;;19196:30;19262:26;19242:18;;;19235:54;19306:18;;10596:43:0::1;18982:348:1::0;10596:43:0::1;11007:6:::2;:14:::0;;-1:-1:-1;;;;11007:14:0::2;::::0;;11037:9:::2;::::0;::::2;::::0;11016:5:::2;::::0;11037:9:::2;10949:105::o:0;45587:185::-;45725:39;45742:4;45748:2;45752:7;45725:39;;;;;;;;;;;;:16;:39::i;71355:341::-;71414:13;;;;71406:64;;;;-1:-1:-1;;;71406:64:0;;21198:2:1;71406:64:0;;;21180:21:1;21237:2;21217:18;;;21210:30;21276:34;21256:18;;;21249:62;-1:-1:-1;;;21327:18:1;;;21320:36;21373:19;;71406:64:0;20996:402:1;71406:64:0;71503:39;71522:10;71534:7;71503:18;:39::i;:::-;71481:148;;;;-1:-1:-1;;;71481:148:0;;23203:2:1;71481:148:0;;;23185:21:1;23242:2;23222:18;;;23215:30;23281:34;23261:18;;;23254:62;23352:29;23332:18;;;23325:57;23399:19;;71481:148:0;23001:423:1;71481:148:0;71640:14;71646:7;71640:5;:14::i;:::-;71687:1;71676:8;;:12;;;;:::i;:::-;71665:8;:23;-1:-1:-1;71355:341:0:o;72187:377::-;72274:16;72308:18;72329:17;72339:6;72329:9;:17::i;:::-;72308:38;;72359:25;72401:10;72387:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72387:25:0;;72359:53;;72428:9;72423:108;72443:10;72439:1;:14;72423:108;;;72489:30;72509:6;72517:1;72489:19;:30::i;:::-;72475:8;72484:1;72475:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;72455:3;;;;:::i;:::-;;;;72423:108;;;-1:-1:-1;72548:8:0;72187:377;-1:-1:-1;;;72187:377:0:o;29067:641::-;-1:-1:-1;;;;;29149:16:0;;29168:1;29149:16;;;:7;:16;;;;;;29141:71;;;;-1:-1:-1;;;29141:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27100:26:0;;29225:21;27100:26;;;:19;:26;;;;;;29249:30;;-1:-1:-1;;;29249:30:0;;29273:4;29249:30;;;8239:51:1;-1:-1:-1;;;;;29249:15:0;;;;;8212:18:1;;29249:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;29225:77;;29313:15;29331:65;29347:7;29356:13;29371:24;29380:5;29387:7;-1:-1:-1;;;;;27804:21:0;;;27777:7;27804:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;27707:135;29331:65;29313:83;-1:-1:-1;29417:12:0;29409:68;;;;-1:-1:-1;;;29409:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29490:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;29524:7;;29490:21;:41;;29524:7;;29490:41;:::i;:::-;;;;-1:-1:-1;;;;;;;29542:26:0;;;;;;:19;:26;;;;;:37;;29572:7;;29542:26;:37;;29572:7;;29542:37;:::i;:::-;;;;-1:-1:-1;29592:47:0;;-1:-1:-1;29615:5:0;29622:7;29631;29592:22;:47::i;:::-;29655:45;;;-1:-1:-1;;;;;8501:32:1;;;8483:51;;8565:2;8550:18;;8543:34;;;29655:45:0;;;;;8456:18:1;29655:45:0;;;;;;;;29130:578;;29067:641;;:::o;56204:233::-;56279:7;56315:30;56102:10;:17;;56014:113;56315:30;56307:5;:38;56299:95;;;;-1:-1:-1;;;56299:95:0;;27244:2:1;56299:95:0;;;27226:21:1;27283:2;27263:18;;;27256:30;27322:34;27302:18;;;27295:62;-1:-1:-1;;;27373:18:1;;;27366:42;27425:19;;56299:95:0;27042:408:1;56299:95:0;56412:10;56423:5;56412:17;;;;;;;;:::i;:::-;;;;;;;;;56405:24;;56204:233;;;:::o;63446:156::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;63527:23:::1;:7;63537:13:::0;;63527:23:::1;:::i;:::-;;63566:28;63580:13;;63566:28;;;;;;;:::i;:::-;;;;;;;;63446:156:::0;;:::o;42562:239::-;42634:7;42670:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42670:16:0;42705:19;42697:73;;;;-1:-1:-1;;;42697:73:0;;20788:2:1;42697:73:0;;;20770:21:1;20827:2;20807:18;;;20800:30;20866:34;20846:18;;;20839:62;-1:-1:-1;;;20917:18:1;;;20910:39;20966:19;;42697:73:0;20586:405:1;62030:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65999:166::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;66076:13:::1;:30:::0;;-1:-1:-1;;66076:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;66122:35:::1;::::0;10137:41:1;;;66122:35:0::1;::::0;10125:2:1;10110:18;66122:35:0::1;;;;;;;;65999:166:::0;:::o;42292:208::-;42364:7;-1:-1:-1;;;;;42392:19:0;;42384:74;;;;-1:-1:-1;;;42384:74:0;;20377:2:1;42384:74:0;;;20359:21:1;20416:2;20396:18;;;20389:30;20455:34;20435:18;;;20428:62;-1:-1:-1;;;20506:18:1;;;20499:40;20556:19;;42384:74:0;20175:406:1;42384:74:0;-1:-1:-1;;;;;;42476:16:0;;;;;:9;:16;;;;;;;42292:208::o;9124:103::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;9189:30:::1;9216:1;9189:18;:30::i;:::-;9124:103::o:0;63718:464::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;63833:11:::1;63828:347;63850:23:::0;;::::1;63828:347;;;63950:1;63923:10:::0;;63934:3;63923:15;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;63923:29:0::1;;;63897:137;;;::::0;-1:-1:-1;;;63897:137:0;;28487:2:1;63897:137:0::1;::::0;::::1;28469:21:1::0;28526:2;28506:18;;;28499:30;28565:34;28545:18;;;28538:62;-1:-1:-1;;;28616:18:1;;;28609:44;28670:19;;63897:137:0::1;28285:410:1::0;63897:137:0::1;64053:12;:29;64066:10;;64077:3;64066:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64053:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;64053:29:0;;::::1;;64049:115;;64144:4;64112:12;:29;64125:10;;64136:3;64125:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64112:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;64112:29:0;:36;;-1:-1:-1;;64112:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64049:115:::1;63875:5:::0;::::1;::::0;::::1;:::i;:::-;;;;63828:347;;10751:103:::0;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;10394:6:::1;::::0;-1:-1:-1;;;10394:6:0;::::1;;;10393:7;10385:48;;;;-1:-1:-1::0;;;10385:48:0::1;;;;;;;:::i;:::-;10810:6:::2;:13:::0;;-1:-1:-1;;;;10810:13:0::2;-1:-1:-1::0;;;10810:13:0::2;::::0;;10839:7:::2;::::0;::::2;::::0;10810:13;;10839:7:::2;10751:103::o:0;72576:202::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;72634:9:::1;72629:142;72653:5;:12:::0;72649:16;::::1;72629:142;;;72687:22;72720:5;72726:1;72720:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;72720:8:0::1;::::0;-1:-1:-1;72744:15:0::1;72720:8:::0;72744:7:::1;:15::i;:::-;-1:-1:-1::0;72667:3:0;::::1;::::0;::::1;:::i;:::-;;;;72629:142;;;;72576:202::o:0;27933:100::-;27984:7;28011;28019:5;28011:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28011:14:0;;27933:100;-1:-1:-1;;27933:100:0:o;65706:88::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;65771:5:::1;:15:::0;65706:88::o;43037:104::-;43093:13;43126:7;43119:14;;;;;:::i;44720:155::-;44815:52;7277:10;44848:8;44858;44815:18;:52::i;:::-;44720:155;;:::o;65897:94::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;65965:8:::1;:18:::0;65897:94::o;66173:1071::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;10394:6:::1;::::0;-1:-1:-1;;;10394:6:0;::::1;;;10393:7;10385:48;;;;-1:-1:-1::0;;;10385:48:0::1;;;;;;;:::i;:::-;66352:14:::2;::::0;66320:8:::2;::::0;:28:::2;::::0;66331:10;;66320:28:::2;:::i;:::-;:46;;66298:143;;;;-1:-1:-1::0;;;66298:143:0::2;;;;;;;:::i;:::-;66509:13;::::0;66476:9:::2;::::0;:29:::2;::::0;66488:10;;66476:29:::2;:::i;:::-;:46;;66454:142;;;::::0;-1:-1:-1;;;66454:142:0;;22375:2:1;66454:142:0::2;::::0;::::2;22357:21:1::0;22414:2;22394:18;;;22387:30;22453:34;22433:18;;;22426:62;-1:-1:-1;;;22504:18:1;;;22497:44;22558:19;;66454:142:0::2;22173:410:1::0;66454:142:0::2;66609:18;::::0;66638:599:::2;66660:23:::0;;::::2;66638:599;;;66760:1;66733:10:::0;;66744:3;66733:15;;::::2;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66733:29:0::2;;;66707:142;;;;-1:-1:-1::0;;;66707:142:0::2;;;;;;;:::i;:::-;66864:21;:9;4012:19:::0;;4030:1;4012:19;;;3923:127;66864:21:::2;66913:9;3893:14:::0;66900:32:::2;;66947:38;66957:10;;66968:3;66957:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;66974:10;66947:9;:38::i;:::-;67032:12;:29;67045:10;;67056:3;67045:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67032:29:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;67032:29:0;;:33:::2;::::0;67064:1:::2;67032:33;:::i;:::-;67000:12;:29;67013:10;;67024:3;67013:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67000:29:0::2;-1:-1:-1::0;;;;;67000:29:0::2;;;;;;;;;;;;:65;;;;67113:13;:30;67127:10;;67138:3;67127:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67113:30:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;67113:30:0;;:34:::2;::::0;67146:1:::2;67113:34;:::i;:::-;67080:13;:30;67094:10;;67105:3;67094:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67080:30:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;67080:30:0;:67;67173:8:::2;::::0;:12:::2;::::0;67184:1:::2;67173:12;:::i;:::-;67162:8;:23:::0;67212:9:::2;::::0;:13:::2;::::0;67224:1:::2;67212:13;:::i;:::-;67200:9;:25:::0;66685:5;::::2;::::0;::::2;:::i;:::-;;;;66638:599;;64318:472:::0;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;64438:11:::1;64433:350;64455:23:::0;;::::1;64433:350;;;64555:1;64528:10:::0;;64539:3;64528:15;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64528:29:0::1;;;64502:140;;;::::0;-1:-1:-1;;;64502:140:0;;11568:2:1;64502:140:0::1;::::0;::::1;11550:21:1::0;11607:2;11587:18;;;11580:30;11646:34;11626:18;;;11619:62;-1:-1:-1;;;11697:18:1;;;11690:47;11754:19;;64502:140:0::1;11366:413:1::0;64502:140:0::1;64661:12;:29;64674:10;;64685:3;64674:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64661:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;64661:29:0;;::::1;;:37;;:29:::0;:37:::1;64657:115;;;64751:5;64719:12;:29;64732:10;;64743:3;64732:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64719:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;64719:29:0;:37;;-1:-1:-1;;64719:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64657:115:::1;64480:5:::0;::::1;::::0;::::1;:::i;:::-;;;;64433:350;;45843:328:::0;46018:41;7277:10;46051:7;46018:18;:41::i;:::-;46010:103;;;;-1:-1:-1;;;46010:103:0;;;;;;;:::i;:::-;46124:39;46138:4;46144:2;46148:7;46157:5;46124:13;:39::i;43212:334::-;47746:4;47770:16;;;:7;:16;;;;;;43285:13;;-1:-1:-1;;;;;47770:16:0;43311:76;;;;-1:-1:-1;;;43311:76:0;;24812:2:1;43311:76:0;;;24794:21:1;24851:2;24831:18;;;24824:30;24890:34;24870:18;;;24863:62;-1:-1:-1;;;24941:18:1;;;24934:45;24996:19;;43311:76:0;24610:411:1;43311:76:0;43400:21;43424:10;:8;:10::i;:::-;43400:34;;43476:1;43458:7;43452:21;:25;:86;;;;;;;;;;;;;;;;;43504:7;43513:18;:7;:16;:18::i;:::-;43487:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43452:86;43445:93;43212:334;-1:-1:-1;;;43212:334:0:o;9382:201::-;8546:6;;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9471:22:0;::::1;9463:73;;;::::0;-1:-1:-1;;;9463:73:0;;12817:2:1;9463:73:0::1;::::0;::::1;12799:21:1::0;12856:2;12836:18;;;12829:30;12895:34;12875:18;;;12868:62;-1:-1:-1;;;12946:18:1;;;12939:36;12992:19;;9463:73:0::1;12615:402:1::0;9463:73:0::1;9547:28;9566:8;9547:18;:28::i;70588:759::-:0;10394:6;;-1:-1:-1;;;10394:6:0;;;;10393:7;10385:48;;;;-1:-1:-1;;;10385:48:0;;;;;;;:::i;:::-;70699:22:::1;70687:8;::::0;::::1;;:34;::::0;::::1;;;;;;:::i;:::-;;;70665:114;;;::::0;-1:-1:-1;;;70665:114:0;;13988:2:1;70665:114:0::1;::::0;::::1;13970:21:1::0;14027:2;14007:18;;;14000:30;14066:32;14046:18;;;14039:60;14116:18;;70665:114:0::1;13786:354:1::0;70665:114:0::1;70824:29;70812:8;::::0;::::1;;:41;::::0;::::1;;;;;;:::i;:::-;;;70790:132;;;::::0;-1:-1:-1;;;70790:132:0;;23992:2:1;70790:132:0::1;::::0;::::1;23974:21:1::0;24031:2;24011:18;;;24004:30;24070:34;24050:18;;;24043:62;-1:-1:-1;;;24121:18:1;;;24114:39;24170:19;;70790:132:0::1;23790:405:1::0;70790:132:0::1;70963:22;70951:8;::::0;::::1;;:34;::::0;::::1;;;;;;:::i;:::-;;70933:161;;;71012:20;71024:7;71012:11;:20::i;:::-;70933:161;;;71065:17;71074:7;71065:8;:17::i;:::-;71130:14;;71119:7;71108:8;;:18;;;;:::i;:::-;:36;71104:236;;;71161:8;:33:::0;;-1:-1:-1;;71161:33:0::1;71172:22;71161:33:::0;;::::1;::::0;;;71214:114:::1;::::0;::::1;::::0;::::1;::::0;71253:19:::1;::::0;71172:22;71214:114:::1;:::i;71704:474::-:0;71754:7;;;71804:8;;;;:41;;;;;;;;:::i;:::-;;71800:85;;;-1:-1:-1;71872:1:0;71800:85;71911:22;71899:8;;;;:34;;;;;;;;:::i;:::-;;71895:78;;;-1:-1:-1;71960:1:0;71895:78;71999:19;71987:8;;;;:31;;;;;;;;:::i;:::-;;71983:75;;;-1:-1:-1;72045:1:0;71983:75;72084:22;72072:8;;;;:34;;;;;;;;:::i;:::-;;72068:78;;;-1:-1:-1;72133:1:0;72068:78;72163:7;71704:474;-1:-1:-1;71704:474:0:o;41923:305::-;42025:4;-1:-1:-1;;;;;;42062:40:0;;-1:-1:-1;;;42062:40:0;;:105;;-1:-1:-1;;;;;;;42119:48:0;;-1:-1:-1;;;42119:48:0;42062:105;:158;;;-1:-1:-1;;;;;;;;;;33728:40:0;;;42184:36;33619:157;51663:174;51738:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;51738:29:0;-1:-1:-1;;;;;51738:29:0;;;;;;;;:24;;51792:23;51738:24;51792:14;:23::i;:::-;-1:-1:-1;;;;;51783:46:0;;;;;;;;;;;51663:174;;:::o;48665:110::-;48741:26;48751:2;48755:7;48741:26;;;;;;;;;;;;:9;:26::i;29886:248::-;30096:12;;-1:-1:-1;;;;;30076:16:0;;30032:7;30076:16;;;:7;:16;;;;;;30032:7;;30111:15;;30060:32;;:13;:32;:::i;:::-;30059:49;;;;:::i;:::-;:67;;;;:::i;:::-;30052:74;29886:248;-1:-1:-1;;;;29886:248:0:o;13201:317::-;13316:6;13291:21;:31;;13283:73;;;;-1:-1:-1;;;13283:73:0;;17594:2:1;13283:73:0;;;17576:21:1;17633:2;17613:18;;;17606:30;17672:31;17652:18;;;17645:59;17721:18;;13283:73:0;17392:353:1;13283:73:0;13370:12;13388:9;-1:-1:-1;;;;;13388:14:0;13410:6;13388:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13369:52;;;13440:7;13432:78;;;;-1:-1:-1;;;13432:78:0;;17167:2:1;13432:78:0;;;17149:21:1;17206:2;17186:18;;;17179:30;17245:34;17225:18;;;17218:62;17316:28;17296:18;;;17289:56;17362:19;;13432:78:0;16965:422:1;47975:348:0;48068:4;47770:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47770:16:0;48085:73;;;;-1:-1:-1;;;48085:73:0;;18359:2:1;48085:73:0;;;18341:21:1;18398:2;18378:18;;;18371:30;18437:34;18417:18;;;18410:62;-1:-1:-1;;;18488:18:1;;;18481:42;18540:19;;48085:73:0;18157:408:1;48085:73:0;48169:13;48185:23;48200:7;48185:14;:23::i;:::-;48169:39;;48238:5;-1:-1:-1;;;;;48227:16:0;:7;-1:-1:-1;;;;;48227:16:0;;:51;;;;48271:7;-1:-1:-1;;;;;48247:31:0;:20;48259:7;48247:11;:20::i;:::-;-1:-1:-1;;;;;48247:31:0;;48227:51;:87;;;-1:-1:-1;;;;;;45067:25:0;;;45043:4;45067:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;48219:96;47975:348;-1:-1:-1;;;;47975:348:0:o;50967:578::-;51126:4;-1:-1:-1;;;;;51099:31:0;:23;51114:7;51099:14;:23::i;:::-;-1:-1:-1;;;;;51099:31:0;;51091:85;;;;-1:-1:-1;;;51091:85:0;;24402:2:1;51091:85:0;;;24384:21:1;24441:2;24421:18;;;24414:30;24480:34;24460:18;;;24453:62;-1:-1:-1;;;24531:18:1;;;24524:39;24580:19;;51091:85:0;24200:405:1;51091:85:0;-1:-1:-1;;;;;51195:16:0;;51187:65;;;;-1:-1:-1;;;51187:65:0;;15983:2:1;51187:65:0;;;15965:21:1;16022:2;16002:18;;;15995:30;16061:34;16041:18;;;16034:62;-1:-1:-1;;;16112:18:1;;;16105:34;16156:19;;51187:65:0;15781:400:1;51187:65:0;51265:39;51286:4;51292:2;51296:7;51265:20;:39::i;:::-;51369:29;51386:1;51390:7;51369:8;:29::i;:::-;-1:-1:-1;;;;;51411:15:0;;;;;;:9;:15;;;;;:20;;51430:1;;51411:15;:20;;51430:1;;51411:20;:::i;:::-;;;;-1:-1:-1;;;;;;;51442:13:0;;;;;;:9;:13;;;;;:18;;51459:1;;51442:13;:18;;51459:1;;51442:18;:::i;:::-;;;;-1:-1:-1;;51471:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;51471:21:0;-1:-1:-1;;;;;51471:21:0;;;;;;;;;51510:27;;51471:16;;51510:27;;;;;;;50967:578;;;:::o;50270:360::-;50330:13;50346:23;50361:7;50346:14;:23::i;:::-;50330:39;;50382:48;50403:5;50418:1;50422:7;50382:20;:48::i;:::-;50471:29;50488:1;50492:7;50471:8;:29::i;:::-;-1:-1:-1;;;;;50513:16:0;;;;;;:9;:16;;;;;:21;;50533:1;;50513:16;:21;;50533:1;;50513:21;:::i;:::-;;;;-1:-1:-1;;50552:16:0;;;;:7;:16;;;;;;50545:23;;-1:-1:-1;;;;;;50545:23:0;;;50586:36;50560:7;;50552:16;-1:-1:-1;;;;;50586:36:0;;;;;50552:16;;50586:36;50319:311;50270:360;:::o;19907:211::-;20051:58;;;-1:-1:-1;;;;;8501:32:1;;20051:58:0;;;8483:51:1;8550:18;;;;8543:34;;;20051:58:0;;;;;;;;;;8456:18:1;;;;20051:58:0;;;;;;;;-1:-1:-1;;;;;20051:58:0;-1:-1:-1;;;20051:58:0;;;20024:86;;20044:5;;20024:19;:86::i;9743:191::-;9836:6;;;-1:-1:-1;;;;;9853:17:0;;;-1:-1:-1;;;;;;9853:17:0;;;;;;;9886:40;;9836:6;;;9853:17;9836:6;;9886:40;;9817:16;;9886:40;9806:128;9743:191;:::o;51979:315::-;52134:8;-1:-1:-1;;;;;52125:17:0;:5;-1:-1:-1;;;;;52125:17:0;;;52117:55;;;;-1:-1:-1;;;52117:55:0;;16388:2:1;52117:55:0;;;16370:21:1;16427:2;16407:18;;;16400:30;16466:27;16446:18;;;16439:55;16511:18;;52117:55:0;16186:349:1;52117:55:0;-1:-1:-1;;;;;52183:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;52183:46:0;;;;;;;;;;52245:41;;10137::1;;;52245::0;;10110:18:1;52245:41:0;;;;;;;51979:315;;;:::o;47053:::-;47210:28;47220:4;47226:2;47230:7;47210:9;:28::i;:::-;47257:48;47280:4;47286:2;47290:7;47299:5;47257:22;:48::i;:::-;47249:111;;;;-1:-1:-1;;;47249:111:0;;;;;;;:::i;63610:100::-;63662:13;63695:7;63688:14;;;;;:::i;4759:723::-;4815:13;5036:10;5032:53;;-1:-1:-1;;5063:10:0;;;;;;;;;;;;-1:-1:-1;;;5063:10:0;;;;;4759:723::o;5032:53::-;5110:5;5095:12;5151:78;5158:9;;5151:78;;5184:8;;;;:::i;:::-;;-1:-1:-1;5207:10:0;;-1:-1:-1;5215:2:0;5207:10;;:::i;:::-;;;5151:78;;;5239:19;5271:6;5261:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5261:17:0;;5239:39;;5289:154;5296:10;;5289:154;;5323:11;5333:1;5323:11;;:::i;:::-;;-1:-1:-1;5392:10:0;5400:2;5392:5;:10;:::i;:::-;5379:24;;:2;:24;:::i;:::-;5366:39;;5349:6;5356;5349:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5349:56:0;;;;;;;;-1:-1:-1;5420:11:0;5429:2;5420:11;;:::i;:::-;;;5289:154;;68018:1348;68096:22;68084:8;;;;:34;;;;;;;;:::i;:::-;;68076:108;;;;-1:-1:-1;;;68076:108:0;;13581:2:1;68076:108:0;;;13563:21:1;13620:2;13600:18;;;13593:30;13659:34;13639:18;;;13632:62;-1:-1:-1;;;13710:18:1;;;13703:36;13756:19;;68076:108:0;13379:402:1;68076:108:0;68230:10;68217:24;;;;:12;:24;;;;;;;;:32;;:24;:32;68195:116;;;;-1:-1:-1;;;68195:116:0;;15580:2:1;68195:116:0;;;15562:21:1;15619:2;15599:18;;;15592:30;15658:34;15638:18;;;15631:62;-1:-1:-1;;;15709:18:1;;;15702:32;15751:19;;68195:116:0;15378:398:1;68195:116:0;68322:17;68342:13;65873:8;;;65802:87;68342:13;68404:10;68388:27;;;;:15;:27;;;;;;68322:33;;-1:-1:-1;68322:33:0;;68388:37;;68418:7;;68388:37;:::i;:::-;:50;;68366:155;;;;-1:-1:-1;;;68366:155:0;;14749:2:1;68366:155:0;;;14731:21:1;14788:2;14768:18;;;14761:30;14827:34;14807:18;;;14800:62;14898:25;14878:18;;;14871:53;14941:19;;68366:155:0;14547:419:1;68366:155:0;68576:14;;68565:7;68554:8;;:18;;;;:::i;:::-;:36;;68532:127;;;;-1:-1:-1;;;68532:127:0;;;;;;;:::i;:::-;68670:14;68687:10;65685:5;;;65617:81;68687:10;68670:27;-1:-1:-1;68750:9:0;68730:16;68739:7;68670:27;68730:16;:::i;:::-;:29;;68708:132;;;;-1:-1:-1;;;68708:132:0;;;;;;;:::i;:::-;68851:18;;68880:431;68908:7;68902:3;:13;68880:431;;;68939:21;:9;4012:19;;4030:1;4012:19;;;3923:127;68939:21;68988:9;3893:14;68975:32;;69022:33;69032:10;69044;69022:9;:33::i;:::-;69116:10;69100:27;;;;:15;:27;;;;;;:37;;69130:7;;69100:37;:::i;:::-;69086:10;69070:27;;;;:15;:27;;;;;;;;:67;;;;69180:13;:25;;;;:35;;69208:7;;69180:35;:::i;:::-;69166:10;69152:25;;;;:13;:25;;;;;:63;69241:8;;:12;;69252:1;69241:12;:::i;:::-;69230:8;:23;69283:12;;:16;;69298:1;69283:16;:::i;:::-;69268:12;:31;68917:5;;;;:::i;:::-;;;;68880:431;;;-1:-1:-1;69326:32:0;;29614:25:1;;;69338:10:0;;69326:32;;29602:2:1;29587:18;69326:32:0;29468:177:1;69374:1206:0;69447:1;69437:7;:11;69429:57;;;;-1:-1:-1;;;69429:57:0;;14347:2:1;69429:57:0;;;14329:21:1;14386:2;14366:18;;;14359:30;14425:34;14405:18;;;14398:62;-1:-1:-1;;;14476:18:1;;;14469:31;14517:19;;69429:57:0;14145:397:1;69429:57:0;69517:19;69505:8;;;;:31;;;;;;;;:::i;:::-;;69497:84;;;;-1:-1:-1;;;69497:84:0;;21605:2:1;69497:84:0;;;21587:21:1;21644:2;21624:18;;;21617:30;21683:34;21663:18;;;21656:62;-1:-1:-1;;;21734:18:1;;;21727:38;21782:19;;69497:84:0;21403:404:1;69497:84:0;69592:17;69612:13;65873:8;;;65802:87;69612:13;69671:10;69658:24;;;;:12;:24;;;;;;69592:33;;-1:-1:-1;69592:33:0;;69658:34;;69685:7;;69658:34;:::i;:::-;:48;;69636:154;;;;-1:-1:-1;;;69636:154:0;;16742:2:1;69636:154:0;;;16724:21:1;16781:2;16761:18;;;16754:30;16820:34;16800:18;;;16793:62;16891:26;16871:18;;;16864:54;16935:19;;69636:154:0;16540:420:1;69636:154:0;69845:14;;69834:7;69823:8;;:18;;;;:::i;:::-;:36;;69801:127;;;;-1:-1:-1;;;69801:127:0;;;;;;;:::i;:::-;69939:14;69956:10;65685:5;;;65617:81;69956:10;69939:27;-1:-1:-1;70019:9:0;69999:16;70008:7;69939:27;69999:16;:::i;:::-;:29;;69977:132;;;;-1:-1:-1;;;69977:132:0;;;;;;;:::i;:::-;70120:18;;70149:379;70177:7;70171:3;:13;70149:379;;;70208:21;:9;4012:19;;4030:1;4012:19;;;3923:127;70208:21;70257:9;3893:14;70244:32;;70291:33;70301:10;70313;70291:9;:33::i;:::-;70379:10;70366:24;;;;:12;:24;;;;;;:34;;70393:7;;70366:34;:::i;:::-;70352:10;70339:24;;;;:12;:24;;;;;;;;:61;;;;70443:13;:25;;;;:35;;70471:7;;70443:35;:::i;:::-;70429:10;70415:25;;;;:13;:25;;;;;:63;70504:8;;:12;;70515:1;70504:12;:::i;:::-;70493:8;:23;70186:5;;;;:::i;:::-;;;;70149:379;;;-1:-1:-1;70543:29:0;;29614:25:1;;;70552:10:0;;70543:29;;29602:2:1;29587:18;70543:29:0;29468:177:1;49002:321:0;49132:18;49138:2;49142:7;49132:5;:18::i;:::-;49183:54;49214:1;49218:2;49222:7;49231:5;49183:22;:54::i;:::-;49161:154;;;;-1:-1:-1;;;49161:154:0;;;;;;;:::i;57050:589::-;-1:-1:-1;;;;;57256:18:0;;57252:187;;57291:40;57323:7;58466:10;:17;;58439:24;;;;:15;:24;;;;;:44;;;58494:24;;;;;;;;;;;;58362:164;57291:40;57252:187;;;57361:2;-1:-1:-1;;;;;57353:10:0;:4;-1:-1:-1;;;;;57353:10:0;;57349:90;;57380:47;57413:4;57419:7;57380:32;:47::i;:::-;-1:-1:-1;;;;;57453:16:0;;57449:183;;57486:45;57523:7;57486:36;:45::i;57449:183::-;57559:4;-1:-1:-1;;;;;57553:10:0;:2;-1:-1:-1;;;;;57553:10:0;;57549:83;;57580:40;57608:2;57612:7;57580:27;:40::i;22480:716::-;22904:23;22930:69;22958:4;22930:69;;;;;;;;;;;;;;;;;22938:5;-1:-1:-1;;;;;22930:27:0;;;:69;;;;;:::i;:::-;23014:17;;22904:95;;-1:-1:-1;23014:21:0;23010:179;;23111:10;23100:30;;;;;;;;;;;;:::i;:::-;23092:85;;;;-1:-1:-1;;;23092:85:0;;28902:2:1;23092:85:0;;;28884:21:1;28941:2;28921:18;;;28914:30;28980:34;28960:18;;;28953:62;-1:-1:-1;;;29031:18:1;;;29024:40;29081:19;;23092:85:0;28700:406:1;52859:799:0;53014:4;-1:-1:-1;;;;;53035:13:0;;12202:20;12250:8;53031:620;;53071:72;;-1:-1:-1;;;53071:72:0;;-1:-1:-1;;;;;53071:36:0;;;;;:72;;7277:10;;53122:4;;53128:7;;53137:5;;53071:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53071:72:0;;;;;;;;-1:-1:-1;;53071:72:0;;;;;;;;;;;;:::i;:::-;;;53067:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53313:13:0;;53309:272;;53356:60;;-1:-1:-1;;;53356:60:0;;;;;;;:::i;53309:272::-;53531:6;53525:13;53516:6;53512:2;53508:15;53501:38;53067:529;-1:-1:-1;;;;;;53194:51:0;-1:-1:-1;;;53194:51:0;;-1:-1:-1;53187:58:0;;53031:620;-1:-1:-1;53635:4:0;52859:799;;;;;;:::o;49659:382::-;-1:-1:-1;;;;;49739:16:0;;49731:61;;;;-1:-1:-1;;;49731:61:0;;22014:2:1;49731:61:0;;;21996:21:1;;;22033:18;;;22026:30;22092:34;22072:18;;;22065:62;22144:18;;49731:61:0;21812:356:1;49731:61:0;47746:4;47770:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47770:16:0;:30;49803:58;;;;-1:-1:-1;;;49803:58:0;;13224:2:1;49803:58:0;;;13206:21:1;13263:2;13243:18;;;13236:30;13302;13282:18;;;13275:58;13350:18;;49803:58:0;13022:352:1;49803:58:0;49874:45;49903:1;49907:2;49911:7;49874:20;:45::i;:::-;-1:-1:-1;;;;;49932:13:0;;;;;;:9;:13;;;;;:18;;49949:1;;49932:13;:18;;49949:1;;49932:18;:::i;:::-;;;;-1:-1:-1;;49961:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49961:21:0;-1:-1:-1;;;;;49961:21:0;;;;;;;;50000:33;;49961:16;;;50000:33;;49961:16;;50000:33;49659:382;;:::o;59153:988::-;59419:22;59469:1;59444:22;59461:4;59444:16;:22::i;:::-;:26;;;;:::i;:::-;59481:18;59502:26;;;:17;:26;;;;;;59419:51;;-1:-1:-1;59635:28:0;;;59631:328;;-1:-1:-1;;;;;59702:18:0;;59680:19;59702:18;;;:12;:18;;;;;;;;:34;;;;;;;;;59753:30;;;;;;:44;;;59870:30;;:17;:30;;;;;:43;;;59631:328;-1:-1:-1;60055:26:0;;;;:17;:26;;;;;;;;60048:33;;;-1:-1:-1;;;;;60099:18:0;;;;;:12;:18;;;;;:34;;;;;;;60092:41;59153:988::o;60436:1079::-;60714:10;:17;60689:22;;60714:21;;60734:1;;60714:21;:::i;:::-;60746:18;60767:24;;;:15;:24;;;;;;61140:10;:26;;60689:46;;-1:-1:-1;60767:24:0;;60689:46;;61140:26;;;;;;:::i;:::-;;;;;;;;;61118:48;;61204:11;61179:10;61190;61179:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;61284:28;;;:15;:28;;;;;;;:41;;;61456:24;;;;;61449:31;61491:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;60507:1008;;;60436:1079;:::o;57940:221::-;58025:14;58042:20;58059:2;58042:16;:20::i;:::-;-1:-1:-1;;;;;58073:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;58118:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;57940:221:0:o;14685:229::-;14822:12;14854:52;14876:6;14884:4;14890:1;14893:12;14822;12202:20;;16092:60;;;;-1:-1:-1;;;16092:60:0;;26464:2:1;16092:60:0;;;26446:21:1;26503:2;26483:18;;;26476:30;26542:31;26522:18;;;26515:59;26591:18;;16092:60:0;26262:353:1;16092:60:0;16166:12;16180:23;16207:6;-1:-1:-1;;;;;16207:11:0;16226:5;16233:4;16207:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16165:73;;;;16256:51;16273:7;16282:10;16294:12;16256:16;:51::i;:::-;16249:58;15805:510;-1:-1:-1;;;;;;;15805:510:0:o;18491:712::-;18641:12;18670:7;18666:530;;;-1:-1:-1;18701:10:0;18694:17;;18666:530;18815:17;;:21;18811:374;;19013:10;19007:17;19074:15;19061:10;19057:2;19053:19;19046:44;18811:374;19156:12;19149:20;;-1:-1:-1;;;19149:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;526:388::-;594:6;602;655:2;643:9;634:7;630:23;626:32;623:52;;;671:1;668;661:12;623:52;710:9;697:23;729:31;754:5;729:31;:::i;:::-;779:5;-1:-1:-1;836:2:1;821:18;;808:32;849:33;808:32;849:33;:::i;:::-;901:7;891:17;;;526:388;;;;;:::o;919:456::-;996:6;1004;1012;1065:2;1053:9;1044:7;1040:23;1036:32;1033:52;;;1081:1;1078;1071:12;1033:52;1120:9;1107:23;1139:31;1164:5;1139:31;:::i;:::-;1189:5;-1:-1:-1;1246:2:1;1231:18;;1218:32;1259:33;1218:32;1259:33;:::i;:::-;919:456;;1311:7;;-1:-1:-1;;;1365:2:1;1350:18;;;;1337:32;;919:456::o;1380:1266::-;1475:6;1483;1491;1499;1552:3;1540:9;1531:7;1527:23;1523:33;1520:53;;;1569:1;1566;1559:12;1520:53;1608:9;1595:23;1627:31;1652:5;1627:31;:::i;:::-;1677:5;-1:-1:-1;1734:2:1;1719:18;;1706:32;1747:33;1706:32;1747:33;:::i;:::-;1799:7;-1:-1:-1;1853:2:1;1838:18;;1825:32;;-1:-1:-1;1908:2:1;1893:18;;1880:32;1931:18;1961:14;;;1958:34;;;1988:1;1985;1978:12;1958:34;2026:6;2015:9;2011:22;2001:32;;2071:7;2064:4;2060:2;2056:13;2052:27;2042:55;;2093:1;2090;2083:12;2042:55;2129:2;2116:16;2151:2;2147;2144:10;2141:36;;;2157:18;;:::i;:::-;2232:2;2226:9;2200:2;2286:13;;-1:-1:-1;;2282:22:1;;;2306:2;2278:31;2274:40;2262:53;;;2330:18;;;2350:22;;;2327:46;2324:72;;;2376:18;;:::i;:::-;2416:10;2412:2;2405:22;2451:2;2443:6;2436:18;2491:7;2486:2;2481;2477;2473:11;2469:20;2466:33;2463:53;;;2512:1;2509;2502:12;2463:53;2568:2;2563;2559;2555:11;2550:2;2542:6;2538:15;2525:46;2613:1;2608:2;2603;2595:6;2591:15;2587:24;2580:35;2634:6;2624:16;;;;;;;1380:1266;;;;;;;:::o;2651:382::-;2716:6;2724;2777:2;2765:9;2756:7;2752:23;2748:32;2745:52;;;2793:1;2790;2783:12;2745:52;2832:9;2819:23;2851:31;2876:5;2851:31;:::i;:::-;2901:5;-1:-1:-1;2958:2:1;2943:18;;2930:32;2971:30;2930:32;2971:30;:::i;3038:315::-;3106:6;3114;3167:2;3155:9;3146:7;3142:23;3138:32;3135:52;;;3183:1;3180;3173:12;3135:52;3222:9;3209:23;3241:31;3266:5;3241:31;:::i;:::-;3291:5;3343:2;3328:18;;;;3315:32;;-1:-1:-1;;;3038:315:1:o;3358:615::-;3444:6;3452;3505:2;3493:9;3484:7;3480:23;3476:32;3473:52;;;3521:1;3518;3511:12;3473:52;3561:9;3548:23;3590:18;3631:2;3623:6;3620:14;3617:34;;;3647:1;3644;3637:12;3617:34;3685:6;3674:9;3670:22;3660:32;;3730:7;3723:4;3719:2;3715:13;3711:27;3701:55;;3752:1;3749;3742:12;3701:55;3792:2;3779:16;3818:2;3810:6;3807:14;3804:34;;;3834:1;3831;3824:12;3804:34;3887:7;3882:2;3872:6;3869:1;3865:14;3861:2;3857:23;3853:32;3850:45;3847:65;;;3908:1;3905;3898:12;3847:65;3939:2;3931:11;;;;;3961:6;;-1:-1:-1;3358:615:1;;-1:-1:-1;;;;3358:615:1:o;3978:241::-;4034:6;4087:2;4075:9;4066:7;4062:23;4058:32;4055:52;;;4103:1;4100;4093:12;4055:52;4142:9;4129:23;4161:28;4183:5;4161:28;:::i;4224:245::-;4291:6;4344:2;4332:9;4323:7;4319:23;4315:32;4312:52;;;4360:1;4357;4350:12;4312:52;4392:9;4386:16;4411:28;4433:5;4411:28;:::i;4474:245::-;4532:6;4585:2;4573:9;4564:7;4560:23;4556:32;4553:52;;;4601:1;4598;4591:12;4553:52;4640:9;4627:23;4659:30;4683:5;4659:30;:::i;4724:249::-;4793:6;4846:2;4834:9;4825:7;4821:23;4817:32;4814:52;;;4862:1;4859;4852:12;4814:52;4894:9;4888:16;4913:30;4937:5;4913:30;:::i;5649:592::-;5720:6;5728;5781:2;5769:9;5760:7;5756:23;5752:32;5749:52;;;5797:1;5794;5787:12;5749:52;5837:9;5824:23;5866:18;5907:2;5899:6;5896:14;5893:34;;;5923:1;5920;5913:12;5893:34;5961:6;5950:9;5946:22;5936:32;;6006:7;5999:4;5995:2;5991:13;5987:27;5977:55;;6028:1;6025;6018:12;5977:55;6068:2;6055:16;6094:2;6086:6;6083:14;6080:34;;;6110:1;6107;6100:12;6080:34;6155:7;6150:2;6141:6;6137:2;6133:15;6129:24;6126:37;6123:57;;;6176:1;6173;6166:12;6246:180;6305:6;6358:2;6346:9;6337:7;6333:23;6329:32;6326:52;;;6374:1;6371;6364:12;6326:52;-1:-1:-1;6397:23:1;;6246:180;-1:-1:-1;6246:180:1:o;6431:184::-;6501:6;6554:2;6542:9;6533:7;6529:23;6525:32;6522:52;;;6570:1;6567;6560:12;6522:52;-1:-1:-1;6593:16:1;;6431:184;-1:-1:-1;6431:184:1:o;6620:257::-;6661:3;6699:5;6693:12;6726:6;6721:3;6714:19;6742:63;6798:6;6791:4;6786:3;6782:14;6775:4;6768:5;6764:16;6742:63;:::i;:::-;6859:2;6838:15;-1:-1:-1;;6834:29:1;6825:39;;;;6866:4;6821:50;;6620:257;-1:-1:-1;;6620:257:1:o;6882:242::-;6968:1;6961:5;6958:12;6948:143;;7013:10;7008:3;7004:20;7001:1;6994:31;7048:4;7045:1;7038:15;7076:4;7073:1;7066:15;6948:143;7100:18;;6882:242::o;7129:274::-;7258:3;7296:6;7290:13;7312:53;7358:6;7353:3;7346:4;7338:6;7334:17;7312:53;:::i;:::-;7381:16;;;;;7129:274;-1:-1:-1;;7129:274:1:o;7408:470::-;7587:3;7625:6;7619:13;7641:53;7687:6;7682:3;7675:4;7667:6;7663:17;7641:53;:::i;:::-;7757:13;;7716:16;;;;7779:57;7757:13;7716:16;7813:4;7801:17;;7779:57;:::i;:::-;7852:20;;7408:470;-1:-1:-1;;;;7408:470:1:o;8588:488::-;-1:-1:-1;;;;;8857:15:1;;;8839:34;;8909:15;;8904:2;8889:18;;8882:43;8956:2;8941:18;;8934:34;;;9004:3;8999:2;8984:18;;8977:31;;;8782:4;;9025:45;;9050:19;;9042:6;9025:45;:::i;:::-;9017:53;8588:488;-1:-1:-1;;;;;;8588:488:1:o;9360:632::-;9531:2;9583:21;;;9653:13;;9556:18;;;9675:22;;;9502:4;;9531:2;9754:15;;;;9728:2;9713:18;;;9502:4;9797:169;9811:6;9808:1;9805:13;9797:169;;;9872:13;;9860:26;;9941:15;;;;9906:12;;;;9833:1;9826:9;9797:169;;;-1:-1:-1;9983:3:1;;9360:632;-1:-1:-1;;;;;;9360:632:1:o;10189:218::-;10340:2;10325:18;;10352:49;10329:9;10383:6;10352:49;:::i;10412:330::-;10608:2;10593:18;;10620:49;10597:9;10651:6;10620:49;:::i;:::-;10678:58;10732:2;10721:9;10717:18;10709:6;10678:58;:::i;10747:390::-;10906:2;10895:9;10888:21;10945:6;10940:2;10929:9;10925:18;10918:34;11002:6;10994;10989:2;10978:9;10974:18;10961:48;11058:1;11029:22;;;11053:2;11025:31;;;11018:42;;;;11121:2;11100:15;;;-1:-1:-1;;11096:29:1;11081:45;11077:54;;10747:390;-1:-1:-1;10747:390:1:o;11142:219::-;11291:2;11280:9;11273:21;11254:4;11311:44;11351:2;11340:9;11336:18;11328:6;11311:44;:::i;12196:414::-;12398:2;12380:21;;;12437:2;12417:18;;;12410:30;12476:34;12471:2;12456:18;;12449:62;-1:-1:-1;;;12542:2:1;12527:18;;12520:48;12600:3;12585:19;;12196:414::o;14971:402::-;15173:2;15155:21;;;15212:2;15192:18;;;15185:30;15251:34;15246:2;15231:18;;15224:62;-1:-1:-1;;;15317:2:1;15302:18;;15295:36;15363:3;15348:19;;14971:402::o;18570:407::-;18772:2;18754:21;;;18811:2;18791:18;;;18784:30;18850:34;18845:2;18830:18;;18823:62;-1:-1:-1;;;18916:2:1;18901:18;;18894:41;18967:3;18952:19;;18570:407::o;19760:410::-;19962:2;19944:21;;;20001:2;19981:18;;;19974:30;20040:34;20035:2;20020:18;;20013:62;-1:-1:-1;;;20106:2:1;20091:18;;20084:44;20160:3;20145:19;;19760:410::o;23429:356::-;23631:2;23613:21;;;23650:18;;;23643:30;23709:34;23704:2;23689:18;;23682:62;23776:2;23761:18;;23429:356::o;25428:413::-;25630:2;25612:21;;;25669:2;25649:18;;;25642:30;25708:34;25703:2;25688:18;;25681:62;-1:-1:-1;;;25774:2:1;25759:18;;25752:47;25831:3;25816:19;;25428:413::o;25846:411::-;26048:2;26030:21;;;26087:2;26067:18;;;26060:30;26126:34;26121:2;26106:18;;26099:62;-1:-1:-1;;;26192:2:1;26177:18;;26170:45;26247:3;26232:19;;25846:411::o;26620:417::-;26822:2;26804:21;;;26861:2;26841:18;;;26834:30;26900:34;26895:2;26880:18;;26873:62;-1:-1:-1;;;26966:2:1;26951:18;;26944:51;27027:3;27012:19;;26620:417::o;27455:415::-;27657:2;27639:21;;;27696:2;27676:18;;;27669:30;27735:34;27730:2;27715:18;;27708:62;-1:-1:-1;;;27801:2:1;27786:18;;27779:49;27860:3;27845:19;;27455:415::o;27875:405::-;28077:2;28059:21;;;28116:2;28096:18;;;28089:30;28155:34;28150:2;28135:18;;28128:62;-1:-1:-1;;;28221:2:1;28206:18;;28199:39;28270:3;28255:19;;27875:405::o;29111:352::-;29313:2;29295:21;;;29352:2;29332:18;;;29325:30;29391;29386:2;29371:18;;29364:58;29454:2;29439:18;;29111:352::o;29650:128::-;29690:3;29721:1;29717:6;29714:1;29711:13;29708:39;;;29727:18;;:::i;:::-;-1:-1:-1;29763:9:1;;29650:128::o;29783:120::-;29823:1;29849;29839:35;;29854:18;;:::i;:::-;-1:-1:-1;29888:9:1;;29783:120::o;29908:168::-;29948:7;30014:1;30010;30006:6;30002:14;29999:1;29996:21;29991:1;29984:9;29977:17;29973:45;29970:71;;;30021:18;;:::i;:::-;-1:-1:-1;30061:9:1;;29908:168::o;30081:125::-;30121:4;30149:1;30146;30143:8;30140:34;;;30154:18;;:::i;:::-;-1:-1:-1;30191:9:1;;30081:125::o;30211:258::-;30283:1;30293:113;30307:6;30304:1;30301:13;30293:113;;;30383:11;;;30377:18;30364:11;;;30357:39;30329:2;30322:10;30293:113;;;30424:6;30421:1;30418:13;30415:48;;;-1:-1:-1;;30459:1:1;30441:16;;30434:27;30211:258::o;30474:380::-;30553:1;30549:12;;;;30596;;;30617:61;;30671:4;30663:6;30659:17;30649:27;;30617:61;30724:2;30716:6;30713:14;30693:18;30690:38;30687:161;;;30770:10;30765:3;30761:20;30758:1;30751:31;30805:4;30802:1;30795:15;30833:4;30830:1;30823:15;30687:161;;30474:380;;;:::o;30859:135::-;30898:3;-1:-1:-1;;30919:17:1;;30916:43;;;30939:18;;:::i;:::-;-1:-1:-1;30986:1:1;30975:13;;30859:135::o;30999:112::-;31031:1;31057;31047:35;;31062:18;;:::i;:::-;-1:-1:-1;31096:9:1;;30999:112::o;31116:127::-;31177:10;31172:3;31168:20;31165:1;31158:31;31208:4;31205:1;31198:15;31232:4;31229:1;31222:15;31248:127;31309:10;31304:3;31300:20;31297:1;31290:31;31340:4;31337:1;31330:15;31364:4;31361:1;31354:15;31380:127;31441:10;31436:3;31432:20;31429:1;31422:31;31472:4;31469:1;31462:15;31496:4;31493:1;31486:15;31512:127;31573:10;31568:3;31564:20;31561:1;31554:31;31604:4;31601:1;31594:15;31628:4;31625:1;31618:15;31644:127;31705:10;31700:3;31696:20;31693:1;31686:31;31736:4;31733:1;31726:15;31760:4;31757:1;31750:15;31776:127;31837:10;31832:3;31828:20;31825:1;31818:31;31868:4;31865:1;31858:15;31892:4;31889:1;31882:15;31908:131;-1:-1:-1;;;;;31983:31:1;;31973:42;;31963:70;;32029:1;32026;32019:12;32044:118;32130:5;32123:13;32116:21;32109:5;32106:32;32096:60;;32152:1;32149;32142:12;32167:131;-1:-1:-1;;;;;;32241:32:1;;32231:43;;32221:71;;32288:1;32285;32278:12

Swarm Source

ipfs://d83f6de0d90c044cb383f6e36ffb495aae181d6107ba65b2774f807d88e59757
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.