ETH Price: $3,278.55 (-1.58%)

Token

uniswap State Dollar (uSD)
 

Overview

Max Total Supply

2,546.024431933182227597 uSD

Holders

45

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.098607712860013014 uSD

Value
$0.00
0xa680820b3F0bBc830D23859be54A42927c0e699d
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:
StableCoin

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

pragma solidity ^0.7.0;

import "./ERC20.sol";
import "./IStableCoin.sol";

contract StableCoin is ERC20, IStableCoin {
    address
        private constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    address private _doubleProxy;

    address[] private _allowedPairs;

    uint256[] private _rebalanceRewardMultiplier;

    uint256[] private _timeWindows;

    uint256[] private _mintables;

    uint256 private _lastRedeemBlock;

    constructor(
        string memory name,
        string memory symbol,
        address doubleProxy,
        address[] memory allowedPairs,
        uint256[] memory rebalanceRewardMultiplier,
        uint256[] memory timeWindows,
        uint256[] memory mintables
    ) {
        if (doubleProxy == address(0)) {
            return;
        }
        init(
            name,
            symbol,
            doubleProxy,
            allowedPairs,
            rebalanceRewardMultiplier,
            timeWindows,
            mintables
        );
    }

    function init(
        string memory name,
        string memory symbol,
        address doubleProxy,
        address[] memory allowedPairs,
        uint256[] memory rebalanceRewardMultiplier,
        uint256[] memory timeWindows,
        uint256[] memory mintables
    ) public override {
        super.init(name, symbol);
        _doubleProxy = doubleProxy;
        _allowedPairs = allowedPairs;
        assert(rebalanceRewardMultiplier.length == 2);
        _rebalanceRewardMultiplier = rebalanceRewardMultiplier;
        assert(timeWindows.length == mintables.length);
        _timeWindows = timeWindows;
        _mintables = mintables;
    }

    function tierData()
        public
        override
        view
        returns (uint256[] memory, uint256[] memory)
    {
        return (_timeWindows, _mintables);
    }

    function availableToMint() public override view returns (uint256) {

        uint256 mintable
         = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
        if(_timeWindows.length > 0 && block.number < _timeWindows[_timeWindows.length - 1]) {
            for (uint256 i = 0; i < _timeWindows.length; i++) {
                if (block.number < _timeWindows[i]) {
                    mintable = _mintables[i];
                    break;
                }
            }
        }
        uint256 minted = totalSupply();
        return minted >= mintable ? 0 : mintable - minted;
    }

    function doubleProxy() public override view returns (address) {
        return _doubleProxy;
    }

    function setDoubleProxy(address newDoubleProxy)
        public
        override
        _byCommunity
    {
        _doubleProxy = newDoubleProxy;
    }

    function allowedPairs() public override view returns (address[] memory) {
        return _allowedPairs;
    }

    function setAllowedPairs(address[] memory newAllowedPairs)
        public
        override
        _byCommunity
    {
        _allowedPairs = newAllowedPairs;
    }

    function rebalanceRewardMultiplier()
        public
        override
        view
        returns (uint256[] memory)
    {
        return _rebalanceRewardMultiplier;
    }

    function differences()
        public
        override
        view
        returns (uint256 credit, uint256 debt)
    {
        uint256 totalSupply = totalSupply();
        uint256 effectiveAmount = 0;
        for (uint256 i = 0; i < _allowedPairs.length; i++) {
            (uint256 amount0, uint256 amount1) = _getPairAmount(i);
            effectiveAmount += (amount0 + amount1);
        }
        credit = effectiveAmount > totalSupply
            ? effectiveAmount - totalSupply
            : 0;
        debt = totalSupply > effectiveAmount
            ? totalSupply - effectiveAmount
            : 0;
    }

    function calculateRebalanceByDebtReward(uint256 burnt)
        public
        override
        view
        returns (uint256 reward)
    {
        if(burnt == 0) {
            return 0;
        }
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = IMVDProxy(IDoubleProxy(_doubleProxy).proxy()).getToken();
        reward = IUniswapV2Router(UNISWAP_V2_ROUTER).getAmountsOut(
            burnt,
            path
        )[1];
        reward =
            (reward * _rebalanceRewardMultiplier[0]) /
            _rebalanceRewardMultiplier[1];
    }

    function fromTokenToStable(address tokenAddress, uint256 amount)
        public
        override
        view
        returns (uint256)
    {
        StableCoin token = StableCoin(tokenAddress);
        uint256 remainingDecimals = decimals() - token.decimals();
        uint256 result = amount == 0 ? token.balanceOf(address(this)) : amount;
        if (remainingDecimals == 0) {
            return result;
        }
        return result * 10**remainingDecimals;
    }

    function mint(
        uint256 pairIndex,
        uint256 amount0,
        uint256 amount1,
        uint256 amount0Min,
        uint256 amount1Min
    ) public override _forAllowedPair(pairIndex) returns (uint256 minted) {
        require(
            IStateHolder(
                IMVDProxy(IDoubleProxy(_doubleProxy).proxy())
                    .getStateHolderAddress()
            )
                .getBool(
                _toStateHolderKey(
                    "stablecoin.authorized",
                    _toString(address(this))
                )
            ),
            "Unauthorized action!"
        );
        (address token0, address token1, ) = _getPairData(pairIndex);
        _transferTokensAndCheckAllowance(token0, amount0);
        _transferTokensAndCheckAllowance(token1, amount1);
        (uint256 firstAmount, uint256 secondAmount, ) = _createPoolToken(
            token0,
            token1,
            amount0,
            amount1,
            amount0Min,
            amount1Min
        );
        minted =
            fromTokenToStable(token0, firstAmount) +
            fromTokenToStable(token1, secondAmount);
        require(minted <= availableToMint(), "Minting amount is greater than availability");
        _mint(msg.sender, minted);
    }

    function burn(
        uint256 pairIndex,
        uint256 pairAmount,
        uint256 amount0,
        uint256 amount1
    )
        public
        override
        _forAllowedPair(pairIndex)
        returns (uint256 removed0, uint256 removed1)
    {
        (address token0, address token1, address pairAddress) = _getPairData(pairIndex);
        _checkAllowance(pairAddress, pairAmount);
        (removed0, removed1) = IUniswapV2Router(UNISWAP_V2_ROUTER)
            .removeLiquidity(
            token0,
            token1,
            pairAmount,
            amount0,
            amount1,
            msg.sender,
            block.timestamp + 1000
        );
        _burn(
            msg.sender,
            fromTokenToStable(token0, removed0) +
                fromTokenToStable(token1, removed1)
        );
    }

    function rebalanceByCredit(
        uint256 pairIndex,
        uint256 pairAmount,
        uint256 amount0,
        uint256 amount1
    ) public override _forAllowedPair(pairIndex) returns (uint256 redeemed) {
        require(
            block.number >=
            _lastRedeemBlock + 
            IStateHolder(
                IMVDProxy(IDoubleProxy(_doubleProxy).proxy())
                    .getStateHolderAddress()
            )
                .getUint256("stablecoin.rebalancebycredit.block.interval"),
            "Unauthorized action!"
        );
        _lastRedeemBlock = block.number;
        (uint256 credit, ) = differences();
        (address token0, address token1, address pairAddress) = _getPairData(pairIndex);
        _checkAllowance(pairAddress, pairAmount);
        (uint256 removed0, uint256 removed1) = IUniswapV2Router(
            UNISWAP_V2_ROUTER
        )
            .removeLiquidity(
            token0,
            token1,
            pairAmount,
            amount0,
            amount1,
            IMVDProxy(IDoubleProxy(_doubleProxy).proxy()).getMVDWalletAddress(),
            block.timestamp + 1000
        );
        redeemed =
            fromTokenToStable(token0, removed0) +
            fromTokenToStable(token1, removed1);
        require(redeemed <= credit, "Cannot redeem given pair amount");
    }

    function rebalanceByDebt(uint256 amount) public override returns(uint256 reward) {
        require(amount > 0, "You must insert a positive value");
        (, uint256 debt) = differences();
        require(amount <= debt, "Cannot Burn this amount");
        _burn(msg.sender, amount);
        IMVDProxy(IDoubleProxy(_doubleProxy).proxy()).submit(
            "mintNewVotingTokensForStableCoin",
            abi.encode(
                address(0),
                0,
                reward = calculateRebalanceByDebtReward(amount),
                msg.sender
            )
        );
    }

    modifier _byCommunity() {
        require(
            IMVDFunctionalitiesManager(
                IMVDProxy(IDoubleProxy(_doubleProxy).proxy())
                    .getMVDFunctionalitiesManagerAddress()
            )
                .isAuthorizedFunctionality(msg.sender),
            "Unauthorized Action!"
        );
        _;
    }

    modifier _forAllowedPair(uint256 pairIndex) {
        require(
            pairIndex >= 0 && pairIndex < _allowedPairs.length,
            "Unknown pair!"
        );
        _;
    }

    function _getPairData(uint256 pairIndex)
        private
        view
        returns (
            address token0,
            address token1,
            address pairAddress
        )
    {
        IUniswapV2Pair pair = IUniswapV2Pair(
            pairAddress = _allowedPairs[pairIndex]
        );
        token0 = pair.token0();
        token1 = pair.token1();
    }

    function _transferTokensAndCheckAllowance(
        address tokenAddress,
        uint256 value
    ) private {
        IERC20(tokenAddress).transferFrom(msg.sender, address(this), value);
        _checkAllowance(tokenAddress, value);
    }

    function _checkAllowance(address tokenAddress, uint256 value) private {
        IERC20 token = IERC20(tokenAddress);
        if (token.allowance(address(this), UNISWAP_V2_ROUTER) <= value) {
            token.approve(
                UNISWAP_V2_ROUTER,
                0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
            );
        }
    }

    function _createPoolToken(
        address firstToken,
        address secondToken,
        uint256 originalFirstAmount,
        uint256 originalSecondAmount,
        uint256 firstAmountMin,
        uint256 secondAmountMin
    )
        private
        returns (
            uint256 firstAmount,
            uint256 secondAmount,
            uint256 poolAmount
        )
    {
        (firstAmount, secondAmount, poolAmount) = IUniswapV2Router(
            UNISWAP_V2_ROUTER
        )
            .addLiquidity(
            firstToken,
            secondToken,
            originalFirstAmount,
            originalSecondAmount,
            firstAmountMin,
            secondAmountMin,
            address(this),
            block.timestamp + 1000
        );
        if (firstAmount < originalFirstAmount) {
            IERC20(firstToken).transfer(
                msg.sender,
                originalFirstAmount - firstAmount
            );
        }
        if (secondAmount < originalSecondAmount) {
            IERC20(secondToken).transfer(
                msg.sender,
                originalSecondAmount - secondAmount
            );
        }
    }

    function _getPairAmount(uint256 i)
        private
        view
        returns (uint256 amount0, uint256 amount1)
    {
        (address token0, address token1, address pairAddress) = _getPairData(i);
        IUniswapV2Pair pair = IUniswapV2Pair(pairAddress);
        uint256 pairAmount = pair.balanceOf(address(this));
        uint256 pairTotalSupply = pair.totalSupply();
        (amount0, amount1, ) = pair.getReserves();
        amount0 = fromTokenToStable(
            token0,
            (pairAmount * amount0) / pairTotalSupply
        );
        amount1 = fromTokenToStable(
            token1,
            (pairAmount * amount1) / pairTotalSupply
        );
    }

    function _toStateHolderKey(string memory a, string memory b)
        private
        pure
        returns (string memory)
    {
        return _toLowerCase(string(abi.encodePacked(a, "_", b)));
    }

    function _toString(address _addr) private pure returns (string memory) {
        bytes32 value = bytes32(uint256(_addr));
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(42);
        str[0] = "0";
        str[1] = "x";
        for (uint256 i = 0; i < 20; i++) {
            str[2 + i * 2] = alphabet[uint256(uint8(value[i + 12] >> 4))];
            str[3 + i * 2] = alphabet[uint256(uint8(value[i + 12] & 0x0f))];
        }
        return string(str);
    }

    function _toLowerCase(string memory str)
        private
        pure
        returns (string memory)
    {
        bytes memory bStr = bytes(str);
        for (uint256 i = 0; i < bStr.length; i++) {
            bStr[i] = bStr[i] >= 0x41 && bStr[i] <= 0x5A
                ? bytes1(uint8(bStr[i]) + 0x20)
                : bStr[i];
        }
        return string(bStr);
    }
}

File 1 of 7: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.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 in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 7: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 7: ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

