ETH Price: $3,384.23 (+4.18%)
Gas: 2 Gwei

Token

White Rabbit Stacks (STACKS)
 

Overview

Max Total Supply

144 STACKS

Holders

24

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
salients.eth
Balance
1 STACKS
0x065f3b968938044f9d7dd6b17860b1ca32f042a3
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RBT_Stacks

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-13
*/

// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.18;

contract protected {
    mapping (address => bool) is_auth;
    function authorized(address addy) public view returns(bool) {
        return is_auth[addy];
    }
    function set_authorized(address addy, bool booly) public onlyAuth {
        is_auth[addy] = booly;
    }
    modifier onlyAuth() {
        require( is_auth[msg.sender] || msg.sender==owner, "not owner");
        _;
    }
    address owner;
    modifier onlyOwner() {
        require(msg.sender==owner, "not owner");
        _;
    }
    bool locked;
    modifier safe() {
        require(!locked, "reentrant");
        locked = true;
        _;
        locked = false;
    }
    function change_owner(address new_owner) public onlyAuth {
        owner = new_owner;
    }
    receive() external payable {}
    fallback() external payable {}
}

// SECTION Interfaces
interface ERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

interface ERC721 is ERC165 {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    function approve(address _approved, uint256 _tokenId) external;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

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

interface IERC721Receiver {
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

interface IUniswapV2Pair {
  event Approval(address indexed owner, address indexed spender, uint value);
  event Transfer(address indexed from, address indexed to, uint value);

  function name() external pure returns (string memory);
  function symbol() external pure returns (string memory);
  function decimals() external pure returns (uint8);
  function totalSupply() external view returns (uint);
  function balanceOf(address owner) external view returns (uint);
  function allowance(address owner, address spender) external view returns (uint);

  function approve(address spender, uint value) external returns (bool);
  function transfer(address to, uint value) external returns (bool);
  function transferFrom(address from, address to, uint value) external returns (bool);

  function DOMAIN_SEPARATOR() external view returns (bytes32);
  function PERMIT_TYPEHASH() external pure returns (bytes32);
  function nonces(address owner) external view returns (uint);

  function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

  event Mint(address indexed sender, uint amount0, uint amount1);
  event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
  event Swap(
      address indexed sender,
      uint amount0In,
      uint amount1In,
      uint amount0Out,
      uint amount1Out,
      address indexed to
  );
  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint);
  function factory() external view returns (address);
  function token0() external view returns (address);
  function token1() external view returns (address);
  function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
  function price0CumulativeLast() external view returns (uint);
  function price1CumulativeLast() external view returns (uint);
  function kLast() external view returns (uint);

  function mint(address to) external returns (uint liquidity);
  function burn(address to) external returns (uint amount0, uint amount1);
  function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
  function skim(address to) external;
  function sync() external;
}


interface IUniswapV2Factory {
  event PairCreated(address indexed token0, address indexed token1, address pair, uint);

  function getPair(address tokenA, address tokenB) external view returns (address pair);
  function allPairs(uint) external view returns (address pair);
  function allPairsLength() external view returns (uint);

  function feeTo() external view returns (address);
  function feeToSetter() external view returns (address);

