ETH Price: $3,303.55 (-3.57%)
Gas: 8 Gwei

Token

CYN-COIN (CYNC)
 

Overview

Max Total Supply

100,000,000,000 CYNC

Holders

178 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
90,796.533756761443382701 CYNC

Value
$0.00
0x7309f0134f3e51e8cbe29dd86068e0f264f6c946
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

This project combines the use of collectible NFT’s in the form of trading cards, comics, limited edition artwork, and memberships resulting in a portion of earnings going to the CYN-C project pool which is intended to grow with the CYN-C project.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CynCoinV1

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 * This is the offical code for Cyn-Coin 
 * Official Website: https://www.cyn-c.io/
 * Discord: https://discord.gg/qP6rhnNW
 * Twitter: @CyncNft
 * Opensea- http://opensea.io/CYN-C 
 * Telegram- http://t.me/CYNCommunity
 
 
 * This code was originally written as Safetoken by: 0f0crypto <[email protected]>
 * discord: https://discord.gg/zn86MDCQc
 *
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.4;

/**
 * Tokenomics:
 * Redistribution   2%
 * Community Fund   1%
 * Project Fund     1%
 */

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {return msg.sender;}
    function _msgData() internal view virtual returns (bytes calldata) {this; return msg.data;}
}
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {return a + b;}
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {return a - b;}
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {return a * b;}
    function div(uint256 a, uint256 b) internal pure returns (uint256) {return a / b;}
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {return a % b;}
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked { require(b <= a, errorMessage); return a - b; }
    }
}
library Address {
    function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0;}
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");(bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {return functionCall(target, data, "Address: low-level call failed");}
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {return functionCallWithValue(target, data, 0, errorMessage);}
    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");}
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) { return returndata; } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {revert(errorMessage);}
        }
    }
    
}
abstract contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;
    bool private _renounced;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
        _renounced = true;
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "Only the previous owner can unlock onwership");
        require(_renounced == false, "Cannot unlock renounced ownership");
        require(block.timestamp > _lockTime , "The contract is still locked");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

abstract contract Manageable is Context {
    address private _manager;
    event ManagementTransferred(address indexed previousManager, address indexed newManager);
    constructor(){
        address msgSender = _msgSender();
        _manager = msgSender;
        emit ManagementTransferred(address(0), msgSender);
    }
    function manager() public view returns(address){ return _manager; }
    modifier onlyManager(){
        require(_manager == _msgSender(), "Manageable: caller is not the manager");
        _;
    }
    function transferManagement(address newManager) external virtual onlyManager {
        emit ManagementTransferred(_manager, newManager);
        _manager = newManager;
    }
}
interface IPancakeV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IPancakeV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

abstract contract Tokenomics {

    using SafeMath for uint256;

    // --------------------- Token Settings ------------------- //

    string internal constant NAME = "CYN-COIN";
    string internal constant SYMBOL = "CYNC";

    uint16 internal constant FEES_DIVISOR = 10**3;
    uint8 internal constant DECIMALS = 18;
    uint256 internal constant ZEROES = 10**DECIMALS;

    uint256 private constant MAX = ~uint256(0);
    uint256 internal constant TOTAL_SUPPLY = 100000000000 * ZEROES; // 100B Total Supply
    uint256 internal _reflectedSupply = (MAX - (MAX % TOTAL_SUPPLY));


    uint256 internal constant maxTransactionAmount = TOTAL_SUPPLY / 100; // 1% of the total supply per transaction

    uint256 internal constant maxWalletBalance = TOTAL_SUPPLY / 20; // 5% of the total supply per wallet (20/100=5%)

    uint256 internal constant numberOfTokensToSwapToLiquidity = TOTAL_SUPPLY / 1000; // not being used. 

    // --------------------- Fees Settings ------------------- //

    //address internal projectFund = 0xCF14cAA1aFb0464b3e9BB0Fd652b01fC59388fCC; //Multi-sig Project Fund test
    //address internal communityWallet = 0x863bBFf526DD5ec0e77AB7eB959a2FbC9910CB98; //Multi-sig Community Fund test
    address internal projectFund = 0xCa5284C60aF1c65507bE8d597b213666C3a7551F; //Multi-sig Project Fund 
    address internal communityWallet = 0xE057D9f2b4d39793DBe92dA241b8A33ad9a6dD46; //Multi-sig Community Fund
    address internal burnAddress = 0x0000000000000000000000000000000662607015; //(Planck's constant) This burn address is only here for potenital future manual burning.

    enum FeeType { Antiwhale, Burn, Liquidity, Rfi, External, ExternalToETH }
    struct Fee {
        FeeType name;
        uint256 value;
        address recipient;
        uint256 total;
    }

    Fee[] internal fees;
    uint256 internal sumOfFees;

    constructor() {
        _addFees();
    }

    function _addFee(FeeType name, uint256 value, address recipient) private {
        fees.push( Fee(name, value, recipient, 0 ) );
        sumOfFees += value;
    }

    function _addFees() private {
        /**
         * Tokenomics:
         * Project Fund      1%
         * Redistribution    2%
         * Community Wallet  1% 
         */


        _addFee(FeeType.Rfi, 20, address(this) );
        _addFee(FeeType.Burn, 0, burnAddress ); // not being used 
        _addFee(FeeType.Liquidity, 0, address(this) ); // not being used 
        _addFee(FeeType.External, 10, projectFund );
        _addFee(FeeType.External, 10, communityWallet );

    }

    function _getFeesCount() internal view returns (uint256){ return fees.length; }

    function _getFeeStruct(uint256 index) private view returns(Fee storage){
        require( index >= 0 && index < fees.length, "FeesSettings._getFeeStruct: Fee index out of bounds");
        return fees[index];
    }
    function _getFee(uint256 index) internal view returns (FeeType, uint256, address, uint256){
        Fee memory fee = _getFeeStruct(index);
        return ( fee.name, fee.value, fee.recipient, fee.total );
    }
    function _addFeeCollectedAmount(uint256 index, uint256 amount) internal {
        Fee storage fee = _getFeeStruct(index);
        fee.total = fee.total.add(amount);
    }

    // function getCollectedFeeTotal(uint256 index) external view returns (uint256){
    function getCollectedFeeTotal(uint256 index) internal view returns (uint256){
        Fee memory fee = _getFeeStruct(index);
        return fee.total;
    }
}

abstract contract Presaleable is Manageable {
    bool internal isInPresale;
    function setPreseableEnabled(bool value) external onlyManager {
        isInPresale = value;
    }
}

abstract contract BaseRfiToken is IERC20, IERC20Metadata, Ownable, Presaleable, Tokenomics {

    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) internal _reflectedBalances;
    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowances;

    mapping (address => bool) internal _isExcludedFromFee;
    mapping (address => bool) internal _isExcludedFromRewards;
    address[] private _excluded;

    constructor(){

        _reflectedBalances[owner()] = _reflectedSupply;

        // exclude owner,Multi-sig wallets and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[communityWallet] = true; //multi-sig wallet for community Fund
        _isExcludedFromFee[projectFund] = true; // multi-sig wallet for project fund
    


        // exclude the owner, multi-sig wallets  and this contract from rewards
        _exclude(owner());
        _exclude(communityWallet);
        _exclude(projectFund);
        _exclude(address(this));

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

    }

    /** Functions required by IERC20Metadat **/
        function name() external pure override returns (string memory) { return NAME; }
        function symbol() external pure override returns (string memory) { return SYMBOL; }
        function decimals() external pure override returns (uint8) { return DECIMALS; }

    /** Functions required by IERC20Metadat - END **/
    /** Functions required by IERC20 **/
        function totalSupply() external pure override returns (uint256) {
            return TOTAL_SUPPLY;
        }

        function balanceOf(address account) public view override returns (uint256){
            if (_isExcludedFromRewards[account]) return _balances[account];
            return tokenFromReflection(_reflectedBalances[account]);
        }

        function transfer(address recipient, uint256 amount) external override returns (bool){
            _transfer(_msgSender(), recipient, amount);
            return true;
        }

        function allowance(address owner, address spender) external view override returns (uint256){
            return _allowances[owner][spender];
        }

        function approve(address spender, uint256 amount) external override returns (bool) {
            _approve(_msgSender(), spender, amount);
            return true;
        }

        function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool){
            _transfer(sender, recipient, amount);
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
            return true;
        }
    /** Functions required by IERC20 - END **/

    function burn(uint256 amount) external {

        address sender = _msgSender();
        require(sender != address(0), "BaseRfiToken: burn from the zero address");
        require(sender != address(burnAddress), "BaseRfiToken: burn from the burn address");

        uint256 balance = balanceOf(sender);
        require(balance >= amount, "BaseRfiToken: burn amount exceeds balance");

        uint256 reflectedAmount = amount.mul(_getCurrentRate());

        // remove the amount from the sender's balance first
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(reflectedAmount);
        if (_isExcludedFromRewards[sender])
            _balances[sender] = _balances[sender].sub(amount);

        _burnTokens( sender, amount, reflectedAmount );
    }

    /**
     * @dev "Soft" burns the specified amount of tokens by sending them
     * to the burn address
     */
    function _burnTokens(address sender, uint256 tBurn, uint256 rBurn) internal {

        /**
         * @dev Do not reduce _totalSupply and/or _reflectedSupply. (soft) burning by sending
         * tokens to the burn address (which should be excluded from rewards) is sufficient
         * in RFI
         */
        _reflectedBalances[burnAddress] = _reflectedBalances[burnAddress].add(rBurn);
        if (_isExcludedFromRewards[burnAddress])
            _balances[burnAddress] = _balances[burnAddress].add(tBurn);

        /**
         * @dev Emit the event so that the burn address balance is updated (on bscscan)
         */
        emit Transfer(sender, burnAddress, tBurn);
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

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

    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcludedFromRewards[account];
    }

    /**
     * @dev Calculates and returns the reflected amount for the given amount with or without
     * the transfer fees (deductTransferFee true/false)
     */
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) {
        require(tAmount <= TOTAL_SUPPLY, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount,0);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount,_getSumOfFees(_msgSender(), tAmount));
            return rTransferAmount;
        }
    }

    /**
     * @dev Calculates and returns the amount of tokens corresponding to the given reflected amount.
     */
    function tokenFromReflection(uint256 rAmount) internal view returns(uint256) {
        require(rAmount <= _reflectedSupply, "Amount must be less than total reflections");
        uint256 currentRate = _getCurrentRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) external onlyOwner() {
        require(!_isExcludedFromRewards[account], "Account is not included");
        require(_excluded.length < 10, "Cannot exclude more than 10 accounts");
        _exclude(account);
    }

    function _exclude(address account) internal {
        if(_reflectedBalances[account] > 0) {
            _balances[account] = tokenFromReflection(_reflectedBalances[account]);
        }
        _isExcludedFromRewards[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcludedFromRewards[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _balances[account] = 0;
                _isExcludedFromRewards[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function setExcludedFromFee(address account, bool value) external onlyOwner { _isExcludedFromFee[account] = value; }
    function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "BaseRfiToken: approve from the zero address");
        require(spender != address(0), "BaseRfiToken: approve to the zero address");

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

    /**
     */
    function _isUnlimitedSender(address account) internal view returns(bool){
        // the owner and multi-sig wallets are excluded: 
        return (account == owner() || account == communityWallet || account == projectFund );
    }
    /**
     */
    function _isUnlimitedRecipient(address account) internal view returns(bool){
        // the owner and community fund wallet should be a white-listed recipient
        // and anyone should be able to burn as many tokens as they wish.
        
        return (account == owner() || account == burnAddress  || account == communityWallet|| account == projectFund);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "BaseRfiToken: transfer from the zero address");
        require(recipient != address(0), "BaseRfiToken: transfer to the zero address");
        require(sender != address(burnAddress), "BaseRfiToken: transfer from the burn address");
        require(amount > 0, "Transfer amount must be greater than zero");

        // indicates whether or not feee should be deducted from the transfer
        bool takeFee = true;

        if ( isInPresale ){ takeFee = false; }
        else {
            /**
            * Check the amount is within the max allowed limit as long as a
            * unlimited sender/recepient is not involved in the transaction
            */
            if ( amount > maxTransactionAmount && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) ){
                revert("Transfer amount exceeds the maxTxAmount.");
            }

            if ( maxWalletBalance > 0 && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) && !_isV2Pair(recipient) ){
                uint256 recipientBalance = balanceOf(recipient);
                require(recipientBalance + amount <= maxWalletBalance, "New balance would exceed the maxWalletBalance");
            }
        }

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]){ takeFee = false; }

        _beforeTokenTransfer(sender, recipient, amount, takeFee);
        _transferTokens(sender, recipient, amount, takeFee);

    }

    function _transferTokens(address sender, address recipient, uint256 amount, bool takeFee) private {


        uint256 sumOfFees = _getSumOfFees(sender, amount);
        if ( !takeFee ){ sumOfFees = 0; }

        (uint256 rAmount, uint256 rTransferAmount, uint256 tAmount, uint256 tTransferAmount, uint256 currentRate ) = _getValues(amount, sumOfFees);

        /**
         * Sender's and Recipient's reflected balances must be always updated regardless of
         * whether they are excluded from rewards or not.
         */
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(rAmount);
        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rTransferAmount);

        /**
         * Update the true/nominal balances for excluded accounts
         */
        if (_isExcludedFromRewards[sender]){ _balances[sender] = _balances[sender].sub(tAmount); }
        if (_isExcludedFromRewards[recipient] ){ _balances[recipient] = _balances[recipient].add(tTransferAmount); }

        _takeFees( amount, currentRate, sumOfFees );
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _takeFees(uint256 amount, uint256 currentRate, uint256 sumOfFees ) private {
        if ( sumOfFees > 0 && !isInPresale ){
            _takeTransactionFees(amount, currentRate);
        }
    }

    function _getValues(uint256 tAmount, uint256 feesSum) internal view returns (uint256, uint256, uint256, uint256, uint256) {

        uint256 tTotalFees = tAmount.mul(feesSum).div(FEES_DIVISOR);
        uint256 tTransferAmount = tAmount.sub(tTotalFees);
        uint256 currentRate = _getCurrentRate();
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rTotalFees = tTotalFees.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rTotalFees);

        return (rAmount, rTransferAmount, tAmount, tTransferAmount, currentRate);
    }

    function _getCurrentRate() internal view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() internal view returns(uint256, uint256) {
        uint256 rSupply = _reflectedSupply;
        uint256 tSupply = TOTAL_SUPPLY;

        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_reflectedBalances[_excluded[i]] > rSupply || _balances[_excluded[i]] > tSupply) return (_reflectedSupply, TOTAL_SUPPLY);
            rSupply = rSupply.sub(_reflectedBalances[_excluded[i]]);
            tSupply = tSupply.sub(_balances[_excluded[i]]);
        }
        if (tSupply == 0 || rSupply < _reflectedSupply.div(TOTAL_SUPPLY)) return (_reflectedSupply, TOTAL_SUPPLY);
        return (rSupply, tSupply);
    }

    /**
     * @dev Hook that is called before any transfer of tokens.
     */
    function _beforeTokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) internal virtual;


    function _getSumOfFees(address sender, uint256 amount) internal view virtual returns (uint256);


    function _isV2Pair(address account) internal view virtual returns(bool);


    function _redistribute(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) internal {
        uint256 tFee = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rFee = tFee.mul(currentRate);

        _reflectedSupply = _reflectedSupply.sub(rFee);
        _addFeeCollectedAmount(index, tFee);
    }

    /**
     * @dev Hook that is called before the `Transfer` event is emitted if fees are enabled for the transfer
     */
    function _takeTransactionFees(uint256 amount, uint256 currentRate) internal virtual;
}