import "./Context.sol";
import "./IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./IStableCoin.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
abstract contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
     function init(string memory name, string memory symbol) internal {
        require(
            keccak256(bytes(_symbol)) == keccak256(""),
            "Init already Called!"
        );
         _name = name;
         _symbol = symbol;
         _decimals = 18;
     }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public override view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public override view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        virtual
        override
        view
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens 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 amount
    ) internal virtual {}
}

File 4 of 7: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.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 5 of 7: IStableCoin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

interface IStableCoin {
    function init(
        string calldata name,
        string calldata symbol,
        address doubleProxy,
        address[] calldata allowedPairs,
        uint256[] calldata rebalanceRewardMultiplier,
        uint256[] calldata timeWindows,
        uint256[] calldata mintables
    ) external;

    function tierData() external view returns(uint256[] memory, uint256[] memory);

    function availableToMint() external view returns(uint256);

    function doubleProxy() external view returns (address);

    function setDoubleProxy(address newDoubleProxy) external;

    function allowedPairs() external view returns (address[] memory);

    function setAllowedPairs(address[] calldata newAllowedPairs) external;

    function rebalanceRewardMultiplier()
        external
        view
        returns (uint256[] memory);

    function differences() external view returns (uint256, uint256);

    function calculateRebalanceByDebtReward(uint256 burnt)
        external
        view
        returns (uint256);

    function fromTokenToStable(address tokenAddress, uint256 amount)
        external
        view
        returns (uint256);

    function mint(
        uint256 pairIndex,
        uint256 amount0,
        uint256 amount1,
        uint256 amount0Min,
        uint256 amount1Min
    ) external returns (uint256);

    function burn(
        uint256 pairIndex,
        uint256 pairAmount,
        uint256 amount0,
        uint256 amount1
    ) external returns (uint256, uint256);

    function rebalanceByCredit(
        uint256 pairIndex,
        uint256 pairAmount,
        uint256 amount0,
        uint256 amount1
    ) external returns (uint256);

    function rebalanceByDebt(uint256 amount) external returns(uint256);
}

interface IDoubleProxy {
    function proxy() external view returns (address);
}

interface IMVDProxy {
    function getToken() external view returns (address);

    function getMVDFunctionalitiesManagerAddress()
        external
        view
        returns (address);

    function getMVDWalletAddress() external view returns (address);

    function getStateHolderAddress() external view returns (address);

    function submit(string calldata codeName, bytes calldata data)
        external
        payable
        returns (bytes memory returnData);
}

interface IMVDFunctionalitiesManager {
    function isAuthorizedFunctionality(address functionality)
        external
        view
        returns (bool);
}

interface IStateHolder {
    function getBool(string calldata varName) external view returns (bool);
    function getUint256(string calldata varName) external view returns (uint256);
}

interface IUniswapV2Router {
    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );
}

interface IUniswapV2Pair {
    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function balanceOf(address account) external view returns (uint256);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );
}