  function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router01 {
  function factory() external pure returns (address);
  function WETH() external pure returns (address);

  function addLiquidity(
      address tokenA,
      address tokenB,
      uint amountADesired,
      uint amountBDesired,
      uint amountAMin,
      uint amountBMin,
      address to,
      uint deadline
  ) external returns (uint amountA, uint amountB, uint liquidity);
  function addLiquidityETH(
      address token,
      uint amountTokenDesired,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
  ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
  function removeLiquidity(
      address tokenA,
      address tokenB,
      uint liquidity,
      uint amountAMin,
      uint amountBMin,
      address to,
      uint deadline
  ) external returns (uint amountA, uint amountB);
  function removeLiquidityETH(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
  ) external returns (uint amountToken, uint amountETH);
  function removeLiquidityWithPermit(
      address tokenA,
      address tokenB,
      uint liquidity,
      uint amountAMin,
      uint amountBMin,
      address to,
      uint deadline,
      bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external returns (uint amountA, uint amountB);
  function removeLiquidityETHWithPermit(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline,
      bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external returns (uint amountToken, uint amountETH);
  function swapExactTokensForTokens(
      uint amountIn,
      uint amountOutMin,
      address[] calldata path,
      address to,
      uint deadline
  ) external returns (uint[] memory amounts);
  function swapTokensForExactTokens(
      uint amountOut,
      uint amountInMax,
      address[] calldata path,
      address to,
      uint deadline
  ) external returns (uint[] memory amounts);
  function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
      external
      payable
      returns (uint[] memory amounts);
  function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
      external
      returns (uint[] memory amounts);
  function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
      external
      returns (uint[] memory amounts);
  function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
      external
      payable
      returns (uint[] memory amounts);

  function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
  function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
  function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
  function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
  function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
// !SECTION Interfaces

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error UnableDetermineTokenOwner();
error UnableGetTokenOwnerByIndex();
error URIQueryForNonexistentToken();


contract RBT_Stacks is ERC721, protected {

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name = "White Rabbit Stacks";

    string public symbol = "STACKS";
    string public baseURI = "https://whiterabbit.mypinata.cloud/ipfs/";
    /*///////////////////////////////////////////////////////////////
                          ERC721 STORAGE
    //////////////////////////////////////////////////////////////*/

    // Array which maps token ID to address (index is tokenID)
    address[] internal _owners;

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

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

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor() {
        owner = msg.sender;
        is_auth[msg.sender] = true;
        // Defining uniswap stuff to be used in the contract
        router = IUniswapV2Router02(routerAddress);
        factoryAddress = router.factory();
        factory = IUniswapV2Factory(factoryAddress);
        wethAddress = router.WETH();
        WETH = IERC20(wethAddress);
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x780e9d63 || // ERC165 Interface ID for ERC721Enumerable
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       ERC721ENUMERABLE LOGIC
    //////////////////////////////////////////////////////////////*/

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * It is not recommended to call this function on chain from another smart contract,
     * as it can become quite expensive for larger collections.
     */
    function tokenOfOwnerByIndex(address _owner, uint256 index) public view virtual returns (uint256 tokenId) {
        if (index >= balanceOf(_owner)) revert OwnerIndexOutOfBounds();

        uint256 count;
        uint256 qty = _owners.length;
        // Cannot realistically overflow, since we are using uint256
        unchecked {
            for (tokenId; tokenId < qty; tokenId++) {
                if (_owner == ownerOf(tokenId)) {
                    if (count == index) return tokenId;
                    else count++;
                }
            }
        }

        revert UnableGetTokenOwnerByIndex();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual returns (uint256) {
        if (index >= totalSupply()) revert TokenIndexOutOfBounds();
        return index;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     *      Iterates through _owners array -- it is not recommended to call this function
     *      from another contract, as it can become quite expensive for larger collections.
     */
    function balanceOf(address _owner) public view virtual returns (uint256) {
        if (_owner == address(0)) revert BalanceQueryForZeroAddress();

        uint256 count;
        uint256 qty = _owners.length;
        // Cannot realistically overflow, since we are using uint256
        unchecked {
            for (uint256 i; i < qty; i++) {
                if (_owner == ownerOf(i)) {
                    count++;
                }
            }
        }
        return count;
    }

    /**
     * @dev See {IERC721-ownerOf}.
     *      Gas spent here starts off proportional to the maximum mint batch size.
     *      It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownerOf(uint256 tokenId) public view virtual returns (address) {
        if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();

        // Cannot realistically overflow, since we are using uint256
        unchecked {
            for (tokenId; ; tokenId++) {
                if (_owners[tokenId] != address(0)) {
                    return _owners[tokenId];
                }
            }
        }

        revert UnableDetermineTokenOwner();
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual {
        address _owner = ownerOf(tokenId);
        if (to == _owner) revert ApprovalToCurrentOwner();

        if (msg.sender != _owner && !isApprovedForAll(_owner, msg.sender)) revert ApprovalCallerNotOwnerNorApproved();

        _tokenApprovals[tokenId] = to;
        emit Approval(_owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual {
        if (operator == msg.sender) revert ApproveToCaller();

        _operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual {
        if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();
        if (ownerOf(tokenId) != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        bool isApprovedOrOwner = (msg.sender == from ||
            msg.sender == getApproved(tokenId) ||
            isApprovedForAll(from, msg.sender));
        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        // delete token approvals from previous owner
        delete _tokenApprovals[tokenId];
        _owners[tokenId] = to;

        // if token ID below transferred one isnt set, set it to previous owner
        // if tokenid is zero, skip this to prevent underflow
        if (tokenId > 0 && _owners[tokenId - 1] == address(0)) {
            _owners[tokenId - 1] = from;
        }

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        if (!_checkOnERC721Received(from, to, id, data)) revert TransferToNonERC721ReceiverImplementer();
    }

    /**
     * @dev Returns whether `tokenId` exists.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length;
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     *      The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.code.length == 0) return true;

        try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer();

            assembly {
                revert(add(32, reason), mload(reason))
            }
        }
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    /**
     * @dev Safely mints `qty` tokens and transfers them to `to`.
     *
     *      If `to` refers to a smart contract, it must implement
     *      {IERC721Receiver-onERC721Received}
     *
     *      Unlike in the standard ERC721 implementation {IERC721Receiver-onERC721Received}
     *      is only called once. If the receiving contract confirms the transfer of one token,
     *      all additional tokens are automatically confirmed too.
     */
    function _safeMint(address to, uint256 qty) internal virtual {
        _safeMint(to, qty, '');
    }

    /**
     * @dev Equivalent to {safeMint(to, qty)}, but accepts an additional data argument.
     */
    function _safeMint(
        address to,
        uint256 qty,
        bytes memory data
    ) internal virtual {
        _mint(to, qty);

        if (!_checkOnERC721Received(address(0), to, _owners.length - 1, data))
            revert TransferToNonERC721ReceiverImplementer();
    }

    /**
     * @dev Mints `qty` tokens and transfers them to `to`.
     *      Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 qty) internal virtual {
        if (to == address(0)) revert MintToZeroAddress();
        if (qty == 0) revert MintZeroQuantity();

        uint256 _currentIndex = _owners.length;

        // Cannot realistically overflow, since we are using uint256
        unchecked {
            for (uint256 i; i < qty - 1; i++) {
                _owners.push();
                emit Transfer(address(0), to, _currentIndex + i);
            }
        }

        // set last index to receiver
        _owners.push(to);
        emit Transfer(address(0), to, _currentIndex + (qty - 1));
    }

    // SECTION Stacks
    // Addresses
    address public routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    IUniswapV2Router02 public router;
    address public wethAddress;
    IERC20 public WETH;
    address public factoryAddress;
    IUniswapV2Factory public factory;
    address public rbtAddress;
    IERC20 public rbt;
    address public rbtLiquidityAddress;
    IUniswapV2Pair public rbtLiquidity;

    // Prices
    uint public price = 0.04 ether;
    uint private manualPriceRBT = 1000000000000000000000; // 1000 RBT
    bool public autoPriceRBT = true; // St the RBT price automatically based on the RBT/ETH price

    // Stacks on chain metadata
    mapping(uint => bytes32[]) public stackPieces; // Each Stack id is mapped to a piece number
    mapping(uint => string) stackImage; // Each stack id is mapped to an image
    uint public PIECES_PER_STACK = 5; // Number of pieces per stack
    bytes32[] commonPieces;
    bytes32[] uncommonPieces;
    bytes32[] rarePieces;
    mapping (bytes32 => uint) public pieceRarity; // Each piece is mapped to a rarity for reading
    
    // Controls
    bool onlyEthers;
    bool onlyRBT = true;
    bool burnRBT = true;

    // Edition and enviroment
    uint public currentEdition = 1;
    uint private piecesCounter = 0;
    mapping(bytes32 => bool) private pieceExists;

    // SECTION Metadata and URIs
    mapping (uint256 => string) private _editionURIs;
    mapping (uint256 => uint256) private _tokenEditions;
    mapping(uint256 => uint256[]) private _editionStacks;

    function setBaseURI(string memory _baseURI) public onlyAuth {
        baseURI = _baseURI;
    }

    function getBaseURI() public view returns (string memory) {
        return baseURI;
    }

    function setEditionsURIHash(uint256 edition, string memory _hash) public onlyAuth {
        _editionURIs[edition] = _hash;
    }

    function getEditionsURIHash(uint256 edition) public view returns (string memory) {
        return _editionURIs[edition];
    }

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "URIQueryForNonexistentToken");
        uint tokenEdition = _tokenEditions[tokenId];
        string memory _tokenId = _editionURIs[tokenEdition];
        return string(abi.encodePacked(baseURI, _tokenId));
    }

    function getStacksForEdition(uint256 edition) public view returns (uint256[] memory) {
        return _editionStacks[edition];
    }

    function getCurrentEdition() public view returns (uint256) {
        return currentEdition;
    }
    // !SECTION Metadata and URIs

    // NOTE Public payable mint
    function mint() public safe payable {
        // Getting RBT price
        uint _priceRBT;
        if (autoPriceRBT) {
            _priceRBT = getRBTETHPrice();
        } else {
            _priceRBT = manualPriceRBT;
        }
        // Accepting both ether and RBT
        if (onlyEthers) {
            if (msg.value < price) revert("Not enough ETH");
        } else if (onlyRBT) {
            if (msg.value > 0) revert("No ETH allowed");
            if (rbt.balanceOf(msg.sender) < _priceRBT) revert("Not enough RBT");
            // If the RBT are to burn, burn them
            if (burnRBT) {
                bool success = rbt.transferFrom(msg.sender, address(0), _priceRBT);
                if (!success) revert("RBT transfer failed");
            } else {
                bool success = rbt.transferFrom(msg.sender, address(this), _priceRBT);
                if (!success) revert("RBT transfer failed");
            }
        } else {
            if (msg.value > 0) {
                if (msg.value < price) revert("Not enough ETH");
            } else {
                if (rbt.balanceOf(msg.sender) < _priceRBT) revert("Not enough RBT");
                // If the RBT are to burn, burn them
                if (burnRBT) {
                    bool success = rbt.transferFrom(msg.sender, address(0), _priceRBT);
                    if (!success) revert("RBT transfer failed");
                } else {
                    bool success = rbt.transferFrom(msg.sender, address(this), _priceRBT);
                    if (!success) revert("RBT transfer failed");
                }
            }
        }

        uint random;
        // Randomly select pieces from the array
        bytes32[] memory pieces = new bytes32[](PIECES_PER_STACK);
        // Rarity counter
        uint uncommon = 0;
        uint rare = 0;
        uint rarity_selected = 0; // 0 common, 1 uncommon, 2 rare
        for (uint i = 0; i < PIECES_PER_STACK; i++) {
            // Generate a random number between 0 and 99 (inclusive)
            random = uint(keccak256((abi.encodePacked(block.timestamp,
                                                      msg.sender,
                                                      commonPieces.length,
                                                      uncommonPieces.length,
                                                      rarePieces.length,
                                                      balanceOf(msg.sender),
                                                      block.prevrandao,
                                                      msg.value,
                                                      i)))) % 99;
            // Rarity is determined by the random number
            // NOTE Rarity per stack cannot be more than 1 rare and 2 uncommon pieces per pack
            if ((random > 90) && (rare < 1)) { // 10 %
                rarity_selected = 2;
                rare++;   
            } else if ((random > 40) && (random < 90) && (uncommon < 2)) { // 50 %
               rarity_selected = 1;
               uncommon++;
            } else {
                rarity_selected = 0;
            }
            // Copy the chosen rarity array to a new array
            bytes32[] memory allPieces;
            if (rarity_selected == 0) {
                allPieces = commonPieces;
            } else if (rarity_selected == 1) {
                allPieces = uncommonPieces;
            } else {
                allPieces = rarePieces;
            }
            // Generate a random number between 0 and the length of the chosen rarity array
            random = uint(keccak256((abi.encodePacked(block.timestamp,
                                                      msg.sender,
                                                      commonPieces.length,
                                                      uncommonPieces.length,
                                                      rarePieces.length,
                                                      balanceOf(msg.sender),
                                                      block.prevrandao,
                                                      msg.value,
                                                      i)))) % allPieces.length;
            // Select a piece from the chosen rarity array
            pieces[i] = allPieces[random % allPieces.length];
        }
        // Set the edition of the stack
        _tokenEditions[_owners.length] = currentEdition;
        // Add the stack to the edition
        _editionStacks[currentEdition].push(_owners.length);
        // Assign the pieces to the stack
        stackPieces[_owners.length] = pieces;
        _safeMint(msg.sender, 1);
    }

    // NOTE Returning all the pieces available
    function getAllPieces() public view returns (bytes32[] memory common,
                                                 bytes32[] memory uncommon,
                                                 bytes32[] memory rare) {
        common = commonPieces;
        uncommon = uncommonPieces;
        rare = rarePieces;
    }

    // NOTE Getter for the piece number of a stack
    function getPieces(uint256 stackID) public view returns (bytes32[] memory) {
        return stackPieces[stackID];
    }

    // NOTE Gets the pieces owned by an address
    function getOwnedPieces(address _owner) public view returns (bytes32[] memory) {
        bytes32[] memory ownedPieces = new bytes32[](balanceOf(_owner) * PIECES_PER_STACK);
        for (uint i = 0; i < balanceOf(_owner); i++) {
            // Compose the pieces from all the stacks owned by the address
            bytes32[] memory pieces = stackPieces[tokenOfOwnerByIndex(_owner, i)];
            for (uint j = 0; j < PIECES_PER_STACK; j++) {
                ownedPieces[i * PIECES_PER_STACK + j] = pieces[j];
            }
        }
        return ownedPieces;
    }

    // NOTE Returns the number of pieces per stack
    function getPiecesPerStack() public view returns (uint) {
        return PIECES_PER_STACK;
    }

    // NOTE Returns the rarity of a piece
    function getPieceRarity(bytes32 piece) public view returns (uint) {
        return pieceRarity[piece];
    }
    
    // ANCHOR Admin
    function setRBTAddress(address _rbtAddress) public onlyAuth {
        rbtAddress = _rbtAddress;
        rbt = IERC20(rbtAddress);
    }

    function setOnlyEthers(bool _onlyEthers) public onlyAuth {
        onlyEthers = _onlyEthers;
        if (_onlyEthers) onlyRBT = false;
    }

    function setOnlyRBT(bool _onlyRBT) public onlyAuth {
        onlyRBT = _onlyRBT;
        if (_onlyRBT) onlyEthers = false;
    }

    // If to burn RBT or not when buying a stack
    function setBurnRBT(bool _burnRBT) public onlyAuth {
        burnRBT = _burnRBT;
    }

    // NOTE Prices

    function setAutoRBTPrices(bool _autoPriceRBT) public onlyAuth {
        autoPriceRBT = _autoPriceRBT;
    }

    function setPriceRBT(uint256 _priceRBT) public onlyAuth {
        manualPriceRBT = _priceRBT;
    }

    function priceRBT() public view returns (uint) {
        uint _priceRBT;
        if (autoPriceRBT) {
            _priceRBT = getRBTETHPrice();
        } else {
            _priceRBT = manualPriceRBT;
        }
        return _priceRBT;
    }

    function setPrice(uint256 _price) public onlyAuth {
        price = _price;
    }

    // NOTE Sets a piece image for a piece code
    function setStackImage(uint id, string memory image) public onlyAuth {
        stackImage[id] = image;
    }

    // NOTE Add a piece to the total pieces array
    function addPiece(string memory plainPiece, uint rarity) public onlyAuth {
        bytes32 _piece = keccak256(abi.encodePacked(plainPiece));
        if (rarity == 0) commonPieces.push(_piece);
        else if (rarity == 1) uncommonPieces.push(_piece);
        else if (rarity == 2) rarePieces.push(_piece);
        else revert("Invalid rarity");
        pieceExists[_piece] = true;
        piecesCounter++;
    }

    // NOTE Bulk version
    function addPieces(string[] memory plainPieces, uint rarity) public onlyAuth {
        bytes32 _piece;
        if (rarity == 0) {
            for (uint i = 0; i < plainPieces.length; i++) {
                _piece = keccak256(abi.encodePacked(plainPieces[i]));
                commonPieces.push(_piece);
                pieceRarity[_piece] = 0;
                pieceExists[_piece] = true;
                piecesCounter++;
            }
        } else if (rarity == 1) {
            for (uint i = 0; i < plainPieces.length; i++) {
                _piece = keccak256(abi.encodePacked(plainPieces[i]));
                uncommonPieces.push(_piece);
                pieceRarity[_piece] = 1;
                pieceExists[_piece] = true;
                piecesCounter++;
            }
        } else if (rarity == 2) {
            for (uint i = 0; i < plainPieces.length; i++) {
                _piece = keccak256(abi.encodePacked(plainPieces[i]));
                rarePieces.push(_piece);
                pieceRarity[_piece] = 2;
                pieceExists[_piece] = true;
                piecesCounter++;
            }
        } else revert("Invalid rarity");
    }

    // NOTE Auto version that uses a semi-randomic algorithm to generate the pieces
    function addPiecesAuto(uint number, string memory seed, uint rarity) 
                           public onlyAuth 
                           returns (bytes32[] memory createdPieces, uint cycles) {
        bytes32 random;
        bytes32[] memory _createdPieces = new bytes32[](number);
        uint validPieces;
        uint i;
        for (i=0; validPieces < number; i++) {
            random = keccak256(abi.encodePacked(
                block.timestamp,
                msg.sender,
                commonPieces.length,
                uncommonPieces.length,
                rarePieces.length,
                piecesCounter,
                balanceOf(msg.sender),
                block.prevrandao,
                seed,
                i));
            if (pieceExists[random] == false) {
                _createdPieces[validPieces] = random;
                if (rarity == 0) commonPieces.push(random);
                else if (rarity == 1) uncommonPieces.push(random);
                else if (rarity == 2) rarePieces.push(random);
                else revert("Invalid rarity");
                pieceExists[random] = true;
                piecesCounter++;
                validPieces++;
            }
        }
        cycles = i;
        createdPieces = _createdPieces;
    }

    // NOTE Finds a liquidity pair for rbt and weth
    function findRBTWETHPair() public onlyAuth {
        // Calling factory to get RBT and WETH pair
        rbtLiquidityAddress = IUniswapV2Factory(factory).getPair(rbtAddress, wethAddress);
        // If anything, we create the pair
        if (rbtLiquidityAddress == address(0)) {
            rbtLiquidityAddress = IUniswapV2Factory(factory).createPair(rbtAddress, wethAddress);
        }
    }

    // NOTE Inspects liquidity on Uniswap to always return ETH Price in RBT
    function getRBTETHPrice() public view returns (uint rbtTo005eth) {
        // Both rbt and weth must be defined
        require(rbtAddress != address(0) && wethAddress != address(0), "RBT or WETH not defined");
        // Also the pair of rbt and weth must be existant
        require(rbtLiquidityAddress != address(0), "RBT/WETH pair not found");
        // Getting reserves
        (uint rbtReserve, uint wethReserve, ) = IUniswapV2Pair(rbtLiquidityAddress).getReserves();
        // Calculating 1 ETH in RBT
        uint ethInRBT = rbtReserve / wethReserve;
        // Calculating 0.05 ETH in RBT
        rbtTo005eth = ethInRBT / 20;
    }
    
    function advanceEdition() public onlyAuth {
        currentEdition++;
    }
    // !SECTION Stacks

    // String manipulation functions
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"UnableDetermineTokenOwner","type":"error"},{"inputs":[],"name":"UnableGetTokenOwnerByIndex","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"PIECES_PER_STACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"plainPiece","type":"string"},{"internalType":"uint256","name":"rarity","type":"uint256"}],"name":"addPiece","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"plainPieces","type":"string[]"},{"internalType":"uint256","name":"rarity","type":"uint256"}],"name":"addPieces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"string","name":"seed","type":"string"},{"internalType":"uint256","name":"rarity","type":"uint256"}],"name":"addPiecesAuto","outputs":[{"internalType":"bytes32[]","name":"createdPieces","type":"bytes32[]"},{"internalType":"uint256","name":"cycles","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"advanceEdition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoPriceRBT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"new_owner","type":"address"}],"name":"change_owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentEdition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"findRBTWETHPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllPieces","outputs":[{"internalType":"bytes32[]","name":"common","type":"bytes32[]"},{"internalType":"bytes32[]","name":"uncommon","type":"bytes32[]"},{"internalType":"bytes32[]","name":"rare","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEdition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"edition","type":"uint256"}],"name":"getEditionsURIHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getOwnedPieces","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"piece","type":"bytes32"}],"name":"getPieceRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stackID","type":"uint256"}],"name":"getPieces","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPiecesPerStack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRBTETHPrice","outputs":[{"internalType":"uint256","name":"rbtTo005eth","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"edition","type":"uint256"}],"name":"getStacksForEdition","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"pieceRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceRBT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rbt","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rbtAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rbtLiquidity","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rbtLiquidityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_autoPriceRBT","type":"bool"}],"name":"setAutoRBTPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_burnRBT","type":"bool"}],"name":"setBurnRBT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"edition","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"}],"name":"setEditionsURIHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_onlyEthers","type":"bool"}],"name":"setOnlyEthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_onlyRBT","type":"bool"}],"name":"setOnlyRBT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceRBT","type":"uint256"}],"name":"setPriceRBT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rbtAddress","type":"address"}],"name":"setRBTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"image","type":"string"}],"name":"setStackImage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"set_authorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stackPieces","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052601360809081527f57686974652052616262697420537461636b730000000000000000000000000060a0526002906200003e908262000325565b50604080518082019091526006815265535441434b5360d01b60208201526003906200006b908262000325565b50604051806060016040528060288152602001620041526028913960049062000095908262000325565b50600880546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055668e1bc9bf040000601255683635c9adc5dea000006013556014805460ff191660019081179091556005601755601c80546201010062ffff0019909116179055601d556000601e553480156200011157600080fd5b5060018054336001600160a01b03199182168117835560009081526020818152604091829020805460ff1916909417909355600854600980546001600160a01b03909216919093168117909255805163c45a015560e01b81529051919263c45a0155926004808401938290030181865afa15801562000194573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ba9190620003f1565b600c80546001600160a01b039283166001600160a01b03199182168117909255600d80549091169091179055600954604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa15801562000229573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024f9190620003f1565b600a80546001600160a01b03929092166001600160a01b03199283168117909155600b805490921617905562000423565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002ab57607f821691505b602082108103620002cc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032057600081815260208120601f850160051c81016020861015620002fb5750805b601f850160051c820191505b818110156200031c5782815560010162000307565b5050505b505050565b81516001600160401b0381111562000341576200034162000280565b620003598162000352845462000296565b84620002d2565b602080601f831160018114620003915760008415620003785750858301515b600019600386901b1c1916600185901b1785556200031c565b600085815260208120601f198616915b82811015620003c257888601518255948401946001909101908401620003a1565b5085821015620003e15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200040457600080fd5b81516001600160a01b03811681146200041c57600080fd5b9392505050565b613d1f80620004336000396000f3fe60806040526004361061038c5760003560e01c80636c0360eb116101da578063b918161111610101578063d34602381161009a578063ec047c081161006c578063ec047c0814610aee578063ef1aac8014610b0e578063f87c75eb14610b23578063f887ea4014610b4357005b8063d346023814610a5d578063d6fcb81014610a7d578063e935752814610aa1578063e985e9c514610ace57005b8063c87b56dd116100d3578063c87b56dd146109e3578063c93e230f14610a03578063cdaf5e4e14610a1d578063d14d6c2914610a3d57005b8063b918161114610955578063bc69de561461098e578063bf574348146109a3578063c45a0155146109c357005b806395d89b4111610173578063a22cb46511610145578063a22cb465146108df578063ad5c4648146108ff578063b27507711461091f578063b88d4fde1461093557005b806395d89b41146108675780639617b3871461087c578063966dae0e146108a9578063a035b1fe146108c957005b80637c469c2d116101ac5780637c469c2d146107d957806380a3d3d9146107f957806391b7f5ed1461081957806394dc9ddd1461083957005b80636c0360eb146107625780636ff499811461077757806370a08231146107a4578063714c5398146107c457005b80633268cc56116102be57806355de5a9311610257578063625b980411610229578063625b9804146106f75780636352211e14610717578063688d2a8b146107375780636ad5e0a11461074c57005b806355de5a931461068d57806355f804b3146106a257806359bd8c86146106c25780635b22773d146106e257005b80634c421db7116102905780634c421db71461060d5780634f0e0ef31461062d5780634f6ccce71461064d57806350c5c3b11461066d57005b80633268cc561461058d57806335c473d6146105ad5780633e2e582f146105cd57806342842e0e146105ed57005b8063142712211161033057806323b872dd1161030257806323b872dd1461050d578063253c8bd41461052d5780632bfe87421461054d5780632f745c591461056d57005b8063142712211461048c57806318160ddd146104b957806318f7d862146104d85780632200ec80146104f857005b8063095ea7b311610369578063095ea7b3146104245780630b044205146104445780630e957f04146104645780631249c58b1461048457005b806301ffc9a71461039557806306fdde03146103ca578063081812fc146103ec57005b3661039357005b005b3480156103a157600080fd5b506103b56103b0366004613224565b610b63565b60405190151581526020015b60405180910390f35b3480156103d657600080fd5b506103df610bd0565b6040516103c19190613298565b3480156103f857600080fd5b5061040c6104073660046132ab565b610c5e565b6040516001600160a01b0390911681526020016103c1565b34801561043057600080fd5b5061039361043f3660046132d9565b610ca4565b34801561045057600080fd5b5061039361045f3660046133c4565b610d7d565b34801561047057600080fd5b5060105461040c906001600160a01b031681565b610393610de6565b34801561049857600080fd5b506104ac6104a73660046132ab565b611604565b6040516103c19190613446565b3480156104c557600080fd5b506005545b6040519081526020016103c1565b3480156104e457600080fd5b50600f5461040c906001600160a01b031681565b34801561050457600080fd5b50610393611666565b34801561051957600080fd5b50610393610528366004613459565b6117e8565b34801561053957600080fd5b5061039361054836600461349a565b611a0d565b34801561055957600080fd5b506103936105683660046134c5565b611a73565b34801561057957600080fd5b506104ca6105883660046132d9565b611ae2565b34801561059957600080fd5b5060085461040c906001600160a01b031681565b3480156105b957600080fd5b506103936105c83660046134fe565b611b75565b3480156105d957600080fd5b5060115461040c906001600160a01b031681565b3480156105f957600080fd5b50610393610608366004613459565b611bcc565b34801561061957600080fd5b506103936106283660046134fe565b611be7565b34801561063957600080fd5b50600a5461040c906001600160a01b031681565b34801561065957600080fd5b506104ca6106683660046132ab565b611c51565b34801561067957600080fd5b50600e5461040c906001600160a01b031681565b34801561069957600080fd5b50601d546104ca565b3480156106ae57600080fd5b506103936106bd36600461351b565b611c7f565b3480156106ce57600080fd5b506103936106dd3660046132ab565b611cd3565b3480156106ee57600080fd5b506104ca611d1c565b34801561070357600080fd5b5061039361071236600461349a565b611e93565b34801561072357600080fd5b5061040c6107323660046132ab565b611f03565b34801561074357600080fd5b506104ca611f9e565b34801561075857600080fd5b506104ca60175481565b34801561076e57600080fd5b506103df611fbe565b34801561078357600080fd5b506107976107923660046132ab565b611fcb565b6040516103c19190613550565b3480156107b057600080fd5b506104ca6107bf36600461349a565b61202b565b3480156107d057600080fd5b506103df61209d565b3480156107e557600080fd5b506104ca6107f4366004613594565b61212f565b34801561080557600080fd5b506103936108143660046135b6565b612160565b34801561082557600080fd5b506103936108343660046132ab565b6122ff565b34801561084557600080fd5b506108596108543660046135fb565b612348565b6040516103c192919061364b565b34801561087357600080fd5b506103df61258e565b34801561088857600080fd5b506104ca6108973660046132ab565b601b6020526000908152604090205481565b3480156108b557600080fd5b50600c5461040c906001600160a01b031681565b3480156108d557600080fd5b506104ca60125481565b3480156108eb57600080fd5b506103936108fa3660046134c5565b61259b565b34801561090b57600080fd5b50600b5461040c906001600160a01b031681565b34801561092b57600080fd5b506104ca601d5481565b34801561094157600080fd5b5061039361095036600461366d565b612630565b34801561096157600080fd5b506103b561097036600461349a565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561099a57600080fd5b5061039361266a565b3480156109af57600080fd5b506103936109be3660046134fe565b6126c5565b3480156109cf57600080fd5b50600d5461040c906001600160a01b031681565b3480156109ef57600080fd5b506103df6109fe3660046132ab565b612725565b348015610a0f57600080fd5b506014546103b59060ff1681565b348015610a2957600080fd5b50610393610a383660046136ed565b612852565b348015610a4957600080fd5b506103df610a583660046132ab565b612b15565b348015610a6957600080fd5b50610393610a783660046134fe565b612bac565b348015610a8957600080fd5b50610a92612c1b565b6040516103c1939291906137b6565b348015610aad57600080fd5b506104ca610abc3660046132ab565b6000908152601b602052604090205490565b348015610ada57600080fd5b506103b5610ae93660046137f9565b612d1e565b348015610afa57600080fd5b506104ac610b0936600461349a565b612d4c565b348015610b1a57600080fd5b506017546104ca565b348015610b2f57600080fd5b50610393610b3e3660046133c4565b612eb6565b348015610b4f57600080fd5b5060095461040c906001600160a01b031681565b60006301ffc9a760e01b6001600160e01b031983161480610b9457506380ac58cd60e01b6001600160e01b03198316145b80610baf575063780e9d6360e01b6001600160e01b03198316145b80610bca5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60028054610bdd90613827565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990613827565b8015610c565780601f10610c2b57610100808354040283529160200191610c56565b820191906000526020600020905b815481529060010190602001808311610c3957829003601f168201915b505050505081565b6000610c6b826005541190565b610c88576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610caf82611f03565b9050806001600160a01b0316836001600160a01b031603610ce35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d035750610d018133612d1e565b155b15610d21576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360009081526020819052604090205460ff1680610da557506001546001600160a01b031633145b610dca5760405162461bcd60e51b8152600401610dc190613861565b60405180910390fd5b60008281526020805260409020610de182826138d2565b505050565b600154600160a01b900460ff1615610e2c5760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610dc1565b6001805460ff60a01b1916600160a01b17905560145460009060ff1615610e5c57610e55611d1c565b9050610e61565b506013545b601c5460ff1615610eb457601254341015610eaf5760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610dc1565b6112b0565b601c54610100900460ff16156110b7573415610f035760405162461bcd60e51b815260206004820152600e60248201526d139bc811551208185b1b1bddd95960921b6044820152606401610dc1565b600f546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610f4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6f9190613992565b1015610fae5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08195b9bdd59da0814909560921b6044820152606401610dc1565b601c5462010000900460ff161561108257600f546040516323b872dd60e01b81526000916001600160a01b0316906323b872dd90610ff4903390859087906004016139ab565b6020604051808303816000875af1158015611013573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103791906139cf565b90508061107c5760405162461bcd60e51b8152602060048201526013602482015272149095081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610dc1565b506112b0565b600f546040516323b872dd60e01b81526000916001600160a01b0316906323b872dd90610ff4903390309087906004016139ab565b341561110057601254341015610eaf5760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610dc1565b600f546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116c9190613992565b10156111ab5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08195b9bdd59da0814909560921b6044820152606401610dc1565b601c5462010000900460ff16156111f157600f546040516323b872dd60e01b81526000916001600160a01b0316906323b872dd90610ff4903390859087906004016139ab565b600f546040516323b872dd60e01b81526000916001600160a01b0316906323b872dd90611226903390309087906004016139ab565b6020604051808303816000875af1158015611245573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126991906139cf565b9050806112ae5760405162461bcd60e51b8152602060048201526013602482015272149095081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610dc1565b505b60008060175467ffffffffffffffff8111156112ce576112ce613305565b6040519080825280602002602001820160405280156112f7578160200160208202803683370190505b5090506000806000805b60175481101561158f57601854601954601a54606392429233926113248461202b565b44348960405160200161133f999897969594939291906139ec565b6040516020818303038152906040528051906020012060001c6113629190613a52565b9550605a861180156113745750600183105b1561138f57600291508261138781613a7c565b9350506113cb565b60288611801561139f5750605a86105b80156113ab5750600284105b156113c65760019150836113be81613a7c565b9450506113cb565b600091505b60608260000361142d57601880548060200260200160405190810160405280929190818152602001828054801561142157602002820191906000526020600020905b81548152602001906001019080831161140d575b505050505090506114df565b8260010361148b576019805480602002602001604051908101604052809291908181526020018280548015611421576020028201919060005260206000209081548152602001906001019080831161140d57505050505090506114df565b601a8054806020026020016040519081016040528092919081815260200182805480156114d757602002820191906000526020600020905b8154815260200190600101908083116114c3575b505050505090505b8051601854601954601a544292339290916114f98461202b565b44348a604051602001611514999897969594939291906139ec565b6040516020818303038152906040528051906020012060001c6115379190613a52565b9650808151886115479190613a52565b8151811061155757611557613a95565b602002602001015186838151811061157157611571613a95565b6020908102919091010152508061158781613a7c565b915050611301565b50601d5460058054600090815260216020908152604080832085905593825260228152838220835481546001810183559184528284209091015591548152601582529190912085516115e3928701906131b7565b506115ef336001612f12565b50506001805460ff60a01b1916905550505050565b60008181526015602090815260409182902080548351818402810184019094528084526060939283018282801561165a57602002820191906000526020600020905b815481526020019060010190808311611646575b50505050509050919050565b3360009081526020819052604090205460ff168061168e57506001546001600160a01b031633145b6116aa5760405162461bcd60e51b8152600401610dc190613861565b600d54600e54600a5460405163e6a4390560e01b81526001600160a01b039283166004820152908216602482015291169063e6a4390590604401602060405180830381865afa158015611701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117259190613aab565b601080546001600160a01b0319166001600160a01b039290921691821790556117e657600d54600e54600a546040516364e329cb60e11b81526001600160a01b039283166004820152908216602482015291169063c9c65396906044016020604051808303816000875af11580156117a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c59190613aab565b601080546001600160a01b0319166001600160a01b03929092169190911790555b565b6117f3816005541190565b61181057604051636f96cda160e11b815260040160405180910390fd5b826001600160a01b031661182382611f03565b6001600160a01b0316146118495760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03821661187057604051633a954ecd60e21b815260040160405180910390fd5b6000336001600160a01b03851614806118a2575061188d82610c5e565b6001600160a01b0316336001600160a01b0316145b806118b257506118b28433612d1e565b9050806118d257604051632ce44b5f60e11b815260040160405180910390fd5b600082815260066020526040902080546001600160a01b0319169055600580548491908490811061190557611905613a95565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060008211801561197457506000600561194d600185613ac8565b8154811061195d5761195d613a95565b6000918252602090912001546001600160a01b0316145b156119c657836005611987600185613ac8565b8154811061199757611997613a95565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b3360009081526020819052604090205460ff1680611a3557506001546001600160a01b031633145b611a515760405162461bcd60e51b8152600401610dc190613861565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680611a9b57506001546001600160a01b031633145b611ab75760405162461bcd60e51b8152600401610dc190613861565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6000611aed8361202b565b8210611b0c576040516306ed618760e11b815260040160405180910390fd5b6005546000905b80831015611b5c57611b2483611f03565b6001600160a01b0316856001600160a01b031603611b5157838203611b4a575050610bca565b6001909101905b600190920191611b13565b604051637339954760e01b815260040160405180910390fd5b3360009081526020819052604090205460ff1680611b9d57506001546001600160a01b031633145b611bb95760405162461bcd60e51b8152600401610dc190613861565b6014805460ff1916911515919091179055565b610de183838360405180602001604052806000815250612630565b3360009081526020819052604090205460ff1680611c0f57506001546001600160a01b031633145b611c2b5760405162461bcd60e51b8152600401610dc190613861565b601c805460ff19168215801591909117909155611c4e57601c805461ff00191690555b50565b6000611c5c60055490565b8210611c7b576040516329c8c00760e21b815260040160405180910390fd5b5090565b3360009081526020819052604090205460ff1680611ca757506001546001600160a01b031633145b611cc35760405162461bcd60e51b8152600401610dc190613861565b6004611ccf82826138d2565b5050565b3360009081526020819052604090205460ff1680611cfb57506001546001600160a01b031633145b611d175760405162461bcd60e51b8152600401610dc190613861565b601355565b600e546000906001600160a01b031615801590611d435750600a546001600160a01b031615155b611d8f5760405162461bcd60e51b815260206004820152601760248201527f524254206f722057455448206e6f7420646566696e65640000000000000000006044820152606401610dc1565b6010546001600160a01b0316611de75760405162461bcd60e51b815260206004820152601760248201527f5242542f574554482070616972206e6f7420666f756e640000000000000000006044820152606401610dc1565b600080601060009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e619190613af7565b506001600160701b0391821693501690506000611e7e8284613b47565b9050611e8b601482613b47565b935050505090565b3360009081526020819052604090205460ff1680611ebb57506001546001600160a01b031633145b611ed75760405162461bcd60e51b8152600401610dc190613861565b600e80546001600160a01b039092166001600160a01b03199283168117909155600f8054909216179055565b6000611f10826005541190565b611f2d57604051636f96cda160e11b815260040160405180910390fd5b60006001600160a01b031660058381548110611f4b57611f4b613a95565b6000918252602090912001546001600160a01b031614611f935760058281548110611f7857611f78613a95565b6000918252602090912001546001600160a01b031692915050565b600190910190611f2d565b601454600090819060ff1615611fb657610bca611d1c565b505060135490565b60048054610bdd90613827565b60008181526022602090815260409182902080548351818402810184019094528084526060939283018282801561165a57602002820191906000526020600020908154815260200190600101908083116116465750505050509050919050565b60006001600160a01b038216612054576040516323d3ad8160e21b815260040160405180910390fd5b600554600090815b818110156120945761206d81611f03565b6001600160a01b0316856001600160a01b03160361208c576001909201915b60010161205c565b50909392505050565b6060600480546120ac90613827565b80601f01602080910402602001604051908101604052809291908181526020018280546120d890613827565b80156121255780601f106120fa57610100808354040283529160200191612125565b820191906000526020600020905b81548152906001019060200180831161210857829003601f168201915b5050505050905090565b6015602052816000526040600020818154811061214b57600080fd5b90600052602060002001600091509150505481565b3360009081526020819052604090205460ff168061218857506001546001600160a01b031633145b6121a45760405162461bcd60e51b8152600401610dc190613861565b6000826040516020016121b79190613b5b565b6040516020818303038152906040528051906020012090508160000361221157601880546001810182556000919091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e018190556122ce565b8160010361225357601980546001810182556000919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695018190556122ce565b8160020361229557601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e018190556122ce565b60405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642072617269747960901b6044820152606401610dc1565b6000818152601f60205260408120805460ff19166001179055601e8054916122f583613a7c565b9190505550505050565b3360009081526020819052604090205460ff168061232757506001546001600160a01b031633145b6123435760405162461bcd60e51b8152600401610dc190613861565b601255565b336000908152602081905260408120546060919060ff168061237457506001546001600160a01b031633145b6123905760405162461bcd60e51b8152600401610dc190613861565b6000808667ffffffffffffffff8111156123ac576123ac613305565b6040519080825280602002602001820160405280156123d5578160200160208202803683370190505b5090506000805b8882101561257f57601854601954601a54601e5442933393909290916124018561202b565b448f8960405160200161241d9a99989796959493929190613b77565b60408051601f1981840301815291815281516020928301206000818152601f9093529082205490955060ff161515900361256d578383838151811061246457612464613a95565b602002602001018181525050866000036124b257601880546001810182556000919091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e01849055612532565b866001036124f457601980546001810182556000919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c969501849055612532565b8660020361229557601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e018490555b6000848152601f60205260408120805460ff19166001179055601e80549161255983613a7c565b9190505550818061256990613a7c565b9250505b8061257781613a7c565b9150506123dc565b91989197509095505050505050565b60038054610bdd90613827565b336001600160a01b038316036125c45760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61263b8484846117e8565b61264784848484612f2c565b612664576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b3360009081526020819052604090205460ff168061269257506001546001600160a01b031633145b6126ae5760405162461bcd60e51b8152600401610dc190613861565b601d80549060006126be83613a7c565b9190505550565b3360009081526020819052604090205460ff16806126ed57506001546001600160a01b031633145b6127095760405162461bcd60e51b8152600401610dc190613861565b601c8054911515620100000262ff000019909216919091179055565b6060612732826005541190565b61277e5760405162461bcd60e51b815260206004820152601b60248201527f5552495175657279466f724e6f6e6578697374656e74546f6b656e00000000006044820152606401610dc1565b600082815260216020908152604080832054808452918052822080549192916127a690613827565b80601f01602080910402602001604051908101604052809291908181526020018280546127d290613827565b801561281f5780601f106127f45761010080835404028352916020019161281f565b820191906000526020600020905b81548152906001019060200180831161280257829003601f168201915b5050505050905060048160405160200161283a929190613be8565b60405160208183030381529060405292505050919050565b3360009081526020819052604090205460ff168061287a57506001546001600160a01b031633145b6128965760405162461bcd60e51b8152600401610dc190613861565b60008160000361296c5760005b8351811015612664578381815181106128be576128be613a95565b60200260200101516040516020016128d69190613b5b565b60408051601f1981840301815291815281516020928301206018805460018181019092557fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e018290556000828152601b8552838120819055601f909452918320805460ff1916909217909155601e8054919450909161295483613a7c565b9190505550808061296490613a7c565b9150506128a3565b81600103612a405760005b83518110156126645783818151811061299257612992613a95565b60200260200101516040516020016129aa9190613b5b565b60408051601f1981840301815291815281516020928301206019805460018181019092557f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695018290556000828152601b8552838120829055601f909452918320805460ff1916909217909155601e80549194509091612a2883613a7c565b91905055508080612a3890613a7c565b915050612977565b816002036122955760005b835181101561266457838181518110612a6657612a66613a95565b6020026020010151604051602001612a7e9190613b5b565b60408051601f198184030181529181528151602092830120601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e018290556000828152601b855283812060029055601f909452918320805460ff1916909217909155601e80549194509091612afd83613a7c565b91905055508080612b0d90613a7c565b915050612a4b565b60008181526020805260409020805460609190612b3190613827565b80601f0160208091040260200160405190810160405280929190818152602001828054612b5d90613827565b801561165a5780601f10612b7f5761010080835404028352916020019161165a565b820191906000526020600020905b815481529060010190602001808311612b8d5750939695505050505050565b3360009081526020819052604090205460ff1680612bd457506001546001600160a01b031633145b612bf05760405162461bcd60e51b8152600401610dc190613861565b601c8054821580156101000261ff001990921691909117909155611c4e57601c805460ff1916905550565b60608060606018805480602002602001604051908101604052809291908181526020018280548015612c6c57602002820191906000526020600020905b815481526020019060010190808311612c58575b505050505092506019805480602002602001604051908101604052809291908181526020018280548015612cbf57602002820191906000526020600020905b815481526020019060010190808311612cab575b50505050509150601a805480602002602001604051908101604052809291908181526020018280548015612d1257602002820191906000526020600020905b815481526020019060010190808311612cfe575b50505050509050909192565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60606000601754612d5c8461202b565b612d669190613c6f565b67ffffffffffffffff811115612d7e57612d7e613305565b604051908082528060200260200182016040528015612da7578160200160208202803683370190505b50905060005b612db68461202b565b811015612eaf57600060156000612dcd8785611ae2565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015612e2557602002820191906000526020600020905b815481526020019060010190808311612e11575b5050505050905060005b601754811015612e9a57818181518110612e4b57612e4b613a95565b6020026020010151848260175486612e639190613c6f565b612e6d9190613c86565b81518110612e7d57612e7d613a95565b602090810291909101015280612e9281613a7c565b915050612e2f565b50508080612ea790613a7c565b915050612dad565b5092915050565b3360009081526020819052604090205460ff1680612ede57506001546001600160a01b031633145b612efa5760405162461bcd60e51b8152600401610dc190613861565b6000828152601660205260409020610de182826138d2565b611ccf828260405180602001604052806000815250613031565b6000836001600160a01b03163b600003612f4857506001613029565b604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612f7a903390899088908890600401613c99565b6020604051808303816000875af1925050508015612fb5575060408051601f3d908101601f19168201909252612fb291810190613ccc565b60015b613013573d808015612fe3576040519150601f19603f3d011682016040523d82523d6000602084013e612fe8565b606091505b50805160000361300b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b61303b8383613076565b61305960008460016005805490506130539190613ac8565b84612f2c565b610de1576040516368d2bf6b60e11b815260040160405180910390fd5b6001600160a01b03821661309c57604051622e076360e81b815260040160405180910390fd5b806000036130bd5760405163b562e8dd60e01b815260040160405180910390fd5b60055460005b6001830381101561311b576005805460010181556000908152604051838301916001600160a01b038716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001016130c3565b5060058054600180820183556000929092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0386161790556131729083613ac8565b61317c9082613c86565b6040516001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b8280548282559060005260206000209081019282156131f2579160200282015b828111156131f25782518255916020019190600101906131d7565b50611c7b9291505b80821115611c7b57600081556001016131fa565b6001600160e01b031981168114611c4e57600080fd5b60006020828403121561323657600080fd5b81356132418161320e565b9392505050565b60005b8381101561326357818101518382015260200161324b565b50506000910152565b60008151808452613284816020860160208601613248565b601f01601f19169290920160200192915050565b602081526000613241602083018461326c565b6000602082840312156132bd57600080fd5b5035919050565b6001600160a01b0381168114611c4e57600080fd5b600080604083850312156132ec57600080fd5b82356132f7816132c4565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561334457613344613305565b604052919050565b600067ffffffffffffffff83111561336657613366613305565b613379601f8401601f191660200161331b565b905082815283838301111561338d57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133b557600080fd5b6132418383356020850161334c565b600080604083850312156133d757600080fd5b82359150602083013567ffffffffffffffff8111156133f557600080fd5b613401858286016133a4565b9150509250929050565b600081518084526020808501945080840160005b8381101561343b5781518752958201959082019060010161341f565b509495945050505050565b602081526000613241602083018461340b565b60008060006060848603121561346e57600080fd5b8335613479816132c4565b92506020840135613489816132c4565b929592945050506040919091013590565b6000602082840312156134ac57600080fd5b8135613241816132c4565b8015158114611c4e57600080fd5b600080604083850312156134d857600080fd5b82356134e3816132c4565b915060208301356134f3816134b7565b809150509250929050565b60006020828403121561351057600080fd5b8135613241816134b7565b60006020828403121561352d57600080fd5b813567ffffffffffffffff81111561354457600080fd5b613029848285016133a4565b6020808252825182820181905260009190848201906040850190845b818110156135885783518352928401929184019160010161356c565b50909695505050505050565b600080604083850312156135a757600080fd5b50508035926020909101359150565b600080604083850312156135c957600080fd5b823567ffffffffffffffff8111156135e057600080fd5b6135ec858286016133a4565b95602094909401359450505050565b60008060006060848603121561361057600080fd5b83359250602084013567ffffffffffffffff81111561362e57600080fd5b61363a868287016133a4565b925050604084013590509250925092565b60408152600061365e604083018561340b565b90508260208301529392505050565b6000806000806080858703121561368357600080fd5b843561368e816132c4565b9350602085013561369e816132c4565b925060408501359150606085013567ffffffffffffffff8111156136c157600080fd5b8501601f810187136136d257600080fd5b6136e18782356020840161334c565b91505092959194509250565b6000806040838503121561370057600080fd5b823567ffffffffffffffff8082111561371857600080fd5b818501915085601f83011261372c57600080fd5b813560208282111561374057613740613305565b8160051b61374f82820161331b565b928352848101820192828101908a85111561376957600080fd5b83870192505b848310156137a5578235868111156137875760008081fd5b6137958c86838b01016133a4565b835250918301919083019061376f565b9a9890920135985050505050505050565b6060815260006137c9606083018661340b565b82810360208401526137db818661340b565b905082810360408401526137ef818561340b565b9695505050505050565b6000806040838503121561380c57600080fd5b8235613817816132c4565b915060208301356134f3816132c4565b600181811c9082168061383b57607f821691505b60208210810361385b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b601f821115610de157600081815260208120601f850160051c810160208610156138ab5750805b601f850160051c820191505b818110156138ca578281556001016138b7565b505050505050565b815167ffffffffffffffff8111156138ec576138ec613305565b613900816138fa8454613827565b84613884565b602080601f831160018114613935576000841561391d5750858301515b600019600386901b1c1916600185901b1785556138ca565b600085815260208120601f198616915b8281101561396457888601518255948401946001909101908401613945565b50858210156139825787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156139a457600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000602082840312156139e157600080fd5b8151613241816134b7565b98895260609790971b6bffffffffffffffffffffffff19166020890152603488019590955260548701939093526074860191909152609485015260b484015260d483015260f48201526101140190565b634e487b7160e01b600052601260045260246000fd5b600082613a6157613a61613a3c565b500690565b634e487b7160e01b600052601160045260246000fd5b600060018201613a8e57613a8e613a66565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613abd57600080fd5b8151613241816132c4565b81810381811115610bca57610bca613a66565b80516001600160701b0381168114613af257600080fd5b919050565b600080600060608486031215613b0c57600080fd5b613b1584613adb565b9250613b2360208501613adb565b9150604084015163ffffffff81168114613b3c57600080fd5b809150509250925092565b600082613b5657613b56613a3c565b500490565b60008251613b6d818460208701613248565b9190910192915050565b8a81526bffffffffffffffffffffffff198a60601b1660208201528860348201528760548201528660748201528560948201528460b48201528360d482015260008351613bcb8160f4850160208801613248565b60f4920191820192909252610114019a9950505050505050505050565b6000808454613bf681613827565b60018281168015613c0e5760018114613c2357613c52565b60ff1984168752821515830287019450613c52565b8860005260208060002060005b85811015613c495781548a820152908401908201613c30565b50505082870194505b505050508351613c66818360208801613248565b01949350505050565b8082028115828204841417610bca57610bca613a66565b80820180821115610bca57610bca613a66565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137ef9083018461326c565b600060208284031215613cde57600080fd5b81516132418161320e56fea264697066735822122087048a356d62ec63a7fe96db7eceb64852ca23abaeb3d9edb1ae1ba6bb0823d864736f6c6343000812003368747470733a2f2f77686974657261626269742e6d7970696e6174612e636c6f75642f697066732f

Deployed Bytecode

0x60806040526004361061038c5760003560e01c80636c0360eb116101da578063b918161111610101578063d34602381161009a578063ec047c081161006c578063ec047c0814610aee578063ef1aac8014610b0e578063f87c75eb14610b23578063f887ea4014610b4357005b8063d346023814610a5d578063d6fcb81014610a7d578063e935752814610aa1578063e985e9c514610ace57005b8063c87b56dd116100d3578063c87b56dd146109e3578063c93e230f14610a03578063cdaf5e4e14610a1d578063d14d6c2914610a3d57005b8063b918161114610955578063bc69de561461098e578063bf574348146109a3578063c45a0155146109c357005b806395d89b4111610173578063a22cb46511610145578063a22cb465146108df578063ad5c4648146108ff578063b27507711461091f578063b88d4fde1461093557005b806395d89b41146108675780639617b3871461087c578063966dae0e146108a9578063a035b1fe146108c957005b80637c469c2d116101ac5780637c469c2d146107d957806380a3d3d9146107f957806391b7f5ed1461081957806394dc9ddd1461083957005b80636c0360eb146107625780636ff499811461077757806370a08231146107a4578063714c5398146107c457005b80633268cc56116102be57806355de5a9311610257578063625b980411610229578063625b9804146106f75780636352211e14610717578063688d2a8b146107375780636ad5e0a11461074c57005b806355de5a931461068d57806355f804b3146106a257806359bd8c86146106c25780635b22773d146106e257005b80634c421db7116102905780634c421db71461060d5780634f0e0ef31461062d5780634f6ccce71461064d57806350c5c3b11461066d57005b80633268cc561461058d57806335c473d6146105ad5780633e2e582f146105cd57806342842e0e146105ed57005b8063142712211161033057806323b872dd1161030257806323b872dd1461050d578063253c8bd41461052d5780632bfe87421461054d5780632f745c591461056d57005b8063142712211461048c57806318160ddd146104b957806318f7d862146104d85780632200ec80146104f857005b8063095ea7b311610369578063095ea7b3146104245780630b044205146104445780630e957f04146104645780631249c58b1461048457005b806301ffc9a71461039557806306fdde03146103ca578063081812fc146103ec57005b3661039357005b005b3480156103a157600080fd5b506103b56103b0366004613224565b610b63565b60405190151581526020015b60405180910390f35b3480156103d657600080fd5b506103df610bd0565b6040516103c19190613298565b3480156103f857600080fd5b5061040c6104073660046132ab565b610c5e565b6040516001600160a01b0390911681526020016103c1565b34801561043057600080fd5b5061039361043f3660046132d9565b610ca4565b34801561045057600080fd5b5061039361045f3660046133c4565b610d7d565b34801561047057600080fd5b5060105461040c906001600160a01b031681565b610393610de6565b34801561049857600080fd5b506104ac6104a73660046132ab565b611604565b6040516103c19190613446565b3480156104c557600080fd5b506005545b6040519081526020016103c1565b3480156104e457600080fd5b50600f5461040c906001600160a01b031681565b34801561050457600080fd5b50610393611666565b34801561051957600080fd5b50610393610528366004613459565b6117e8565b34801561053957600080fd5b5061039361054836600461349a565b611a0d565b34801561055957600080fd5b506103936105683660046134c5565b611a73565b34801561057957600080fd5b506104ca6105883660046132d9565b611ae2565b34801561059957600080fd5b5060085461040c906001600160a01b031681565b3480156105b957600080fd5b506103936105c83660046134fe565b611b75565b3480156105d957600080fd5b5060115461040c906001600160a01b031681565b3480156105f957600080fd5b50610393610608366004613459565b611bcc565b34801561061957600080fd5b506103936106283660046134fe565b611be7565b34801561063957600080fd5b50600a5461040c906001600160a01b031681565b34801561065957600080fd5b506104ca6106683660046132ab565b611c51565b34801561067957600080fd5b50600e5461040c906001600160a01b031681565b34801561069957600080fd5b50601d546104ca565b3480156106ae57600080fd5b506103936106bd36600461351b565b611c7f565b3480156106ce57600080fd5b506103936106dd3660046132ab565b611cd3565b3480156106ee57600080fd5b506104ca611d1c565b34801561070357600080fd5b5061039361071236600461349a565b611e93565b34801561072357600080fd5b5061040c6107323660046132ab565b611f03565b34801561074357600080fd5b506104ca611f9e565b34801561075857600080fd5b506104ca60175481565b34801561076e57600080fd5b506103df611fbe565b34801561078357600080fd5b506107976107923660046132ab565b611fcb565b6040516103c19190613550565b3480156107b057600080fd5b506104ca6107bf36600461349a565b61202b565b3480156107d057600080fd5b506103df61209d565b3480156107e557600080fd5b506104ca6107f4366004613594565b61212f565b34801561080557600080fd5b506103936108143660046135b6565b612160565b34801561082557600080fd5b506103936108343660046132ab565b6122ff565b34801561084557600080fd5b506108596108543660046135fb565b612348565b6040516103c192919061364b565b34801561087357600080fd5b506103df61258e565b34801561088857600080fd5b506104ca6108973660046132ab565b601b6020526000908152604090205481565b3480156108b557600080fd5b50600c5461040c906001600160a01b031681565b3480156108d557600080fd5b506104ca60125481565b3480156108eb57600080fd5b506103936108fa3660046134c5565b61259b565b34801561090b57600080fd5b50600b5461040c906001600160a01b031681565b34801561092b57600080fd5b506104ca601d5481565b34801561094157600080fd5b5061039361095036600461366d565b612630565b34801561096157600080fd5b506103b561097036600461349a565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561099a57600080fd5b5061039361266a565b3480156109af57600080fd5b506103936109be3660046134fe565b6126c5565b3480156109cf57600080fd5b50600d5461040c906001600160a01b031681565b3480156109ef57600080fd5b506103df6109fe3660046132ab565b612725565b348015610a0f57600080fd5b506014546103b59060ff1681565b348015610a2957600080fd5b50610393610a383660046136ed565b612852565b348015610a4957600080fd5b506103df610a583660046132ab565b612b15565b348015610a6957600080fd5b50610393610a783660046134fe565b612bac565b348015610a8957600080fd5b50610a92612c1b565b6040516103c1939291906137b6565b348015610aad57600080fd5b506104ca610abc3660046132ab565b6000908152601b602052604090205490565b348015610ada57600080fd5b506103b5610ae93660046137f9565b612d1e565b348015610afa57600080fd5b506104ac610b0936600461349a565b612d4c565b348015610b1a57600080fd5b506017546104ca565b348015610b2f57600080fd5b50610393610b3e3660046133c4565b612eb6565b348015610b4f57600080fd5b5060095461040c906001600160a01b031681565b60006301ffc9a760e01b6001600160e01b031983161480610b9457506380ac58cd60e01b6001600160e01b03198316145b80610baf575063780e9d6360e01b6001600160e01b03198316145b80610bca5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60028054610bdd90613827565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990613827565b8015610c565780601f10610c2b57610100808354040283529160200191610c56565b820191906000526020600020905b815481529060010190602001808311610c3957829003601f168201915b505050505081565b6000610c6b826005541190565b610c88576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610caf82611f03565b9050806001600160a01b0316836001600160a01b031603610ce35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d035750610d018133612d1e565b155b15610d21576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360009081526020819052604090205460ff1680610da557506001546001600160a01b031633145b610dca5760405162461bcd60e51b8152600401610dc190613861565b60405180910390fd5b60008281526020805260409020610de182826138d2565b505050565b600154600160a01b900460ff1615610e2c5760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610dc1565b6001805460ff60a01b1916600160a01b17905560145460009060ff1615610e5c57610e55611d1c565b9050610e61565b506013545b601c5460ff1615610eb457601254341015610eaf5760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610dc1565b6112b0565b601c54610100900460ff16156110b7573415610f035760405162461bcd60e51b815260206004820152600e60248201526d139bc811551208185b1b1bddd95960921b6044820152606401610dc1565b600f546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610f4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6f9190613992565b1015610fae5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08195b9bdd59da0814909560921b6044820152606401610dc1565b601c5462010000900460ff161561108257600f546040516323b872dd60e01b81526000916001600160a01b0316906323b872dd90610ff4903390859087906004016139ab565b6020604051808303816000875af1158015611013573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103791906139cf565b90508061107c5760405162461bcd60e51b8152602060048201526013602482015272149095081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610dc1565b506112b0565b600f546040516323b872dd60e01b81526000916001600160a01b0316906323b872dd90610ff4903390309087906004016139ab565b341561110057601254341015610eaf5760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610dc1565b600f546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116c9190613992565b10156111ab5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08195b9bdd59da0814909560921b6044820152606401610dc1565b601c5462010000900460ff16156111f157600f546040516323b872dd60e01b81526000916001600160a01b0316906323b872dd90610ff4903390859087906004016139ab565b600f546040516323b872dd60e01b81526000916001600160a01b0316906323b872dd90611226903390309087906004016139ab565b6020604051808303816000875af1158015611245573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126991906139cf565b9050806112ae5760405162461bcd60e51b8152602060048201526013602482015272149095081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610dc1565b505b60008060175467ffffffffffffffff8111156112ce576112ce613305565b6040519080825280602002602001820160405280156112f7578160200160208202803683370190505b5090506000806000805b60175481101561158f57601854601954601a54606392429233926113248461202b565b44348960405160200161133f999897969594939291906139ec565b6040516020818303038152906040528051906020012060001c6113629190613a52565b9550605a861180156113745750600183105b1561138f57600291508261138781613a7c565b9350506113cb565b60288611801561139f5750605a86105b80156113ab5750600284105b156113c65760019150836113be81613a7c565b9450506113cb565b600091505b60608260000361142d57601880548060200260200160405190810160405280929190818152602001828054801561142157602002820191906000526020600020905b81548152602001906001019080831161140d575b505050505090506114df565b8260010361148b576019805480602002602001604051908101604052809291908181526020018280548015611421576020028201919060005260206000209081548152602001906001019080831161140d57505050505090506114df565b601a8054806020026020016040519081016040528092919081815260200182805480156114d757602002820191906000526020600020905b8154815260200190600101908083116114c3575b505050505090505b8051601854601954601a544292339290916114f98461202b565b44348a604051602001611514999897969594939291906139ec565b6040516020818303038152906040528051906020012060001c6115379190613a52565b9650808151886115479190613a52565b8151811061155757611557613a95565b602002602001015186838151811061157157611571613a95565b6020908102919091010152508061158781613a7c565b915050611301565b50601d5460058054600090815260216020908152604080832085905593825260228152838220835481546001810183559184528284209091015591548152601582529190912085516115e3928701906131b7565b506115ef336001612f12565b50506001805460ff60a01b1916905550505050565b60008181526015602090815260409182902080548351818402810184019094528084526060939283018282801561165a57602002820191906000526020600020905b815481526020019060010190808311611646575b50505050509050919050565b3360009081526020819052604090205460ff168061168e57506001546001600160a01b031633145b6116aa5760405162461bcd60e51b8152600401610dc190613861565b600d54600e54600a5460405163e6a4390560e01b81526001600160a01b039283166004820152908216602482015291169063e6a4390590604401602060405180830381865afa158015611701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117259190613aab565b601080546001600160a01b0319166001600160a01b039290921691821790556117e657600d54600e54600a546040516364e329cb60e11b81526001600160a01b039283166004820152908216602482015291169063c9c65396906044016020604051808303816000875af11580156117a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c59190613aab565b601080546001600160a01b0319166001600160a01b03929092169190911790555b565b6117f3816005541190565b61181057604051636f96cda160e11b815260040160405180910390fd5b826001600160a01b031661182382611f03565b6001600160a01b0316146118495760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03821661187057604051633a954ecd60e21b815260040160405180910390fd5b6000336001600160a01b03851614806118a2575061188d82610c5e565b6001600160a01b0316336001600160a01b0316145b806118b257506118b28433612d1e565b9050806118d257604051632ce44b5f60e11b815260040160405180910390fd5b600082815260066020526040902080546001600160a01b0319169055600580548491908490811061190557611905613a95565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060008211801561197457506000600561194d600185613ac8565b8154811061195d5761195d613a95565b6000918252602090912001546001600160a01b0316145b156119c657836005611987600185613ac8565b8154811061199757611997613a95565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b3360009081526020819052604090205460ff1680611a3557506001546001600160a01b031633145b611a515760405162461bcd60e51b8152600401610dc190613861565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680611a9b57506001546001600160a01b031633145b611ab75760405162461bcd60e51b8152600401610dc190613861565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6000611aed8361202b565b8210611b0c576040516306ed618760e11b815260040160405180910390fd5b6005546000905b80831015611b5c57611b2483611f03565b6001600160a01b0316856001600160a01b031603611b5157838203611b4a575050610bca565b6001909101905b600190920191611b13565b604051637339954760e01b815260040160405180910390fd5b3360009081526020819052604090205460ff1680611b9d57506001546001600160a01b031633145b611bb95760405162461bcd60e51b8152600401610dc190613861565b6014805460ff1916911515919091179055565b610de183838360405180602001604052806000815250612630565b3360009081526020819052604090205460ff1680611c0f57506001546001600160a01b031633145b611c2b5760405162461bcd60e51b8152600401610dc190613861565b601c805460ff19168215801591909117909155611c4e57601c805461ff00191690555b50565b6000611c5c60055490565b8210611c7b576040516329c8c00760e21b815260040160405180910390fd5b5090565b3360009081526020819052604090205460ff1680611ca757506001546001600160a01b031633145b611cc35760405162461bcd60e51b8152600401610dc190613861565b6004611ccf82826138d2565b5050565b3360009081526020819052604090205460ff1680611cfb57506001546001600160a01b031633145b611d175760405162461bcd60e51b8152600401610dc190613861565b601355565b600e546000906001600160a01b031615801590611d435750600a546001600160a01b031615155b611d8f5760405162461bcd60e51b815260206004820152601760248201527f524254206f722057455448206e6f7420646566696e65640000000000000000006044820152606401610dc1565b6010546001600160a01b0316611de75760405162461bcd60e51b815260206004820152601760248201527f5242542f574554482070616972206e6f7420666f756e640000000000000000006044820152606401610dc1565b600080601060009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e619190613af7565b506001600160701b0391821693501690506000611e7e8284613b47565b9050611e8b601482613b47565b935050505090565b3360009081526020819052604090205460ff1680611ebb57506001546001600160a01b031633145b611ed75760405162461bcd60e51b8152600401610dc190613861565b600e80546001600160a01b039092166001600160a01b03199283168117909155600f8054909216179055565b6000611f10826005541190565b611f2d57604051636f96cda160e11b815260040160405180910390fd5b60006001600160a01b031660058381548110611f4b57611f4b613a95565b6000918252602090912001546001600160a01b031614611f935760058281548110611f7857611f78613a95565b6000918252602090912001546001600160a01b031692915050565b600190910190611f2d565b601454600090819060ff1615611fb657610bca611d1c565b505060135490565b60048054610bdd90613827565b60008181526022602090815260409182902080548351818402810184019094528084526060939283018282801561165a57602002820191906000526020600020908154815260200190600101908083116116465750505050509050919050565b60006001600160a01b038216612054576040516323d3ad8160e21b815260040160405180910390fd5b600554600090815b818110156120945761206d81611f03565b6001600160a01b0316856001600160a01b03160361208c576001909201915b60010161205c565b50909392505050565b6060600480546120ac90613827565b80601f01602080910402602001604051908101604052809291908181526020018280546120d890613827565b80156121255780601f106120fa57610100808354040283529160200191612125565b820191906000526020600020905b81548152906001019060200180831161210857829003601f168201915b5050505050905090565b6015602052816000526040600020818154811061214b57600080fd5b90600052602060002001600091509150505481565b3360009081526020819052604090205460ff168061218857506001546001600160a01b031633145b6121a45760405162461bcd60e51b8152600401610dc190613861565b6000826040516020016121b79190613b5b565b6040516020818303038152906040528051906020012090508160000361221157601880546001810182556000919091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e018190556122ce565b8160010361225357601980546001810182556000919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695018190556122ce565b8160020361229557601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e018190556122ce565b60405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642072617269747960901b6044820152606401610dc1565b6000818152601f60205260408120805460ff19166001179055601e8054916122f583613a7c565b9190505550505050565b3360009081526020819052604090205460ff168061232757506001546001600160a01b031633145b6123435760405162461bcd60e51b8152600401610dc190613861565b601255565b336000908152602081905260408120546060919060ff168061237457506001546001600160a01b031633145b6123905760405162461bcd60e51b8152600401610dc190613861565b6000808667ffffffffffffffff8111156123ac576123ac613305565b6040519080825280602002602001820160405280156123d5578160200160208202803683370190505b5090506000805b8882101561257f57601854601954601a54601e5442933393909290916124018561202b565b448f8960405160200161241d9a99989796959493929190613b77565b60408051601f1981840301815291815281516020928301206000818152601f9093529082205490955060ff161515900361256d578383838151811061246457612464613a95565b602002602001018181525050866000036124b257601880546001810182556000919091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e01849055612532565b866001036124f457601980546001810182556000919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c969501849055612532565b8660020361229557601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e018490555b6000848152601f60205260408120805460ff19166001179055601e80549161255983613a7c565b9190505550818061256990613a7c565b9250505b8061257781613a7c565b9150506123dc565b91989197509095505050505050565b60038054610bdd90613827565b336001600160a01b038316036125c45760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61263b8484846117e8565b61264784848484612f2c565b612664576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b3360009081526020819052604090205460ff168061269257506001546001600160a01b031633145b6126ae5760405162461bcd60e51b8152600401610dc190613861565b601d80549060006126be83613a7c565b9190505550565b3360009081526020819052604090205460ff16806126ed57506001546001600160a01b031633145b6127095760405162461bcd60e51b8152600401610dc190613861565b601c8054911515620100000262ff000019909216919091179055565b6060612732826005541190565b61277e5760405162461bcd60e51b815260206004820152601b60248201527f5552495175657279466f724e6f6e6578697374656e74546f6b656e00000000006044820152606401610dc1565b600082815260216020908152604080832054808452918052822080549192916127a690613827565b80601f01602080910402602001604051908101604052809291908181526020018280546127d290613827565b801561281f5780601f106127f45761010080835404028352916020019161281f565b820191906000526020600020905b81548152906001019060200180831161280257829003601f168201915b5050505050905060048160405160200161283a929190613be8565b60405160208183030381529060405292505050919050565b3360009081526020819052604090205460ff168061287a57506001546001600160a01b031633145b6128965760405162461bcd60e51b8152600401610dc190613861565b60008160000361296c5760005b8351811015612664578381815181106128be576128be613a95565b60200260200101516040516020016128d69190613b5b565b60408051601f1981840301815291815281516020928301206018805460018181019092557fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e018290556000828152601b8552838120819055601f909452918320805460ff1916909217909155601e8054919450909161295483613a7c565b9190505550808061296490613a7c565b9150506128a3565b81600103612a405760005b83518110156126645783818151811061299257612992613a95565b60200260200101516040516020016129aa9190613b5b565b60408051601f1981840301815291815281516020928301206019805460018181019092557f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695018290556000828152601b8552838120829055601f909452918320805460ff1916909217909155601e80549194509091612a2883613a7c565b91905055508080612a3890613a7c565b915050612977565b816002036122955760005b835181101561266457838181518110612a6657612a66613a95565b6020026020010151604051602001612a7e9190613b5b565b60408051601f198184030181529181528151602092830120601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e018290556000828152601b855283812060029055601f909452918320805460ff1916909217909155601e80549194509091612afd83613a7c565b91905055508080612b0d90613a7c565b915050612a4b565b60008181526020805260409020805460609190612b3190613827565b80601f0160208091040260200160405190810160405280929190818152602001828054612b5d90613827565b801561165a5780601f10612b7f5761010080835404028352916020019161165a565b820191906000526020600020905b815481529060010190602001808311612b8d5750939695505050505050565b3360009081526020819052604090205460ff1680612bd457506001546001600160a01b031633145b612bf05760405162461bcd60e51b8152600401610dc190613861565b601c8054821580156101000261ff001990921691909117909155611c4e57601c805460ff1916905550565b60608060606018805480602002602001604051908101604052809291908181526020018280548015612c6c57602002820191906000526020600020905b815481526020019060010190808311612c58575b505050505092506019805480602002602001604051908101604052809291908181526020018280548015612cbf57602002820191906000526020600020905b815481526020019060010190808311612cab575b50505050509150601a805480602002602001604051908101604052809291908181526020018280548015612d1257602002820191906000526020600020905b815481526020019060010190808311612cfe575b50505050509050909192565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60606000601754612d5c8461202b565b612d669190613c6f565b67ffffffffffffffff811115612d7e57612d7e613305565b604051908082528060200260200182016040528015612da7578160200160208202803683370190505b50905060005b612db68461202b565b811015612eaf57600060156000612dcd8785611ae2565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015612e2557602002820191906000526020600020905b815481526020019060010190808311612e11575b5050505050905060005b601754811015612e9a57818181518110612e4b57612e4b613a95565b6020026020010151848260175486612e639190613c6f565b612e6d9190613c86565b81518110612e7d57612e7d613a95565b602090810291909101015280612e9281613a7c565b915050612e2f565b50508080612ea790613a7c565b915050612dad565b5092915050565b3360009081526020819052604090205460ff1680612ede57506001546001600160a01b031633145b612efa5760405162461bcd60e51b8152600401610dc190613861565b6000828152601660205260409020610de182826138d2565b611ccf828260405180602001604052806000815250613031565b6000836001600160a01b03163b600003612f4857506001613029565b604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612f7a903390899088908890600401613c99565b6020604051808303816000875af1925050508015612fb5575060408051601f3d908101601f19168201909252612fb291810190613ccc565b60015b613013573d808015612fe3576040519150601f19603f3d011682016040523d82523d6000602084013e612fe8565b606091505b50805160000361300b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b61303b8383613076565b61305960008460016005805490506130539190613ac8565b84612f2c565b610de1576040516368d2bf6b60e11b815260040160405180910390fd5b6001600160a01b03821661309c57604051622e076360e81b815260040160405180910390fd5b806000036130bd5760405163b562e8dd60e01b815260040160405180910390fd5b60055460005b6001830381101561311b576005805460010181556000908152604051838301916001600160a01b038716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001016130c3565b5060058054600180820183556000929092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0386161790556131729083613ac8565b61317c9082613c86565b6040516001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b8280548282559060005260206000209081019282156131f2579160200282015b828111156131f25782518255916020019190600101906131d7565b50611c7b9291505b80821115611c7b57600081556001016131fa565b6001600160e01b031981168114611c4e57600080fd5b60006020828403121561323657600080fd5b81356132418161320e565b9392505050565b60005b8381101561326357818101518382015260200161324b565b50506000910152565b60008151808452613284816020860160208601613248565b601f01601f19169290920160200192915050565b602081526000613241602083018461326c565b6000602082840312156132bd57600080fd5b5035919050565b6001600160a01b0381168114611c4e57600080fd5b600080604083850312156132ec57600080fd5b82356132f7816132c4565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561334457613344613305565b604052919050565b600067ffffffffffffffff83111561336657613366613305565b613379601f8401601f191660200161331b565b905082815283838301111561338d57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133b557600080fd5b6132418383356020850161334c565b600080604083850312156133d757600080fd5b82359150602083013567ffffffffffffffff8111156133f557600080fd5b613401858286016133a4565b9150509250929050565b600081518084526020808501945080840160005b8381101561343b5781518752958201959082019060010161341f565b509495945050505050565b602081526000613241602083018461340b565b60008060006060848603121561346e57600080fd5b8335613479816132c4565b92506020840135613489816132c4565b929592945050506040919091013590565b6000602082840312156134ac57600080fd5b8135613241816132c4565b8015158114611c4e57600080fd5b600080604083850312156134d857600080fd5b82356134e3816132c4565b915060208301356134f3816134b7565b809150509250929050565b60006020828403121561351057600080fd5b8135613241816134b7565b60006020828403121561352d57600080fd5b813567ffffffffffffffff81111561354457600080fd5b613029848285016133a4565b6020808252825182820181905260009190848201906040850190845b818110156135885783518352928401929184019160010161356c565b50909695505050505050565b600080604083850312156135a757600080fd5b50508035926020909101359150565b600080604083850312156135c957600080fd5b823567ffffffffffffffff8111156135e057600080fd5b6135ec858286016133a4565b95602094909401359450505050565b60008060006060848603121561361057600080fd5b83359250602084013567ffffffffffffffff81111561362e57600080fd5b61363a868287016133a4565b925050604084013590509250925092565b60408152600061365e604083018561340b565b90508260208301529392505050565b6000806000806080858703121561368357600080fd5b843561368e816132c4565b9350602085013561369e816132c4565b925060408501359150606085013567ffffffffffffffff8111156136c157600080fd5b8501601f810187136136d257600080fd5b6136e18782356020840161334c565b91505092959194509250565b6000806040838503121561370057600080fd5b823567ffffffffffffffff8082111561371857600080fd5b818501915085601f83011261372c57600080fd5b813560208282111561374057613740613305565b8160051b61374f82820161331b565b928352848101820192828101908a85111561376957600080fd5b83870192505b848310156137a5578235868111156137875760008081fd5b6137958c86838b01016133a4565b835250918301919083019061376f565b9a9890920135985050505050505050565b6060815260006137c9606083018661340b565b82810360208401526137db818661340b565b905082810360408401526137ef818561340b565b9695505050505050565b6000806040838503121561380c57600080fd5b8235613817816132c4565b915060208301356134f3816132c4565b600181811c9082168061383b57607f821691505b60208210810361385b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b601f821115610de157600081815260208120601f850160051c810160208610156138ab5750805b601f850160051c820191505b818110156138ca578281556001016138b7565b505050505050565b815167ffffffffffffffff8111156138ec576138ec613305565b613900816138fa8454613827565b84613884565b602080601f831160018114613935576000841561391d5750858301515b600019600386901b1c1916600185901b1785556138ca565b600085815260208120601f198616915b8281101561396457888601518255948401946001909101908401613945565b50858210156139825787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156139a457600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000602082840312156139e157600080fd5b8151613241816134b7565b98895260609790971b6bffffffffffffffffffffffff19166020890152603488019590955260548701939093526074860191909152609485015260b484015260d483015260f48201526101140190565b634e487b7160e01b600052601260045260246000fd5b600082613a6157613a61613a3c565b500690565b634e487b7160e01b600052601160045260246000fd5b600060018201613a8e57613a8e613a66565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613abd57600080fd5b8151613241816132c4565b81810381811115610bca57610bca613a66565b80516001600160701b0381168114613af257600080fd5b919050565b600080600060608486031215613b0c57600080fd5b613b1584613adb565b9250613b2360208501613adb565b9150604084015163ffffffff81168114613b3c57600080fd5b809150509250925092565b600082613b5657613b56613a3c565b500490565b60008251613b6d818460208701613248565b9190910192915050565b8a81526bffffffffffffffffffffffff198a60601b1660208201528860348201528760548201528660748201528560948201528460b48201528360d482015260008351613bcb8160f4850160208801613248565b60f4920191820192909252610114019a9950505050505050505050565b6000808454613bf681613827565b60018281168015613c0e5760018114613c2357613c52565b60ff1984168752821515830287019450613c52565b8860005260208060002060005b85811015613c495781548a820152908401908201613c30565b50505082870194505b505050508351613c66818360208801613248565b01949350505050565b8082028115828204841417610bca57610bca613a66565b80820180821115610bca57610bca613a66565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137ef9083018461326c565b600060208284031215613cde57600080fd5b81516132418161320e56fea264697066735822122087048a356d62ec63a7fe96db7eceb64852ca23abaeb3d9edb1ae1ba6bb0823d864736f6c63430008120033

Deployed Bytecode Sourcemap

11146:27026:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12831:426;;;;;;;;;;-1:-1:-1;12831:426:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;12831:426:0;;;;;;;;11389:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16937:203::-;;;;;;;;;;-1:-1:-1;16937:203:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;16937:203:0;1533::1;16489:382:0;;;;;;;;;;-1:-1:-1;16489:382:0;;;;;:::i;:::-;;:::i;24539:130::-;;;;;;;;;;-1:-1:-1;24539:130:0;;;;;:::i;:::-;;:::i;23097:34::-;;;;;;;;;;-1:-1:-1;23097:34:0;;;;-1:-1:-1;;;;;23097:34:0;;;25461:4789;;;:::i;30690:121::-;;;;;;;;;;-1:-1:-1;30690:121:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13523:93::-;;;;;;;;;;-1:-1:-1;13594:7:0;:14;13523:93;;;4495:25:1;;;4483:2;4468:18;13523:93:0;4349:177:1;23073:17:0;;;;;;;;;;-1:-1:-1;23073:17:0;;;;-1:-1:-1;;;;;23073:17:0;;;36299:400;;;;;;;;;;;;;:::i;17779:1011::-;;;;;;;;;;-1:-1:-1;17779:1011:0;;;;;:::i;:::-;;:::i;741:93::-;;;;;;;;;;-1:-1:-1;741:93:0;;;;;:::i;:::-;;:::i;243:106::-;;;;;;;;;;-1:-1:-1;243:106:0;;;;;:::i;:::-;;:::i;13855:634::-;;;;;;;;;;-1:-1:-1;13855:634:0;;;;;:::i;:::-;;:::i;22789:73::-;;;;;;;;;;-1:-1:-1;22789:73:0;;;;-1:-1:-1;;;;;22789:73:0;;;32402:109;;;;;;;;;;-1:-1:-1;32402:109:0;;;;;:::i;:::-;;:::i;23138:34::-;;;;;;;;;;-1:-1:-1;23138:34:0;;;;-1:-1:-1;;;;;23138:34:0;;;18861:166;;;;;;;;;;-1:-1:-1;18861:166:0;;;;;:::i;:::-;;:::i;31944:143::-;;;;;;;;;;-1:-1:-1;31944:143:0;;;;;:::i;:::-;;:::i;22908:26::-;;;;;;;;;;-1:-1:-1;22908:26:0;;;;-1:-1:-1;;;;;22908:26:0;;;14566:175;;;;;;;;;;-1:-1:-1;14566:175:0;;;;;:::i;:::-;;:::i;23041:25::-;;;;;;;;;;-1:-1:-1;23041:25:0;;;;-1:-1:-1;;;;;23041:25:0;;;25286:99;;;;;;;;;;-1:-1:-1;25363:14:0;;25286:99;;24335:97;;;;;;;;;;-1:-1:-1;24335:97:0;;;;;:::i;:::-;;:::i;32519:101::-;;;;;;;;;;-1:-1:-1;32519:101:0;;;;;:::i;:::-;;:::i;36784:653::-;;;;;;;;;;;;;:::i;31798:138::-;;;;;;;;;;-1:-1:-1;31798:138:0;;;;;:::i;:::-;;:::i;15947:480::-;;;;;;;;;;-1:-1:-1;15947:480:0;;;;;:::i;:::-;;:::i;32628:249::-;;;;;;;;;;;;;:::i;23615:32::-;;;;;;;;;;;;;;;;11478:66;;;;;;;;;;;;;:::i;25144:134::-;;;;;;;;;;-1:-1:-1;25144:134:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15202:497::-;;;;;;;;;;-1:-1:-1;15202:497:0;;;;;:::i;:::-;;:::i;24440:91::-;;;;;;;;;;;;;:::i;23438:45::-;;;;;;;;;;-1:-1:-1;23438:45:0;;;;;:::i;:::-;;:::i;33194:420::-;;;;;;;;;;-1:-1:-1;33194:420:0;;;;;:::i;:::-;;:::i;32885:83::-;;;;;;;;;;-1:-1:-1;32885:83:0;;;;;:::i;:::-;;:::i;34927:1311::-;;;;;;;;;;-1:-1:-1;34927:1311:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;11440:31::-;;;;;;;;;;;;;:::i;23771:44::-;;;;;;;;;;-1:-1:-1;23771:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;22966:29;;;;;;;;;;-1:-1:-1;22966:29:0;;;;-1:-1:-1;;;;;22966:29:0;;;23196:30;;;;;;;;;;;;;;;;17212:272;;;;;;;;;;-1:-1:-1;17212:272:0;;;;;:::i;:::-;;:::i;22941:18::-;;;;;;;;;;-1:-1:-1;22941:18:0;;;;-1:-1:-1;;;;;22941:18:0;;;24000:30;;;;;;;;;;;;;;;;19098:295;;;;;;;;;;-1:-1:-1;19098:295:0;;;;;:::i;:::-;;:::i;138:99::-;;;;;;;;;;-1:-1:-1;138:99:0;;;;;:::i;:::-;-1:-1:-1;;;;;216:13:0;192:4;216:13;;;;;;;;;;;;;;138:99;37449:77;;;;;;;;;;;;;:::i;32284:88::-;;;;;;;;;;-1:-1:-1;32284:88:0;;;;;:::i;:::-;;:::i;23002:32::-;;;;;;;;;;-1:-1:-1;23002:32:0;;;;-1:-1:-1;;;;;23002:32:0;;;24813:323;;;;;;;;;;-1:-1:-1;24813:323:0;;;;;:::i;:::-;;:::i;23304:31::-;;;;;;;;;;-1:-1:-1;23304:31:0;;;;;;;;33648:1186;;;;;;;;;;-1:-1:-1;33648:1186:0;;;;;:::i;:::-;;:::i;24677:128::-;;;;;;;;;;-1:-1:-1;24677:128:0;;;;;:::i;:::-;;:::i;32095:131::-;;;;;;;;;;-1:-1:-1;32095:131:0;;;;;:::i;:::-;;:::i;30306:324::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;31655:110::-;;;;;;;;;;-1:-1:-1;31655:110:0;;;;;:::i;:::-;31715:4;31739:18;;;:11;:18;;;;;;;31655:110;17555:157;;;;;;;;;;-1:-1:-1;17555:157:0;;;;;:::i;:::-;;:::i;30868:578::-;;;;;;;;;;-1:-1:-1;30868:578:0;;;;;:::i;:::-;;:::i;31506:98::-;;;;;;;;;;-1:-1:-1;31580:16:0;;31506:98;;33025:110;;;;;;;;;;-1:-1:-1;33025:110:0;;;;;:::i;:::-;;:::i;22869:32::-;;;;;;;;;;-1:-1:-1;22869:32:0;;;;-1:-1:-1;;;;;22869:32:0;;;12831:426;12907:4;-1:-1:-1;;;;;;;;;12944:25:0;;;;:101;;-1:-1:-1;;;;;;;;;;13020:25:0;;;12944:101;:177;;;-1:-1:-1;;;;;;;;;;13096:25:0;;;12944:177;:263;;;-1:-1:-1;;;;;;;;;;13182:25:0;;;12944:263;12924:283;12831:426;-1:-1:-1;;12831:426:0:o;11389:42::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16937:203::-;17004:7;17029:16;17037:7;19565;:14;-1:-1:-1;19555:24:0;19466:121;17029:16;17024:64;;17054:34;;-1:-1:-1;;;17054:34:0;;;;;;;;;;;17024:64;-1:-1:-1;17108:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;17108:24:0;;16937:203::o;16489:382::-;16561:14;16578:16;16586:7;16578;:16::i;:::-;16561:33;;16615:6;-1:-1:-1;;;;;16609:12:0;:2;-1:-1:-1;;;;;16609:12:0;;16605:49;;16630:24;;-1:-1:-1;;;16630:24:0;;;;;;;;;;;16605:49;16671:10;-1:-1:-1;;;;;16671:20:0;;;;;;:61;;;16696:36;16713:6;16721:10;16696:16;:36::i;:::-;16695:37;16671:61;16667:109;;;16741:35;;-1:-1:-1;;;16741:35:0;;;;;;;;;;;16667:109;16789:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;16789:29:0;-1:-1:-1;;;;;16789:29:0;;;;;;;;;16834;;16789:24;;16834:29;;;;;;;16550:321;16489:382;;:::o;24539:130::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;;;;;;;;;24632:21:::1;::::0;;;:12:::1;:21:::0;;;;;:29:::1;24656:5:::0;24632:21;:29:::1;:::i;:::-;;24539:130:::0;;:::o;25461:4789::-;646:6;;-1:-1:-1;;;646:6:0;;;;645:7;637:29;;;;-1:-1:-1;;;637:29:0;;15935:2:1;637:29:0;;;15917:21:1;15974:1;15954:18;;;15947:29;-1:-1:-1;;;15992:18:1;;;15985:39;16041:18;;637:29:0;15733:332:1;637:29:0;686:4;677:13;;-1:-1:-1;;;;677:13:0;-1:-1:-1;;;677:13:0;;;:6;25567:12;677:13;;;25567:12:::1;25563:132;;;25608:16;:14;:16::i;:::-;25596:28;;25563:132;;;-1:-1:-1::0;25669:14:0::1;::::0;25563:132:::1;25750:10;::::0;::::1;;25746:1358;;;25793:5;;25781:9;:17;25777:47;;;25800:24;::::0;-1:-1:-1;;;25800:24:0;;16272:2:1;25800:24:0::1;::::0;::::1;16254:21:1::0;16311:2;16291:18;;;16284:30;-1:-1:-1;;;16330:18:1;;;16323:44;16384:18;;25800:24:0::1;16070:338:1::0;25777:47:0::1;25746:1358;;;25846:7;::::0;::::1;::::0;::::1;;;25842:1262;;;25874:9;:13:::0;25870:43:::1;;25889:24;::::0;-1:-1:-1;;;25889:24:0;;16615:2:1;25889:24:0::1;::::0;::::1;16597:21:1::0;16654:2;16634:18;;;16627:30;-1:-1:-1;;;16673:18:1;;;16666:44;16727:18;;25889:24:0::1;16413:338:1::0;25870:43:0::1;25932:3;::::0;:25:::1;::::0;-1:-1:-1;;;25932:25:0;;25946:10:::1;25932:25;::::0;::::1;1679:51:1::0;25960:9:0;;-1:-1:-1;;;;;25932:3:0::1;::::0;:13:::1;::::0;1652:18:1;;25932:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;25928:67;;;25971:24;::::0;-1:-1:-1;;;25971:24:0;;17147:2:1;25971:24:0::1;::::0;::::1;17129:21:1::0;17186:2;17166:18;;;17159:30;-1:-1:-1;;;17205:18:1;;;17198:44;17259:18;;25971:24:0::1;16945:338:1::0;25928:67:0::1;26064:7;::::0;;;::::1;;;26060:348;;;26107:3;::::0;:51:::1;::::0;-1:-1:-1;;;26107:51:0;;26092:12:::1;::::0;-1:-1:-1;;;;;26107:3:0::1;::::0;:16:::1;::::0;:51:::1;::::0;26124:10:::1;::::0;26092:12;;26148:9;;26107:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26092:66;;26182:7;26177:43;;26191:29;::::0;-1:-1:-1;;;26191:29:0;;18120:2:1;26191:29:0::1;::::0;::::1;18102:21:1::0;18159:2;18139:18;;;18132:30;-1:-1:-1;;;18178:18:1;;;18171:49;18237:18;;26191:29:0::1;17918:343:1::0;26177:43:0::1;26073:163;25842:1262;;26060:348;26276:3;::::0;:54:::1;::::0;-1:-1:-1;;;26276:54:0;;26261:12:::1;::::0;-1:-1:-1;;;;;26276:3:0::1;::::0;:16:::1;::::0;:54:::1;::::0;26293:10:::1;::::0;26313:4:::1;::::0;26320:9;;26276:54:::1;;;:::i;25842:1262::-;26444:9;:13:::0;26440:653:::1;;26494:5;;26482:9;:17;26478:47;;;26501:24;::::0;-1:-1:-1;;;26501:24:0;;16272:2:1;26501:24:0::1;::::0;::::1;16254:21:1::0;16311:2;16291:18;;;16284:30;-1:-1:-1;;;16330:18:1;;;16323:44;16384:18;;26501:24:0::1;16070:338:1::0;26440:653:0::1;26570:3;::::0;:25:::1;::::0;-1:-1:-1;;;26570:25:0;;26584:10:::1;26570:25;::::0;::::1;1679:51:1::0;26598:9:0;;-1:-1:-1;;;;;26570:3:0::1;::::0;:13:::1;::::0;1652:18:1;;26570:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;26566:67;;;26609:24;::::0;-1:-1:-1;;;26609:24:0;;17147:2:1;26609:24:0::1;::::0;::::1;17129:21:1::0;17186:2;17166:18;;;17159:30;-1:-1:-1;;;17205:18:1;;;17198:44;17259:18;;26609:24:0::1;16945:338:1::0;26566:67:0::1;26710:7;::::0;;;::::1;;;26706:372;;;26757:3;::::0;:51:::1;::::0;-1:-1:-1;;;26757:51:0;;26742:12:::1;::::0;-1:-1:-1;;;;;26757:3:0::1;::::0;:16:::1;::::0;:51:::1;::::0;26774:10:::1;::::0;26742:12;;26798:9;;26757:51:::1;;;:::i;26706:372::-;26938:3;::::0;:54:::1;::::0;-1:-1:-1;;;26938:54:0;;26923:12:::1;::::0;-1:-1:-1;;;;;26938:3:0::1;::::0;:16:::1;::::0;:54:::1;::::0;26955:10:::1;::::0;26975:4:::1;::::0;26982:9;;26938:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26923:69;;27020:7;27015:43;;27029:29;::::0;-1:-1:-1;;;27029:29:0;;18120:2:1;27029:29:0::1;::::0;::::1;18102:21:1::0;18159:2;18139:18;;;18132:30;-1:-1:-1;;;18178:18:1;;;18171:49;18237:18;;27029:29:0::1;17918:343:1::0;27015:43:0::1;26900:178;26706:372;27116:11;27188:23:::0;27228:16:::1;;27214:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;27214:31:0::1;;27188:57;;27283:13;27311:9:::0;27335:20:::1;27407:6:::0;27402:2514:::1;27423:16;;27419:1;:20;27402:2514;;;27712:12;:19:::0;27788:14:::1;:21:::0;27866:10:::1;:17:::0;28165:2:::1;::::0;27573:15:::1;::::0;27645:10:::1;::::0;27940:21:::1;27645:10:::0;27940:9:::1;:21::i;:::-;28018:16;28091:9;28157:1;27556:603;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27545:616;;;;;;27540:622;;:627;;;;:::i;:::-;27531:636;;28350:2;28341:6;:11;28340:27;;;;;28365:1;28358:4;:8;28340:27;28336:332;;;28414:1;::::0;-1:-1:-1;28434:6:0;::::1;::::0;::::1;:::i;:::-;;;;28336:332;;;28479:2;28470:6;:11;28469:30;;;;;28496:2;28487:6;:11;28469:30;:48;;;;;28515:1;28504:8;:12;28469:48;28465:203;;;28563:1;::::0;-1:-1:-1;28582:10:0;::::1;::::0;::::1;:::i;:::-;;;;28465:203;;;28651:1;28633:19;;28465:203;28742:26;28787:15;28806:1;28787:20:::0;28783:241:::1;;28840:12;28828:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28783:241;;;28878:15;28897:1;28878:20:::0;28874:150:::1;;28931:14;28919:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28874:150;;;28998:10;28986:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28874:150;29765:16:::0;;29312:12:::1;:19:::0;29388:14:::1;:21:::0;29466:10:::1;:17:::0;29173:15:::1;::::0;29245:10:::1;::::0;29312:19;;29540:21:::1;29245:10:::0;29540:9:::1;:21::i;:::-;29618:16;29691:9;29757:1;29156:603;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29145:616;;;;;;29140:622;;:641;;;;:::i;:::-;29131:650;;29868:9;29887;:16;29878:6;:25;;;;:::i;:::-;29868:36;;;;;;;;:::i;:::-;;;;;;;29856:6;29863:1;29856:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:48;-1:-1:-1;27441:3:0;::::1;::::0;::::1;:::i;:::-;;;;27402:2514;;;-1:-1:-1::0;30000:14:0::1;::::0;29982:7:::1;:14:::0;;29967:30:::1;::::0;;;:14:::1;:30;::::0;;;;;;;:47;;;30066:30;;;:14:::1;:30:::0;;;;;30102:14;;30066:51;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;30183:14;;30171:27;;:11:::1;:27:::0;;;;;;:36;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;30218:24;30228:10;30240:1;30218:9;:24::i;:::-;-1:-1:-1::0;;713:6:0;:14;;-1:-1:-1;;;;713:14:0;;;-1:-1:-1;;;;25461:4789:0:o;30690:121::-;30783:20;;;;:11;:20;;;;;;;;;30776:27;;;;;;;;;;;;;;;;;30747:16;;30776:27;;;30783:20;30776:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30690:121;;;:::o;36299:400::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;36446:7:::1;::::0;36463:10:::1;::::0;36475:11:::1;::::0;36428:59:::1;::::0;-1:-1:-1;;;36428:59:0;;-1:-1:-1;;;;;36463:10:0;;::::1;36428:59;::::0;::::1;19891:34:1::0;36475:11:0;;::::1;19941:18:1::0;;;19934:43;36446:7:0;::::1;::::0;36428:34:::1;::::0;19826:18:1;;36428:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36406:19;:81:::0;;-1:-1:-1;;;;;;36406:81:0::1;-1:-1:-1::0;;;;;36406:81:0;;;::::1;::::0;;::::1;::::0;;36542:150:::1;;36636:7;::::0;36656:10:::1;::::0;36668:11:::1;::::0;36618:62:::1;::::0;-1:-1:-1;;;36618:62:0;;-1:-1:-1;;;;;36656:10:0;;::::1;36618:62;::::0;::::1;19891:34:1::0;36668:11:0;;::::1;19941:18:1::0;;;19934:43;36636:7:0;::::1;::::0;36618:37:::1;::::0;19826:18:1;;36618:62:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36596:19;:84:::0;;-1:-1:-1;;;;;;36596:84:0::1;-1:-1:-1::0;;;;;36596:84:0;;;::::1;::::0;;;::::1;::::0;;36542:150:::1;36299:400::o:0;17779:1011::-;17909:16;17917:7;19565;:14;-1:-1:-1;19555:24:0;19466:121;17909:16;17904:61;;17934:31;;-1:-1:-1;;;17934:31:0;;;;;;;;;;;17904:61;18000:4;-1:-1:-1;;;;;17980:24:0;:16;17988:7;17980;:16::i;:::-;-1:-1:-1;;;;;17980:24:0;;17976:65;;18013:28;;-1:-1:-1;;;18013:28:0;;;;;;;;;;;17976:65;-1:-1:-1;;;;;18056:16:0;;18052:52;;18081:23;;-1:-1:-1;;;18081:23:0;;;;;;;;;;;18052:52;18117:22;18143:10;-1:-1:-1;;;;;18143:18:0;;;;:69;;;18192:20;18204:7;18192:11;:20::i;:::-;-1:-1:-1;;;;;18178:34:0;:10;-1:-1:-1;;;;;18178:34:0;;18143:69;:120;;;;18229:34;18246:4;18252:10;18229:16;:34::i;:::-;18117:147;;18280:17;18275:66;;18306:35;;-1:-1:-1;;;18306:35:0;;;;;;;;;;;18275:66;18416:24;;;;:15;:24;;;;;18409:31;;-1:-1:-1;;;;;;18409:31:0;;;18451:7;:16;;18470:2;;18451:7;18432;;18451:16;;;;;;:::i;:::-;;;;;;;;;:21;;;;;-1:-1:-1;;;;;18451:21:0;;;;;-1:-1:-1;;;;;18451:21:0;;;;;;18643:1;18633:7;:11;:49;;;;-1:-1:-1;18680:1:0;18648:7;18656:11;18666:1;18656:7;:11;:::i;:::-;18648:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;18648:20:0;:34;18633:49;18629:109;;;18722:4;18699:7;18707:11;18717:1;18707:7;:11;:::i;:::-;18699:20;;;;;;;;:::i;:::-;;;;;;;;;:27;;;;;-1:-1:-1;;;;;18699:27:0;;;;;-1:-1:-1;;;;;18699:27:0;;;;;;18629:109;18774:7;18770:2;-1:-1:-1;;;;;18755:27:0;18764:4;-1:-1:-1;;;;;18755:27:0;;;;;;;;;;;17893:897;17779:1011;;;:::o;741:93::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;809:5:::1;:17:::0;;-1:-1:-1;;;;;;809:17:0::1;-1:-1:-1::0;;;;;809:17:0;;;::::1;::::0;;;::::1;::::0;;741:93::o;243:106::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;320:13:0;;;::::1;:7;:13:::0;;;::::1;::::0;;;;;;:21;;-1:-1:-1;;320:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;243:106::o;13855:634::-;13944:15;13985:17;13995:6;13985:9;:17::i;:::-;13976:5;:26;13972:62;;14011:23;;-1:-1:-1;;;14011:23:0;;;;;;;;;;;13972:62;14085:7;:14;14047:13;;14205:218;14229:3;14219:7;:13;14205:218;;;14278:16;14286:7;14278;:16::i;:::-;-1:-1:-1;;;;;14268:26:0;:6;-1:-1:-1;;;;;14268:26:0;;14264:144;;14332:5;14323;:14;14319:69;;14339:14;;;;14319:69;14381:7;;;;;14319:69;14234:9;;;;;14205:218;;;14453:28;;-1:-1:-1;;;14453:28:0;;;;;;;;;;;32402:109;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;32475:12:::1;:28:::0;;-1:-1:-1;;32475:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32402:109::o;18861:166::-;18985:34;19002:4;19008:2;19012;18985:34;;;;;;;;;;;;:16;:34::i;31944:143::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;32012:10:::1;:24:::0;;-1:-1:-1;;32012:24:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;32047:32:::1;;32064:7;:15:::0;;-1:-1:-1;;32064:15:0::1;::::0;;32047:32:::1;31944:143:::0;:::o;14566:175::-;14632:7;14665:13;13594:7;:14;;13523:93;14665:13;14656:5;:22;14652:58;;14687:23;;-1:-1:-1;;;14687:23:0;;;;;;;;;;;14652:58;-1:-1:-1;14728:5:0;14566:175::o;24335:97::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;24406:7:::1;:18;24416:8:::0;24406:7;:18:::1;:::i;:::-;;24335:97:::0;:::o;32519:101::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;32586:14:::1;:26:::0;32519:101::o;36784:653::-;36914:10;;36831:16;;-1:-1:-1;;;;;36914:10:0;:24;;;;:53;;-1:-1:-1;36942:11:0;;-1:-1:-1;;;;;36942:11:0;:25;;36914:53;36906:89;;;;-1:-1:-1;;;36906:89:0;;20579:2:1;36906:89:0;;;20561:21:1;20618:2;20598:18;;;20591:30;20657:25;20637:18;;;20630:53;20700:18;;36906:89:0;20377:347:1;36906:89:0;37073:19;;-1:-1:-1;;;;;37073:19:0;37065:69;;;;-1:-1:-1;;;37065:69:0;;20931:2:1;37065:69:0;;;20913:21:1;20970:2;20950:18;;;20943:30;21009:25;20989:18;;;20982:53;21052:18;;37065:69:0;20729:347:1;37065:69:0;37175:15;37192:16;37229:19;;;;;;;;;-1:-1:-1;;;;;37229:19:0;-1:-1:-1;;;;;37214:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;37174:89:0;;;;-1:-1:-1;37174:89:0;;-1:-1:-1;37311:13:0;37327:24;37174:89;;37327:24;:::i;:::-;37311:40;-1:-1:-1;37416:13:0;37427:2;37311:40;37416:13;:::i;:::-;37402:27;;36849:588;;;36784:653;:::o;31798:138::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;31869:10:::1;:24:::0;;-1:-1:-1;;;;;31869:24:0;;::::1;-1:-1:-1::0;;;;;;31869:24:0;;::::1;::::0;::::1;::::0;;;31904:3:::1;:24:::0;;;;::::1;;::::0;;31798:138::o;15947:480::-;16010:7;16035:16;16043:7;19565;:14;-1:-1:-1;19555:24:0;19466:121;16035:16;16030:61;;16060:31;;-1:-1:-1;;;16060:31:0;;;;;;;;;;;16030:61;16277:1;-1:-1:-1;;;;;16249:30:0;:7;16257;16249:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;16249:16:0;:30;16245:102;;16311:7;16319;16311:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;16311:16:0;;15947:480;-1:-1:-1;;15947:480:0:o;16245:102::-;16215:9;;;;;16199:163;;32628:249;32715:12;;32669:4;;;;32715:12;;32711:132;;;32756:16;:14;:16::i;32711:132::-;-1:-1:-1;;32817:14:0;;;32628:249::o;11478:66::-;;;;;;;:::i;25144:134::-;25247:23;;;;:14;:23;;;;;;;;;25240:30;;;;;;;;;;;;;;;;;25211:16;;25240:30;;;25247:23;25240:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25144:134;;;:::o;15202:497::-;15266:7;-1:-1:-1;;;;;15290:20:0;;15286:61;;15319:28;;-1:-1:-1;;;15319:28:0;;;;;;;;;;;15286:61;15398:7;:14;15360:13;;;15518:140;15538:3;15534:1;:7;15518:140;;;15581:10;15589:1;15581:7;:10::i;:::-;-1:-1:-1;;;;;15571:20:0;:6;-1:-1:-1;;;;;15571:20:0;;15567:76;;15616:7;;;;;15567:76;15543:3;;15518:140;;;-1:-1:-1;15686:5:0;;15202:497;-1:-1:-1;;;15202:497:0:o;24440:91::-;24483:13;24516:7;24509:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24440:91;:::o;23438:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33194:420::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;33278:14:::1;33322:10;33305:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;33295:39;;;;;;33278:56;;33349:6;33359:1;33349:11:::0;33345:198:::1;;33362:12;:25:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;33362:25:0;;;;;::::1;::::0;;;33345:198:::1;;;33407:6;33417:1;33407:11:::0;33403:140:::1;;33420:14;:27:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;33420:27:0;;;;;::::1;::::0;;;33403:140:::1;;;33467:6;33477:1;33467:11:::0;33463:80:::1;;33480:10;:23:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;33480:23:0;;;;;::::1;::::0;;;33463:80:::1;;;33519:24;::::0;-1:-1:-1;;;33519:24:0;;22350:2:1;33519:24:0::1;::::0;::::1;22332:21:1::0;22389:2;22369:18;;;22362:30;-1:-1:-1;;;22408:18:1;;;22401:44;22462:18;;33519:24:0::1;22148:338:1::0;33463:80:0::1;33554:19;::::0;;;:11:::1;:19;::::0;;;;:26;;-1:-1:-1;;33554:26:0::1;33576:4;33554:26;::::0;;33591:13:::1;:15:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;33267:347;33194:420:::0;;:::o;32885:83::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;32946:5:::1;:14:::0;32885:83::o;34927:1311::-;403:10;35111:11;395:19;;;;;;;;;;;35079:30;;35111:11;395:19;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;35135:14:::1;35160:31:::0;35208:6:::1;35194:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;35194:21:0::1;-1:-1:-1::0;35160:55:0;-1:-1:-1;35226:16:0::1;::::0;35270:899:::1;35294:6;35280:11;:20;35270:899;;;35439:12;:19:::0;35477:14:::1;:21:::0;35517:10:::1;:17:::0;35553:13:::1;::::0;35376:15:::1;::::0;35410:10:::1;::::0;35439:19;;35477:21;;35585::::1;35410:10:::0;35585:9:::1;:21::i;:::-;35625:16;35660:4;35683:1;35341:344;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;35341:344:0;;::::1;::::0;;;;;;35331:355;;35341:344:::1;35331:355:::0;;::::1;::::0;35705:19:::1;::::0;;;:11:::1;:19:::0;;;;;;;35331:355;;-1:-1:-1;35705:19:0::1;;:28;;::::0;;35701:457:::1;;35784:6;35754:14;35769:11;35754:27;;;;;;;;:::i;:::-;;;;;;:36;;;::::0;::::1;35813:6;35823:1;35813:11:::0;35809:222:::1;;35826:12;:25:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;35826:25:0;;;;;::::1;::::0;;;35809:222:::1;;;35879:6;35889:1;35879:11:::0;35875:156:::1;;35892:14;:27:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;35892:27:0;;;;;::::1;::::0;;;35875:156:::1;;;35947:6;35957:1;35947:11:::0;35943:88:::1;;35960:10;:23:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;35960:23:0;;;;;::::1;::::0;;;35943:88:::1;36050:19;::::0;;;:11:::1;:19;::::0;;;;:26;;-1:-1:-1;;36050:26:0::1;36072:4;36050:26;::::0;;36095:13:::1;:15:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;36129:13;;;;;:::i;:::-;;;;35701:457;35302:3:::0;::::1;::::0;::::1;:::i;:::-;;;;35270:899;;;36216:14:::0;;36188:1;;-1:-1:-1;34927:1311:0;;-1:-1:-1;;;;;;34927:1311:0:o;11440:31::-;;;;;;;:::i;17212:272::-;17314:10;-1:-1:-1;;;;;17302:22:0;;;17298:52;;17333:17;;-1:-1:-1;;;17333:17:0;;;;;;;;;;;17298:52;17382:10;17363:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;17363:40:0;;;;;;;;;;;;:51;;-1:-1:-1;;17363:51:0;;;;;;;;;;17430:46;;540:41:1;;;17363:40:0;;17382:10;17430:46;;513:18:1;17430:46:0;;;;;;;17212:272;;:::o;19098:295::-;19250:26;19263:4;19269:2;19273;19250:12;:26::i;:::-;19294:42;19317:4;19323:2;19327;19331:4;19294:22;:42::i;:::-;19289:96;;19345:40;;-1:-1:-1;;;19345:40:0;;;;;;;;;;;19289:96;19098:295;;;;:::o;37449:77::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;37502:14:::1;:16:::0;;;:14:::1;:16;::::0;::::1;:::i;:::-;;;;;;37449:77::o:0;32284:88::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;32346:7:::1;:18:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;32346:18:0;;::::1;::::0;;;::::1;::::0;;32284:88::o;24813:323::-;24869:13;24903:16;24911:7;19565;:14;-1:-1:-1;19555:24:0;19466:121;24903:16;24895:56;;;;-1:-1:-1;;;24895:56:0;;23653:2:1;24895:56:0;;;23635:21:1;23692:2;23672:18;;;23665:30;23731:29;23711:18;;;23704:57;23778:18;;24895:56:0;23451:351:1;24895:56:0;24962:17;24982:23;;;:14;:23;;;;;;;;;25041:26;;;;;;;;25016:51;;24982:23;;24962:17;25016:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25109:7;25118:8;25092:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25078:50;;;;24813:323;;;:::o;33648:1186::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;33736:14:::1;33765:6;33775:1;33765:11:::0;33761:1065:::1;;33798:6;33793:298;33814:11;:18;33810:1;:22;33793:298;;;33894:11;33906:1;33894:14;;;;;;;;:::i;:::-;;;;;;;33877:32;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;33877:32:0;;::::1;::::0;;;;;;33867:43;;33877:32:::1;33867:43:::0;;::::1;::::0;33929:12:::1;:25:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;-1:-1:-1;33973:19:0;;;:11:::1;:19:::0;;;;;:23;;;34015:11:::1;:19:::0;;;;;;:26;;-1:-1:-1;;34015:26:0::1;::::0;;::::1;::::0;;;34060:13:::1;:15:::0;;33867:43;;-1:-1:-1;34060:15:0;;::::1;::::0;::::1;:::i;:::-;;;;;;33834:3;;;;;:::i;:::-;;;;33793:298;;33761:1065;34112:6;34122:1;34112:11:::0;34108:718:::1;;34145:6;34140:300;34161:11;:18;34157:1;:22;34140:300;;;34241:11;34253:1;34241:14;;;;;;;;:::i;:::-;;;;;;;34224:32;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;34224:32:0;;::::1;::::0;;;;;;34214:43;;34224:32:::1;34214:43:::0;;::::1;::::0;34276:14:::1;:27:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;-1:-1:-1;34322:19:0;;;:11:::1;:19:::0;;;;;:23;;;34364:11:::1;:19:::0;;;;;;:26;;-1:-1:-1;;34364:26:0::1;::::0;;::::1;::::0;;;34409:13:::1;:15:::0;;34214:43;;-1:-1:-1;34409:15:0;;::::1;::::0;::::1;:::i;:::-;;;;;;34181:3;;;;;:::i;:::-;;;;34140:300;;34108:718;34461:6;34471:1;34461:11:::0;34457:369:::1;;34494:6;34489:296;34510:11;:18;34506:1;:22;34489:296;;;34590:11;34602:1;34590:14;;;;;;;;:::i;:::-;;;;;;;34573:32;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;34573:32:0;;::::1;::::0;;;;;;34563:43;;34573:32:::1;34563:43:::0;;::::1;::::0;34625:10:::1;:23:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;-1:-1:-1;34667:19:0;;;:11:::1;:19:::0;;;;;34689:1:::1;34667:23:::0;;34709:11:::1;:19:::0;;;;;;:26;;-1:-1:-1;;34709:26:0::1;::::0;;::::1;::::0;;;34754:13:::1;:15:::0;;34563:43;;-1:-1:-1;34754:15:0;;::::1;::::0;::::1;:::i;:::-;;;;;;34530:3;;;;;:::i;:::-;;;;34489:296;;24677:128:::0;24776:21;;;;:12;:21;;;;;24769:28;;24743:13;;24776:21;24769:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24769:28:0;;24677:128;-1:-1:-1;;;;;;24677:128:0:o;32095:131::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;32157:7:::1;:18:::0;;;::::1;::::0;::::1;;;-1:-1:-1::0;;32157:18:0;;::::1;::::0;;;::::1;::::0;;;32186:32:::1;;32200:10;:18:::0;;-1:-1:-1;;32200:18:0::1;::::0;;32095:131;:::o;30306:324::-;30351:23;30426:25;30503:21;30546:12;30537:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30580:14;30569:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30612:10;30605:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30306:324;;;:::o;17555:157::-;-1:-1:-1;;;;;17668:26:0;;;17644:4;17668:26;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;;;;17555:157::o;30868:578::-;30929:16;30958:28;31023:16;;31003:17;31013:6;31003:9;:17::i;:::-;:36;;;;:::i;:::-;30989:51;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30989:51:0;;30958:82;;31056:6;31051:359;31072:17;31082:6;31072:9;:17::i;:::-;31068:1;:21;31051:359;;;31187:23;31213:11;:43;31225:30;31245:6;31253:1;31225:19;:30::i;:::-;31213:43;;;;;;;;;;;31187:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31276:6;31271:128;31292:16;;31288:1;:20;31271:128;;;31374:6;31381:1;31374:9;;;;;;;;:::i;:::-;;;;;;;31334:11;31369:1;31350:16;;31346:1;:20;;;;:::i;:::-;:24;;;;:::i;:::-;31334:37;;;;;;;;:::i;:::-;;;;;;;;;;:49;31310:3;;;;:::i;:::-;;;;31271:128;;;;31096:314;31091:3;;;;;:::i;:::-;;;;31051:359;;;-1:-1:-1;31427:11:0;30868:578;-1:-1:-1;;30868:578:0:o;33025:110::-;403:10;395:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;430:5:0;;-1:-1:-1;;;;;430:5:0;418:10;:17;395:40;386:63;;;;-1:-1:-1;;;386:63:0;;;;;;;:::i;:::-;33105:14:::1;::::0;;;:10:::1;:14;::::0;;;;:22:::1;33122:5:::0;33105:14;:22:::1;:::i;21465:102::-:0;21537:22;21547:2;21551:3;21537:22;;;;;;;;;;;;:9;:22::i;20157:640::-;20312:4;20333:2;-1:-1:-1;;;;;20333:14:0;;20351:1;20333:19;20329:36;;-1:-1:-1;20361:4:0;20354:11;;20329:36;20382:70;;-1:-1:-1;;;20382:70:0;;-1:-1:-1;;;;;20382:36:0;;;;;:70;;20419:10;;20431:4;;20437:7;;20446:5;;20382:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20382:70:0;;;;;;;;-1:-1:-1;;20382:70:0;;;;;;;;;;;;:::i;:::-;;;20378:412;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20614:6;:13;20631:1;20614:18;20610:71;;20641:40;;-1:-1:-1;;;20641:40:0;;;;;;;;;;;20610:71;20756:6;20750:13;20741:6;20737:2;20733:15;20726:38;20378:412;-1:-1:-1;;;;;;20499:55:0;-1:-1:-1;;;20499:55:0;;-1:-1:-1;20378:412:0;20157:640;;;;;;:::o;21682:291::-;21807:14;21813:2;21817:3;21807:5;:14::i;:::-;21839:64;21870:1;21874:2;21895:1;21878:7;:14;;;;:18;;;;:::i;:::-;21898:4;21839:22;:64::i;:::-;21834:131;;21925:40;;-1:-1:-1;;;21925:40:0;;;;;;;;;;;22112:628;-1:-1:-1;;;;;22184:16:0;;22180:48;;22209:19;;-1:-1:-1;;;22209:19:0;;;;;;;;;;;22180:48;22243:3;22250:1;22243:8;22239:39;;22260:18;;-1:-1:-1;;;22260:18:0;;;;;;;;;;;22239:39;22315:7;:14;22291:21;22437:150;22463:1;22457:3;:7;22453:1;:11;22437:150;;;22490:7;:14;;;;;;-1:-1:-1;22490:14:0;;;22528:43;;22553:17;;;;-1:-1:-1;;;;;22528:43:0;;;;;-1:-1:-1;;22528:43:0;22466:3;;22437:150;;;-1:-1:-1;22649:7:0;:16;;;;;;;;-1:-1:-1;22649:16:0;;;;;;;;-1:-1:-1;;;;;;22649:16:0;-1:-1:-1;;;;;22649:16:0;;;;;22723:7;;:3;:7;:::i;:::-;22706:25;;:13;:25;:::i;:::-;22681:51;;-1:-1:-1;;;;;22681:51:0;;;22698:1;;22681:51;;22698:1;;22681:51;22169:571;22112:628;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2197:127::-;2258:10;2253:3;2249:20;2246:1;2239:31;2289:4;2286:1;2279:15;2313:4;2310:1;2303:15;2329:275;2400:2;2394:9;2465:2;2446:13;;-1:-1:-1;;2442:27:1;2430:40;;2500:18;2485:34;;2521:22;;;2482:62;2479:88;;;2547:18;;:::i;:::-;2583:2;2576:22;2329:275;;-1:-1:-1;2329:275:1:o;2609:407::-;2674:5;2708:18;2700:6;2697:30;2694:56;;;2730:18;;:::i;:::-;2768:57;2813:2;2792:15;;-1:-1:-1;;2788:29:1;2819:4;2784:40;2768:57;:::i;:::-;2759:66;;2848:6;2841:5;2834:21;2888:3;2879:6;2874:3;2870:16;2867:25;2864:45;;;2905:1;2902;2895:12;2864:45;2954:6;2949:3;2942:4;2935:5;2931:16;2918:43;3008:1;3001:4;2992:6;2985:5;2981:18;2977:29;2970:40;2609:407;;;;;:::o;3021:222::-;3064:5;3117:3;3110:4;3102:6;3098:17;3094:27;3084:55;;3135:1;3132;3125:12;3084:55;3157:80;3233:3;3224:6;3211:20;3204:4;3196:6;3192:17;3157:80;:::i;3248:390::-;3326:6;3334;3387:2;3375:9;3366:7;3362:23;3358:32;3355:52;;;3403:1;3400;3393:12;3355:52;3439:9;3426:23;3416:33;;3500:2;3489:9;3485:18;3472:32;3527:18;3519:6;3516:30;3513:50;;;3559:1;3556;3549:12;3513:50;3582;3624:7;3615:6;3604:9;3600:22;3582:50;:::i;:::-;3572:60;;;3248:390;;;;;:::o;3643:435::-;3696:3;3734:5;3728:12;3761:6;3756:3;3749:19;3787:4;3816:2;3811:3;3807:12;3800:19;;3853:2;3846:5;3842:14;3874:1;3884:169;3898:6;3895:1;3892:13;3884:169;;;3959:13;;3947:26;;3993:12;;;;4028:15;;;;3920:1;3913:9;3884:169;;;-1:-1:-1;4069:3:1;;3643:435;-1:-1:-1;;;;;3643:435:1:o;4083:261::-;4262:2;4251:9;4244:21;4225:4;4282:56;4334:2;4323:9;4319:18;4311:6;4282:56;:::i;4753:456::-;4830:6;4838;4846;4899:2;4887:9;4878:7;4874:23;4870:32;4867:52;;;4915:1;4912;4905:12;4867:52;4954:9;4941:23;4973:31;4998:5;4973:31;:::i;:::-;5023:5;-1:-1:-1;5080:2:1;5065:18;;5052:32;5093:33;5052:32;5093:33;:::i;:::-;4753:456;;5145:7;;-1:-1:-1;;;5199:2:1;5184:18;;;;5171:32;;4753:456::o;5214:247::-;5273:6;5326:2;5314:9;5305:7;5301:23;5297:32;5294:52;;;5342:1;5339;5332:12;5294:52;5381:9;5368:23;5400:31;5425:5;5400:31;:::i;5466:118::-;5552:5;5545:13;5538:21;5531:5;5528:32;5518:60;;5574:1;5571;5564:12;5589:382;5654:6;5662;5715:2;5703:9;5694:7;5690:23;5686:32;5683:52;;;5731:1;5728;5721:12;5683:52;5770:9;5757:23;5789:31;5814:5;5789:31;:::i;:::-;5839:5;-1:-1:-1;5896:2:1;5881:18;;5868:32;5909:30;5868:32;5909:30;:::i;:::-;5958:7;5948:17;;;5589:382;;;;;:::o;5976:241::-;6032:6;6085:2;6073:9;6064:7;6060:23;6056:32;6053:52;;;6101:1;6098;6091:12;6053:52;6140:9;6127:23;6159:28;6181:5;6159:28;:::i;6452:322::-;6521:6;6574:2;6562:9;6553:7;6549:23;6545:32;6542:52;;;6590:1;6587;6580:12;6542:52;6630:9;6617:23;6663:18;6655:6;6652:30;6649:50;;;6695:1;6692;6685:12;6649:50;6718;6760:7;6751:6;6740:9;6736:22;6718:50;:::i;6779:632::-;6950:2;7002:21;;;7072:13;;6975:18;;;7094:22;;;6921:4;;6950:2;7173:15;;;;7147:2;7132:18;;;6921:4;7216:169;7230:6;7227:1;7224:13;7216:169;;;7291:13;;7279:26;;7360:15;;;;7325:12;;;;7252:1;7245:9;7216:169;;;-1:-1:-1;7402:3:1;;6779:632;-1:-1:-1;;;;;;6779:632:1:o;7416:248::-;7484:6;7492;7545:2;7533:9;7524:7;7520:23;7516:32;7513:52;;;7561:1;7558;7551:12;7513:52;-1:-1:-1;;7584:23:1;;;7654:2;7639:18;;;7626:32;;-1:-1:-1;7416:248:1:o;7851:390::-;7929:6;7937;7990:2;7978:9;7969:7;7965:23;7961:32;7958:52;;;8006:1;8003;7996:12;7958:52;8046:9;8033:23;8079:18;8071:6;8068:30;8065:50;;;8111:1;8108;8101:12;8065:50;8134;8176:7;8167:6;8156:9;8152:22;8134:50;:::i;:::-;8124:60;8231:2;8216:18;;;;8203:32;;-1:-1:-1;;;;7851:390:1:o;8246:458::-;8333:6;8341;8349;8402:2;8390:9;8381:7;8377:23;8373:32;8370:52;;;8418:1;8415;8408:12;8370:52;8454:9;8441:23;8431:33;;8515:2;8504:9;8500:18;8487:32;8542:18;8534:6;8531:30;8528:50;;;8574:1;8571;8564:12;8528:50;8597;8639:7;8630:6;8619:9;8615:22;8597:50;:::i;:::-;8587:60;;;8694:2;8683:9;8679:18;8666:32;8656:42;;8246:458;;;;;:::o;8709:332::-;8916:2;8905:9;8898:21;8879:4;8936:56;8988:2;8977:9;8973:18;8965:6;8936:56;:::i;:::-;8928:64;;9028:6;9023:2;9012:9;9008:18;9001:34;8709:332;;;;;:::o;9231:795::-;9326:6;9334;9342;9350;9403:3;9391:9;9382:7;9378:23;9374:33;9371:53;;;9420:1;9417;9410:12;9371:53;9459:9;9446:23;9478:31;9503:5;9478:31;:::i;:::-;9528:5;-1:-1:-1;9585:2:1;9570:18;;9557:32;9598:33;9557:32;9598:33;:::i;:::-;9650:7;-1:-1:-1;9704:2:1;9689:18;;9676:32;;-1:-1:-1;9759:2:1;9744:18;;9731:32;9786:18;9775:30;;9772:50;;;9818:1;9815;9808:12;9772:50;9841:22;;9894:4;9886:13;;9882:27;-1:-1:-1;9872:55:1;;9923:1;9920;9913:12;9872:55;9946:74;10012:7;10007:2;9994:16;9989:2;9985;9981:11;9946:74;:::i;:::-;9936:84;;;9231:795;;;;;;;:::o;10264:1237::-;10367:6;10375;10428:2;10416:9;10407:7;10403:23;10399:32;10396:52;;;10444:1;10441;10434:12;10396:52;10484:9;10471:23;10513:18;10554:2;10546:6;10543:14;10540:34;;;10570:1;10567;10560:12;10540:34;10608:6;10597:9;10593:22;10583:32;;10653:7;10646:4;10642:2;10638:13;10634:27;10624:55;;10675:1;10672;10665:12;10624:55;10711:2;10698:16;10733:4;10756:2;10752;10749:10;10746:36;;;10762:18;;:::i;:::-;10808:2;10805:1;10801:10;10831:28;10855:2;10851;10847:11;10831:28;:::i;:::-;10893:15;;;10963:11;;;10959:20;;;10924:12;;;;10991:19;;;10988:39;;;11023:1;11020;11013:12;10988:39;11055:2;11051;11047:11;11036:22;;11067:353;11083:6;11078:3;11075:15;11067:353;;;11169:3;11156:17;11205:2;11192:11;11189:19;11186:109;;;11249:1;11278:2;11274;11267:14;11186:109;11320:57;11369:7;11364:2;11350:11;11346:2;11342:20;11338:29;11320:57;:::i;:::-;11308:70;;-1:-1:-1;11100:12:1;;;;11398;;;;11067:353;;;11439:5;11476:18;;;;11463:32;;-1:-1:-1;;;;;;;;10264:1237:1:o;11506:669::-;11841:2;11830:9;11823:21;11804:4;11867:56;11919:2;11908:9;11904:18;11896:6;11867:56;:::i;:::-;11971:9;11963:6;11959:22;11954:2;11943:9;11939:18;11932:50;12005:44;12042:6;12034;12005:44;:::i;:::-;11991:58;;12097:9;12089:6;12085:22;12080:2;12069:9;12065:18;12058:50;12125:44;12162:6;12154;12125:44;:::i;:::-;12117:52;11506:669;-1:-1:-1;;;;;;11506:669:1:o;12180:388::-;12248:6;12256;12309:2;12297:9;12288:7;12284:23;12280:32;12277:52;;;12325:1;12322;12315:12;12277:52;12364:9;12351:23;12383:31;12408:5;12383:31;:::i;:::-;12433:5;-1:-1:-1;12490:2:1;12475:18;;12462:32;12503:33;12462:32;12503:33;:::i;12807:380::-;12886:1;12882:12;;;;12929;;;12950:61;;13004:4;12996:6;12992:17;12982:27;;12950:61;13057:2;13049:6;13046:14;13026:18;13023:38;13020:161;;13103:10;13098:3;13094:20;13091:1;13084:31;13138:4;13135:1;13128:15;13166:4;13163:1;13156:15;13020:161;;12807:380;;;:::o;13192:332::-;13394:2;13376:21;;;13433:1;13413:18;;;13406:29;-1:-1:-1;;;13466:2:1;13451:18;;13444:39;13515:2;13500:18;;13192:332::o;13655:545::-;13757:2;13752:3;13749:11;13746:448;;;13793:1;13818:5;13814:2;13807:17;13863:4;13859:2;13849:19;13933:2;13921:10;13917:19;13914:1;13910:27;13904:4;13900:38;13969:4;13957:10;13954:20;13951:47;;;-1:-1:-1;13992:4:1;13951:47;14047:2;14042:3;14038:12;14035:1;14031:20;14025:4;14021:31;14011:41;;14102:82;14120:2;14113:5;14110:13;14102:82;;;14165:17;;;14146:1;14135:13;14102:82;;;14106:3;;;13655:545;;;:::o;14376:1352::-;14502:3;14496:10;14529:18;14521:6;14518:30;14515:56;;;14551:18;;:::i;:::-;14580:97;14670:6;14630:38;14662:4;14656:11;14630:38;:::i;:::-;14624:4;14580:97;:::i;:::-;14732:4;;14796:2;14785:14;;14813:1;14808:663;;;;15515:1;15532:6;15529:89;;;-1:-1:-1;15584:19:1;;;15578:26;15529:89;-1:-1:-1;;14333:1:1;14329:11;;;14325:24;14321:29;14311:40;14357:1;14353:11;;;14308:57;15631:81;;14778:944;;14808:663;13602:1;13595:14;;;13639:4;13626:18;;-1:-1:-1;;14844:20:1;;;14962:236;14976:7;14973:1;14970:14;14962:236;;;15065:19;;;15059:26;15044:42;;15157:27;;;;15125:1;15113:14;;;;14992:19;;14962:236;;;14966:3;15226:6;15217:7;15214:19;15211:201;;;15287:19;;;15281:26;-1:-1:-1;;15370:1:1;15366:14;;;15382:3;15362:24;15358:37;15354:42;15339:58;15324:74;;15211:201;-1:-1:-1;;;;;15458:1:1;15442:14;;;15438:22;15425:36;;-1:-1:-1;14376:1352:1:o;16756:184::-;16826:6;16879:2;16867:9;16858:7;16854:23;16850:32;16847:52;;;16895:1;16892;16885:12;16847:52;-1:-1:-1;16918:16:1;;16756:184;-1:-1:-1;16756:184:1:o;17288:375::-;-1:-1:-1;;;;;17546:15:1;;;17528:34;;17598:15;;;;17593:2;17578:18;;17571:43;17645:2;17630:18;;17623:34;;;;17478:2;17463:18;;17288:375::o;17668:245::-;17735:6;17788:2;17776:9;17767:7;17763:23;17759:32;17756:52;;;17804:1;17801;17794:12;17756:52;17836:9;17830:16;17855:28;17877:5;17855:28;:::i;18266:755::-;18619:19;;;18676:2;18672:15;;;;-1:-1:-1;;18668:53:1;18663:2;18654:12;;18647:75;18747:2;18738:12;;18731:28;;;;18784:2;18775:12;;18768:28;;;;18821:3;18812:13;;18805:29;;;;18859:3;18850:13;;18843:29;18897:3;18888:13;;18881:29;18935:3;18926:13;;18919:29;18973:3;18964:13;;18957:29;19011:3;19002:13;;18266:755::o;19026:127::-;19087:10;19082:3;19078:20;19075:1;19068:31;19118:4;19115:1;19108:15;19142:4;19139:1;19132:15;19158:112;19190:1;19216;19206:35;;19221:18;;:::i;:::-;-1:-1:-1;19255:9:1;;19158:112::o;19275:127::-;19336:10;19331:3;19327:20;19324:1;19317:31;19367:4;19364:1;19357:15;19391:4;19388:1;19381:15;19407:135;19446:3;19467:17;;;19464:43;;19487:18;;:::i;:::-;-1:-1:-1;19534:1:1;19523:13;;19407:135::o;19547:127::-;19608:10;19603:3;19599:20;19596:1;19589:31;19639:4;19636:1;19629:15;19663:4;19660:1;19653:15;19988:251;20058:6;20111:2;20099:9;20090:7;20086:23;20082:32;20079:52;;;20127:1;20124;20117:12;20079:52;20159:9;20153:16;20178:31;20203:5;20178:31;:::i;20244:128::-;20311:9;;;20332:11;;;20329:37;;;20346:18;;:::i;21081:188::-;21160:13;;-1:-1:-1;;;;;21202:42:1;;21192:53;;21182:81;;21259:1;21256;21249:12;21182:81;21081:188;;;:::o;21274:450::-;21361:6;21369;21377;21430:2;21418:9;21409:7;21405:23;21401:32;21398:52;;;21446:1;21443;21436:12;21398:52;21469:40;21499:9;21469:40;:::i;:::-;21459:50;;21528:49;21573:2;21562:9;21558:18;21528:49;:::i;:::-;21518:59;;21620:2;21609:9;21605:18;21599:25;21664:10;21657:5;21653:22;21646:5;21643:33;21633:61;;21690:1;21687;21680:12;21633:61;21713:5;21703:15;;;21274:450;;;;;:::o;21729:120::-;21769:1;21795;21785:35;;21800:18;;:::i;:::-;-1:-1:-1;21834:9:1;;21729:120::o;21854:289::-;21985:3;22023:6;22017:13;22039:66;22098:6;22093:3;22086:4;22078:6;22074:17;22039:66;:::i;:::-;22121:16;;;;;21854:289;-1:-1:-1;;21854:289:1:o;22491:955::-;22904:6;22899:3;22892:19;22966:26;22962:31;22953:6;22949:2;22945:15;22941:53;22936:2;22931:3;22927:12;22920:75;23025:6;23020:2;23015:3;23011:12;23004:28;23062:6;23057:2;23052:3;23048:12;23041:28;23100:6;23094:3;23089;23085:13;23078:29;23138:6;23132:3;23127;23123:13;23116:29;23176:6;23170:3;23165;23161:13;23154:29;23214:6;23208:3;23203;23199:13;23192:29;22874:3;23250:6;23244:13;23266:74;23333:6;23327:3;23322;23318:13;23313:2;23305:6;23301:15;23266:74;:::i;:::-;23399:3;23359:16;;23391:12;;;23384:28;;;;23436:3;23428:12;;22491:955;-1:-1:-1;;;;;;;;;;22491:955:1:o;23807:1020::-;23983:3;24012:1;24045:6;24039:13;24075:36;24101:9;24075:36;:::i;:::-;24130:1;24147:18;;;24174:133;;;;24321:1;24316:356;;;;24140:532;;24174:133;-1:-1:-1;;24207:24:1;;24195:37;;24280:14;;24273:22;24261:35;;24252:45;;;-1:-1:-1;24174:133:1;;24316:356;24347:6;24344:1;24337:17;24377:4;24422:2;24419:1;24409:16;24447:1;24461:165;24475:6;24472:1;24469:13;24461:165;;;24553:14;;24540:11;;;24533:35;24596:16;;;;24490:10;;24461:165;;;24465:3;;;24655:6;24650:3;24646:16;24639:23;;24140:532;;;;;24703:6;24697:13;24719:68;24778:8;24773:3;24766:4;24758:6;24754:17;24719:68;:::i;:::-;24803:18;;23807:1020;-1:-1:-1;;;;23807:1020:1:o;24832:168::-;24905:9;;;24936;;24953:15;;;24947:22;;24933:37;24923:71;;24974:18;;:::i;25005:125::-;25070:9;;;25091:10;;;25088:36;;;25104:18;;:::i;25135:489::-;-1:-1:-1;;;;;25404:15:1;;;25386:34;;25456:15;;25451:2;25436:18;;25429:43;25503:2;25488:18;;25481:34;;;25551:3;25546:2;25531:18;;25524:31;;;25329:4;;25572:46;;25598:19;;25590:6;25572:46;:::i;25629:249::-;25698:6;25751:2;25739:9;25730:7;25726:23;25722:32;25719:52;;;25767:1;25764;25757:12;25719:52;25799:9;25793:16;25818:30;25842:5;25818:30;:::i

Swarm Source

ipfs://87048a356d62ec63a7fe96db7eceb64852ca23abaeb3d9edb1ae1ba6bb0823d8
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.