abstract contract Liquifier is Ownable, Manageable {

    using SafeMath for uint256;

    uint256 private withdrawableBalance;

    enum Env {Testnet, MainnetV1, MainnetV2}
    Env private _env;

    address private _mainnetRouterV1Address = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // just a place holder
    address private _mainnetRouterV2Address = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // just a place holder
    address private _testnetRouterAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // being used - all addresses are using the routerV2 of Uniswap
    // PancakeSwap Testnet = https://pancake.kiemtienonline360.com/
    //address private _testnetRouterAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;

    IPancakeV2Router internal _router;
    address internal _pair;

    bool private inSwapAndLiquify;
    bool private swapAndLiquifyEnabled = true;

    uint256 private maxTransactionAmount;
    uint256 private numberOfTokensToSwapToLiquidity;

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    event RouterSet(address indexed router);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event LiquidityAdded(uint256 tokenAmountSent, uint256 ethAmountSent, uint256 liquidity);

    receive() external payable {}

    function initializeLiquiditySwapper(Env env, uint256 maxTx, uint256 liquifyAmount) internal {
        _env = env;
        if (_env == Env.MainnetV1){ _setRouterAddress(_mainnetRouterV1Address); }
        else if (_env == Env.MainnetV2){ _setRouterAddress(_mainnetRouterV2Address); }
        else /*(_env == Env.Testnet)*/{ _setRouterAddress(_testnetRouterAddress); }

        maxTransactionAmount = maxTx;
        numberOfTokensToSwapToLiquidity = liquifyAmount;

    }

    /**
     * NOTE: passing the `contractTokenBalance` here is preferred to creating `balanceOfDelegate`
     */
    function liquify(uint256 contractTokenBalance, address sender) internal {

        if (contractTokenBalance >= maxTransactionAmount) contractTokenBalance = maxTransactionAmount;

        bool isOverRequiredTokenBalance = ( contractTokenBalance >= numberOfTokensToSwapToLiquidity );

        if ( isOverRequiredTokenBalance && swapAndLiquifyEnabled && !inSwapAndLiquify && (sender != _pair) ){
            // TODO check if the `(sender != _pair)` is necessary because that basically
            // stops swap and liquify for all "buy" transactions
            _swapAndLiquify(contractTokenBalance);
        }

    }


    function _setRouterAddress(address router) private {
        IPancakeV2Router _newPancakeRouter = IPancakeV2Router(router);
        _pair = IPancakeV2Factory(_newPancakeRouter.factory()).createPair(address(this), _newPancakeRouter.WETH());
        _router = _newPancakeRouter;
        emit RouterSet(router);
    }

    function _swapAndLiquify(uint256 amount) private lockTheSwap {

        // split the contract balance into halves
        uint256 half = amount.div(2);
        uint256 otherHalf = amount.sub(half);

  
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        _swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        _addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function _swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _router.WETH();

        _approveDelegate(address(this), address(_router), tokenAmount);

        // make the swap
        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            // The minimum amount of output tokens that must be received for the transaction not to revert.
            // 0 = accept any amount (slippage is inevitable)
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approveDelegate(address(this), address(_router), tokenAmount);

        // add tahe liquidity
        (uint256 tokenAmountSent, uint256 ethAmountSent, uint256 liquidity) = _router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            // Bounds the extent to which the WETH/token price can go up before the transaction reverts.
            // Must be <= amountTokenDesired; 0 = accept any amount (slippage is inevitable)
            0,
            // Bounds the extent to which the token/WETH price can go up before the transaction reverts.
            // 0 = accept any amount (slippage is inevitable)
            0,
            // this is a centralized risk if the owner's account is ever compromised (see Certik SSL-04)
            owner(),
            block.timestamp
        );


        withdrawableBalance = address(this).balance;
        emit LiquidityAdded(tokenAmountSent, ethAmountSent, liquidity);
    }


    /**
    * @dev Sets the uniswapV2 pair (router & factory) for swapping and liquifying tokens
    */
    function setRouterAddress(address router) external onlyManager() {
        _setRouterAddress(router);
    }

    /**
     * @dev Sends the swap and liquify flag to the provided value. If set to `false` tokens collected in the contract will
     * NOT be converted into liquidity.
     */
    function setSwapAndLiquifyEnabled(bool enabled) external onlyManager {
        swapAndLiquifyEnabled = enabled;
        emit SwapAndLiquifyEnabledUpdated(swapAndLiquifyEnabled);
    }

 
    function withdrawLockedEth(address payable recipient) external onlyManager(){
        require(recipient != address(0), "Cannot withdraw the ETH balance to the zero address");
        require(withdrawableBalance > 0, "The ETH balance must be greater than 0");

        // prevent re-entrancy attacks
        uint256 amount = withdrawableBalance;
        withdrawableBalance = 0;
        recipient.transfer(amount);
    }

    /**
     * @dev Use this delegate instead of having (unnecessarily) extend `BaseRfiToken` to gained access
     * to the `_approve` function.
     */
    function _approveDelegate(address owner, address spender, uint256 amount) internal virtual;

}

//////////////////////////////////////////////////////////////////////////
abstract contract Antiwhale is Tokenomics {


    function _getAntiwhaleFees(uint256, uint256) internal view returns (uint256){
        return sumOfFees;
    }
}
//////////////////////////////////////////////////////////////////////////

abstract contract CynCoin is BaseRfiToken, Liquifier, Antiwhale {

    using SafeMath for uint256;

    // constructor(string memory _name, string memory _symbol, uint8 _decimals){
    constructor(Env _env){

        initializeLiquiditySwapper(_env, maxTransactionAmount, numberOfTokensToSwapToLiquidity);

        // exclude the pair address from rewards - we don't want to redistribute
        // tx fees to these two; redistribution is only for holders, dah!
        _exclude(_pair);
        _exclude(burnAddress);
    }

    function _isV2Pair(address account) internal view override returns(bool){
        return (account == _pair);
    }

    function _getSumOfFees(address sender, uint256 amount) internal view override returns (uint256){
        return _getAntiwhaleFees(balanceOf(sender), amount);
    }

    // function _beforeTokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) internal override {
    function _beforeTokenTransfer(address sender, address , uint256 , bool ) internal override {
        if ( !isInPresale ){
            uint256 contractTokenBalance = balanceOf(address(this));
            liquify( contractTokenBalance, sender );
        }
    }

    function _takeTransactionFees(uint256 amount, uint256 currentRate) internal override {

        if( isInPresale ){ return; }

        uint256 feesCount = _getFeesCount();
        for (uint256 index = 0; index < feesCount; index++ ){
            (FeeType name, uint256 value, address recipient,) = _getFee(index);
            // no need to check value < 0 as the value is uint (i.e. from 0 to 2^256-1)
            if ( value == 0 ) continue;

            if ( name == FeeType.Rfi ){
                _redistribute( amount, currentRate, value, index );
            }
            else if ( name == FeeType.Burn ){
                _burn( amount, currentRate, value, index );
            }
            else if ( name == FeeType.Antiwhale){
                // TODO
            }
            else if ( name == FeeType.ExternalToETH){
                _takeFeeToETH( amount, currentRate, value, recipient, index );
            }
            else {
                _takeFee( amount, currentRate, value, recipient, index );
            }
        }
    }

    function _burn(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) private {
        uint256 tBurn = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rBurn = tBurn.mul(currentRate);

        _burnTokens(address(this), tBurn, rBurn);
        _addFeeCollectedAmount(index, tBurn);
    }

    function _takeFee(uint256 amount, uint256 currentRate, uint256 fee, address recipient, uint256 index) private {

        uint256 tAmount = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rAmount = tAmount.mul(currentRate);

        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rAmount);
        if(_isExcludedFromRewards[recipient])
            _balances[recipient] = _balances[recipient].add(tAmount);

        _addFeeCollectedAmount(index, tAmount);
    }

    function _takeFeeToETH(uint256 amount, uint256 currentRate, uint256 fee, address recipient, uint256 index) private {
        _takeFee(amount, currentRate, fee, recipient, index);
    }

    function _approveDelegate(address owner, address spender, uint256 amount) internal override {
        _approve(owner, spender, amount);
    }

}