File 6 of 7: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"doubleProxy","type":"address"},{"internalType":"address[]","name":"allowedPairs","type":"address[]"},{"internalType":"uint256[]","name":"rebalanceRewardMultiplier","type":"uint256[]"},{"internalType":"uint256[]","name":"timeWindows","type":"uint256[]"},{"internalType":"uint256[]","name":"mintables","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedPairs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"pairAmount","type":"uint256"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"burn","outputs":[{"internalType":"uint256","name":"removed0","type":"uint256"},{"internalType":"uint256","name":"removed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnt","type":"uint256"}],"name":"calculateRebalanceByDebtReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"differences","outputs":[{"internalType":"uint256","name":"credit","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doubleProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fromTokenToStable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"doubleProxy","type":"address"},{"internalType":"address[]","name":"allowedPairs","type":"address[]"},{"internalType":"uint256[]","name":"rebalanceRewardMultiplier","type":"uint256[]"},{"internalType":"uint256[]","name":"timeWindows","type":"uint256[]"},{"internalType":"uint256[]","name":"mintables","type":"uint256[]"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"minted","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"pairAmount","type":"uint256"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"rebalanceByCredit","outputs":[{"internalType":"uint256","name":"redeemed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rebalanceByDebt","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebalanceRewardMultiplier","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAllowedPairs","type":"address[]"}],"name":"setAllowedPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDoubleProxy","type":"address"}],"name":"setDoubleProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierData","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003e7f38038062003e7f833981810160405260e08110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010a57600080fd5b9083019060208201858111156200012057600080fd5b82516401000000008111828201881017156200013b57600080fd5b82525081516020918201929091019080838360005b838110156200016a57818101518382015260200162000150565b50505050905090810190601f168015620001985780820380516001836020036101000a031916815260200191505b50604081815260208301519201805192949193919284640100000000821115620001c157600080fd5b908301906020820185811115620001d757600080fd5b8251866020820283011164010000000082111715620001f557600080fd5b82525081516020918201928201910280838360005b83811015620002245781810151838201526020016200020a565b50505050905001604052602001805160405193929190846401000000008211156200024e57600080fd5b9083019060208201858111156200026457600080fd5b82518660208202830111640100000000821117156200028257600080fd5b82525081516020918201928201910280838360005b83811015620002b157818101518382015260200162000297565b5050505090500160405260200180516040519392919084640100000000821115620002db57600080fd5b908301906020820185811115620002f157600080fd5b82518660208202830111640100000000821117156200030f57600080fd5b82525081516020918201928201910280838360005b838110156200033e57818101518382015260200162000324565b50505050905001604052602001805160405193929190846401000000008211156200036857600080fd5b9083019060208201858111156200037e57600080fd5b82518660208202830111640100000000821117156200039c57600080fd5b82525081516020918201928201910280838360005b83811015620003cb578181015183820152602001620003b1565b5050505091909101604052505050506001600160a01b038516620003ef5762000400565b62000400878787878787876200040d565b505050505050506200073c565b620004248787620004bd60201b620024061760201c565b60058054610100600160a81b0319166101006001600160a01b03881602179055835162000459906006906020870190620005dc565b5082516002146200046657fe5b82516200047b90600790602086019062000646565b5080518251146200048857fe5b81516200049d90600890602085019062000646565b508051620004b390600990602084019062000646565b5050505050505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600460405180828054600181600116156101000203166002900480156200053f5780601f106200051c5761010080835404028352918201916200053f565b820191906000526020600020905b8154815290600101906020018083116200052a575b50509150506040518091039020146200059f576040805162461bcd60e51b815260206004820152601460248201527f496e697420616c72656164792043616c6c656421000000000000000000000000604482015290519081900360640190fd5b8151620005b490600390602085019062000692565b508051620005ca90600490602084019062000692565b50506005805460ff1916601217905550565b82805482825590600052602060002090810192821562000634579160200282015b828111156200063457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620005fd565b506200064292915062000704565b5090565b82805482825590600052602060002090810192821562000684579160200282015b828111156200068457825182559160200191906001019062000667565b506200064292915062000725565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620006d557805160ff191683800117855562000684565b828001600101855582156200068457918201828111156200068457825182559160200191906001019062000667565b5b80821115620006425780546001600160a01b031916815560010162000705565b5b8082111562000642576000815560010162000726565b613733806200074c6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806374601c3c116100de578063ae3dfa2811610097578063cbd99d0311610071578063cbd99d03146108de578063d5d9e01d14610904578063dd62ed3e146109a5578063f9cd4d3e146109d35761018e565b8063ae3dfa281461055d578063afa9a8a114610592578063bbc7eea8146108d65761018e565b806374601c3c146104a95780638df2c58a146104b157806395d89b41146104e0578063a457c2d7146104e8578063a9059cbb14610514578063ac2a89c8146105405761018e565b80633227497e1161014b57806352a64eb41161012557806352a64eb414610369578063544275f71461038a5780635de3326c146103e257806370a08231146104835761018e565b80633227497e146102ea57806339509351146103195780634eb9b592146103455761018e565b806306fdde0314610193578063095ea7b3146102105780630ec076771461025057806318160ddd1461028e57806323b872dd14610296578063313ce567146102cc575b600080fd5b61019b6109f0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d55781810151838201526020016101bd565b50505050905090810190601f1680156102025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61023c6004803603604081101561022657600080fd5b506001600160a01b038135169060200135610a86565b604080519115158252519081900360200190f35b61027c6004803603604081101561026657600080fd5b506001600160a01b038135169060200135610aa4565b60408051918252519081900360200190f35b61027c610bc2565b61023c600480360360608110156102ac57600080fd5b506001600160a01b03813581169160208101359091169060400135610bc8565b6102d4610c4f565b6040805160ff9092168252519081900360200190f35b61027c6004803603608081101561030057600080fd5b5080359060208101359060408101359060600135610c58565b61023c6004803603604081101561032f57600080fd5b506001600160a01b0381351690602001356110c9565b61034d611117565b604080516001600160a01b039092168252519081900360200190f35b61037161112b565b6040805192835260208301919091528051918290030190f35b610392611193565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103ce5781810151838201526020016103b6565b505050509050019250505060405180910390f35b6103ea6111ea565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561042e578181015183820152602001610416565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561046d578181015183820152602001610455565b5050505090500194505050505060405180910390f35b61027c6004803603602081101561049957600080fd5b50356001600160a01b031661129d565b61027c6112bc565b610371600480360360808110156104c757600080fd5b508035906020810135906040810135906060013561136f565b61019b6114bf565b61023c600480360360408110156104fe57600080fd5b506001600160a01b038135169060200135611520565b61023c6004803603604081101561052a57600080fd5b506001600160a01b038135169060200135611588565b61027c6004803603602081101561055657600080fd5b503561159c565b61027c600480360360a081101561057357600080fd5b50803590602081013590604081013590606081013590608001356118bc565b6108d4600480360360e08110156105a857600080fd5b810190602081018135600160201b8111156105c257600080fd5b8201836020820111156105d457600080fd5b803590602001918460018302840111600160201b831117156105f557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561064757600080fd5b82018360208201111561065957600080fd5b803590602001918460018302840111600160201b8311171561067a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b03853516959094909350604081019250602001359050600160201b8111156106dd57600080fd5b8201836020820111156106ef57600080fd5b803590602001918460208302840111600160201b8311171561071057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561075f57600080fd5b82018360208201111561077157600080fd5b803590602001918460208302840111600160201b8311171561079257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107e157600080fd5b8201836020820111156107f357600080fd5b803590602001918460208302840111600160201b8311171561081457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561086357600080fd5b82018360208201111561087557600080fd5b803590602001918460208302840111600160201b8311171561089657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611bf7945050505050565b005b610392611c90565b6108d4600480360360208110156108f457600080fd5b50356001600160a01b0316611cf1565b6108d46004803603602081101561091a57600080fd5b810190602081018135600160201b81111561093457600080fd5b82018360208201111561094657600080fd5b803590602001918460208302840111600160201b8311171561096757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ebd945050505050565b61027c600480360360408110156109bb57600080fd5b506001600160a01b0381358116916020013516612078565b61027c600480360360208110156109e957600080fd5b50356120a3565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a7c5780601f10610a5157610100808354040283529160200191610a7c565b820191906000526020600020905b815481529060010190602001808311610a5f57829003601f168201915b5050505050905090565b6000610a9a610a93612513565b8484612517565b5060015b92915050565b6000808390506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610ae557600080fd5b505afa158015610af9573d6000803e3d6000fd5b505050506040513d6020811015610b0f57600080fd5b5051610b19610c4f565b0360ff169050600084600014610b2f5784610ba2565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015610b7557600080fd5b505afa158015610b89573d6000803e3d6000fd5b505050506040513d6020811015610b9f57600080fd5b50515b905081610bb3579250610a9e915050565b600a9190910a02949350505050565b60025490565b6000610bd5848484612603565b610c4584610be1612513565b610c40856040518060600160405280602881526020016135f1602891396001600160a01b038a16600090815260016020526040812090610c1f612513565b6001600160a01b03168152602081019190915260400160002054919061275e565b612517565b5060019392505050565b60055460ff1690565b6000846006548110610ca1576040805162461bcd60e51b815260206004820152600d60248201526c556e6b6e6f776e20706169722160981b604482015290519081900360640190fd5b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015610cef57600080fd5b505afa158015610d03573d6000803e3d6000fd5b505050506040513d6020811015610d1957600080fd5b50516040805163ba83c16f60e01b815290516001600160a01b039092169163ba83c16f91600480820192602092909190829003018186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d6020811015610d8757600080fd5b5051604051630bb687e360e01b8152602060048201908152602b602483018190526001600160a01b0390931692630bb687e392829160449091019061363a823960400191505060206040518083038186803b158015610de557600080fd5b505afa158015610df9573d6000803e3d6000fd5b505050506040513d6020811015610e0f57600080fd5b5051600a5401431015610e60576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420616374696f6e2160601b604482015290519081900360640190fd5b43600a556000610e6e61112b565b5090506000806000610e7f8a6127f5565b925092509250610e8f818a6128ff565b600080737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663baa2abde86868e8e8e600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d6020811015610f3257600080fd5b5051604080516331c6903d60e01b815290516001600160a01b03909216916331c6903d91600480820192602092909190829003018186803b158015610f7657600080fd5b505afa158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b5051604080516001600160e01b031960e08a901b1681526001600160a01b03978816600482015295871660248701526044860194909452606485019290925260848401529290921660a48201526103e8420160c4820152815160e480830193928290030181600087803b15801561101657600080fd5b505af115801561102a573d6000803e3d6000fd5b505050506040513d604081101561104057600080fd5b50805160209091015190925090506110588482610aa4565b6110628684610aa4565b019750858811156110ba576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742072656465656d20676976656e207061697220616d6f756e7400604482015290519081900360640190fd5b50505050505050949350505050565b6000610a9a6110d6612513565b84610c4085600160006110e7612513565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612a2a565b60055461010090046001600160a01b031690565b6000806000611138610bc2565b90506000805b6006548110156111645760008061115483612a8b565b019390930192505060010161113e565b50818111611173576000611177565b8181035b935080821161118757600061118b565b8082035b925050509091565b60606007805480602002602001604051908101604052809291908181526020018280548015610a7c57602002820191906000526020600020905b8154815260200190600101908083116111cd575050505050905090565b606080600860098180548060200260200160405190810160405280929190818152602001828054801561123c57602002820191906000526020600020905b815481526020019060010190808311611228575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561128e57602002820191906000526020600020905b81548152602001906001019080831161127a575b50505050509050915091509091565b6001600160a01b0381166000908152602081905260409020545b919050565b60085460009060001990158015906112ef57506008805460001981019081106112e157fe5b906000526020600020015443105b156113495760005b600854811015611347576008818154811061130e57fe5b906000526020600020015443101561133f576009818154811061132d57fe5b90600052602060002001549150611347565b6001016112f7565b505b6000611353610bc2565b90508181101561136557808203611368565b60005b9250505090565b6000808560065481106113b9576040805162461bcd60e51b815260206004820152600d60248201526c556e6b6e6f776e20706169722160981b604482015290519081900360640190fd5b60008060006113c78a6127f5565b9250925092506113d7818a6128ff565b60408051635d5155ef60e11b81526001600160a01b03858116600483015284166024820152604481018b9052606481018a9052608481018990523360a48201526103e8420160c48201528151737a250d5630b4cf539739df2c5dacb4c659f2488d9263baa2abde9260e480820193918290030181600087803b15801561145c57600080fd5b505af1158015611470573d6000803e3d6000fd5b505050506040513d604081101561148657600080fd5b50805160209091015190965094506114b2336114a28488610aa4565b6114ac868a610aa4565b01612c55565b5050505094509492505050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a7c5780601f10610a5157610100808354040283529160200191610a7c565b6000610a9a61152d612513565b84610c40856040518060600160405280602581526020016136d96025913960016000611557612513565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061275e565b6000610a9a611595612513565b8484612603565b6000816115ab575060006112b7565b604080516002808252606080830184529260208301908036833701905050905030816000815181106115d957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b15801561164757600080fd5b505afa15801561165b573d6000803e3d6000fd5b505050506040513d602081101561167157600080fd5b5051604080516321df0da760e01b815290516001600160a01b03909216916321df0da791600480820192602092909190829003018186803b1580156116b557600080fd5b505afa1580156116c9573d6000803e3d6000fd5b505050506040513d60208110156116df57600080fd5b50518151829060019081106116f057fe5b6001600160a01b039092166020928302919091018201526040805163d06ca61f60e01b81526004810186815260248201928352845160448301528451737a250d5630b4cf539739df2c5dacb4c659f2488d9463d06ca61f9489948894939192606490910191858201910280838360005b83811015611778578181015183820152602001611760565b50505050905001935050505060006040518083038186803b15801561179c57600080fd5b505afa1580156117b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156117d957600080fd5b8101908080516040519392919084600160201b8211156117f857600080fd5b90830190602082018581111561180d57600080fd5b82518660208202830111600160201b8211171561182957600080fd5b82525081516020918201928201910280838360005b8381101561185657818101518382015260200161183e565b5050505090500160405250505060018151811061186f57fe5b60200260200101519150600760018154811061188757fe5b906000526020600020015460076000815481106118a057fe5b90600052602060002001548302816118b457fe5b049392505050565b6000856006548110611905576040805162461bcd60e51b815260206004820152600d60248201526c556e6b6e6f776e20706169722160981b604482015290519081900360640190fd5b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b15801561195357600080fd5b505afa158015611967573d6000803e3d6000fd5b505050506040513d602081101561197d57600080fd5b50516040805163ba83c16f60e01b815290516001600160a01b039092169163ba83c16f91600480820192602092909190829003018186803b1580156119c157600080fd5b505afa1580156119d5573d6000803e3d6000fd5b505050506040513d60208110156119eb57600080fd5b50516040805180820190915260158152741cdd18589b1958dbda5b8b985d5d1a1bdc9a5e9959605a1b60208201526001600160a01b0390911690639535ce1290611a3d90611a3830612d51565b612ecd565b6040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a89578181015183820152602001611a71565b50505050905090810190601f168015611ab65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611ad357600080fd5b505afa158015611ae7573d6000803e3d6000fd5b505050506040513d6020811015611afd57600080fd5b5051611b47576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420616374696f6e2160601b604482015290519081900360640190fd5b600080611b53896127f5565b5091509150611b628289612f99565b611b6c8188612f99565b600080611b7d84848c8c8c8c613025565b5091509150611b8c8382610aa4565b611b968584610aa4565b019550611ba16112bc565b861115611bdf5760405162461bcd60e51b815260040180806020018281038252602b8152602001806136ae602b913960400191505060405180910390fd5b611be93387613212565b505050505095945050505050565b611c018787612406565b60058054610100600160a81b0319166101006001600160a01b038816021790558351611c34906006906020870190613416565b508251600214611c4057fe5b8251611c5390600790602086019061347b565b508051825114611c5f57fe5b8151611c7290600890602085019061347b565b508051611c8690600990602084019061347b565b5050505050505050565b60606006805480602002602001604051908101604052809291908181526020018280548015610a7c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cca575050505050905090565b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3f57600080fd5b505afa158015611d53573d6000803e3d6000fd5b505050506040513d6020811015611d6957600080fd5b505160408051633380ac3560e11b815290516001600160a01b0390921691636701586a91600480820192602092909190829003018186803b158015611dad57600080fd5b505afa158015611dc1573d6000803e3d6000fd5b505050506040513d6020811015611dd757600080fd5b5051604080516318c8e99960e11b815233600482015290516001600160a01b0390921691633191d33291602480820192602092909190829003018186803b158015611e2157600080fd5b505afa158015611e35573d6000803e3d6000fd5b505050506040513d6020811015611e4b57600080fd5b5051611e95576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420416374696f6e2160601b604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015611f0b57600080fd5b505afa158015611f1f573d6000803e3d6000fd5b505050506040513d6020811015611f3557600080fd5b505160408051633380ac3560e11b815290516001600160a01b0390921691636701586a91600480820192602092909190829003018186803b158015611f7957600080fd5b505afa158015611f8d573d6000803e3d6000fd5b505050506040513d6020811015611fa357600080fd5b5051604080516318c8e99960e11b815233600482015290516001600160a01b0390921691633191d33291602480820192602092909190829003018186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d602081101561201757600080fd5b5051612061576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420416374696f6e2160601b604482015290519081900360640190fd5b8051612074906006906020840190613416565b5050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60008082116120f9576040805162461bcd60e51b815260206004820181905260248201527f596f75206d75737420696e73657274206120706f7369746976652076616c7565604482015290519081900360640190fd5b600061210361112b565b9150508083111561215b576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f74204275726e207468697320616d6f756e74000000000000000000604482015290519081900360640190fd5b6121653384612c55565b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b1580156121b357600080fd5b505afa1580156121c7573d6000803e3d6000fd5b505050506040513d60208110156121dd57600080fd5b50516001600160a01b0316639e813f1f6000806121f98761159c565b9550853360405160200180856001600160a01b03168152602001848152602001838152602001826001600160a01b031681526020019450505050506040516020818303038152906040526040518263ffffffff1660e01b8152600401808060200180602001838103835260208152602001807f6d696e744e6577566f74696e67546f6b656e73466f72537461626c65436f696e815250602001838103825284818151815260200191508051906020019080838360005b838110156122c75781810151838201526020016122af565b50505050905090810190601f1680156122f45780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561231457600080fd5b505af1158015612328573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561235157600080fd5b8101908080516040519392919084600160201b82111561237057600080fd5b90830190602082018581111561238557600080fd5b8251600160201b81118282018810171561239e57600080fd5b82525081516020918201929091019080838360005b838110156123cb5781810151838201526020016123b3565b50505050905090810190601f1680156123f85780820380516001836020036101000a031916815260200191505b506040525050505050919050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600460405180828054600181600116156101000203166002900480156124845780601f10612462576101008083540402835291820191612484565b820191906000526020600020905b815481529060010190602001808311612470575b50509150506040518091039020146124da576040805162461bcd60e51b8152602060048201526014602482015273496e697420616c72656164792043616c6c65642160601b604482015290519081900360640190fd5b81516124ed9060039060208501906134c2565b5080516125019060049060208401906134c2565b50506005805460ff1916601217905550565b3390565b6001600160a01b03831661255c5760405162461bcd60e51b815260040180806020018281038252602481526020018061368a6024913960400191505060405180910390fd5b6001600160a01b0382166125a15760405162461bcd60e51b81526004018080602001828103825260228152602001806135a96022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166126485760405162461bcd60e51b81526004018080602001828103825260258152602001806136656025913960400191505060405180910390fd5b6001600160a01b03821661268d5760405162461bcd60e51b81526004018080602001828103825260238152602001806135646023913960400191505060405180910390fd5b612698838383612a25565b6126d5816040518060600160405280602681526020016135cb602691396001600160a01b038616600090815260208190526040902054919061275e565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546127049082612a2a565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156127ed5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127b257818101518382015260200161279a565b50505050905090810190601f1680156127df5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000806000806006858154811061280857fe5b6000918252602091829020015460408051630dfe168160e01b815290516001600160a01b0390921694508493508392630dfe168192600480840193829003018186803b15801561285757600080fd5b505afa15801561286b573d6000803e3d6000fd5b505050506040513d602081101561288157600080fd5b50516040805163d21220a760e01b815290519195506001600160a01b0383169163d21220a791600480820192602092909190829003018186803b1580156128c757600080fd5b505afa1580156128db573d6000803e3d6000fd5b505050506040513d60208110156128f157600080fd5b505193959394509092915050565b60408051636eb1769f60e11b8152306004820152737a250d5630b4cf539739df2c5dacb4c659f2488d60248201529051839183916001600160a01b0384169163dd62ed3e916044808301926020929190829003018186803b15801561296357600080fd5b505afa158015612977573d6000803e3d6000fd5b505050506040513d602081101561298d57600080fd5b505111612a25576040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d6004820152600019602482015290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b1580156129f857600080fd5b505af1158015612a0c573d6000803e3d6000fd5b505050506040513d6020811015612a2257600080fd5b50505b505050565b600082820183811015612a84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000806000806000612a9c866127f5565b92509250925060008190506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612af657600080fd5b505afa158015612b0a573d6000803e3d6000fd5b505050506040513d6020811015612b2057600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038516916318160ddd916004808301926020929190829003018186803b158015612b6857600080fd5b505afa158015612b7c573d6000803e3d6000fd5b505050506040513d6020811015612b9257600080fd5b505160408051630240bc6b60e21b815290519192506001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b158015612bd857600080fd5b505afa158015612bec573d6000803e3d6000fd5b505050506040513d6060811015612c0257600080fd5b5080516020909101516dffffffffffffffffffffffffffff9182169950169650612c378682848b0281612c3157fe5b04610aa4565b9750612c48858289850281612c3157fe5b9650505050505050915091565b6001600160a01b038216612c9a5760405162461bcd60e51b81526004018080602001828103825260218152602001806136196021913960400191505060405180910390fd5b612ca682600083612a25565b612ce381604051806060016040528060228152602001613587602291396001600160a01b038516600090815260208190526040902054919061275e565b6001600160a01b038316600090815260208190526040902055600254612d099082613302565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b03851692918491602082018180368337019050509050600360fc1b81600081518110612db557fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612dde57fe5b60200101906001600160f81b031916908160001a90535060005b6014811015612ec4578260048583600c0160208110612e1357fe5b1a60f81b6001600160f81b031916901c60f81c60ff1681518110612e3357fe5b602001015160f81c60f81b828260020260020181518110612e5057fe5b60200101906001600160f81b031916908160001a905350828482600c0160208110612e7757fe5b825191901a600f16908110612e8857fe5b602001015160f81c60f81b828260020260030181518110612ea557fe5b60200101906001600160f81b031916908160001a905350600101612df8565b50949350505050565b6060612a8483836040516020018083805190602001908083835b60208310612f065780518252601f199092019160209182019101612ee7565b6001836020036101000a03801982511681845116808217855250505050505090500180605f60f81b81525060010182805190602001908083835b60208310612f5f5780518252601f199092019160209182019101612f40565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052613344565b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b158015612fee57600080fd5b505af1158015613002573d6000803e3d6000fd5b505050506040513d602081101561301857600080fd5b50612074905082826128ff565b6040805162e8e33760e81b81526001600160a01b0388811660048301528716602482015260448101869052606481018590526084810184905260a481018390523060c48201526103e8420160e4820152905160009182918291737a250d5630b4cf539739df2c5dacb4c659f2488d9163e8e33700916101048082019260609290919082900301818787803b1580156130bc57600080fd5b505af11580156130d0573d6000803e3d6000fd5b505050506040513d60608110156130e657600080fd5b5080516020820151604090920151909450909250905086831015613181576040805163a9059cbb60e01b8152336004820152848903602482015290516001600160a01b038b169163a9059cbb9160448083019260209291908290030181600087803b15801561315457600080fd5b505af1158015613168573d6000803e3d6000fd5b505050506040513d602081101561317e57600080fd5b50505b85821015613206576040805163a9059cbb60e01b8152336004820152838803602482015290516001600160a01b038a169163a9059cbb9160448083019260209291908290030181600087803b1580156131d957600080fd5b505af11580156131ed573d6000803e3d6000fd5b505050506040513d602081101561320357600080fd5b50505b96509650969350505050565b6001600160a01b03821661326d576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61327960008383612a25565b6002546132869082612a2a565b6002556001600160a01b0382166000908152602081905260409020546132ac9082612a2a565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000612a8483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061275e565b60608160005b815181101561340f57604160f81b82828151811061336457fe5b01602001516001600160f81b0319161080159061339f5750605a60f81b82828151811061338d57fe5b01602001516001600160f81b03191611155b6133c3578181815181106133af57fe5b01602001516001600160f81b0319166133e4565b8181815181106133cf57fe5b602001015160f81c60f81b60f81c60200160f81b5b8282815181106133f057fe5b60200101906001600160f81b031916908160001a90535060010161334a565b5092915050565b82805482825590600052602060002090810192821561346b579160200282015b8281111561346b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613436565b5061347792915061352f565b5090565b8280548282559060005260206000209081019282156134b6579160200282015b828111156134b657825182559160200191906001019061349b565b5061347792915061354e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061350357805160ff19168380011785556134b6565b828001600101855582156134b657918201828111156134b657825182559160200191906001019061349b565b5b808211156134775780546001600160a01b0319168155600101613530565b5b80821115613477576000815560010161354f56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f2061646472657373737461626c65636f696e2e726562616c616e636562796372656469742e626c6f636b2e696e74657276616c45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734d696e74696e6720616d6f756e742069732067726561746572207468616e20617661696c6162696c69747945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a6edf43710700896a164d0275b0640fc162239f48904b6e5d9766aaf7678e2b164736f6c6343000700003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a8ce548324181cd96e51db9bb71d993c4c226c9e000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000014756e697377617020537461746520446f6c6c617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000037553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000003139ffc91b99aa94da8a2dc13f1fc36f9bdc98ee0000000000000000000000007cd0378010711cb72a6ca35f09d5da2094061d9c000000000000000000000000fc5211986172260fb6579eb06220b14f4389011f000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d5000000000000000000000000b20bd5d04be54f870d5c0d3ca85d82b34b836405000000000000000000000000bdfa9ebff5369bc10ff75b4a2fbfce8d5caf10240000000000000000000000003041cbd36888becc7bbcbc0045e3b1f144466f5f000000000000000000000000f1f27db872b7f6e8b873c97f785fe4f9a6c92161000000000000000000000000524847c615639e76fe7d0fe0b16be8c4eac9cf3c000000000000000000000000615cc08df9084e3fac80fe19045a55612185b6a4000000000000000000000000a0abda1f980e03d7eadb78aed8fc1f2dd0fe83dd0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000a6f5e90000000000000000000000000000000000000000000000000000000000aa03290000000000000000000000000000000000000000000000000000000000ad10690000000000000000000000000000000000000000000000000000000000b01da90000000000000000000000000000000000000000000000000000000000b32ae900000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000069e10de76676d080000000000000000000000000000000000000000000000001a784379d99db420000000000000000000000000000000000000000000000000422ca8b0a00a425000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000108b2a2c28029094000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806374601c3c116100de578063ae3dfa2811610097578063cbd99d0311610071578063cbd99d03146108de578063d5d9e01d14610904578063dd62ed3e146109a5578063f9cd4d3e146109d35761018e565b8063ae3dfa281461055d578063afa9a8a114610592578063bbc7eea8146108d65761018e565b806374601c3c146104a95780638df2c58a146104b157806395d89b41146104e0578063a457c2d7146104e8578063a9059cbb14610514578063ac2a89c8146105405761018e565b80633227497e1161014b57806352a64eb41161012557806352a64eb414610369578063544275f71461038a5780635de3326c146103e257806370a08231146104835761018e565b80633227497e146102ea57806339509351146103195780634eb9b592146103455761018e565b806306fdde0314610193578063095ea7b3146102105780630ec076771461025057806318160ddd1461028e57806323b872dd14610296578063313ce567146102cc575b600080fd5b61019b6109f0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d55781810151838201526020016101bd565b50505050905090810190601f1680156102025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61023c6004803603604081101561022657600080fd5b506001600160a01b038135169060200135610a86565b604080519115158252519081900360200190f35b61027c6004803603604081101561026657600080fd5b506001600160a01b038135169060200135610aa4565b60408051918252519081900360200190f35b61027c610bc2565b61023c600480360360608110156102ac57600080fd5b506001600160a01b03813581169160208101359091169060400135610bc8565b6102d4610c4f565b6040805160ff9092168252519081900360200190f35b61027c6004803603608081101561030057600080fd5b5080359060208101359060408101359060600135610c58565b61023c6004803603604081101561032f57600080fd5b506001600160a01b0381351690602001356110c9565b61034d611117565b604080516001600160a01b039092168252519081900360200190f35b61037161112b565b6040805192835260208301919091528051918290030190f35b610392611193565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103ce5781810151838201526020016103b6565b505050509050019250505060405180910390f35b6103ea6111ea565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561042e578181015183820152602001610416565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561046d578181015183820152602001610455565b5050505090500194505050505060405180910390f35b61027c6004803603602081101561049957600080fd5b50356001600160a01b031661129d565b61027c6112bc565b610371600480360360808110156104c757600080fd5b508035906020810135906040810135906060013561136f565b61019b6114bf565b61023c600480360360408110156104fe57600080fd5b506001600160a01b038135169060200135611520565b61023c6004803603604081101561052a57600080fd5b506001600160a01b038135169060200135611588565b61027c6004803603602081101561055657600080fd5b503561159c565b61027c600480360360a081101561057357600080fd5b50803590602081013590604081013590606081013590608001356118bc565b6108d4600480360360e08110156105a857600080fd5b810190602081018135600160201b8111156105c257600080fd5b8201836020820111156105d457600080fd5b803590602001918460018302840111600160201b831117156105f557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561064757600080fd5b82018360208201111561065957600080fd5b803590602001918460018302840111600160201b8311171561067a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b03853516959094909350604081019250602001359050600160201b8111156106dd57600080fd5b8201836020820111156106ef57600080fd5b803590602001918460208302840111600160201b8311171561071057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561075f57600080fd5b82018360208201111561077157600080fd5b803590602001918460208302840111600160201b8311171561079257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107e157600080fd5b8201836020820111156107f357600080fd5b803590602001918460208302840111600160201b8311171561081457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561086357600080fd5b82018360208201111561087557600080fd5b803590602001918460208302840111600160201b8311171561089657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611bf7945050505050565b005b610392611c90565b6108d4600480360360208110156108f457600080fd5b50356001600160a01b0316611cf1565b6108d46004803603602081101561091a57600080fd5b810190602081018135600160201b81111561093457600080fd5b82018360208201111561094657600080fd5b803590602001918460208302840111600160201b8311171561096757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ebd945050505050565b61027c600480360360408110156109bb57600080fd5b506001600160a01b0381358116916020013516612078565b61027c600480360360208110156109e957600080fd5b50356120a3565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a7c5780601f10610a5157610100808354040283529160200191610a7c565b820191906000526020600020905b815481529060010190602001808311610a5f57829003601f168201915b5050505050905090565b6000610a9a610a93612513565b8484612517565b5060015b92915050565b6000808390506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610ae557600080fd5b505afa158015610af9573d6000803e3d6000fd5b505050506040513d6020811015610b0f57600080fd5b5051610b19610c4f565b0360ff169050600084600014610b2f5784610ba2565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015610b7557600080fd5b505afa158015610b89573d6000803e3d6000fd5b505050506040513d6020811015610b9f57600080fd5b50515b905081610bb3579250610a9e915050565b600a9190910a02949350505050565b60025490565b6000610bd5848484612603565b610c4584610be1612513565b610c40856040518060600160405280602881526020016135f1602891396001600160a01b038a16600090815260016020526040812090610c1f612513565b6001600160a01b03168152602081019190915260400160002054919061275e565b612517565b5060019392505050565b60055460ff1690565b6000846006548110610ca1576040805162461bcd60e51b815260206004820152600d60248201526c556e6b6e6f776e20706169722160981b604482015290519081900360640190fd5b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015610cef57600080fd5b505afa158015610d03573d6000803e3d6000fd5b505050506040513d6020811015610d1957600080fd5b50516040805163ba83c16f60e01b815290516001600160a01b039092169163ba83c16f91600480820192602092909190829003018186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d6020811015610d8757600080fd5b5051604051630bb687e360e01b8152602060048201908152602b602483018190526001600160a01b0390931692630bb687e392829160449091019061363a823960400191505060206040518083038186803b158015610de557600080fd5b505afa158015610df9573d6000803e3d6000fd5b505050506040513d6020811015610e0f57600080fd5b5051600a5401431015610e60576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420616374696f6e2160601b604482015290519081900360640190fd5b43600a556000610e6e61112b565b5090506000806000610e7f8a6127f5565b925092509250610e8f818a6128ff565b600080737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663baa2abde86868e8e8e600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d6020811015610f3257600080fd5b5051604080516331c6903d60e01b815290516001600160a01b03909216916331c6903d91600480820192602092909190829003018186803b158015610f7657600080fd5b505afa158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b5051604080516001600160e01b031960e08a901b1681526001600160a01b03978816600482015295871660248701526044860194909452606485019290925260848401529290921660a48201526103e8420160c4820152815160e480830193928290030181600087803b15801561101657600080fd5b505af115801561102a573d6000803e3d6000fd5b505050506040513d604081101561104057600080fd5b50805160209091015190925090506110588482610aa4565b6110628684610aa4565b019750858811156110ba576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742072656465656d20676976656e207061697220616d6f756e7400604482015290519081900360640190fd5b50505050505050949350505050565b6000610a9a6110d6612513565b84610c4085600160006110e7612513565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612a2a565b60055461010090046001600160a01b031690565b6000806000611138610bc2565b90506000805b6006548110156111645760008061115483612a8b565b019390930192505060010161113e565b50818111611173576000611177565b8181035b935080821161118757600061118b565b8082035b925050509091565b60606007805480602002602001604051908101604052809291908181526020018280548015610a7c57602002820191906000526020600020905b8154815260200190600101908083116111cd575050505050905090565b606080600860098180548060200260200160405190810160405280929190818152602001828054801561123c57602002820191906000526020600020905b815481526020019060010190808311611228575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561128e57602002820191906000526020600020905b81548152602001906001019080831161127a575b50505050509050915091509091565b6001600160a01b0381166000908152602081905260409020545b919050565b60085460009060001990158015906112ef57506008805460001981019081106112e157fe5b906000526020600020015443105b156113495760005b600854811015611347576008818154811061130e57fe5b906000526020600020015443101561133f576009818154811061132d57fe5b90600052602060002001549150611347565b6001016112f7565b505b6000611353610bc2565b90508181101561136557808203611368565b60005b9250505090565b6000808560065481106113b9576040805162461bcd60e51b815260206004820152600d60248201526c556e6b6e6f776e20706169722160981b604482015290519081900360640190fd5b60008060006113c78a6127f5565b9250925092506113d7818a6128ff565b60408051635d5155ef60e11b81526001600160a01b03858116600483015284166024820152604481018b9052606481018a9052608481018990523360a48201526103e8420160c48201528151737a250d5630b4cf539739df2c5dacb4c659f2488d9263baa2abde9260e480820193918290030181600087803b15801561145c57600080fd5b505af1158015611470573d6000803e3d6000fd5b505050506040513d604081101561148657600080fd5b50805160209091015190965094506114b2336114a28488610aa4565b6114ac868a610aa4565b01612c55565b5050505094509492505050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a7c5780601f10610a5157610100808354040283529160200191610a7c565b6000610a9a61152d612513565b84610c40856040518060600160405280602581526020016136d96025913960016000611557612513565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061275e565b6000610a9a611595612513565b8484612603565b6000816115ab575060006112b7565b604080516002808252606080830184529260208301908036833701905050905030816000815181106115d957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b15801561164757600080fd5b505afa15801561165b573d6000803e3d6000fd5b505050506040513d602081101561167157600080fd5b5051604080516321df0da760e01b815290516001600160a01b03909216916321df0da791600480820192602092909190829003018186803b1580156116b557600080fd5b505afa1580156116c9573d6000803e3d6000fd5b505050506040513d60208110156116df57600080fd5b50518151829060019081106116f057fe5b6001600160a01b039092166020928302919091018201526040805163d06ca61f60e01b81526004810186815260248201928352845160448301528451737a250d5630b4cf539739df2c5dacb4c659f2488d9463d06ca61f9489948894939192606490910191858201910280838360005b83811015611778578181015183820152602001611760565b50505050905001935050505060006040518083038186803b15801561179c57600080fd5b505afa1580156117b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156117d957600080fd5b8101908080516040519392919084600160201b8211156117f857600080fd5b90830190602082018581111561180d57600080fd5b82518660208202830111600160201b8211171561182957600080fd5b82525081516020918201928201910280838360005b8381101561185657818101518382015260200161183e565b5050505090500160405250505060018151811061186f57fe5b60200260200101519150600760018154811061188757fe5b906000526020600020015460076000815481106118a057fe5b90600052602060002001548302816118b457fe5b049392505050565b6000856006548110611905576040805162461bcd60e51b815260206004820152600d60248201526c556e6b6e6f776e20706169722160981b604482015290519081900360640190fd5b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b15801561195357600080fd5b505afa158015611967573d6000803e3d6000fd5b505050506040513d602081101561197d57600080fd5b50516040805163ba83c16f60e01b815290516001600160a01b039092169163ba83c16f91600480820192602092909190829003018186803b1580156119c157600080fd5b505afa1580156119d5573d6000803e3d6000fd5b505050506040513d60208110156119eb57600080fd5b50516040805180820190915260158152741cdd18589b1958dbda5b8b985d5d1a1bdc9a5e9959605a1b60208201526001600160a01b0390911690639535ce1290611a3d90611a3830612d51565b612ecd565b6040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a89578181015183820152602001611a71565b50505050905090810190601f168015611ab65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611ad357600080fd5b505afa158015611ae7573d6000803e3d6000fd5b505050506040513d6020811015611afd57600080fd5b5051611b47576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420616374696f6e2160601b604482015290519081900360640190fd5b600080611b53896127f5565b5091509150611b628289612f99565b611b6c8188612f99565b600080611b7d84848c8c8c8c613025565b5091509150611b8c8382610aa4565b611b968584610aa4565b019550611ba16112bc565b861115611bdf5760405162461bcd60e51b815260040180806020018281038252602b8152602001806136ae602b913960400191505060405180910390fd5b611be93387613212565b505050505095945050505050565b611c018787612406565b60058054610100600160a81b0319166101006001600160a01b038816021790558351611c34906006906020870190613416565b508251600214611c4057fe5b8251611c5390600790602086019061347b565b508051825114611c5f57fe5b8151611c7290600890602085019061347b565b508051611c8690600990602084019061347b565b5050505050505050565b60606006805480602002602001604051908101604052809291908181526020018280548015610a7c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cca575050505050905090565b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3f57600080fd5b505afa158015611d53573d6000803e3d6000fd5b505050506040513d6020811015611d6957600080fd5b505160408051633380ac3560e11b815290516001600160a01b0390921691636701586a91600480820192602092909190829003018186803b158015611dad57600080fd5b505afa158015611dc1573d6000803e3d6000fd5b505050506040513d6020811015611dd757600080fd5b5051604080516318c8e99960e11b815233600482015290516001600160a01b0390921691633191d33291602480820192602092909190829003018186803b158015611e2157600080fd5b505afa158015611e35573d6000803e3d6000fd5b505050506040513d6020811015611e4b57600080fd5b5051611e95576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420416374696f6e2160601b604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015611f0b57600080fd5b505afa158015611f1f573d6000803e3d6000fd5b505050506040513d6020811015611f3557600080fd5b505160408051633380ac3560e11b815290516001600160a01b0390921691636701586a91600480820192602092909190829003018186803b158015611f7957600080fd5b505afa158015611f8d573d6000803e3d6000fd5b505050506040513d6020811015611fa357600080fd5b5051604080516318c8e99960e11b815233600482015290516001600160a01b0390921691633191d33291602480820192602092909190829003018186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d602081101561201757600080fd5b5051612061576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420416374696f6e2160601b604482015290519081900360640190fd5b8051612074906006906020840190613416565b5050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60008082116120f9576040805162461bcd60e51b815260206004820181905260248201527f596f75206d75737420696e73657274206120706f7369746976652076616c7565604482015290519081900360640190fd5b600061210361112b565b9150508083111561215b576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f74204275726e207468697320616d6f756e74000000000000000000604482015290519081900360640190fd5b6121653384612c55565b600560019054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b1580156121b357600080fd5b505afa1580156121c7573d6000803e3d6000fd5b505050506040513d60208110156121dd57600080fd5b50516001600160a01b0316639e813f1f6000806121f98761159c565b9550853360405160200180856001600160a01b03168152602001848152602001838152602001826001600160a01b031681526020019450505050506040516020818303038152906040526040518263ffffffff1660e01b8152600401808060200180602001838103835260208152602001807f6d696e744e6577566f74696e67546f6b656e73466f72537461626c65436f696e815250602001838103825284818151815260200191508051906020019080838360005b838110156122c75781810151838201526020016122af565b50505050905090810190601f1680156122f45780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561231457600080fd5b505af1158015612328573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561235157600080fd5b8101908080516040519392919084600160201b82111561237057600080fd5b90830190602082018581111561238557600080fd5b8251600160201b81118282018810171561239e57600080fd5b82525081516020918201929091019080838360005b838110156123cb5781810151838201526020016123b3565b50505050905090810190601f1680156123f85780820380516001836020036101000a031916815260200191505b506040525050505050919050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600460405180828054600181600116156101000203166002900480156124845780601f10612462576101008083540402835291820191612484565b820191906000526020600020905b815481529060010190602001808311612470575b50509150506040518091039020146124da576040805162461bcd60e51b8152602060048201526014602482015273496e697420616c72656164792043616c6c65642160601b604482015290519081900360640190fd5b81516124ed9060039060208501906134c2565b5080516125019060049060208401906134c2565b50506005805460ff1916601217905550565b3390565b6001600160a01b03831661255c5760405162461bcd60e51b815260040180806020018281038252602481526020018061368a6024913960400191505060405180910390fd5b6001600160a01b0382166125a15760405162461bcd60e51b81526004018080602001828103825260228152602001806135a96022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166126485760405162461bcd60e51b81526004018080602001828103825260258152602001806136656025913960400191505060405180910390fd5b6001600160a01b03821661268d5760405162461bcd60e51b81526004018080602001828103825260238152602001806135646023913960400191505060405180910390fd5b612698838383612a25565b6126d5816040518060600160405280602681526020016135cb602691396001600160a01b038616600090815260208190526040902054919061275e565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546127049082612a2a565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156127ed5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127b257818101518382015260200161279a565b50505050905090810190601f1680156127df5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000806000806006858154811061280857fe5b6000918252602091829020015460408051630dfe168160e01b815290516001600160a01b0390921694508493508392630dfe168192600480840193829003018186803b15801561285757600080fd5b505afa15801561286b573d6000803e3d6000fd5b505050506040513d602081101561288157600080fd5b50516040805163d21220a760e01b815290519195506001600160a01b0383169163d21220a791600480820192602092909190829003018186803b1580156128c757600080fd5b505afa1580156128db573d6000803e3d6000fd5b505050506040513d60208110156128f157600080fd5b505193959394509092915050565b60408051636eb1769f60e11b8152306004820152737a250d5630b4cf539739df2c5dacb4c659f2488d60248201529051839183916001600160a01b0384169163dd62ed3e916044808301926020929190829003018186803b15801561296357600080fd5b505afa158015612977573d6000803e3d6000fd5b505050506040513d602081101561298d57600080fd5b505111612a25576040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d6004820152600019602482015290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b1580156129f857600080fd5b505af1158015612a0c573d6000803e3d6000fd5b505050506040513d6020811015612a2257600080fd5b50505b505050565b600082820183811015612a84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000806000806000612a9c866127f5565b92509250925060008190506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612af657600080fd5b505afa158015612b0a573d6000803e3d6000fd5b505050506040513d6020811015612b2057600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038516916318160ddd916004808301926020929190829003018186803b158015612b6857600080fd5b505afa158015612b7c573d6000803e3d6000fd5b505050506040513d6020811015612b9257600080fd5b505160408051630240bc6b60e21b815290519192506001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b158015612bd857600080fd5b505afa158015612bec573d6000803e3d6000fd5b505050506040513d6060811015612c0257600080fd5b5080516020909101516dffffffffffffffffffffffffffff9182169950169650612c378682848b0281612c3157fe5b04610aa4565b9750612c48858289850281612c3157fe5b9650505050505050915091565b6001600160a01b038216612c9a5760405162461bcd60e51b81526004018080602001828103825260218152602001806136196021913960400191505060405180910390fd5b612ca682600083612a25565b612ce381604051806060016040528060228152602001613587602291396001600160a01b038516600090815260208190526040902054919061275e565b6001600160a01b038316600090815260208190526040902055600254612d099082613302565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b03851692918491602082018180368337019050509050600360fc1b81600081518110612db557fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612dde57fe5b60200101906001600160f81b031916908160001a90535060005b6014811015612ec4578260048583600c0160208110612e1357fe5b1a60f81b6001600160f81b031916901c60f81c60ff1681518110612e3357fe5b602001015160f81c60f81b828260020260020181518110612e5057fe5b60200101906001600160f81b031916908160001a905350828482600c0160208110612e7757fe5b825191901a600f16908110612e8857fe5b602001015160f81c60f81b828260020260030181518110612ea557fe5b60200101906001600160f81b031916908160001a905350600101612df8565b50949350505050565b6060612a8483836040516020018083805190602001908083835b60208310612f065780518252601f199092019160209182019101612ee7565b6001836020036101000a03801982511681845116808217855250505050505090500180605f60f81b81525060010182805190602001908083835b60208310612f5f5780518252601f199092019160209182019101612f40565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052613344565b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b158015612fee57600080fd5b505af1158015613002573d6000803e3d6000fd5b505050506040513d602081101561301857600080fd5b50612074905082826128ff565b6040805162e8e33760e81b81526001600160a01b0388811660048301528716602482015260448101869052606481018590526084810184905260a481018390523060c48201526103e8420160e4820152905160009182918291737a250d5630b4cf539739df2c5dacb4c659f2488d9163e8e33700916101048082019260609290919082900301818787803b1580156130bc57600080fd5b505af11580156130d0573d6000803e3d6000fd5b505050506040513d60608110156130e657600080fd5b5080516020820151604090920151909450909250905086831015613181576040805163a9059cbb60e01b8152336004820152848903602482015290516001600160a01b038b169163a9059cbb9160448083019260209291908290030181600087803b15801561315457600080fd5b505af1158015613168573d6000803e3d6000fd5b505050506040513d602081101561317e57600080fd5b50505b85821015613206576040805163a9059cbb60e01b8152336004820152838803602482015290516001600160a01b038a169163a9059cbb9160448083019260209291908290030181600087803b1580156131d957600080fd5b505af11580156131ed573d6000803e3d6000fd5b505050506040513d602081101561320357600080fd5b50505b96509650969350505050565b6001600160a01b03821661326d576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61327960008383612a25565b6002546132869082612a2a565b6002556001600160a01b0382166000908152602081905260409020546132ac9082612a2a565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000612a8483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061275e565b60608160005b815181101561340f57604160f81b82828151811061336457fe5b01602001516001600160f81b0319161080159061339f5750605a60f81b82828151811061338d57fe5b01602001516001600160f81b03191611155b6133c3578181815181106133af57fe5b01602001516001600160f81b0319166133e4565b8181815181106133cf57fe5b602001015160f81c60f81b60f81c60200160f81b5b8282815181106133f057fe5b60200101906001600160f81b031916908160001a90535060010161334a565b5092915050565b82805482825590600052602060002090810192821561346b579160200282015b8281111561346b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613436565b5061347792915061352f565b5090565b8280548282559060005260206000209081019282156134b6579160200282015b828111156134b657825182559160200191906001019061349b565b5061347792915061354e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061350357805160ff19168380011785556134b6565b828001600101855582156134b657918201828111156134b657825182559160200191906001019061349b565b5b808211156134775780546001600160a01b0319168155600101613530565b5b80821115613477576000815560010161354f56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f2061646472657373737461626c65636f696e2e726562616c616e636562796372656469742e626c6f636b2e696e74657276616c45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734d696e74696e6720616d6f756e742069732067726561746572207468616e20617661696c6162696c69747945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a6edf43710700896a164d0275b0640fc162239f48904b6e5d9766aaf7678e2b164736f6c63430007000033

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

00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a8ce548324181cd96e51db9bb71d993c4c226c9e000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000014756e697377617020537461746520446f6c6c617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000037553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000003139ffc91b99aa94da8a2dc13f1fc36f9bdc98ee0000000000000000000000007cd0378010711cb72a6ca35f09d5da2094061d9c000000000000000000000000fc5211986172260fb6579eb06220b14f4389011f000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d5000000000000000000000000b20bd5d04be54f870d5c0d3ca85d82b34b836405000000000000000000000000bdfa9ebff5369bc10ff75b4a2fbfce8d5caf10240000000000000000000000003041cbd36888becc7bbcbc0045e3b1f144466f5f000000000000000000000000f1f27db872b7f6e8b873c97f785fe4f9a6c92161000000000000000000000000524847c615639e76fe7d0fe0b16be8c4eac9cf3c000000000000000000000000615cc08df9084e3fac80fe19045a55612185b6a4000000000000000000000000a0abda1f980e03d7eadb78aed8fc1f2dd0fe83dd0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000a6f5e90000000000000000000000000000000000000000000000000000000000aa03290000000000000000000000000000000000000000000000000000000000ad10690000000000000000000000000000000000000000000000000000000000b01da90000000000000000000000000000000000000000000000000000000000b32ae900000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000069e10de76676d080000000000000000000000000000000000000000000000001a784379d99db420000000000000000000000000000000000000000000000000422ca8b0a00a425000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000108b2a2c28029094000000

-----Decoded View---------------
Arg [0] : name (string): uniswap State Dollar
Arg [1] : symbol (string): uSD
Arg [2] : doubleProxy (address): 0xa8CE548324181cd96e51db9bb71D993C4C226C9E
Arg [3] : allowedPairs (address[]): 0x3139Ffc91B99aa94DA8A2dc13f1fC36F9BDc98eE,0x7cD0378010711CB72a6ca35f09D5Da2094061D9c,0xfC5211986172260fb6579eb06220b14F4389011F,0xAE461cA67B15dc8dc81CE7615e0320dA1A9aB8D5,0xB20bd5D04BE54f870D5C0d3cA85d82b34B836405,0xbdFa9eBFf5369bC10ff75b4a2FBfce8d5caf1024,0x3041CbD36888bECc7bbCBc0045E3B1f144466f5f,0xf1f27Db872b7F6E8B873C97F785fe4f9a6C92161,0x524847C615639e76fE7D0FE0B16be8c4eAC9CF3c,0x615Cc08dF9084e3faC80FE19045A55612185B6a4,0xa0ABda1F980e03D7eADb78aed8fC1f2DD0fe83Dd
Arg [4] : rebalanceRewardMultiplier (uint256[]): 30,25
Arg [5] : timeWindows (uint256[]): 10941929,11141929,11341929,11541929,11741929
Arg [6] : mintables (uint256[]): 500000000000000000000000,2000000000000000000000000,5000000000000000000000000,10000000000000000000000000,20000000000000000000000000

-----Encoded View---------------
38 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 000000000000000000000000a8ce548324181cd96e51db9bb71d993c4c226c9e
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000340
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000400
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [8] : 756e697377617020537461746520446f6c6c6172000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 7553440000000000000000000000000000000000000000000000000000000000
Arg [11] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [12] : 0000000000000000000000003139ffc91b99aa94da8a2dc13f1fc36f9bdc98ee
Arg [13] : 0000000000000000000000007cd0378010711cb72a6ca35f09d5da2094061d9c
Arg [14] : 000000000000000000000000fc5211986172260fb6579eb06220b14f4389011f
Arg [15] : 000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d5
Arg [16] : 000000000000000000000000b20bd5d04be54f870d5c0d3ca85d82b34b836405
Arg [17] : 000000000000000000000000bdfa9ebff5369bc10ff75b4a2fbfce8d5caf1024
Arg [18] : 0000000000000000000000003041cbd36888becc7bbcbc0045e3b1f144466f5f
Arg [19] : 000000000000000000000000f1f27db872b7f6e8b873c97f785fe4f9a6c92161
Arg [20] : 000000000000000000000000524847c615639e76fe7d0fe0b16be8c4eac9cf3c
Arg [21] : 000000000000000000000000615cc08df9084e3fac80fe19045a55612185b6a4
Arg [22] : 000000000000000000000000a0abda1f980e03d7eadb78aed8fc1f2dd0fe83dd
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [24] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [27] : 0000000000000000000000000000000000000000000000000000000000a6f5e9
Arg [28] : 0000000000000000000000000000000000000000000000000000000000aa0329
Arg [29] : 0000000000000000000000000000000000000000000000000000000000ad1069
Arg [30] : 0000000000000000000000000000000000000000000000000000000000b01da9
Arg [31] : 0000000000000000000000000000000000000000000000000000000000b32ae9
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [33] : 0000000000000000000000000000000000000000000069e10de76676d0800000
Arg [34] : 00000000000000000000000000000000000000000001a784379d99db42000000
Arg [35] : 0000000000000000000000000000000000000000000422ca8b0a00a425000000
Arg [36] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [37] : 000000000000000000000000000000000000000000108b2a2c28029094000000


Deployed Bytecode Sourcemap

109:13294:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2353:81:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4469:202;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4469:202:2;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4429:469:6;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4429:469:6;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3396:98:2;;;:::i;5131:439::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5131:439:2;;;;;;;;;;;;;;;;;:::i;3255:81::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7011:1343:6;;;;;;;;;;;;;;;;-1:-1:-1;7011:1343:6;;;;;;;;;;;;;;;;;:::i;5965:289:2:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5965:289:2;;;;;;;;:::i;2488:98:6:-;;;:::i;:::-;;;;-1:-1:-1;;;;;2488:98:6;;;;;;;;;;;;;;3211:613;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3034:171;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1700:172;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3552:117:2;;;;;;;;;;;;;;;;-1:-1:-1;3552:117:2;-1:-1:-1;;;;;3552:117:2;;:::i;1878:604:6:-;;;:::i;6185:820::-;;;;;;;;;;;;;;;;-1:-1:-1;6185:820:6;;;;;;;;;;;;;;;;;:::i;2547:85:2:-;;;:::i;6741:386::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6741:386:2;;;;;;;;:::i;3872:208::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3872:208:2;;;;;;;;:::i;3830:593:6:-;;;;;;;;;;;;;;;;-1:-1:-1;3830:593:6;;:::i;4904:1275::-;;;;;;;;;;;;;;;;-1:-1:-1;4904:1275:6;;;;;;;;;;;;;;;;;;;;;;:::i;1048:646::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1048:646:6;;;;;;;;-1:-1:-1;1048:646:6;;-1:-1:-1;;;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1048:646:6;;-1:-1:-1;;;;;1048:646:6;;;;;;;;-1:-1:-1;1048:646:6;;;;-1:-1:-1;1048:646:6;;;;-1:-1:-1;;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1048:646:6;;;;;;;;-1:-1:-1;1048:646:6;;-1:-1:-1;;;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1048:646:6;;;;;;;;-1:-1:-1;1048:646:6;;-1:-1:-1;;;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1048:646:6;;;;;;;;-1:-1:-1;1048:646:6;;-1:-1:-1;;;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1048:646:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1048:646:6;;-1:-1:-1;1048:646:6;;-1:-1:-1;;;;;1048:646:6:i;:::-;;2749:109;;;:::i;2592:151::-;;;;;;;;;;;;;;;;-1:-1:-1;2592:151:6;-1:-1:-1;;;;;2592:151:6;;:::i;2864:164::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2864:164:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2864:164:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2864:164:6;;-1:-1:-1;2864:164:6;;-1:-1:-1;;;;;2864:164:6:i;4138:193:2:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4138:193:2;;;;;;;;;;:::i;8360:588:6:-;;;;;;;;;;;;;;;;-1:-1:-1;8360:588:6;;:::i;2353:81:2:-;2422:5;2415:12;;;;;;;;-1:-1:-1;;2415:12:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2390:13;;2415:12;;2422:5;;2415:12;;2422:5;2415:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2353:81;:::o;4469:202::-;4584:4;4604:39;4613:12;:10;:12::i;:::-;4627:7;4636:6;4604:8;:39::i;:::-;-1:-1:-1;4660:4:2;4469:202;;;;;:::o;4429:469:6:-;4556:7;4579:16;4609:12;4579:43;;4632:25;4673:5;-1:-1:-1;;;;;4673:14:6;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4673:16:6;4660:10;:8;:10::i;:::-;:29;4632:57;;;;4699:14;4716:6;4726:1;4716:11;:53;;4763:6;4716:53;;;4730:30;;;-1:-1:-1;;;4730:30:6;;4754:4;4730:30;;;;;;-1:-1:-1;;;;;4730:15:6;;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4730:30:6;4716:53;4699:70;-1:-1:-1;4783:22:6;4779:66;;4828:6;-1:-1:-1;4821:13:6;;-1:-1:-1;;4821:13:6;4779:66;4870:2;:21;;;;4861:30;;4429:469;-1:-1:-1;;;;4429:469:6:o;3396:98:2:-;3475:12;;3396:98;:::o;5131:439::-;5267:4;5283:36;5293:6;5301:9;5312:6;5283:9;:36::i;:::-;5329:213;5351:6;5371:12;:10;:12::i;:::-;5397:135;5452:6;5397:135;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5397:19:2;;;;;;:11;:19;;;;;;5417:12;:10;:12::i;:::-;-1:-1:-1;;;;;5397:33:2;;;;;;;;;;;;-1:-1:-1;5397:33:2;;;:135;:37;:135::i;:::-;5329:8;:213::i;:::-;-1:-1:-1;5559:4:2;5131:439;;;;;:::o;3255:81::-;3320:9;;;;3255:81;:::o;7011:1343:6:-;7201:16;7181:9;9401:13;:20;9389:32;;9350:110;;;;;-1:-1:-1;;;9350:110:6;;;;;;;;;;;;-1:-1:-1;;;9350:110:6;;;;;;;;;;;;;;;7363:12:::1;;;;;;;;;-1:-1:-1::0;;;;;7363:12:6::1;-1:-1:-1::0;;;;;7350:32:6::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;7350:34:6;7340:90:::1;::::0;;-1:-1:-1;;;7340:90:6;;;;-1:-1:-1;;;;;7340:88:6;;::::1;::::0;::::1;::::0;:90:::1;::::0;;::::1;::::0;7350:34:::1;::::0;7340:90;;;;;;;;:88;:90;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;7340:90:6;7310:209:::1;::::0;-1:-1:-1;;;7310:209:6;;7340:90:::1;7310:209;::::0;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;;;;;7310:162:6;;::::1;::::0;::::1;::::0;:209;;;;;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;7310:209:6;7278:16:::1;::::0;:241:::1;7250:12;:269;;7229:336;;;::::0;;-1:-1:-1;;;7229:336:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7229:336:6;;;;;;;;;;;;;::::1;;7594:12;7575:16;:31:::0;7617:14:::1;7637:13;:11;:13::i;:::-;7616:34;;;7661:14;7677::::0;7693:19:::1;7716:23;7729:9;7716:12;:23::i;:::-;7660:79;;;;;;7749:40;7765:11;7778:10;7749:15;:40::i;:::-;7800:16;7818::::0;210:42:::1;-1:-1:-1::0;;;;;7838:86:6::1;;7938:6;7958;7978:10;8002:7;8023;8067:12;;;;;;;;;-1:-1:-1::0;;;;;8067:12:6::1;-1:-1:-1::0;;;;;8054:32:6::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8054:34:6;8044:67:::1;::::0;;-1:-1:-1;;;8044:67:6;;;;-1:-1:-1;;;;;8044:65:6;;::::1;::::0;::::1;::::0;:67:::1;::::0;;::::1;::::0;8054:34:::1;::::0;8044:67;;;;;;;;:65;:67;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8044:67:6;7838:319:::1;::::0;;-1:-1:-1;;;;;;7838:319:6::1;::::0;;;;;;-1:-1:-1;;;;;7838:319:6;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;8143:4:::1;8125:15;:22;7838:319:::0;;;;;;;;;;;;;;;;;-1:-1:-1;7838:319:6;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;7838:319:6;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;7838:319:6;-1:-1:-1;8240:35:6::1;8258:6:::0;7838:319;8240:17:::1;:35::i;:::-;8190;8208:6;8216:8;8190:17;:35::i;:::-;:85;8167:108;;8305:6;8293:8;:18;;8285:62;;;::::0;;-1:-1:-1;;;8285:62:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;9470:1;;;;;;7011:1343:::0;;;;;;;:::o;5965:289:2:-;6077:4;6097:129;6119:12;:10;:12::i;:::-;6145:7;6166:50;6205:10;6166:11;:25;6178:12;:10;:12::i;:::-;-1:-1:-1;;;;;6166:25:2;;;;;;;;;;;;;;;;;-1:-1:-1;6166:25:2;;;:34;;;;;;;;;;;:38;:50::i;2488:98:6:-;2567:12;;;;;-1:-1:-1;;;;;2567:12:6;;2488:98::o;3211:613::-;3296:14;3312:12;3340:19;3362:13;:11;:13::i;:::-;3340:35;;3385:23;3427:9;3422:182;3446:13;:20;3442:24;;3422:182;;;3488:15;3505;3524:17;3539:1;3524:14;:17::i;:::-;3575;3555:38;;;;;-1:-1:-1;;3468:3:6;;3422:182;;;;3640:11;3622:15;:29;:89;;3710:1;3622:89;;;3684:11;3666:15;:29;3622:89;3613:98;;3742:15;3728:11;:29;:89;;3816:1;3728:89;;;3786:15;3772:11;:29;3728:89;3721:96;;3211:613;;;;:::o;3034:171::-;3133:16;3172:26;3165:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3034:171;:::o;1700:172::-;1782:16;1800;1840:12;1854:10;1832:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1700:172;;:::o;3552:117:2:-;-1:-1:-1;;;;;3644:18:2;;3618:7;3644:18;;;;;;;;;;;3552:117;;;;:::o;1878:604:6:-;2062:12;:19;1935:7;;-1:-1:-1;;1983:66:6;2062:23;;;;:79;;-1:-1:-1;2104:12:6;2117:19;;-1:-1:-1;;2117:23:6;;;2104:37;;;;;;;;;;;;;;2089:12;:52;2062:79;2059:318;;;2162:9;2157:210;2181:12;:19;2177:23;;2157:210;;;2244:12;2257:1;2244:15;;;;;;;;;;;;;;;;2229:12;:30;2225:128;;;2294:10;2305:1;2294:13;;;;;;;;;;;;;;;;2283:24;;2329:5;;2225:128;2202:3;;2157:210;;;;2059:318;2386:14;2403:13;:11;:13::i;:::-;2386:30;;2443:8;2433:6;:18;;:42;;2469:6;2458:8;:17;2433:42;;;2454:1;2433:42;2426:49;;;;1878:604;:::o;6185:820::-;6394:16;;6366:9;9401:13;:20;9389:32;;9350:110;;;;;-1:-1:-1;;;9350:110:6;;;;;;;;;;;;-1:-1:-1;;;9350:110:6;;;;;;;;;;;;;;;6445:14:::1;6461::::0;6477:19:::1;6500:23;6513:9;6500:12;:23::i;:::-;6444:79;;;;;;6533:40;6549:11;6562:10;6533:15;:40::i;:::-;6606:240;::::0;;-1:-1:-1;;;6606:240:6;;-1:-1:-1;;;;;6606:240:6;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;6790:10:::1;6606:240:::0;;;;6832:4:::1;6814:15;:22;6606:240:::0;;;;;;210:42:::1;::::0;6606:64:::1;::::0;:240;;;;;;;;;;;-1:-1:-1;210:42:6;6606:240;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;6606:240:6;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;6606:240:6;-1:-1:-1;6856:142:6::1;6875:10;6953:35;6971:6:::0;6606:240;6953:17:::1;:35::i;:::-;6899;6917:6;6925:8;6899:17;:35::i;:::-;:89;6856:5;:142::i;:::-;9470:1;;;6185:820:::0;;;;;;;;:::o;2547:85:2:-;2618:7;2611:14;;;;;;;;-1:-1:-1;;2611:14:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2586:13;;2611:14;;2618:7;;2611:14;;2618:7;2611:14;;;;;;;;;;;;;;;;;;;;;;;;6741:386;6858:4;6878:221;6900:12;:10;:12::i;:::-;6926:7;6947:142;7003:15;6947:142;;;;;;;;;;;;;;;;;:11;:25;6959:12;:10;:12::i;:::-;-1:-1:-1;;;;;6947:25:2;;;;;;;;;;;;;;;;;-1:-1:-1;6947:25:2;;;:34;;;;;;;;;;;:142;:38;:142::i;3872:208::-;3990:4;4010:42;4020:12;:10;:12::i;:::-;4034:9;4045:6;4010:9;:42::i;3830:593:6:-;3947:14;3980:10;3977:48;;-1:-1:-1;4013:1:6;4006:8;;3977:48;4058:16;;;4072:1;4058:16;;;4034:21;4058:16;;;;;4034:21;4058:16;;;;;;;;;;-1:-1:-1;4058:16:6;4034:40;;4102:4;4084;4089:1;4084:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;4084:23:6;;;-1:-1:-1;;;;;4084:23:6;;;;;4150:12;;;;;;;;;-1:-1:-1;;;;;4150:12:6;-1:-1:-1;;;;;4137:32:6;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4137:34:6;4127:56;;;-1:-1:-1;;;4127:56:6;;;;-1:-1:-1;;;;;4127:54:6;;;;;;:56;;;;;4137:34;;4127:56;;;;;;;;:54;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4127:56:6;4117:7;;:4;;4122:1;;4117:7;;;;;;-1:-1:-1;;;;;4117:66:6;;;:7;;;;;;;;;;:66;4202:96;;;-1:-1:-1;;;4202:96:6;;;;;;;;;;;;;;;;;;;;;;210:42;;4202:49;;4265:5;;4284:4;;4202:96;;;;;;;;;;;;;;;;-1:-1:-1;4202:96:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4202:96:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4202:96:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4202:96:6;;;;;;;;;;;;-1:-1:-1;4202:96:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4299:1;4202:99;;;;;;;;;;;;;;4193:108;;4387:26;4414:1;4387:29;;;;;;;;;;;;;;;;4342:26;4369:1;4342:29;;;;;;;;;;;;;;;;4333:6;:38;4332:84;;;;;;;3830:593;-1:-1:-1;;;3830:593:6:o;4904:1275::-;5109:14;5089:9;9401:13;:20;9389:32;;9350:110;;;;;-1:-1:-1;;;9350:110:6;;;;;;;;;;;;-1:-1:-1;;;9350:110:6;;;;;;;;;;;;;;;5209:12:::1;;;;;;;;;-1:-1:-1::0;;;;;5209:12:6::1;-1:-1:-1::0;;;;;5196:32:6::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;5196:34:6;5186:90:::1;::::0;;-1:-1:-1;;;5186:90:6;;;;-1:-1:-1;;;;;5186:88:6;;::::1;::::0;::::1;::::0;:90:::1;::::0;;::::1;::::0;5196:34:::1;::::0;5186:90;;;;;;;;:88;:90;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;5186:90:6;5333:126:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;5186:90:6::1;5333:126:::0;::::1;::::0;-1:-1:-1;;;;;5156:159:6;;::::1;::::0;::::1;::::0;5333:126:::1;::::0;5417:24:::1;5435:4;5417:9;:24::i;:::-;5333:17;:126::i;:::-;5156:317;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;5156:317:6;5135:384:::1;;;::::0;;-1:-1:-1;;;5135:384:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;5135:384:6;;;;;;;;;;;;;::::1;;5530:14;5546::::0;5566:23:::1;5579:9;5566:12;:23::i;:::-;5529:60;;;;;5599:49;5632:6;5640:7;5599:32;:49::i;:::-;5658;5691:6;5699:7;5658:32;:49::i;:::-;5718:19;5739:20:::0;5765:156:::1;5795:6;5815;5835:7;5856;5877:10;5901;5765:16;:156::i;:::-;5717:204;;;;;6005:39;6023:6;6031:12;6005:17;:39::i;:::-;5952:38;5970:6;5978:11;5952:17;:38::i;:::-;:92;5931:113;;6072:17;:15;:17::i;:::-;6062:6;:27;;6054:83;;;;-1:-1:-1::0;;;6054:83:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6147:25;6153:10;6165:6;6147:5;:25::i;:::-;9470:1;;;;4904:1275:::0;;;;;;;;:::o;1048:646::-;1346:24;1357:4;1363:6;1346:10;:24::i;:::-;1380:12;:26;;-1:-1:-1;;;;;;1380:26:6;;-1:-1:-1;;;;;1380:26:6;;;;;;1416:28;;;;:13;;:28;;;;;:::i;:::-;;1461:25;:32;1497:1;1461:37;1454:45;;;;1509:54;;;;:26;;:54;;;;;:::i;:::-;;1602:9;:16;1580:11;:18;:38;1573:46;;;;1629:26;;;;:12;;:26;;;;;:::i;:::-;-1:-1:-1;1665:22:6;;;;:10;;:22;;;;;:::i;:::-;;1048:646;;;;;;;:::o;2749:109::-;2803:16;2838:13;2831:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2831:20:6;;;;;;;;;;;;;;;;;;;;;;2749:109;:::o;2592:151::-;9076:12;;;;;;;;;-1:-1:-1;;;;;9076:12:6;-1:-1:-1;;;;;9063:32:6;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9063:34:6;9053:104;;;-1:-1:-1;;;9053:104:6;;;;-1:-1:-1;;;;;9053:102:6;;;;;;:104;;;;;9063:34;;9053:104;;;;;;;;:102;:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9053:104:6;9009:217;;;-1:-1:-1;;;9009:217:6;;9215:10;9009:217;;;;;;-1:-1:-1;;;;;9009:205:6;;;;;;:217;;;;;9053:104;;9009:217;;;;;;;;:205;:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9009:217:6;8988:284;;;;;-1:-1:-1;;;8988:284:6;;;;;;;;;;;;-1:-1:-1;;;8988:284:6;;;;;;;;;;;;;;;2707:12:::1;:29:::0;;-1:-1:-1;;;;;2707:29:6;;::::1;;;-1:-1:-1::0;;;;;;2707:29:6;;::::1;::::0;;;::::1;::::0;;2592:151::o;2864:164::-;9076:12;;;;;;;;;-1:-1:-1;;;;;9076:12:6;-1:-1:-1;;;;;9063:32:6;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9063:34:6;9053:104;;;-1:-1:-1;;;9053:104:6;;;;-1:-1:-1;;;;;9053:102:6;;;;;;:104;;;;;9063:34;;9053:104;;;;;;;;:102;:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9053:104:6;9009:217;;;-1:-1:-1;;;9009:217:6;;9215:10;9009:217;;;;;;-1:-1:-1;;;;;9009:205:6;;;;;;:217;;;;;9053:104;;9009:217;;;;;;;;:205;:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9009:217:6;8988:284;;;;;-1:-1:-1;;;8988:284:6;;;;;;;;;;;;-1:-1:-1;;;8988:284:6;;;;;;;;;;;;;;;2990:31;;::::1;::::0;:13:::1;::::0;:31:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2864:164:::0;:::o;4138:193:2:-;-1:-1:-1;;;;;4297:18:2;;;4267:7;4297:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4138:193::o;8360:588:6:-;8425:14;8468:1;8459:6;:10;8451:55;;;;;-1:-1:-1;;;8451:55:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8519:12;8535:13;:11;:13::i;:::-;8516:32;;;8576:4;8566:6;:14;;8558:50;;;;;-1:-1:-1;;;8558:50:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;8618:25;8624:10;8636:6;8618:5;:25::i;:::-;8676:12;;;;;;;;;-1:-1:-1;;;;;8676:12:6;-1:-1:-1;;;;;8663:32:6;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8663:34:6;-1:-1:-1;;;;;8653:52:6;;8803:1;;8851:38;8882:6;8851:30;:38::i;:::-;8842:47;;;8907:10;8767:164;;;;;;-1:-1:-1;;;;;8767:164:6;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8767:164:6;;;;;;;;;;;;;;;;;;;;;;;8653:288;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8653:288:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8653:288:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8653:288:6;;;;;;-1:-1:-1;8653:288:6;;;;;;;;;;-1:-1:-1;8653:288:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8360:588;;;;:::o;2021:267:2:-;2146:13;2133:7;2117:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;2096:109;;;;;-1:-1:-1;;;2096:109:2;;;;;;;;;;;;-1:-1:-1;;;2096:109:2;;;;;;;;;;;;;;;2216:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;2239:16:2;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;;2266:9:2;:14;;-1:-1:-1;;2266:14:2;2278:2;2266:14;;;-1:-1:-1;2021:267:2:o;590:104:1:-;677:10;590:104;:::o;10023:370:2:-;-1:-1:-1;;;;;10154:19:2;;10146:68;;;;-1:-1:-1;;;10146:68:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10232:21:2;;10224:68;;;;-1:-1:-1;;;10224:68:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10303:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10354:32;;;;;;;;;;;;;;;;;10023:370;;;:::o;7601:594::-;-1:-1:-1;;;;;7736:20:2;;7728:70;;;;-1:-1:-1;;;7728:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7816:23:2;;7808:71;;;;-1:-1:-1;;;7808:71:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7890:47;7911:6;7919:9;7930:6;7890:20;:47::i;:::-;7968:105;8003:6;7968:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7968:17:2;;:9;:17;;;;;;;;;;;;:105;:21;:105::i;:::-;-1:-1:-1;;;;;7948:17:2;;;:9;:17;;;;;;;;;;;:125;;;;8106:20;;;;;;;:32;;8131:6;8106:24;:32::i;:::-;-1:-1:-1;;;;;8083:20:2;;;:9;:20;;;;;;;;;;;;:55;;;;8153:35;;;;;;;8083:20;;8153:35;;;;;;;;;;;;;7601:594;;;:::o;1746:187:5:-;1832:7;1867:12;1859:6;;;;1851:29;;;;-1:-1:-1;;;1851:29:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1902:5:5;;;1746:187::o;9484:369:6:-;9584:14;9612;9640:19;9684;9748:13;9762:9;9748:24;;;;;;;;;;;;;;;;;;;9801:13;;;-1:-1:-1;;;9801:13:6;;;;-1:-1:-1;;;;;9748:24:6;;;;-1:-1:-1;9748:24:6;;-1:-1:-1;9748:24:6;;9801:11;;:13;;;;;;;;;;9748:24;9801:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9801:13:6;9833;;;-1:-1:-1;;;9833:13:6;;;;9801;;-1:-1:-1;;;;;;9833:11:6;;;;;:13;;;;;9801;;9833;;;;;;;;:11;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9833:13:6;9484:369;;9833:13;;-1:-1:-1;9484:369:6;;;-1:-1:-1;;9484:369:6:o;10104:366::-;10233:49;;;-1:-1:-1;;;10233:49:6;;10257:4;10233:49;;;;210:42;10233:49;;;;;;10206:12;;10286:5;;-1:-1:-1;;;;;10233:15:6;;;;;:49;;;;;;;;;;;;;;:15;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10233:49:6;:58;10229:235;;10307:146;;;-1:-1:-1;;;10307:146:6;;210:42;10307:146;;;;-1:-1:-1;;10307:146:6;;;;;;-1:-1:-1;;;;;10307:13:6;;;;;:146;;;;;;;;;;;;;;-1:-1:-1;10307:13:6;:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10229:235:6;10104:366;;;:::o;874:176:5:-;932:7;963:5;;;986:6;;;;978:46;;;;;-1:-1:-1;;;978:46:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;1042:1;874:176;-1:-1:-1;;;874:176:5:o;11636:673:6:-;11717:15;11734;11766:14;11782;11798:19;11821:15;11834:1;11821:12;:15::i;:::-;11765:71;;;;;;11846:19;11883:11;11846:49;;11905:18;11926:4;-1:-1:-1;;;;;11926:14:6;;11949:4;11926:29;;;;;;;;;;;;;-1:-1:-1;;;;;11926:29:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11926:29:6;11991:18;;;-1:-1:-1;;;11991:18:6;;;;11926:29;;-1:-1:-1;11965:23:6;;-1:-1:-1;;;;;11991:16:6;;;;;:18;;;;;11926:29;;11991:18;;;;;;;:16;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11991:18:6;12042;;;-1:-1:-1;;;12042:18:6;;;;11991;;-1:-1:-1;;;;;;12042:16:6;;;;;:18;;;;;;;;;;;;;;;:16;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12042:18:6;;;;;;;12019:41;;;;;-1:-1:-1;12019:41:6;;-1:-1:-1;12080:101:6;12111:6;12156:15;12132:20;;;12156:15;12131:40;;;;;12080:17;:101::i;:::-;12070:111;;12201:101;12232:6;12277:15;12266:7;12253:10;:20;12252:40;;;;12201:101;12191:111;;11636:673;;;;;;;;;:::o;9154:444:2:-;-1:-1:-1;;;;;9237:21:2;;9229:67;;;;-1:-1:-1;;;9229:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9307:49;9328:7;9345:1;9349:6;9307:20;:49::i;:::-;9388:102;9424:6;9388:102;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9388:18:2;;:9;:18;;;;;;;;;;;;:102;:22;:102::i;:::-;-1:-1:-1;;;;;9367:18:2;;:9;:18;;;;;;;;;;:123;9515:12;;:24;;9532:6;9515:16;:24::i;:::-;9500:12;:39;9554:37;;;;;;;;9580:1;;-1:-1:-1;;;;;9554:37:2;;;;;;;;;;;;9154:444;;:::o;12520:499:6:-;12650:42;;;;;;;;;;;-1:-1:-1;;;12650:42:6;;;;12722:13;;12732:2;12722:13;;;12576;12722;;;;;;-1:-1:-1;;;;;12625:14:6;;;12650:42;12576:13;;12722;;;;;;;;;;-1:-1:-1;12722:13:6;12703:32;;-1:-1:-1;;;12745:3:6;12749:1;12745:6;;;;;;;;;;;:12;-1:-1:-1;;;;;12745:12:6;;;;;;;;;-1:-1:-1;;;12767:3:6;12771:1;12767:6;;;;;;;;;;;:12;-1:-1:-1;;;;;12767:12:6;;;;;;;;;12794:9;12789:196;12813:2;12809:1;:6;12789:196;;;12853:8;12893:1;12876:5;12882:1;12886:2;12882:6;12876:13;;;;;;;;;;-1:-1:-1;;;;;12876:18:6;;;;12870:25;;12862:34;;12853:44;;;;;;;;;;;;;;;;12836:3;12844:1;12848;12844:5;12840:1;:9;12836:14;;;;;;;;;;;:61;-1:-1:-1;;;;;12836:61:6;;;;;;;;;12928:8;12951:5;12957:1;12961:2;12957:6;12951:13;;;;;;;12928:46;;12951:13;;;12967:4;12945:27;;12928:46;;;;;;;;;;;;;;12911:3;12919:1;12923;12919:5;12915:1;:9;12911:14;;;;;;;;;;;:63;-1:-1:-1;;;;;12911:63:6;;;;;;;;-1:-1:-1;12817:3:6;;12789:196;;;-1:-1:-1;13008:3:6;12520:499;-1:-1:-1;;;;12520:499:6:o;12315:199::-;12422:13;12458:49;12495:1;12503;12478:27;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12478:27:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12478:27:6;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12478:27:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12458:12;:49::i;9859:239::-;9978:67;;;-1:-1:-1;;;9978:67:6;;10012:10;9978:67;;;;10032:4;9978:67;;;;;;;;;;;;-1:-1:-1;;;;;9978:33:6;;;;;:67;;;;;;;;;;;;;;-1:-1:-1;9978:33:6;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10055:36:6;;-1:-1:-1;10071:12:6;10085:5;10055:15;:36::i;10476:1154::-;10903:329;;;-1:-1:-1;;;10903:329:6;;-1:-1:-1;;;;;10903:329:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11181:4;10903:329;;;;11218:4;11200:15;:22;10903:329;;;;;;10751:19;;;;;;210:42;;10903:83;;:329;;;;;;;;;;;;;;;10751:19;210:42;10903:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10903:329:6;;;;;;;;;;;;;-1:-1:-1;10903:329:6;;-1:-1:-1;10903:329:6;-1:-1:-1;11246:33:6;;;11242:184;;;11295:120;;;-1:-1:-1;;;11295:120:6;;11340:10;11295:120;;;;11368:33;;;11295:120;;;;;;-1:-1:-1;;;;;11295:27:6;;;;;:120;;;;;;;;;;;;;;-1:-1:-1;11295:27:6;:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11242:184:6;11454:20;11439:12;:35;11435:189;;;11490:123;;;-1:-1:-1;;;11490:123:6;;11536:10;11490:123;;;;11564:35;;;11490:123;;;;;;-1:-1:-1;;;;;11490:28:6;;;;;:123;;;;;;;;;;;;;;-1:-1:-1;11490:28:6;:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11435:189:6;10476:1154;;;;;;;;;;:::o;8465:370:2:-;-1:-1:-1;;;;;8548:21:2;;8540:65;;;;;-1:-1:-1;;;8540:65:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;8616:49;8645:1;8649:7;8658:6;8616:20;:49::i;:::-;8691:12;;:24;;8708:6;8691:16;:24::i;:::-;8676:12;:39;-1:-1:-1;;;;;8746:18:2;;:9;:18;;;;;;;;;;;:30;;8769:6;8746:22;:30::i;:::-;-1:-1:-1;;;;;8725:18:2;;:9;:18;;;;;;;;;;;:51;;;;8791:37;;;;;;;8725:18;;:9;;8791:37;;;;;;;;;;8465:370;;:::o;1321:134:5:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;13025:376:6:-;13112:13;13167:3;13186:9;13181:185;13205:4;:11;13201:1;:15;13181:185;;;13258:4;13247:15;;:4;13252:1;13247:7;;;;;;;;;;;;-1:-1:-1;;;;;;13247:7:6;:15;;;;:34;;;13277:4;13266:15;;:4;13271:1;13266:7;;;;;;;;;;;;-1:-1:-1;;;;;;13266:7:6;:15;;13247:34;:108;;13348:4;13353:1;13348:7;;;;;;;;;;;;-1:-1:-1;;;;;;13348:7:6;13247:108;;;13313:4;13318:1;13313:7;;;;;;;;;;;;;;;;13307:14;;13324:4;13307:21;13300:29;;13247:108;13237:4;13242:1;13237:7;;;;;;;;;;;:118;-1:-1:-1;;;;;13237:118:6;;;;;;;;-1:-1:-1;13218:3:6;;13181:185;;;-1:-1:-1;13389:4:6;13025:376;-1:-1:-1;;13025:376:6:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

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

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