contract CynCoinV1 is CynCoin{

    constructor() CynCoin(Env.MainnetV2){
        // pre-approve the initial liquidity supply (to safe a bit of time)
        _approve(owner(),address(_router), ~uint256(0));
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousManager","type":"address"},{"indexed":true,"internalType":"address","name":"newManager","type":"address"}],"name":"ManagementTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"RouterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":[{"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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","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":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPreseableEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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"},{"inputs":[{"internalType":"address","name":"newManager","type":"address"}],"name":"transferManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdrawLockedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126012600a62000e2c565b620000239064174876e80062000eeb565b620000319060001962000f45565b6200003f9060001962000f0d565b600455600580546001600160a01b031990811673ca5284c60af1c65507be8d597b213666c3a7551f1790915560068054821673e057d9f2b4d39793dbe92da241b8a33ad9a6dd4617905560078054821664066260701517905560118054747a250d5630b4cf539739df2c5dacb4c659f2488d00610100600160a81b0319909116179055601280548216737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155601380549092161790556015805460ff60a81b1916600160a81b1790553480156200010d57600080fd5b50600080546001600160a01b03191633908117825560405160029282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060038054610100600160a81b0319163361010081029190911790915560405181906000907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85908290a350620001a4620003dd565b600454600a6000620001be6000546001600160a01b031690565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506001600d6000620001f86200045460201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152600d9093528183208054851660019081179091556006548216845282842080548616821790556005549091168352912080549092161790556200027e620002786000546001600160a01b031690565b62000463565b60065462000295906001600160a01b031662000463565b600554620002ac906001600160a01b031662000463565b620002b73062000463565b600080546001600160a01b0316907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620002f46012600a62000e2c565b620003059064174876e80062000eeb565b60405190815260200160405180910390a36200037c8160646200032b6012600a62000e2c565b6200033c9064174876e80062000eeb565b62000348919062000dcc565b6103e8620003596012600a62000e2c565b6200036a9064174876e80062000eeb565b62000376919062000dcc565b62000526565b60155462000393906001600160a01b031662000463565b600754620003aa906001600160a01b031662000463565b50620003d7620003c26000546001600160a01b031690565b6014546001600160a01b031660001962000613565b62000f88565b620003ec60036014306200074e565b60075462000409906001906000906001600160a01b03166200074e565b6200041860026000306200074e565b6005546200043590600490600a906001600160a01b03166200074e565b6006546200045290600490600a906001600160a01b03166200074e565b565b6000546001600160a01b031690565b6001600160a01b0381166000908152600a602052604090205415620004c0576001600160a01b0381166000908152600a6020526040902054620004a6906200084b565b6001600160a01b0382166000908152600b60205260409020555b6001600160a01b03166000818152600e60205260408120805460ff19166001908117909155600f805491820181559091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319169091179055565b6011805484919060ff191660018360028111156200055457634e487b7160e01b600052602160045260246000fd5b0217905550600160115460ff1660028111156200058157634e487b7160e01b600052602160045260246000fd5b1415620005aa57601154620005a49061010090046001600160a01b0316620008e3565b62000607565b600260115460ff166002811115620005d257634e487b7160e01b600052602160045260246000fd5b1415620005f057601254620005a4906001600160a01b0316620008e3565b60135462000607906001600160a01b0316620008e3565b60169190915560175550565b6001600160a01b038316620006835760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b6001600160a01b038216620006ed5760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b60648201526084016200067a565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600860405180608001604052808560058111156200077c57634e487b7160e01b600052602160045260246000fd5b815260208082018690526001600160a01b03851660408301526000606090920182905283546001818101865594835291208251600490920201805492939092839160ff1990911690836005811115620007e557634e487b7160e01b600052602160045260246000fd5b02179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301555050816009600082825462000841919062000db1565b9091555050505050565b6000600454821115620008b45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016200067a565b6000620008c062000ac2565b9050620008dc818462000af560201b620013d21790919060201c565b9392505050565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200092257600080fd5b505afa15801562000937573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200095d919062000d88565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620009a657600080fd5b505afa158015620009bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009e1919062000d88565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801562000a2a57600080fd5b505af115801562000a3f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a65919062000d88565b601580546001600160a01b03199081166001600160a01b039384161790915560148054909116838316179055604051908316907fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1590600090a25050565b6000808062000ad062000b0c565b9150915062000aee818362000af560201b620013d21790919060201c565b9250505090565b600062000b03828462000dcc565b90505b92915050565b60045460009081908162000b236012600a62000e2c565b62000b349064174876e80062000eeb565b905060005b600f5481101562000cf85782600a6000600f848154811062000b6b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000be6575081600b6000600f848154811062000bbf57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562000c195760045462000bfd6012600a62000e2c565b62000c0e9064174876e80062000eeb565b945094505050509091565b62000c7c600a6000600f848154811062000c4357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528281019390935260409091019020548591620013e562000d7a821b17901c565b925062000ce1600b6000600f848154811062000ca857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528281019390935260409091019020548491620013e562000d7a821b17901c565b91508062000cef8162000f27565b91505062000b39565b5080158062000d3f575062000d3c62000d146012600a62000e2c565b62000d259064174876e80062000eeb565b60045462000af560201b620013d21790919060201c565b82105b1562000d715760045462000d566012600a62000e2c565b62000d679064174876e80062000eeb565b9350935050509091565b90939092509050565b600062000b03828462000f0d565b60006020828403121562000d9a578081fd5b81516001600160a01b0381168114620008dc578182fd5b6000821982111562000dc75762000dc762000f5c565b500190565b60008262000dde5762000dde62000f72565b500490565b600181815b8085111562000e2457816000190482111562000e085762000e0862000f5c565b8085161562000e1657918102915b93841c939080029062000de8565b509250929050565b600062000b0360ff84168360008262000e485750600162000b06565b8162000e575750600062000b06565b816001811462000e70576002811462000e7b5762000e9b565b600191505062000b06565b60ff84111562000e8f5762000e8f62000f5c565b50506001821b62000b06565b5060208310610133831016604e8410600b841016171562000ec0575081810a62000b06565b62000ecc838362000de3565b806000190482111562000ee35762000ee362000f5c565b029392505050565b600081600019048311821515161562000f085762000f0862000f5c565b500290565b60008282101562000f225762000f2262000f5c565b500390565b600060001982141562000f3e5762000f3e62000f5c565b5060010190565b60008262000f575762000f5762000f72565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b612fce8062000f986000396000f3fe6080604052600436106101d15760003560e01c806370a08231116100f7578063a69df4b511610095578063dd46706411610064578063dd46706414610584578063dd62ed3e146105a4578063e4edf852146105ea578063f2fde38b1461060a57600080fd5b8063a69df4b51461050f578063a9059cbb14610524578063b7671a0d14610544578063c49b9a801461056457600080fd5b806388f82020116100d157806388f820201461046b5780638da5cb5b146104a457806395d89b41146104c2578063a457c2d7146104ef57600080fd5b806370a0823114610416578063715018a61461043657806374778cdc1461044b57600080fd5b806341cb87fc1161016f57806352390c021161013e57806352390c02146103885780635342acb4146103a8578063602bc62b146103e15780636612e66f146103f657600080fd5b806341cb87fc146102f157806342966c68146103115780634549b03914610331578063481c6a751461035157600080fd5b806323b872dd116101ab57806323b872dd14610273578063313ce567146102935780633685d419146102af57806339509351146102d157600080fd5b806306fdde03146101dd578063095ea7b31461022057806318160ddd1461025057600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b5060408051808201909152600881526721aca716a1a7a4a760c11b60208201525b6040516102179190612c4c565b60405180910390f35b34801561022c57600080fd5b5061024061023b366004612ba0565b61062a565b6040519015158152602001610217565b34801561025c57600080fd5b50610265610641565b604051908152602001610217565b34801561027f57600080fd5b5061024061028e366004612b2c565b610663565b34801561029f57600080fd5b5060405160128152602001610217565b3480156102bb57600080fd5b506102cf6102ca366004612abc565b6106cc565b005b3480156102dd57600080fd5b506102406102ec366004612ba0565b6108c4565b3480156102fd57600080fd5b506102cf61030c366004612abc565b6108fa565b34801561031d57600080fd5b506102cf61032c366004612be5565b610936565b34801561033d57600080fd5b5061026561034c366004612bfd565b610b28565b34801561035d57600080fd5b5060035461010090046001600160a01b03165b6040516001600160a01b039091168152602001610217565b34801561039457600080fd5b506102cf6103a3366004612abc565b610bd7565b3480156103b457600080fd5b506102406103c3366004612abc565b6001600160a01b03166000908152600d602052604090205460ff1690565b3480156103ed57600080fd5b50600254610265565b34801561040257600080fd5b506102cf610411366004612b6c565b610cd1565b34801561042257600080fd5b50610265610431366004612abc565b610d26565b34801561044257600080fd5b506102cf610d85565b34801561045757600080fd5b506102cf610466366004612bcb565b610df4565b34801561047757600080fd5b50610240610486366004612abc565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156104b057600080fd5b506000546001600160a01b0316610370565b3480156104ce57600080fd5b5060408051808201909152600481526343594e4360e01b602082015261020a565b3480156104fb57600080fd5b5061024061050a366004612ba0565b610e42565b34801561051b57600080fd5b506102cf610e91565b34801561053057600080fd5b5061024061053f366004612ba0565b610ffd565b34801561055057600080fd5b506102cf61055f366004612abc565b61100a565b34801561057057600080fd5b506102cf61057f366004612bcb565b611153565b34801561059057600080fd5b506102cf61059f366004612be5565b6111de565b3480156105b057600080fd5b506102656105bf366004612af4565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156105f657600080fd5b506102cf610605366004612abc565b611263565b34801561061657600080fd5b506102cf610625366004612abc565b6112fa565b60006106373384846113f1565b5060015b92915050565b600061064f6012600a612e04565b61065e9064174876e800612eaf565b905090565b6000610670848484611525565b6106c284336106bd85604051806060016040528060288152602001612f2c602891396001600160a01b038a166000908152600c602090815260408083203384529091529020549190611907565b6113f1565b5060019392505050565b6000546001600160a01b031633146106ff5760405162461bcd60e51b81526004016106f690612c9f565b60405180910390fd5b6001600160a01b0381166000908152600e602052604090205460ff166107675760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c7564656400000000000000000060448201526064016106f6565b60005b600f548110156108c057816001600160a01b0316600f828154811061079f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156108ae57600f80546107ca90600190612ece565b815481106107e857634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600f80546001600160a01b03909216918390811061082257634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600b82526040808220829055600e90925220805460ff19169055600f80548061088857634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806108b881612ee5565b91505061076a565b5050565b336000818152600c602090815260408083206001600160a01b038716845290915281205490916106379185906106bd9086611933565b6003546001600160a01b0361010090910416331461092a5760405162461bcd60e51b81526004016106f690612cd4565b6109338161193f565b50565b33806109955760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865207a65726f604482015267206164647265737360c01b60648201526084016106f6565b6007546001600160a01b0382811691161415610a045760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865206275726e604482015267206164647265737360c01b60648201526084016106f6565b6000610a0f82610d26565b905082811015610a735760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a206275726e20616d6f756e7420657863656564604482015268732062616c616e636560b81b60648201526084016106f6565b6000610a87610a80611b12565b8590611b35565b6001600160a01b0384166000908152600a6020526040902054909150610aad90826113e5565b6001600160a01b0384166000908152600a6020908152604080832093909355600e9052205460ff1615610b17576001600160a01b0383166000908152600b6020526040902054610afd90856113e5565b6001600160a01b0384166000908152600b60205260409020555b610b22838583611b41565b50505050565b6000610b366012600a612e04565b610b459064174876e800612eaf565b831115610b945760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016106f6565b81610bb4576000610ba6846000611c23565b5092945061063b9350505050565b6000610bc984610bc43387611c99565b611c23565b5091945061063b9350505050565b6000546001600160a01b03163314610c015760405162461bcd60e51b81526004016106f690612c9f565b6001600160a01b0381166000908152600e602052604090205460ff1615610c6a5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420696e636c7564656400000000000000000060448201526064016106f6565b600f54600a11610cc85760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206578636c756465206d6f7265207468616e203130206163636f604482015263756e747360e01b60648201526084016106f6565b61093381611cae565b6000546001600160a01b03163314610cfb5760405162461bcd60e51b81526004016106f690612c9f565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600e602052604081205460ff1615610d6357506001600160a01b03166000908152600b602052604090205490565b6001600160a01b0382166000908152600a602052604090205461063b90611d6e565b6000546001600160a01b03163314610daf5760405162461bcd60e51b81526004016106f690612c9f565b600080546040516001600160a01b0390911690600080516020612f54833981519152908390a3600080546001600160a01b03191690556003805460ff19166001179055565b6003546001600160a01b03610100909104163314610e245760405162461bcd60e51b81526004016106f690612cd4565b60038054911515600160a81b0260ff60a81b19909216919091179055565b600061063733846106bd85604051806060016040528060258152602001612f7460259139336000908152600c602090815260408083206001600160a01b038d1684529091529020549190611907565b6001546001600160a01b03163314610f005760405162461bcd60e51b815260206004820152602c60248201527f4f6e6c79207468652070726576696f7573206f776e65722063616e20756e6c6f60448201526b0636b206f6e776572736869760a41b60648201526084016106f6565b60035460ff1615610f5d5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420756e6c6f636b2072656e6f756e636564206f776e65727368696044820152600760fc1b60648201526084016106f6565b6002544211610fae5760405162461bcd60e51b815260206004820152601c60248201527f54686520636f6e7472616374206973207374696c6c206c6f636b65640000000060448201526064016106f6565b600154600080546040516001600160a01b039384169390911691600080516020612f5483398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610637338484611525565b6003546001600160a01b0361010090910416331461103a5760405162461bcd60e51b81526004016106f690612cd4565b6001600160a01b0381166110ac5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420776974686472617720746865204554482062616c616e636520604482015272746f20746865207a65726f206164647265737360681b60648201526084016106f6565b60006010541161110d5760405162461bcd60e51b815260206004820152602660248201527f546865204554482062616c616e6365206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016106f6565b6010805460009182905560405190916001600160a01b0384169183156108fc0291849190818181858888f1935050505015801561114e573d6000803e3d6000fd5b505050565b6003546001600160a01b036101009091041633146111835760405162461bcd60e51b81526004016106f690612cd4565b6015805460ff60a81b1916600160a81b8315158102919091179182905560405160ff9190920416151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599060200160405180910390a150565b6000546001600160a01b031633146112085760405162461bcd60e51b81526004016106f690612c9f565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556112378142612d89565b600255600080546040516001600160a01b0390911690600080516020612f54833981519152908390a350565b6003546001600160a01b036101009091041633146112935760405162461bcd60e51b81526004016106f690612cd4565b6003546040516001600160a01b0380841692610100900416907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b031633146113245760405162461bcd60e51b81526004016106f690612c9f565b6001600160a01b0381166113895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106f6565b600080546040516001600160a01b0380851693921691600080516020612f5483398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006113de8284612da1565b9392505050565b60006113de8284612ece565b6001600160a01b03831661145b5760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b60648201526084016106f6565b6001600160a01b0382166114c35760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b60648201526084016106f6565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166115905760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b7a65726f206164647265737360a01b60648201526084016106f6565b6001600160a01b0382166115f95760405162461bcd60e51b815260206004820152602a60248201527f42617365526669546f6b656e3a207472616e7366657220746f20746865207a65604482015269726f206164647265737360b01b60648201526084016106f6565b6007546001600160a01b038481169116141561166c5760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b6275726e206164647265737360a01b60648201526084016106f6565b600081116116ce5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016106f6565b600354600190600160a81b900460ff16156116eb575060006118a7565b60646116f96012600a612e04565b6117089064174876e800612eaf565b6117129190612da1565b82118015611726575061172484611deb565b155b8015611738575061173683611e30565b155b156117965760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016106f6565b600060146117a66012600a612e04565b6117b59064174876e800612eaf565b6117bf9190612da1565b1180156117d257506117d084611deb565b155b80156117e457506117e283611e30565b155b80156117fe57506015546001600160a01b03848116911614155b156118a757600061180e84610d26565b9050601461181e6012600a612e04565b61182d9064174876e800612eaf565b6118379190612da1565b6118418483612d89565b11156118a55760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b60648201526084016106f6565b505b6001600160a01b0384166000908152600d602052604090205460ff16806118e657506001600160a01b0383166000908152600d602052604090205460ff165b156118ef575060005b6118fb84848484611e8c565b610b2284848484611ebb565b6000818484111561192b5760405162461bcd60e51b81526004016106f69190612c4c565b505050900390565b60006113de8284612d89565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561197d57600080fd5b505afa158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190612ad8565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156119fd57600080fd5b505afa158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a359190612ad8565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab59190612ad8565b601580546001600160a01b03199081166001600160a01b039384161790915560148054909116838316179055604051908316907fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1590600090a25050565b6000806000611b1f612076565b9092509050611b2e82826113d2565b9250505090565b60006113de8284612eaf565b6007546001600160a01b03166000908152600a6020526040902054611b669082611933565b600780546001600160a01b039081166000908152600a602090815260408083209590955592549091168152600e909152205460ff1615611be1576007546001600160a01b03166000908152600b6020526040902054611bc59083611933565b6007546001600160a01b03166000908152600b60205260409020555b6007546040518381526001600160a01b03918216918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611518565b60008080808080611c406103e8611c3a8a8a611b35565b906113d2565b90506000611c4e89836113e5565b90506000611c5a611b12565b90506000611c688b83611b35565b90506000611c768584611b35565b90506000611c8483836113e5565b929d929c9b5093995091975095505050505050565b60006113de611ca784610d26565b5060095490565b6001600160a01b0381166000908152600a602052604090205415611d08576001600160a01b0381166000908152600a6020526040902054611cee90611d6e565b6001600160a01b0382166000908152600b60205260409020555b6001600160a01b03166000818152600e60205260408120805460ff19166001908117909155600f805491820181559091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319169091179055565b6000600454821115611dd55760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016106f6565b6000611ddf611b12565b90506113de83826113d2565b600080546001600160a01b0383811691161480611e1557506006546001600160a01b038381169116145b8061063b5750506005546001600160a01b0390811691161490565b600080546001600160a01b0383811691161480611e5a57506007546001600160a01b038381169116145b80611e1557506006546001600160a01b038381169116148061063b5750506005546001600160a01b0390811691161490565b600354600160a81b900460ff16610b22576000611ea830610d26565b9050611eb4818661229d565b5050505050565b6000611ec78584611c99565b905081611ed2575060005b6000806000806000611ee48887611c23565b6001600160a01b038f166000908152600a602052604090205494995092975090955093509150611f1490866113e5565b6001600160a01b03808c166000908152600a602052604080822093909355908b1681522054611f439085611933565b6001600160a01b03808b166000908152600a6020908152604080832094909455918d168152600e909152205460ff1615611fb4576001600160a01b038a166000908152600b6020526040902054611f9a90846113e5565b6001600160a01b038b166000908152600b60205260409020555b6001600160a01b0389166000908152600e602052604090205460ff1615612012576001600160a01b0389166000908152600b6020526040902054611ff89083611933565b6001600160a01b038a166000908152600b60205260409020555b61201d888288612307565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161206291815260200190565b60405180910390a350505050505050505050565b60045460009081908161208b6012600a612e04565b61209a9064174876e800612eaf565b905060005b600f548110156122345782600a6000600f84815481106120cf57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612148575081600b6000600f848154811061212157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156121765760045461215c6012600a612e04565b61216b9064174876e800612eaf565b945094505050509091565b6121ca600a6000600f848154811061219e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906113e5565b9250612220600b6000600f84815481106121f457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906113e5565b91508061222c81612ee5565b91505061209f565b50801580612267575061226461224c6012600a612e04565b61225b9064174876e800612eaf565b600454906113d2565b82105b156122945760045461227b6012600a612e04565b61228a9064174876e800612eaf565b9350935050509091565b90939092509050565b60165482106122ac5760165491505b601754821080159081906122c95750601554600160a81b900460ff165b80156122df5750601554600160a01b900460ff16155b80156122f957506015546001600160a01b03838116911614155b1561114e5761114e83612330565b6000811180156123215750600354600160a81b900460ff16155b1561114e5761114e83836123d7565b6015805460ff60a01b1916600160a01b17905560006123508260026113d2565b9050600061235e83836113e5565b90504761236a8361251d565b600061237647836113e5565b905061238283826126a2565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506015805460ff60a01b19169055505050565b600354600160a81b900460ff16156123ed575050565b60006123f860085490565b905060005b81811015610b22576000806000612413846127d9565b50925092509250816000141561242b5750505061250b565b600383600581111561244d57634e487b7160e01b600052602160045260246000fd5b14156124645761245f87878487612890565b612507565b600183600581111561248657634e487b7160e01b600052602160045260246000fd5b14156124985761245f878784876128cd565b60008360058111156124ba57634e487b7160e01b600052602160045260246000fd5b14156124c557612507565b60058360058111156124e757634e487b7160e01b600052602160045260246000fd5b14156124fa5761245f8787848488612904565b612507878784848861290d565b5050505b8061251581612ee5565b9150506123fd565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061256057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156125b457600080fd5b505afa1580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190612ad8565b8160018151811061260d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260145461263391309116846129d0565b60145460405163791ac94760e01b81526001600160a01b039091169063791ac9479061266c908590600090869030904290600401612d19565b600060405180830381600087803b15801561268657600080fd5b505af115801561269a573d6000803e3d6000fd5b505050505050565b6014546126ba9030906001600160a01b0316846129d0565b601454600090819081906001600160a01b031663f305d71985308885806126e96000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561274c57600080fd5b505af1158015612760573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127859190612c1f565b47601055604080518481526020810184905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a15050505050565b60008060008060006127ea866129db565b60408051608081019091528154909190829060ff16600581111561281e57634e487b7160e01b600052602160045260246000fd5b600581111561283d57634e487b7160e01b600052602160045260246000fd5b8152600182015460208083019190915260028301546001600160a01b0316604080840191909152600390930154606092830152835190840151928401519390910151909991985091965090945092505050565b60006128a26103e8611c3a8786611b35565b905060006128b08286611b35565b6004549091506128c090826113e5565b60045561269a8383612a80565b60006128df6103e8611c3a8786611b35565b905060006128ed8286611b35565b90506128fa308383611b41565b61269a8383612a80565b611eb485858585855b600061291f6103e8611c3a8887611b35565b9050600061292d8287611b35565b6001600160a01b0385166000908152600a60205260409020549091506129539082611933565b6001600160a01b0385166000908152600a6020908152604080832093909355600e9052205460ff16156129bd576001600160a01b0384166000908152600b60205260409020546129a39083611933565b6001600160a01b0385166000908152600b60205260409020555b6129c78383612a80565b50505050505050565b61114e8383836113f1565b60006008548210612a4a5760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b60648201526084016106f6565b60088281548110612a6b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600402019050919050565b6000612a8b836129db565b6003810154909150612a9d9083611933565b6003909101555050565b80358015158114612ab757600080fd5b919050565b600060208284031215612acd578081fd5b81356113de81612f16565b600060208284031215612ae9578081fd5b81516113de81612f16565b60008060408385031215612b06578081fd5b8235612b1181612f16565b91506020830135612b2181612f16565b809150509250929050565b600080600060608486031215612b40578081fd5b8335612b4b81612f16565b92506020840135612b5b81612f16565b929592945050506040919091013590565b60008060408385031215612b7e578182fd5b8235612b8981612f16565b9150612b9760208401612aa7565b90509250929050565b60008060408385031215612bb2578182fd5b8235612bbd81612f16565b946020939093013593505050565b600060208284031215612bdc578081fd5b6113de82612aa7565b600060208284031215612bf6578081fd5b5035919050565b60008060408385031215612c0f578182fd5b82359150612b9760208401612aa7565b600080600060608486031215612c33578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b81811015612c7857858101830151858201604001528201612c5c565b81811115612c895783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616040820152643730b3b2b960d91b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612d685784516001600160a01b031683529383019391830191600101612d43565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612d9c57612d9c612f00565b500190565b600082612dbc57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115612dfc578160001904821115612de257612de2612f00565b80851615612def57918102915b93841c9390800290612dc6565b509250929050565b60006113de60ff841683600082612e1d5750600161063b565b81612e2a5750600061063b565b8160018114612e405760028114612e4a57612e66565b600191505061063b565b60ff841115612e5b57612e5b612f00565b50506001821b61063b565b5060208310610133831016604e8410600b8410161715612e89575081810a61063b565b612e938383612dc1565b8060001904821115612ea757612ea7612f00565b029392505050565b6000816000190483118215151615612ec957612ec9612f00565b500290565b600082821015612ee057612ee0612f00565b500390565b6000600019821415612ef957612ef9612f00565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461093357600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122051de055e584ab0c35c5efa32437aa2aa01d0cf5b125dab120769c12fd7d71db264736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101d15760003560e01c806370a08231116100f7578063a69df4b511610095578063dd46706411610064578063dd46706414610584578063dd62ed3e146105a4578063e4edf852146105ea578063f2fde38b1461060a57600080fd5b8063a69df4b51461050f578063a9059cbb14610524578063b7671a0d14610544578063c49b9a801461056457600080fd5b806388f82020116100d157806388f820201461046b5780638da5cb5b146104a457806395d89b41146104c2578063a457c2d7146104ef57600080fd5b806370a0823114610416578063715018a61461043657806374778cdc1461044b57600080fd5b806341cb87fc1161016f57806352390c021161013e57806352390c02146103885780635342acb4146103a8578063602bc62b146103e15780636612e66f146103f657600080fd5b806341cb87fc146102f157806342966c68146103115780634549b03914610331578063481c6a751461035157600080fd5b806323b872dd116101ab57806323b872dd14610273578063313ce567146102935780633685d419146102af57806339509351146102d157600080fd5b806306fdde03146101dd578063095ea7b31461022057806318160ddd1461025057600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b5060408051808201909152600881526721aca716a1a7a4a760c11b60208201525b6040516102179190612c4c565b60405180910390f35b34801561022c57600080fd5b5061024061023b366004612ba0565b61062a565b6040519015158152602001610217565b34801561025c57600080fd5b50610265610641565b604051908152602001610217565b34801561027f57600080fd5b5061024061028e366004612b2c565b610663565b34801561029f57600080fd5b5060405160128152602001610217565b3480156102bb57600080fd5b506102cf6102ca366004612abc565b6106cc565b005b3480156102dd57600080fd5b506102406102ec366004612ba0565b6108c4565b3480156102fd57600080fd5b506102cf61030c366004612abc565b6108fa565b34801561031d57600080fd5b506102cf61032c366004612be5565b610936565b34801561033d57600080fd5b5061026561034c366004612bfd565b610b28565b34801561035d57600080fd5b5060035461010090046001600160a01b03165b6040516001600160a01b039091168152602001610217565b34801561039457600080fd5b506102cf6103a3366004612abc565b610bd7565b3480156103b457600080fd5b506102406103c3366004612abc565b6001600160a01b03166000908152600d602052604090205460ff1690565b3480156103ed57600080fd5b50600254610265565b34801561040257600080fd5b506102cf610411366004612b6c565b610cd1565b34801561042257600080fd5b50610265610431366004612abc565b610d26565b34801561044257600080fd5b506102cf610d85565b34801561045757600080fd5b506102cf610466366004612bcb565b610df4565b34801561047757600080fd5b50610240610486366004612abc565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156104b057600080fd5b506000546001600160a01b0316610370565b3480156104ce57600080fd5b5060408051808201909152600481526343594e4360e01b602082015261020a565b3480156104fb57600080fd5b5061024061050a366004612ba0565b610e42565b34801561051b57600080fd5b506102cf610e91565b34801561053057600080fd5b5061024061053f366004612ba0565b610ffd565b34801561055057600080fd5b506102cf61055f366004612abc565b61100a565b34801561057057600080fd5b506102cf61057f366004612bcb565b611153565b34801561059057600080fd5b506102cf61059f366004612be5565b6111de565b3480156105b057600080fd5b506102656105bf366004612af4565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156105f657600080fd5b506102cf610605366004612abc565b611263565b34801561061657600080fd5b506102cf610625366004612abc565b6112fa565b60006106373384846113f1565b5060015b92915050565b600061064f6012600a612e04565b61065e9064174876e800612eaf565b905090565b6000610670848484611525565b6106c284336106bd85604051806060016040528060288152602001612f2c602891396001600160a01b038a166000908152600c602090815260408083203384529091529020549190611907565b6113f1565b5060019392505050565b6000546001600160a01b031633146106ff5760405162461bcd60e51b81526004016106f690612c9f565b60405180910390fd5b6001600160a01b0381166000908152600e602052604090205460ff166107675760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c7564656400000000000000000060448201526064016106f6565b60005b600f548110156108c057816001600160a01b0316600f828154811061079f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156108ae57600f80546107ca90600190612ece565b815481106107e857634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600f80546001600160a01b03909216918390811061082257634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600b82526040808220829055600e90925220805460ff19169055600f80548061088857634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806108b881612ee5565b91505061076a565b5050565b336000818152600c602090815260408083206001600160a01b038716845290915281205490916106379185906106bd9086611933565b6003546001600160a01b0361010090910416331461092a5760405162461bcd60e51b81526004016106f690612cd4565b6109338161193f565b50565b33806109955760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865207a65726f604482015267206164647265737360c01b60648201526084016106f6565b6007546001600160a01b0382811691161415610a045760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865206275726e604482015267206164647265737360c01b60648201526084016106f6565b6000610a0f82610d26565b905082811015610a735760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a206275726e20616d6f756e7420657863656564604482015268732062616c616e636560b81b60648201526084016106f6565b6000610a87610a80611b12565b8590611b35565b6001600160a01b0384166000908152600a6020526040902054909150610aad90826113e5565b6001600160a01b0384166000908152600a6020908152604080832093909355600e9052205460ff1615610b17576001600160a01b0383166000908152600b6020526040902054610afd90856113e5565b6001600160a01b0384166000908152600b60205260409020555b610b22838583611b41565b50505050565b6000610b366012600a612e04565b610b459064174876e800612eaf565b831115610b945760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016106f6565b81610bb4576000610ba6846000611c23565b5092945061063b9350505050565b6000610bc984610bc43387611c99565b611c23565b5091945061063b9350505050565b6000546001600160a01b03163314610c015760405162461bcd60e51b81526004016106f690612c9f565b6001600160a01b0381166000908152600e602052604090205460ff1615610c6a5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420696e636c7564656400000000000000000060448201526064016106f6565b600f54600a11610cc85760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206578636c756465206d6f7265207468616e203130206163636f604482015263756e747360e01b60648201526084016106f6565b61093381611cae565b6000546001600160a01b03163314610cfb5760405162461bcd60e51b81526004016106f690612c9f565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600e602052604081205460ff1615610d6357506001600160a01b03166000908152600b602052604090205490565b6001600160a01b0382166000908152600a602052604090205461063b90611d6e565b6000546001600160a01b03163314610daf5760405162461bcd60e51b81526004016106f690612c9f565b600080546040516001600160a01b0390911690600080516020612f54833981519152908390a3600080546001600160a01b03191690556003805460ff19166001179055565b6003546001600160a01b03610100909104163314610e245760405162461bcd60e51b81526004016106f690612cd4565b60038054911515600160a81b0260ff60a81b19909216919091179055565b600061063733846106bd85604051806060016040528060258152602001612f7460259139336000908152600c602090815260408083206001600160a01b038d1684529091529020549190611907565b6001546001600160a01b03163314610f005760405162461bcd60e51b815260206004820152602c60248201527f4f6e6c79207468652070726576696f7573206f776e65722063616e20756e6c6f60448201526b0636b206f6e776572736869760a41b60648201526084016106f6565b60035460ff1615610f5d5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420756e6c6f636b2072656e6f756e636564206f776e65727368696044820152600760fc1b60648201526084016106f6565b6002544211610fae5760405162461bcd60e51b815260206004820152601c60248201527f54686520636f6e7472616374206973207374696c6c206c6f636b65640000000060448201526064016106f6565b600154600080546040516001600160a01b039384169390911691600080516020612f5483398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610637338484611525565b6003546001600160a01b0361010090910416331461103a5760405162461bcd60e51b81526004016106f690612cd4565b6001600160a01b0381166110ac5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420776974686472617720746865204554482062616c616e636520604482015272746f20746865207a65726f206164647265737360681b60648201526084016106f6565b60006010541161110d5760405162461bcd60e51b815260206004820152602660248201527f546865204554482062616c616e6365206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016106f6565b6010805460009182905560405190916001600160a01b0384169183156108fc0291849190818181858888f1935050505015801561114e573d6000803e3d6000fd5b505050565b6003546001600160a01b036101009091041633146111835760405162461bcd60e51b81526004016106f690612cd4565b6015805460ff60a81b1916600160a81b8315158102919091179182905560405160ff9190920416151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599060200160405180910390a150565b6000546001600160a01b031633146112085760405162461bcd60e51b81526004016106f690612c9f565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556112378142612d89565b600255600080546040516001600160a01b0390911690600080516020612f54833981519152908390a350565b6003546001600160a01b036101009091041633146112935760405162461bcd60e51b81526004016106f690612cd4565b6003546040516001600160a01b0380841692610100900416907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b031633146113245760405162461bcd60e51b81526004016106f690612c9f565b6001600160a01b0381166113895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106f6565b600080546040516001600160a01b0380851693921691600080516020612f5483398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006113de8284612da1565b9392505050565b60006113de8284612ece565b6001600160a01b03831661145b5760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b60648201526084016106f6565b6001600160a01b0382166114c35760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b60648201526084016106f6565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166115905760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b7a65726f206164647265737360a01b60648201526084016106f6565b6001600160a01b0382166115f95760405162461bcd60e51b815260206004820152602a60248201527f42617365526669546f6b656e3a207472616e7366657220746f20746865207a65604482015269726f206164647265737360b01b60648201526084016106f6565b6007546001600160a01b038481169116141561166c5760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b6275726e206164647265737360a01b60648201526084016106f6565b600081116116ce5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016106f6565b600354600190600160a81b900460ff16156116eb575060006118a7565b60646116f96012600a612e04565b6117089064174876e800612eaf565b6117129190612da1565b82118015611726575061172484611deb565b155b8015611738575061173683611e30565b155b156117965760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016106f6565b600060146117a66012600a612e04565b6117b59064174876e800612eaf565b6117bf9190612da1565b1180156117d257506117d084611deb565b155b80156117e457506117e283611e30565b155b80156117fe57506015546001600160a01b03848116911614155b156118a757600061180e84610d26565b9050601461181e6012600a612e04565b61182d9064174876e800612eaf565b6118379190612da1565b6118418483612d89565b11156118a55760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b60648201526084016106f6565b505b6001600160a01b0384166000908152600d602052604090205460ff16806118e657506001600160a01b0383166000908152600d602052604090205460ff165b156118ef575060005b6118fb84848484611e8c565b610b2284848484611ebb565b6000818484111561192b5760405162461bcd60e51b81526004016106f69190612c4c565b505050900390565b60006113de8284612d89565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561197d57600080fd5b505afa158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b59190612ad8565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156119fd57600080fd5b505afa158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a359190612ad8565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab59190612ad8565b601580546001600160a01b03199081166001600160a01b039384161790915560148054909116838316179055604051908316907fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1590600090a25050565b6000806000611b1f612076565b9092509050611b2e82826113d2565b9250505090565b60006113de8284612eaf565b6007546001600160a01b03166000908152600a6020526040902054611b669082611933565b600780546001600160a01b039081166000908152600a602090815260408083209590955592549091168152600e909152205460ff1615611be1576007546001600160a01b03166000908152600b6020526040902054611bc59083611933565b6007546001600160a01b03166000908152600b60205260409020555b6007546040518381526001600160a01b03918216918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611518565b60008080808080611c406103e8611c3a8a8a611b35565b906113d2565b90506000611c4e89836113e5565b90506000611c5a611b12565b90506000611c688b83611b35565b90506000611c768584611b35565b90506000611c8483836113e5565b929d929c9b5093995091975095505050505050565b60006113de611ca784610d26565b5060095490565b6001600160a01b0381166000908152600a602052604090205415611d08576001600160a01b0381166000908152600a6020526040902054611cee90611d6e565b6001600160a01b0382166000908152600b60205260409020555b6001600160a01b03166000818152600e60205260408120805460ff19166001908117909155600f805491820181559091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319169091179055565b6000600454821115611dd55760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016106f6565b6000611ddf611b12565b90506113de83826113d2565b600080546001600160a01b0383811691161480611e1557506006546001600160a01b038381169116145b8061063b5750506005546001600160a01b0390811691161490565b600080546001600160a01b0383811691161480611e5a57506007546001600160a01b038381169116145b80611e1557506006546001600160a01b038381169116148061063b5750506005546001600160a01b0390811691161490565b600354600160a81b900460ff16610b22576000611ea830610d26565b9050611eb4818661229d565b5050505050565b6000611ec78584611c99565b905081611ed2575060005b6000806000806000611ee48887611c23565b6001600160a01b038f166000908152600a602052604090205494995092975090955093509150611f1490866113e5565b6001600160a01b03808c166000908152600a602052604080822093909355908b1681522054611f439085611933565b6001600160a01b03808b166000908152600a6020908152604080832094909455918d168152600e909152205460ff1615611fb4576001600160a01b038a166000908152600b6020526040902054611f9a90846113e5565b6001600160a01b038b166000908152600b60205260409020555b6001600160a01b0389166000908152600e602052604090205460ff1615612012576001600160a01b0389166000908152600b6020526040902054611ff89083611933565b6001600160a01b038a166000908152600b60205260409020555b61201d888288612307565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161206291815260200190565b60405180910390a350505050505050505050565b60045460009081908161208b6012600a612e04565b61209a9064174876e800612eaf565b905060005b600f548110156122345782600a6000600f84815481106120cf57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612148575081600b6000600f848154811061212157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156121765760045461215c6012600a612e04565b61216b9064174876e800612eaf565b945094505050509091565b6121ca600a6000600f848154811061219e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906113e5565b9250612220600b6000600f84815481106121f457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906113e5565b91508061222c81612ee5565b91505061209f565b50801580612267575061226461224c6012600a612e04565b61225b9064174876e800612eaf565b600454906113d2565b82105b156122945760045461227b6012600a612e04565b61228a9064174876e800612eaf565b9350935050509091565b90939092509050565b60165482106122ac5760165491505b601754821080159081906122c95750601554600160a81b900460ff165b80156122df5750601554600160a01b900460ff16155b80156122f957506015546001600160a01b03838116911614155b1561114e5761114e83612330565b6000811180156123215750600354600160a81b900460ff16155b1561114e5761114e83836123d7565b6015805460ff60a01b1916600160a01b17905560006123508260026113d2565b9050600061235e83836113e5565b90504761236a8361251d565b600061237647836113e5565b905061238283826126a2565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506015805460ff60a01b19169055505050565b600354600160a81b900460ff16156123ed575050565b60006123f860085490565b905060005b81811015610b22576000806000612413846127d9565b50925092509250816000141561242b5750505061250b565b600383600581111561244d57634e487b7160e01b600052602160045260246000fd5b14156124645761245f87878487612890565b612507565b600183600581111561248657634e487b7160e01b600052602160045260246000fd5b14156124985761245f878784876128cd565b60008360058111156124ba57634e487b7160e01b600052602160045260246000fd5b14156124c557612507565b60058360058111156124e757634e487b7160e01b600052602160045260246000fd5b14156124fa5761245f8787848488612904565b612507878784848861290d565b5050505b8061251581612ee5565b9150506123fd565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061256057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156125b457600080fd5b505afa1580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190612ad8565b8160018151811061260d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260145461263391309116846129d0565b60145460405163791ac94760e01b81526001600160a01b039091169063791ac9479061266c908590600090869030904290600401612d19565b600060405180830381600087803b15801561268657600080fd5b505af115801561269a573d6000803e3d6000fd5b505050505050565b6014546126ba9030906001600160a01b0316846129d0565b601454600090819081906001600160a01b031663f305d71985308885806126e96000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561274c57600080fd5b505af1158015612760573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127859190612c1f565b47601055604080518481526020810184905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a15050505050565b60008060008060006127ea866129db565b60408051608081019091528154909190829060ff16600581111561281e57634e487b7160e01b600052602160045260246000fd5b600581111561283d57634e487b7160e01b600052602160045260246000fd5b8152600182015460208083019190915260028301546001600160a01b0316604080840191909152600390930154606092830152835190840151928401519390910151909991985091965090945092505050565b60006128a26103e8611c3a8786611b35565b905060006128b08286611b35565b6004549091506128c090826113e5565b60045561269a8383612a80565b60006128df6103e8611c3a8786611b35565b905060006128ed8286611b35565b90506128fa308383611b41565b61269a8383612a80565b611eb485858585855b600061291f6103e8611c3a8887611b35565b9050600061292d8287611b35565b6001600160a01b0385166000908152600a60205260409020549091506129539082611933565b6001600160a01b0385166000908152600a6020908152604080832093909355600e9052205460ff16156129bd576001600160a01b0384166000908152600b60205260409020546129a39083611933565b6001600160a01b0385166000908152600b60205260409020555b6129c78383612a80565b50505050505050565b61114e8383836113f1565b60006008548210612a4a5760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b60648201526084016106f6565b60088281548110612a6b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600402019050919050565b6000612a8b836129db565b6003810154909150612a9d9083611933565b6003909101555050565b80358015158114612ab757600080fd5b919050565b600060208284031215612acd578081fd5b81356113de81612f16565b600060208284031215612ae9578081fd5b81516113de81612f16565b60008060408385031215612b06578081fd5b8235612b1181612f16565b91506020830135612b2181612f16565b809150509250929050565b600080600060608486031215612b40578081fd5b8335612b4b81612f16565b92506020840135612b5b81612f16565b929592945050506040919091013590565b60008060408385031215612b7e578182fd5b8235612b8981612f16565b9150612b9760208401612aa7565b90509250929050565b60008060408385031215612bb2578182fd5b8235612bbd81612f16565b946020939093013593505050565b600060208284031215612bdc578081fd5b6113de82612aa7565b600060208284031215612bf6578081fd5b5035919050565b60008060408385031215612c0f578182fd5b82359150612b9760208401612aa7565b600080600060608486031215612c33578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b81811015612c7857858101830151858201604001528201612c5c565b81811115612c895783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616040820152643730b3b2b960d91b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612d685784516001600160a01b031683529383019391830191600101612d43565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612d9c57612d9c612f00565b500190565b600082612dbc57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115612dfc578160001904821115612de257612de2612f00565b80851615612def57918102915b93841c9390800290612dc6565b509250929050565b60006113de60ff841683600082612e1d5750600161063b565b81612e2a5750600061063b565b8160018114612e405760028114612e4a57612e66565b600191505061063b565b60ff841115612e5b57612e5b612f00565b50506001821b61063b565b5060208310610133831016604e8410600b8410161715612e89575081810a61063b565b612e938383612dc1565b8060001904821115612ea757612ea7612f00565b029392505050565b6000816000190483118215151615612ec957612ec9612f00565b500290565b600082821015612ee057612ee0612f00565b500390565b6000600019821415612ef957612ef9612f00565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461093357600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122051de055e584ab0c35c5efa32437aa2aa01d0cf5b125dab120769c12fd7d71db264736f6c63430008040033

Deployed Bytecode Sourcemap

37235:226:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13872:79;;;;;;;;;;-1:-1:-1;13944:4:0;;;;;;;;;;;;-1:-1:-1;;;13944:4:0;;;;13872:79;;;;;;;:::i;:::-;;;;;;;;14965:175;;;;;;;;;;-1:-1:-1;14965:175:0;;;;;:::i;:::-;;:::i;:::-;;;4779:14:1;;4772:22;4754:41;;4742:2;4727:18;14965:175:0;4709:92:1;14242:110:0;;;;;;;;;;;;;:::i;:::-;;;15553:25:1;;;15541:2;15526:18;14242:110:0;15508:76:1;15152:330:0;;;;;;;;;;-1:-1:-1;15152:330:0;;;;;:::i;:::-;;:::i;14054:79::-;;;;;;;;;;-1:-1:-1;14054:79:0;;9117:2;17043:36:1;;17031:2;17016:18;14054:79:0;16998:87:1;19408:499:0;;;;;;;;;;-1:-1:-1;19408:499:0;;;;;:::i;:::-;;:::i;:::-;;17155:218;;;;;;;;;;-1:-1:-1;17155:218:0;;;;;:::i;:::-;;:::i;32251:109::-;;;;;;;;;;-1:-1:-1;32251:109:0;;;;;:::i;:::-;;:::i;15538:784::-;;;;;;;;;;-1:-1:-1;15538:784:0;;;;;:::i;:::-;;:::i;17968:480::-;;;;;;;;;;-1:-1:-1;17968:480:0;;;;;:::i;:::-;;:::i;7552:67::-;;;;;;;;;;-1:-1:-1;7608:8:0;;;;;-1:-1:-1;;;;;7608:8:0;7552:67;;;-1:-1:-1;;;;;3649:32:1;;;3631:51;;3619:2;3604:18;7552:67:0;3586:102:1;18854:261:0;;;;;;;;;;-1:-1:-1;18854:261:0;;;;;:::i;:::-;;:::i;20037:109::-;;;;;;;;;;-1:-1:-1;20037:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;20116:27:0;20101:4;20116:27;;;:18;:27;;;;;;;;;20037:109;6496:90;;;;;;;;;;-1:-1:-1;6569:9:0;;6496:90;;19915:116;;;;;;;;;;-1:-1:-1;19915:116:0;;;;;:::i;:::-;;:::i;14364:233::-;;;;;;;;;;-1:-1:-1;14364:233:0;;;;;:::i;:::-;;:::i;6064:176::-;;;;;;;;;;;;;:::i;12471:100::-;;;;;;;;;;-1:-1:-1;12471:100:0;;;;;:::i;:::-;;:::i;17658:133::-;;;;;;;;;;-1:-1:-1;17658:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;17752:31:0;17728:4;17752:31;;;:22;:31;;;;;;;;;17658:133;5854:79;;;;;;;;;;-1:-1:-1;5892:7:0;5919:6;-1:-1:-1;;;;;5919:6:0;5854:79;;13961:83;;;;;;;;;;-1:-1:-1;14035:6:0;;;;;;;;;;;;-1:-1:-1;;;14035:6:0;;;;13961:83;;17381:269;;;;;;;;;;-1:-1:-1;17381:269:0;;;;;:::i;:::-;;:::i;6824:387::-;;;;;;;;;;;;;:::i;14609:180::-;;;;;;;;;;-1:-1:-1;14609:180:0;;;;;:::i;:::-;;:::i;32748:427::-;;;;;;;;;;-1:-1:-1;32748:427:0;;;;;:::i;:::-;;:::i;32551:186::-;;;;;;;;;;-1:-1:-1;32551:186:0;;;;;:::i;:::-;;:::i;6592:226::-;;;;;;;;;;-1:-1:-1;6592:226:0;;;;;:::i;:::-;;:::i;14801:152::-;;;;;;;;;;-1:-1:-1;14801:152:0;;;;;:::i;:::-;-1:-1:-1;;;;;14914:18:0;;;14884:7;14914:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14801:152;7758:176;;;;;;;;;;-1:-1:-1;7758:176:0;;;;;:::i;:::-;;:::i;6246:244::-;;;;;;;;;;-1:-1:-1;6246:244:0;;;;;:::i;:::-;;:::i;14965:175::-;15042:4;15063:39;1539:10;15086:7;15095:6;15063:8;:39::i;:::-;-1:-1:-1;15124:4:0;14965:175;;;;;:::o;14242:110::-;14297:7;9161:12;9117:2;9161;:12;:::i;:::-;9272:21;;:12;:21;:::i;:::-;14321:19;;14242:110;:::o;15152:330::-;15252:4;15272:36;15282:6;15290:9;15301:6;15272:9;:36::i;:::-;15323:121;15332:6;1539:10;15354:89;15392:6;15354:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15354:19:0;;;;;;:11;:19;;;;;;;;1539:10;15354:33;;;;;;;;;;:37;:89::i;:::-;15323:8;:121::i;:::-;-1:-1:-1;15466:4:0;15152:330;;;;;:::o;19408:499::-;5979:6;;-1:-1:-1;;;;;5979:6:0;1539:10;5979:22;5971:67;;;;-1:-1:-1;;;5971:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;19490:31:0;::::1;;::::0;;;:22:::1;:31;::::0;;;;;::::1;;19482:67;;;::::0;-1:-1:-1;;;19482:67:0;;8377:2:1;19482:67:0::1;::::0;::::1;8359:21:1::0;8416:2;8396:18;;;8389:30;8455:25;8435:18;;;8428:53;8498:18;;19482:67:0::1;8349:173:1::0;19482:67:0::1;19565:9;19560:340;19584:9;:16:::0;19580:20;::::1;19560:340;;;19642:7;-1:-1:-1::0;;;;;19626:23:0::1;:9;19636:1;19626:12;;;;;;-1:-1:-1::0;;;19626:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;19626:12:0::1;:23;19622:267;;;19685:9;19695:16:::0;;:20:::1;::::0;19714:1:::1;::::0;19695:20:::1;:::i;:::-;19685:31;;;;;;-1:-1:-1::0;;;19685:31:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;19670:9:::1;:12:::0;;-1:-1:-1;;;;;19685:31:0;;::::1;::::0;19680:1;;19670:12;::::1;;;-1:-1:-1::0;;;19670:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;19670:46:0::1;-1:-1:-1::0;;;;;19670:46:0;;::::1;;::::0;;19735:18;;::::1;::::0;;:9:::1;:18:::0;;;;;;:22;;;19776::::1;:31:::0;;;;:39;;-1:-1:-1;;19776:39:0::1;::::0;;19834:9:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;19834:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;19834:15:0;;;;;-1:-1:-1;;;;;;19834:15:0::1;::::0;;;;;19560:340:::1;19408:499:::0;:::o;19622:267::-:1;19602:3:::0;::::1;::::0;::::1;:::i;:::-;;;;19560:340;;;;19408:499:::0;:::o;17155:218::-;1539:10;17243:4;17292:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17292:34:0;;;;;;;;;;17243:4;;17260:83;;17283:7;;17292:50;;17331:10;17292:38;:50::i;32251:109::-;7666:8;;-1:-1:-1;;;;;7666:8:0;;;;;1539:10;7666:24;7658:74;;;;-1:-1:-1;;;7658:74:0;;;;;;;:::i;:::-;32327:25:::1;32345:6;32327:17;:25::i;:::-;32251:109:::0;:::o;15538:784::-;1539:10;;15630:73;;;;-1:-1:-1;;;15630:73:0;;15200:2:1;15630:73:0;;;15182:21:1;15239:2;15219:18;;;15212:30;15278:34;15258:18;;;15251:62;-1:-1:-1;;;15329:18:1;;;15322:38;15377:19;;15630:73:0;15172:230:1;15630:73:0;15740:11;;-1:-1:-1;;;;;15722:30:0;;;15740:11;;15722:30;;15714:83;;;;-1:-1:-1;;;15714:83:0;;7968:2:1;15714:83:0;;;7950:21:1;8007:2;7987:18;;;7980:30;8046:34;8026:18;;;8019:62;-1:-1:-1;;;8097:18:1;;;8090:38;8145:19;;15714:83:0;7940:230:1;15714:83:0;15810:15;15828:17;15838:6;15828:9;:17::i;:::-;15810:35;;15875:6;15864:7;:17;;15856:71;;;;-1:-1:-1;;;15856:71:0;;10729:2:1;15856:71:0;;;10711:21:1;10768:2;10748:18;;;10741:30;10807:34;10787:18;;;10780:62;-1:-1:-1;;;10858:18:1;;;10851:39;10907:19;;15856:71:0;10701:231:1;15856:71:0;15940:23;15966:29;15977:17;:15;:17::i;:::-;15966:6;;:10;:29::i;:::-;-1:-1:-1;;;;;16099:26:0;;;;;;:18;:26;;;;;;15940:55;;-1:-1:-1;16099:47:0;;15940:55;16099:30;:47::i;:::-;-1:-1:-1;;;;;16070:26:0;;;;;;:18;:26;;;;;;;;:76;;;;16161:22;:30;;;;;;16157:98;;;-1:-1:-1;;;;;16226:17:0;;;;;;:9;:17;;;;;;:29;;16248:6;16226:21;:29::i;:::-;-1:-1:-1;;;;;16206:17:0;;;;;;:9;:17;;;;;:49;16157:98;16268:46;16281:6;16289;16297:15;16268:11;:46::i;:::-;15538:784;;;;:::o;17968:480::-;18060:7;9161:12;9117:2;9161;:12;:::i;:::-;9272:21;;:12;:21;:::i;:::-;18088:7;:23;;18080:67;;;;-1:-1:-1;;;18080:67:0;;9960:2:1;18080:67:0;;;9942:21:1;9999:2;9979:18;;;9972:30;10038:33;10018:18;;;10011:61;10089:18;;18080:67:0;9932:181:1;18080:67:0;18163:17;18158:283;;18198:15;18221:21;18232:7;18240:1;18221:10;:21::i;:::-;-1:-1:-1;18197:45:0;;-1:-1:-1;18257:14:0;;-1:-1:-1;;;;18257:14:0;18158:283;18306:23;18336:56;18347:7;18355:36;1539:10;18383:7;18355:13;:36::i;:::-;18336:10;:56::i;:::-;-1:-1:-1;18304:88:0;;-1:-1:-1;18407:22:0;;-1:-1:-1;;;;18407:22:0;18854:261;5979:6;;-1:-1:-1;;;;;5979:6:0;1539:10;5979:22;5971:67;;;;-1:-1:-1;;;5971:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18939:31:0;::::1;;::::0;;;:22:::1;:31;::::0;;;;;::::1;;18938:32;18930:68;;;::::0;-1:-1:-1;;;18930:68:0;;7616:2:1;18930:68:0::1;::::0;::::1;7598:21:1::0;7655:2;7635:18;;;7628:30;7694:25;7674:18;;;7667:53;7737:18;;18930:68:0::1;7588:173:1::0;18930:68:0::1;19017:9;:16:::0;19036:2:::1;-1:-1:-1::0;19009:70:0::1;;;::::0;-1:-1:-1;;;19009:70:0;;9555:2:1;19009:70:0::1;::::0;::::1;9537:21:1::0;9594:2;9574:18;;;9567:30;9633:34;9613:18;;;9606:62;-1:-1:-1;;;9684:18:1;;;9677:34;9728:19;;19009:70:0::1;9527:226:1::0;19009:70:0::1;19090:17;19099:7;19090:8;:17::i;19915:116::-:0;5979:6;;-1:-1:-1;;;;;5979:6:0;1539:10;5979:22;5971:67;;;;-1:-1:-1;;;5971:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19993:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;19993:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19915:116::o;14364:233::-;-1:-1:-1;;;;;14457:31:0;;14430:7;14457:31;;;:22;:31;;;;;;;;14453:62;;;-1:-1:-1;;;;;;14497:18:0;;;;;:9;:18;;;;;;;14364:233::o;14453:62::-;-1:-1:-1;;;;;14557:27:0;;;;;;:18;:27;;;;;;14537:48;;:19;:48::i;6064:176::-;5979:6;;-1:-1:-1;;;;;5979:6:0;1539:10;5979:22;5971:67;;;;-1:-1:-1;;;5971:67:0;;;;;;;:::i;:::-;6171:1:::1;6155:6:::0;;6134:40:::1;::::0;-1:-1:-1;;;;;6155:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;6134:40:0;6171:1;;6134:40:::1;6202:1;6185:19:::0;;-1:-1:-1;;;;;;6185:19:0::1;::::0;;6215:10:::1;:17:::0;;-1:-1:-1;;6215:17:0::1;6185:19:::0;6215:17:::1;::::0;;6064:176::o;12471:100::-;7666:8;;-1:-1:-1;;;;;7666:8:0;;;;;1539:10;7666:24;7658:74;;;;-1:-1:-1;;;7658:74:0;;;;;;;:::i;:::-;12544:11:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;12544:19:0::1;-1:-1:-1::0;;;;12544:19:0;;::::1;::::0;;;::::1;::::0;;12471:100::o;17381:269::-;17474:4;17491:129;1539:10;17514:7;17523:96;17562:15;17523:96;;;;;;;;;;;;;;;;;1539:10;17523:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17523:34:0;;;;;;;;;;;;:38;:96::i;6824:387::-;6876:14;;-1:-1:-1;;;;;6876:14:0;6894:10;6876:28;6868:85;;;;-1:-1:-1;;;6868:85:0;;6385:2:1;6868:85:0;;;6367:21:1;6424:2;6404:18;;;6397:30;6463:34;6443:18;;;6436:62;-1:-1:-1;;;6514:18:1;;;6507:42;6566:19;;6868:85:0;6357:234:1;6868:85:0;6972:10;;;;:19;6964:65;;;;-1:-1:-1;;;6964:65:0;;13562:2:1;6964:65:0;;;13544:21:1;13601:2;13581:18;;;13574:30;13640:34;13620:18;;;13613:62;-1:-1:-1;;;13691:18:1;;;13684:31;13732:19;;6964:65:0;13534:223:1;6964:65:0;7066:9;;7048:15;:27;7040:69;;;;-1:-1:-1;;;7040:69:0;;5616:2:1;7040:69:0;;;5598:21:1;5655:2;5635:18;;;5628:30;5694;5674:18;;;5667:58;5742:18;;7040:69:0;5588:178:1;7040:69:0;7154:14;;;7146:6;;7125:44;;-1:-1:-1;;;;;7154:14:0;;;;7146:6;;;;-1:-1:-1;;;;;;;;;;;7125:44:0;;7189:14;;;7180:23;;-1:-1:-1;;;;;;7180:23:0;-1:-1:-1;;;;;7189:14:0;;;7180:23;;;;;;6824:387::o;14609:180::-;14689:4;14709:42;1539:10;14733:9;14744:6;14709:9;:42::i;32748:427::-;7666:8;;-1:-1:-1;;;;;7666:8:0;;;;;1539:10;7666:24;7658:74;;;;-1:-1:-1;;;7658:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32843:23:0;::::1;32835:87;;;::::0;-1:-1:-1;;;32835:87:0;;11550:2:1;32835:87:0::1;::::0;::::1;11532:21:1::0;11589:2;11569:18;;;11562:30;11628:34;11608:18;;;11601:62;-1:-1:-1;;;11679:18:1;;;11672:49;11738:19;;32835:87:0::1;11522:241:1::0;32835:87:0::1;32963:1;32941:19;;:23;32933:74;;;::::0;-1:-1:-1;;;32933:74:0;;12741:2:1;32933:74:0::1;::::0;::::1;12723:21:1::0;12780:2;12760:18;;;12753:30;12819:34;12799:18;;;12792:62;-1:-1:-1;;;12870:18:1;;;12863:36;12916:19;;32933:74:0::1;12713:228:1::0;32933:74:0::1;33077:19;::::0;;33060:14:::1;33107:23:::0;;;;33141:26:::1;::::0;33077:19;;-1:-1:-1;;;;;33141:18:0;::::1;::::0;:26;::::1;;;::::0;33077:19;;33141:26;;33060:14;33141:26;33077:19;33141:18;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;7743:1;32748:427:::0;:::o;32551:186::-;7666:8;;-1:-1:-1;;;;;7666:8:0;;;;;1539:10;7666:24;7658:74;;;;-1:-1:-1;;;7658:74:0;;;;;;;:::i;:::-;32631:21:::1;:31:::0;;-1:-1:-1;;;;32631:31:0::1;-1:-1:-1::0;;;32631:31:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;32678:51:::1;::::0;32631:31:::1;32707:21:::0;;;::::1;;4779:14:1::0;4772:22;4754:41;;32678:51:0::1;::::0;4742:2:1;4727:18;32678:51:0::1;;;;;;;32551:186:::0;:::o;6592:226::-;5979:6;;-1:-1:-1;;;;;5979:6:0;1539:10;5979:22;5971:67;;;;-1:-1:-1;;;5971:67:0;;;;;;;:::i;:::-;6673:6:::1;::::0;;;6656:23;;-1:-1:-1;;;;;;6656:23:0;;::::1;-1:-1:-1::0;;;;;6673:6:0;::::1;6656:23;::::0;;;6690:19:::1;::::0;;6732:22:::1;6750:4:::0;6732:15:::1;:22;:::i;:::-;6720:9;:34:::0;6807:1:::1;6791:6:::0;;6770:40:::1;::::0;-1:-1:-1;;;;;6791:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;6770:40:0;6807:1;;6770:40:::1;6592:226:::0;:::o;7758:176::-;7666:8;;-1:-1:-1;;;;;7666:8:0;;;;;1539:10;7666:24;7658:74;;;;-1:-1:-1;;;7658:74:0;;;;;;;:::i;:::-;7873:8:::1;::::0;7851:43:::1;::::0;-1:-1:-1;;;;;7851:43:0;;::::1;::::0;7873:8:::1;::::0;::::1;;::::0;7851:43:::1;::::0;;;::::1;7905:8;:21:::0;;-1:-1:-1;;;;;7905:21:0;;::::1;;;-1:-1:-1::0;;;;;;7905:21:0;;::::1;::::0;;;::::1;::::0;;7758:176::o;6246:244::-;5979:6;;-1:-1:-1;;;;;5979:6:0;1539:10;5979:22;5971:67;;;;-1:-1:-1;;;5971:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6335:22:0;::::1;6327:73;;;::::0;-1:-1:-1;;;6327:73:0;;7209:2:1;6327:73:0::1;::::0;::::1;7191:21:1::0;7248:2;7228:18;;;7221:30;7287:34;7267:18;;;7260:62;-1:-1:-1;;;7338:18:1;;;7331:36;7384:19;;6327:73:0::1;7181:228:1::0;6327:73:0::1;6437:6;::::0;;6416:38:::1;::::0;-1:-1:-1;;;;;6416:38:0;;::::1;::::0;6437:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;6416:38:0;::::1;6465:6;:17:::0;;-1:-1:-1;;;;;;6465:17:0::1;-1:-1:-1::0;;;;;6465:17:0;;;::::1;::::0;;;::::1;::::0;;6246:244::o;1941:82::-;1999:7;2016:5;2020:1;2016;:5;:::i;:::-;2009:12;1941:82;-1:-1:-1;;;1941:82:0:o;1765:::-;1823:7;1840:5;1844:1;1840;:5;:::i;20154:352::-;-1:-1:-1;;;;;20248:19:0;;20240:75;;;;-1:-1:-1;;;20240:75:0;;5973:2:1;20240:75:0;;;5955:21:1;6012:2;5992:18;;;5985:30;6051:34;6031:18;;;6024:62;-1:-1:-1;;;6102:18:1;;;6095:41;6153:19;;20240:75:0;5945:233:1;20240:75:0;-1:-1:-1;;;;;20334:21:0;;20326:75;;;;-1:-1:-1;;;20326:75:0;;14790:2:1;20326:75:0;;;14772:21:1;14829:2;14809:18;;;14802:30;14868:34;14848:18;;;14841:62;-1:-1:-1;;;14919:18:1;;;14912:39;14968:19;;20326:75:0;14762:231:1;20326:75:0;-1:-1:-1;;;;;20414:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20466:32;;15553:25:1;;;20466:32:0;;15526:18:1;20466:32:0;;;;;;;;20154:352;;;:::o;21169:1667::-;-1:-1:-1;;;;;21266:20:0;;21258:77;;;;-1:-1:-1;;;21258:77:0;;8729:2:1;21258:77:0;;;8711:21:1;8768:2;8748:18;;;8741:30;8807:34;8787:18;;;8780:62;-1:-1:-1;;;8858:18:1;;;8851:42;8910:19;;21258:77:0;8701:234:1;21258:77:0;-1:-1:-1;;;;;21354:23:0;;21346:78;;;;-1:-1:-1;;;21346:78:0;;11139:2:1;21346:78:0;;;11121:21:1;11178:2;11158:18;;;11151:30;11217:34;11197:18;;;11190:62;-1:-1:-1;;;11268:18:1;;;11261:40;11318:19;;21346:78:0;11111:232:1;21346:78:0;21461:11;;-1:-1:-1;;;;;21443:30:0;;;21461:11;;21443:30;;21435:87;;;;-1:-1:-1;;;21435:87:0;;9142:2:1;21435:87:0;;;9124:21:1;9181:2;9161:18;;;9154:30;9220:34;9200:18;;;9193:62;-1:-1:-1;;;9271:18:1;;;9264:42;9323:19;;21435:87:0;9114:234:1;21435:87:0;21550:1;21541:6;:10;21533:64;;;;-1:-1:-1;;;21533:64:0;;12331:2:1;21533:64:0;;;12313:21:1;12370:2;12350:18;;;12343:30;12409:34;12389:18;;;12382:62;-1:-1:-1;;;12460:18:1;;;12453:39;12509:19;;21533:64:0;12303:231:1;21533:64:0;21726:11;;21704:4;;-1:-1:-1;;;21726:11:0;;;;21721:795;;;-1:-1:-1;21751:5:0;21721:795;;;9460:3;9161:12;9117:2;9161;:12;:::i;:::-;9272:21;;:12;:21;:::i;:::-;9445:18;;;;:::i;:::-;21981:6;:29;:60;;;;;22015:26;22034:6;22015:18;:26::i;:::-;22014:27;21981:60;:97;;;;;22046:32;22068:9;22046:21;:32::i;:::-;22045:33;21981:97;21976:189;;;22099:50;;-1:-1:-1;;;22099:50:0;;10320:2:1;22099:50:0;;;10302:21:1;10359:2;10339:18;;;10332:30;10398:34;10378:18;;;10371:62;-1:-1:-1;;;10449:18:1;;;10442:38;10497:19;;22099:50:0;10292:230:1;21976:189:0;22205:1;9574:2;9161:12;9117:2;9161;:12;:::i;:::-;9272:21;;:12;:21;:::i;:::-;9559:17;;;;:::i;:::-;22186:20;:51;;;;;22211:26;22230:6;22211:18;:26::i;:::-;22210:27;22186:51;:88;;;;;22242:32;22264:9;22242:21;:32::i;:::-;22241:33;22186:88;:113;;;;-1:-1:-1;34410:5:0;;-1:-1:-1;;;;;34399:16:0;;;34410:5;;34399:16;22278:21;22186:113;22181:324;;;22320:24;22347:20;22357:9;22347;:20::i;:::-;22320:47;-1:-1:-1;9574:2:0;9161:12;9117:2;9161;:12;:::i;:::-;9272:21;;:12;:21;:::i;:::-;9559:17;;;;:::i;:::-;22394:25;22413:6;22394:16;:25;:::i;:::-;:45;;22386:103;;;;-1:-1:-1;;;22386:103:0;;13148:2:1;22386:103:0;;;13130:21:1;13187:2;13167:18;;;13160:30;13226:34;13206:18;;;13199:62;-1:-1:-1;;;13277:18:1;;;13270:43;13330:19;;22386:103:0;13120:235:1;22386:103:0;22181:324;;-1:-1:-1;;;;;22616:26:0;;;;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;22646:29:0;;;;;;:18;:29;;;;;;;;22616:59;22613:83;;;-1:-1:-1;22688:5:0;22613:83;22708:56;22729:6;22737:9;22748:6;22756:7;22708:20;:56::i;:::-;22775:51;22791:6;22799:9;22810:6;22818:7;22775:15;:51::i;2117:171::-;2203:7;2251:12;2243:6;;;;2235:29;;;;-1:-1:-1;;;2235:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;2273:5:0;;;2117:171::o;1677:82::-;1735:7;1752:5;1756:1;1752;:5;:::i;29263:319::-;29325:34;29379:6;29325:61;;29423:17;-1:-1:-1;;;;;29423:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29405:57:0;;29471:4;29478:17;-1:-1:-1;;;;;29478:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29405:98;;-1:-1:-1;;;;;;29405:98:0;;;;;;;-1:-1:-1;;;;;3923:15:1;;;29405:98:0;;;3905:34:1;3975:15;;3955:18;;;3948:43;3840:18;;29405:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29397:5;:106;;-1:-1:-1;;;;;;29397:106:0;;;-1:-1:-1;;;;;29397:106:0;;;;;;;29514:7;:27;;;;;;;;;;;29557:17;;;;;;;;-1:-1:-1;;29557:17:0;29263:319;;:::o;24788:171::-;24837:7;24858:15;24875;24894:19;:17;:19::i;:::-;24857:56;;-1:-1:-1;24857:56:0;-1:-1:-1;24931:20:0;24857:56;;24931:11;:20::i;:::-;24924:27;;;;24788:171;:::o;1853:82::-;1911:7;1928:5;1932:1;1928;:5;:::i;16449:698::-;16824:11;;-1:-1:-1;;;;;16824:11:0;16805:31;;;;:18;:31;;;;;;:42;;16841:5;16805:35;:42::i;:::-;16790:11;;;-1:-1:-1;;;;;16790:11:0;;;16771:31;;;;:18;:31;;;;;;;;:76;;;;16885:11;;;;;16862:35;;:22;:35;;;;;;;16858:112;;;16947:11;;-1:-1:-1;;;;;16947:11:0;16937:22;;;;:9;:22;;;;;;:33;;16964:5;16937:26;:33::i;:::-;16922:11;;-1:-1:-1;;;;;16922:11:0;16912:22;;;;:9;:22;;;;;:58;16858:112;17120:11;;17103:36;;15553:25:1;;;-1:-1:-1;;;;;17120:11:0;;;;17103:36;;;;;15541:2:1;15526:18;17103:36:0;15508:76:1;24211:569:0;24288:7;;;;;;24367:38;9070:5;24367:20;:7;24379;24367:11;:20::i;:::-;:24;;:38::i;:::-;24346:59;-1:-1:-1;24416:23:0;24442;:7;24346:59;24442:11;:23::i;:::-;24416:49;;24476:19;24498:17;:15;:17::i;:::-;24476:39;-1:-1:-1;24526:15:0;24544:24;:7;24476:39;24544:11;:24::i;:::-;24526:42;-1:-1:-1;24579:18:0;24600:27;:10;24615:11;24600:14;:27::i;:::-;24579:48;-1:-1:-1;24638:23:0;24664;:7;24579:48;24664:11;:23::i;:::-;24708:7;;;;24734;-1:-1:-1;24743:15:0;;-1:-1:-1;24760:11:0;;-1:-1:-1;24211:569:0;-1:-1:-1;;;;;;24211:569:0:o;34432:165::-;34519:7;34545:44;34563:17;34573:6;34563:9;:17::i;:::-;-1:-1:-1;33664:9:0;;;33570:111;19123:277;-1:-1:-1;;;;;19181:27:0;;19211:1;19181:27;;;:18;:27;;;;;;:31;19178:132;;-1:-1:-1;;;;;19270:27:0;;;;;;:18;:27;;;;;;19250:48;;:19;:48::i;:::-;-1:-1:-1;;;;;19229:18:0;;;;;;:9;:18;;;;;:69;19178:132;-1:-1:-1;;;;;19320:31:0;;;;;:22;:31;;;;;:38;;-1:-1:-1;;19320:38:0;19354:4;19320:38;;;;;;19369:9;:23;;;;;;;;;;;;;;-1:-1:-1;;;;;;19369:23:0;;;;;;19123:277::o;18576:270::-;18644:7;18683:16;;18672:7;:27;;18664:82;;;;-1:-1:-1;;;18664:82:0;;6798:2:1;18664:82:0;;;6780:21:1;6837:2;6817:18;;;6810:30;6876:34;6856:18;;;6849:62;-1:-1:-1;;;6927:18:1;;;6920:40;6977:19;;18664:82:0;6770:232:1;18664:82:0;18757:19;18779:17;:15;:17::i;:::-;18757:39;-1:-1:-1;18814:24:0;:7;18757:39;18814:11;:24::i;20532:234::-;20599:4;5919:6;;-1:-1:-1;;;;;20682:18:0;;;5919:6;;20682:18;;:48;;-1:-1:-1;20715:15:0;;-1:-1:-1;;;;;20704:26:0;;;20715:15;;20704:26;20682:48;:74;;;-1:-1:-1;;20745:11:0;;-1:-1:-1;;;;;20745:11:0;;;20734:22;;;;20532:234::o;20790:371::-;20860:4;5919:6;;-1:-1:-1;;;;;21052:18:0;;;5919:6;;21052:18;;:44;;-1:-1:-1;21085:11:0;;-1:-1:-1;;;;;21074:22:0;;;21085:11;;21074:22;21052:44;:75;;;-1:-1:-1;21112:15:0;;-1:-1:-1;;;;;21101:26:0;;;21112:15;;21101:26;21052:100;;;-1:-1:-1;;21141:11:0;;-1:-1:-1;;;;;21141:11:0;;;21130:22;;;;20790:371::o;34728:264::-;34836:11;;-1:-1:-1;;;34836:11:0;;;;34830:155;;34864:28;34895:24;34913:4;34895:9;:24::i;:::-;34864:55;;34934:39;34943:20;34965:6;34934:7;:39::i;:::-;34830:155;34728:264;;;;:::o;22844:1145::-;22957:17;22977:29;22991:6;22999;22977:13;:29::i;:::-;22957:49;;23023:7;23017:33;;-1:-1:-1;23046:1:0;23017:33;23063:15;23080:23;23105:15;23122:23;23147:19;23171:29;23182:6;23190:9;23171:10;:29::i;:::-;-1:-1:-1;;;;;23420:26:0;;;;;;:18;:26;;;;;;23062:138;;-1:-1:-1;23062:138:0;;-1:-1:-1;23062:138:0;;-1:-1:-1;23062:138:0;-1:-1:-1;23062:138:0;-1:-1:-1;23420:39:0;;23062:138;23420:30;:39::i;:::-;-1:-1:-1;;;;;23391:26:0;;;;;;;:18;:26;;;;;;:68;;;;23502:29;;;;;;;:50;;23536:15;23502:33;:50::i;:::-;-1:-1:-1;;;;;23470:29:0;;;;;;;:18;:29;;;;;;;;:82;;;;23662:30;;;;;:22;:30;;;;;;;23658:90;;;-1:-1:-1;;;;;23715:17:0;;;;;;:9;:17;;;;;;:30;;23737:7;23715:21;:30::i;:::-;-1:-1:-1;;;;;23695:17:0;;;;;;:9;:17;;;;;:50;23658:90;-1:-1:-1;;;;;23762:33:0;;;;;;:22;:33;;;;;;;;23758:108;;;-1:-1:-1;;;;;23822:20:0;;;;;;:9;:20;;;;;;:41;;23847:15;23822:24;:41::i;:::-;-1:-1:-1;;;;;23799:20:0;;;;;;:9;:20;;;;;:64;23758:108;23878:43;23889:6;23897:11;23910:9;23878;:43::i;:::-;23954:9;-1:-1:-1;;;;;23937:44:0;23946:6;-1:-1:-1;;;;;23937:44:0;;23965:15;23937:44;;;;15553:25:1;;15541:2;15526:18;;15508:76;23937:44:0;;;;;;;;22844:1145;;;;;;;;;;:::o;24967:656::-;25065:16;;25018:7;;;;;9161:12;9117:2;9161;:12;:::i;:::-;9272:21;;:12;:21;:::i;:::-;25092:30;;25140:9;25135:329;25159:9;:16;25155:20;;25135:329;;;25236:7;25201:18;:32;25220:9;25230:1;25220:12;;;;;;-1:-1:-1;;;25220:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25220:12:0;25201:32;;;;;;;;;;;;;:42;;:79;;;25273:7;25247:9;:23;25257:9;25267:1;25257:12;;;;;;-1:-1:-1;;;25257:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25257:12:0;25247:23;;;;;;;;;;;;;:33;25201:79;25197:124;;;25290:16;;9161:12;9117:2;9161;:12;:::i;:::-;9272:21;;:12;:21;:::i;:::-;25282:39;;;;;;;24967:656;;:::o;25197:124::-;25346:45;25358:18;:32;25377:9;25387:1;25377:12;;;;;;-1:-1:-1;;;25377:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25377:12:0;25358:32;;;;;;;;;;;;;25346:7;;:11;:45::i;:::-;25336:55;;25416:36;25428:9;:23;25438:9;25448:1;25438:12;;;;;;-1:-1:-1;;;25438:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25438:12:0;25428:23;;;;;;;;;;;;;25416:7;;:11;:36::i;:::-;25406:46;-1:-1:-1;25177:3:0;;;;:::i;:::-;;;;25135:329;;;-1:-1:-1;25478:12:0;;;:60;;-1:-1:-1;25504:34:0;9161:12;9117:2;9161;:12;:::i;:::-;9272:21;;:12;:21;:::i;:::-;25504:16;;;:20;:34::i;:::-;25494:7;:44;25478:60;25474:105;;;25548:16;;9161:12;9117:2;9161;:12;:::i;:::-;9272:21;;:12;:21;:::i;:::-;25540:39;;;;;;24967:656;;:::o;25474:105::-;25598:7;;25607;;-1:-1:-1;24967:656:0;-1:-1:-1;24967:656:0:o;28627:626::-;28740:20;;28716;:44;28712:93;;28785:20;;28762:43;;28712:93;28878:31;;28854:55;;;;;;;28929:51;;-1:-1:-1;28959:21:0;;-1:-1:-1;;;28959:21:0;;;;28929:51;:72;;;;-1:-1:-1;28985:16:0;;-1:-1:-1;;;28985:16:0;;;;28984:17;28929:72;:93;;;;-1:-1:-1;29016:5:0;;-1:-1:-1;;;;;29006:15:0;;;29016:5;;29006:15;;28929:93;28924:320;;;29195:37;29211:20;29195:15;:37::i;23997:206::-;24109:1;24097:9;:13;:29;;;;-1:-1:-1;24115:11:0;;-1:-1:-1;;;24115:11:0;;;;24114:12;24097:29;24092:104;;;24143:41;24164:6;24172:11;24143:20;:41::i;29590:679::-;27604:16;:23;;-1:-1:-1;;;;27604:23:0;-1:-1:-1;;;27604:23:0;;;;29730:13:::1;:6:::0;29741:1:::1;29730:10;:13::i;:::-;29715:28:::0;-1:-1:-1;29754:17:0::1;29774:16;:6:::0;29715:28;29774:10:::1;:16::i;:::-;29754:36:::0;-1:-1:-1;29832:21:0::1;29898:23;29916:4:::0;29898:17:::1;:23::i;:::-;30052:18;30073:41;:21;30099:14:::0;30073:25:::1;:41::i;:::-;30052:62;;30164:36;30178:9;30189:10;30164:13;:36::i;:::-;30218:43;::::0;;16779:25:1;;;16835:2;16820:18;;16813:34;;;16863:18;;;16856:34;;;30218:43:0::1;::::0;16767:2:1;16752:18;30218:43:0::1;;;;;;;-1:-1:-1::0;;27650:16:0;:24;;-1:-1:-1;;;;27650:24:0;;;-1:-1:-1;;;29590:679:0:o;35000:1067::-;35102:11;;-1:-1:-1;;;35102:11:0;;;;35098:28;;;35000:1067;;:::o;35098:28::-;35138:17;35158:15;11491:4;:11;;11426:79;35158:15;35138:35;;35189:13;35184:876;35216:9;35208:5;:17;35184:876;;;35252:12;35266:13;35281:17;35303:14;35311:5;35303:7;:14::i;:::-;35251:66;;;;;;;35426:5;35435:1;35426:10;35421:26;;;35439:8;;;;;35421:26;35477:11;35469:4;:19;;;;;;-1:-1:-1;;;35469:19:0;;;;;;;;;;35464:585;;;35509:50;35524:6;35532:11;35545:5;35552;35509:13;:50::i;:::-;35464:585;;;35607:12;35599:4;:20;;;;;;-1:-1:-1;;;35599:20:0;;;;;;;;;;35594:455;;;35640:42;35647:6;35655:11;35668:5;35675;35640;:42::i;35594:455::-;35730:17;35722:4;:25;;;;;;-1:-1:-1;;;35722:25:0;;;;;;;;;;35717:332;;;;;;35821:21;35813:4;:29;;;;;;-1:-1:-1;;;35813:29:0;;;;;;;;;;35808:241;;;35862:61;35877:6;35885:11;35898:5;35905:9;35916:5;35862:13;:61::i;35808:241::-;35977:56;35987:6;35995:11;36008:5;36015:9;36026:5;35977:8;:56::i;:::-;35184:876;;;;35227:7;;;;:::i;:::-;;;;35184:876;;30277:720;30430:16;;;30444:1;30430:16;;;;;;;;30406:21;;30430:16;;;;;;;;;;-1:-1:-1;30430:16:0;30406:40;;30475:4;30457;30462:1;30457:7;;;;;;-1:-1:-1;;;30457:7:0;;;;;;;;;-1:-1:-1;;;;;30457:23:0;;;:7;;;;;;;;;;:23;;;;30501:7;;:14;;;-1:-1:-1;;;30501:14:0;;;;:7;;;;;:12;;:14;;;;;30457:7;;30501:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30491:4;30496:1;30491:7;;;;;;-1:-1:-1;;;30491:7:0;;;;;;;;;-1:-1:-1;;;;;30491:24:0;;;:7;;;;;;;;;:24;30568:7;;30528:62;;30553:4;;30568:7;30578:11;30528:16;:62::i;:::-;30629:7;;:360;;-1:-1:-1;;;30629:360:0;;-1:-1:-1;;;;;30629:7:0;;;;:58;;:360;;30702:11;;30629:7;;30916:4;;30943;;30963:15;;30629:360;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30277:720;;:::o;31005:1129::-;31194:7;;31154:62;;31179:4;;-1:-1:-1;;;;;31194:7:0;31204:11;31154:16;:62::i;:::-;31330:7;;31261:23;;;;;;-1:-1:-1;;;;;31330:7:0;:23;31361:9;31394:4;31414:11;31261:23;;31947:7;5892;5919:6;-1:-1:-1;;;;;5919:6:0;;5854:79;31947:7;31330:665;;;;;;-1:-1:-1;;;;;;31330:665:0;;;-1:-1:-1;;;;;4361:15:1;;;31330:665:0;;;4343:34:1;4393:18;;;4386:34;;;;4436:18;;;4429:34;;;;4479:18;;;4472:34;4543:15;;;4522:19;;;4515:44;31969:15:0;4575:19:1;;;4568:35;4277:19;;31330:665:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32032:21;32010:19;:43;32069:57;;;16779:25:1;;;16835:2;16820:18;;16813:34;;;16863:18;;;16856:34;;;31260:735:0;;-1:-1:-1;31260:735:0;;-1:-1:-1;31260:735:0;-1:-1:-1;32069:57:0;;16767:2:1;16752:18;32069:57:0;;;;;;;31005:1129;;;;;:::o;11736:213::-;11791:7;11800;11809;11818;11837:14;11854:20;11868:5;11854:13;:20::i;:::-;11837:37;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11837:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;11837:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11837:37:0;;;;;;;;;;;;;;;;;;;11894:8;;11904:9;;;;11915:13;;;;11930:9;;;;;11894:8;;11904:9;;-1:-1:-1;11915:13:0;;-1:-1:-1;11930:9:0;;-1:-1:-1;11736:213:0;-1:-1:-1;;;11736:213:0:o;26022:315::-;26130:12;26145:33;9070:5;26145:15;:6;26156:3;26145:10;:15::i;:33::-;26130:48;-1:-1:-1;26189:12:0;26204:21;26130:48;26213:11;26204:8;:21::i;:::-;26257:16;;26189:36;;-1:-1:-1;26257:26:0;;26189:36;26257:20;:26::i;:::-;26238:16;:45;26294:35;26317:5;26324:4;26294:22;:35::i;36075:305::-;36174:13;36190:33;9070:5;36190:15;:6;36201:3;36190:10;:15::i;:33::-;36174:49;-1:-1:-1;36234:13:0;36250:22;36174:49;36260:11;36250:9;:22::i;:::-;36234:38;;36285:40;36305:4;36312:5;36319;36285:11;:40::i;:::-;36336:36;36359:5;36366;36336:22;:36::i;36887:186::-;37013:52;37022:6;37030:11;37043:3;37048:9;37059:5;36388:491;36511:15;36529:33;9070:5;36529:15;:6;36540:3;36529:10;:15::i;:33::-;36511:51;-1:-1:-1;36573:15:0;36591:24;36511:51;36603:11;36591;:24::i;:::-;-1:-1:-1;;;;;36660:29:0;;;;;;:18;:29;;;;;;36573:42;;-1:-1:-1;36660:42:0;;36573;36660:33;:42::i;:::-;-1:-1:-1;;;;;36628:29:0;;;;;;:18;:29;;;;;;;;:74;;;;36716:22;:33;;;;;;36713:107;;;-1:-1:-1;;;;;36787:20:0;;;;;;:9;:20;;;;;;:33;;36812:7;36787:24;:33::i;:::-;-1:-1:-1;;;;;36764:20:0;;;;;;:9;:20;;;;;:56;36713:107;36833:38;36856:5;36863:7;36833:22;:38::i;:::-;36388:491;;;;;;;:::o;37081:143::-;37184:32;37193:5;37200:7;37209:6;37184:8;:32::i;11513:217::-;11572:11;11626:4;:11;11618:19;;11595:98;;;;-1:-1:-1;;;11595:98:0;;14370:2:1;11595:98:0;;;14352:21:1;14409:2;14389:18;;;14382:30;14448:34;14428:18;;;14421:62;-1:-1:-1;;;14499:18:1;;;14492:49;14558:19;;11595:98:0;14342:241:1;11595:98:0;11711:4;11716:5;11711:11;;;;;;-1:-1:-1;;;11711:11:0;;;;;;;;;;;;;;;;;;;11704:18;;11513:217;;;:::o;11955:173::-;12038:15;12056:20;12070:5;12056:13;:20::i;:::-;12099:9;;;;12038:38;;-1:-1:-1;12099:21:0;;12113:6;12099:13;:21::i;:::-;12087:9;;;;:33;-1:-1:-1;;11955:173:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:257::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;312:6;304;297:22;259:2;356:9;343:23;375:31;400:5;375:31;:::i;441:261::-;511:6;564:2;552:9;543:7;539:23;535:32;532:2;;;585:6;577;570:22;532:2;622:9;616:16;641:31;666:5;641:31;:::i;977:398::-;1045:6;1053;1106:2;1094:9;1085:7;1081:23;1077:32;1074:2;;;1127:6;1119;1112:22;1074:2;1171:9;1158:23;1190:31;1215:5;1190:31;:::i;:::-;1240:5;-1:-1:-1;1297:2:1;1282:18;;1269:32;1310:33;1269:32;1310:33;:::i;:::-;1362:7;1352:17;;;1064:311;;;;;:::o;1380:466::-;1457:6;1465;1473;1526:2;1514:9;1505:7;1501:23;1497:32;1494:2;;;1547:6;1539;1532:22;1494:2;1591:9;1578:23;1610:31;1635:5;1610:31;:::i;:::-;1660:5;-1:-1:-1;1717:2:1;1702:18;;1689:32;1730:33;1689:32;1730:33;:::i;:::-;1484:362;;1782:7;;-1:-1:-1;;;1836:2:1;1821:18;;;;1808:32;;1484:362::o;1851:325::-;1916:6;1924;1977:2;1965:9;1956:7;1952:23;1948:32;1945:2;;;1998:6;1990;1983:22;1945:2;2042:9;2029:23;2061:31;2086:5;2061:31;:::i;:::-;2111:5;-1:-1:-1;2135:35:1;2166:2;2151:18;;2135:35;:::i;:::-;2125:45;;1935:241;;;;;:::o;2181:325::-;2249:6;2257;2310:2;2298:9;2289:7;2285:23;2281:32;2278:2;;;2331:6;2323;2316:22;2278:2;2375:9;2362:23;2394:31;2419:5;2394:31;:::i;:::-;2444:5;2496:2;2481:18;;;;2468:32;;-1:-1:-1;;;2268:238:1:o;2511:190::-;2567:6;2620:2;2608:9;2599:7;2595:23;2591:32;2588:2;;;2641:6;2633;2626:22;2588:2;2669:26;2685:9;2669:26;:::i;2706:190::-;2765:6;2818:2;2806:9;2797:7;2793:23;2789:32;2786:2;;;2839:6;2831;2824:22;2786:2;-1:-1:-1;2867:23:1;;2776:120;-1:-1:-1;2776:120:1:o;2901:258::-;2966:6;2974;3027:2;3015:9;3006:7;3002:23;2998:32;2995:2;;;3048:6;3040;3033:22;2995:2;3089:9;3076:23;3066:33;;3118:35;3149:2;3138:9;3134:18;3118:35;:::i;3164:316::-;3252:6;3260;3268;3321:2;3309:9;3300:7;3296:23;3292:32;3289:2;;;3342:6;3334;3327:22;3289:2;3376:9;3370:16;3360:26;;3426:2;3415:9;3411:18;3405:25;3395:35;;3470:2;3459:9;3455:18;3449:25;3439:35;;3279:201;;;;;:::o;4806:603::-;4918:4;4947:2;4976;4965:9;4958:21;5008:6;5002:13;5051:6;5046:2;5035:9;5031:18;5024:34;5076:4;5089:140;5103:6;5100:1;5097:13;5089:140;;;5198:14;;;5194:23;;5188:30;5164:17;;;5183:2;5160:26;5153:66;5118:10;;5089:140;;;5247:6;5244:1;5241:13;5238:2;;;5317:4;5312:2;5303:6;5292:9;5288:22;5284:31;5277:45;5238:2;-1:-1:-1;5393:2:1;5372:15;-1:-1:-1;;5368:29:1;5353:45;;;;5400:2;5349:54;;4927:482;-1:-1:-1;;;4927:482:1:o;11768:356::-;11970:2;11952:21;;;11989:18;;;11982:30;12048:34;12043:2;12028:18;;12021:62;12115:2;12100:18;;11942:182::o;13762:401::-;13964:2;13946:21;;;14003:2;13983:18;;;13976:30;14042:34;14037:2;14022:18;;14015:62;-1:-1:-1;;;14108:2:1;14093:18;;14086:35;14153:3;14138:19;;13936:227::o;15589:983::-;15851:4;15899:3;15888:9;15884:19;15930:6;15919:9;15912:25;15956:2;15994:6;15989:2;15978:9;15974:18;15967:34;16037:3;16032:2;16021:9;16017:18;16010:31;16061:6;16096;16090:13;16127:6;16119;16112:22;16165:3;16154:9;16150:19;16143:26;;16204:2;16196:6;16192:15;16178:29;;16225:4;16238:195;16252:6;16249:1;16246:13;16238:195;;;16317:13;;-1:-1:-1;;;;;16313:39:1;16301:52;;16408:15;;;;16373:12;;;;16349:1;16267:9;16238:195;;;-1:-1:-1;;;;;;;16489:32:1;;;;16484:2;16469:18;;16462:60;-1:-1:-1;;;16553:3:1;16538:19;16531:35;16450:3;15860:712;-1:-1:-1;;;15860:712:1:o;17090:128::-;17130:3;17161:1;17157:6;17154:1;17151:13;17148:2;;;17167:18;;:::i;:::-;-1:-1:-1;17203:9:1;;17138:80::o;17223:217::-;17263:1;17289;17279:2;;-1:-1:-1;;;17314:31:1;;17368:4;17365:1;17358:15;17396:4;17321:1;17386:15;17279:2;-1:-1:-1;17425:9:1;;17269:171::o;17445:422::-;17534:1;17577:5;17534:1;17591:270;17612:7;17602:8;17599:21;17591:270;;;17671:4;17667:1;17663:6;17659:17;17653:4;17650:27;17647:2;;;17680:18;;:::i;:::-;17730:7;17720:8;17716:22;17713:2;;;17750:16;;;;17713:2;17829:22;;;;17789:15;;;;17591:270;;;17595:3;17509:358;;;;;:::o;17872:140::-;17930:5;17959:47;18000:4;17990:8;17986:19;17980:4;18066:5;18096:8;18086:2;;-1:-1:-1;18137:1:1;18151:5;;18086:2;18185:4;18175:2;;-1:-1:-1;18222:1:1;18236:5;;18175:2;18267:4;18285:1;18280:59;;;;18353:1;18348:130;;;;18260:218;;18280:59;18310:1;18301:10;;18324:5;;;18348:130;18385:3;18375:8;18372:17;18369:2;;;18392:18;;:::i;:::-;-1:-1:-1;;18448:1:1;18434:16;;18463:5;;18260:218;;18562:2;18552:8;18549:16;18543:3;18537:4;18534:13;18530:36;18524:2;18514:8;18511:16;18506:2;18500:4;18497:12;18493:35;18490:77;18487:2;;;-1:-1:-1;18599:19:1;;;18631:5;;18487:2;18678:34;18703:8;18697:4;18678:34;:::i;:::-;18748:6;18744:1;18740:6;18736:19;18727:7;18724:32;18721:2;;;18759:18;;:::i;:::-;18797:20;;18076:747;-1:-1:-1;;;18076:747:1:o;18828:168::-;18868:7;18934:1;18930;18926:6;18922:14;18919:1;18916:21;18911:1;18904:9;18897:17;18893:45;18890:2;;;18941:18;;:::i;:::-;-1:-1:-1;18981:9:1;;18880:116::o;19001:125::-;19041:4;19069:1;19066;19063:8;19060:2;;;19074:18;;:::i;:::-;-1:-1:-1;19111:9:1;;19050:76::o;19131:135::-;19170:3;-1:-1:-1;;19191:17:1;;19188:2;;;19211:18;;:::i;:::-;-1:-1:-1;19258:1:1;19247:13;;19178:88::o;19271:127::-;19332:10;19327:3;19323:20;19320:1;19313:31;19363:4;19360:1;19353:15;19387:4;19384:1;19377:15;19403:131;-1:-1:-1;;;;;19478:31:1;;19468:42;;19458:2;;19524:1;19521;19514:12

Swarm Source

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