Address Details
contract

0x1A12b63B14B52020Be0831c3b708793AE4F920d5

Contract Name
OpenBiSea
Creator
0x4f476c–6a49a1 at 0x7ee7c9–fabef5
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
12 Transactions
Transfers
6 Transfers
Gas Used
2,924,927
Last Balance Update
11736349
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
OpenBiSea




Optimization enabled
true
Compiler version
v0.6.8+commit.0bbfe453




Optimization runs
200
EVM Version
byzantium




Verified at
2021-10-22T10:23:25.201205Z

Contract source code

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;

import "./access/PoolRoles.sol";
import "./interface/IPoolRegistry.sol";
import "./interface/IAssetsManageTeam.sol";
import "./interface/IERC20.sol";
import "./access/PoolRoles.sol";
import "./math/SafeMath.sol";
//import "./interface/IERC721.sol";
//import "./interface/IERC1155.sol";
import "./utils/EnumerableUintSet.sol";
import "./interface/IOpenBiSeaAuction.sol";
import "./access/TeamRole.sol";

//import "./interface/IERC721Receiver.sol";
//import "./interface/IERC1155Receiver.sol";

contract OpenBiSea is PoolRoles,TeamRole  {
    using SafeMath for uint256;
    using EnumerableUintSet for EnumerableUintSet.UintSet;

    event Deposit(address indexed from, uint256 value);
    event DebugWithdrawLPartner(address sender,address owner, uint256 getDepositLengthSender, uint256 getDepositLengthOwner,uint256 totalAmountReturn,uint256 indexesDepositLength,uint256 balanceThis);
    string private _name;
    bool private _isPublicPool = true;
    address private _auction;
    address private _busdContract;
    address private _token;
    uint256 private _lockPeriod;
    uint256 private _rate;
    uint256 private _poolValueUSD = 0;
    uint256 private _poolValue = 0;
    string private _proofOfValue = "nothing";
    uint256 private _depositFixedFee;
    uint256 private _referralDepositFee;
    uint256 private _auctionCreationFeeMultiplier;
    uint256 private _auctionContractFeeMultiplier;
    uint256 private _totalIncome;
    uint256 private _premiumFee;
    struct DepositToPool {
        uint256 amount;          // Amount of funds deposited
        uint256 time;            // Deposit time
        uint256 lock_period;     // Asset lock time
        bool refund_authorize;   // Are assets unlocked for withdrawal
        uint256 amountWithdrawal;
        address investedToken;
    }
    mapping(address => DepositToPool[]) private _deposites;
    mapping(address => address) private _referrals;

//    mapping(address => uint256) private _consumersRevenueAmount;

    IAssetsManageTeam private _assetsManageTeam;
    IPoolRegistry private _poolRegistry;
    modifier onlyAdmin(address sender) {
        if(hasRole(GENERAL_PARTNER_ROLE, sender) || hasRole(SUPER_ADMIN_ROLE, sender) || _poolRegistry.isTeam(sender)) {
            _;
        } else {
            revert("The sender does not have permission");
        }
    }
    address private _tokenForTokensale;
    uint256 private _initialBalance;
    constructor (
        address tokenForTokensale,
//        string memory name,
//        uint256 locked,
//        uint256 depositFixedFee,
//        uint256 referralDepositFee,
//        uint256 auctionCreationFeeMultiplier,
//        uint256 auctionContractFeeMultiplier,
        address superAdmin,
        address gPartner,
        address lPartner,
        address team,
        address poolRegistry,
        address returnInvestmentLpartner,
        IAssetsManageTeam assetsManageTeam,
        uint256 initialBalance,
        address busdContract
    ) public {
//        _name = name;
        _tokenForTokensale = tokenForTokensale;
//        _lockPeriod = locked;
//        _depositFixedFee = depositFixedFee;
//        _referralDepositFee = referralDepositFee;
//        _auctionCreationFeeMultiplier = auctionCreationFeeMultiplier;
//        _auctionContractFeeMultiplier = auctionContractFeeMultiplier;
        _assetsManageTeam = assetsManageTeam;
        _poolRegistry = IPoolRegistry(poolRegistry);
        _initialBalance = initialBalance;
        _busdContract = busdContract;
        PoolRoles.addAdmin(SUPER_ADMIN_ROLE, msg.sender);
        PoolRoles.addAdmin(SUPER_ADMIN_ROLE, superAdmin);
        PoolRoles.addAdmin(SUPER_ADMIN_ROLE, poolRegistry);
        PoolRoles.finalize();
        grantRole(GENERAL_PARTNER_ROLE, gPartner);
        grantRole(LIMITED_PARTNER_ROLE, lPartner);
        grantRole(STARTUP_TEAM_ROLE, team);
        grantRole(POOL_REGISTRY, poolRegistry);
        grantRole(RETURN_INVESTMENT_LPARTNER, returnInvestmentLpartner);
    }

    function _updatePool(
        string calldata name,
        bool isPublicPool,
        address token,
        uint256 locked,
        uint256 depositFixedFee,
        uint256 referralDepositFee,
        uint256 auctionCreationFeeMultiplier,
        uint256 auctionContractFeeMultiplier
    ) external onlyPoolRegistry returns (bool) {
        _name = name;
        _isPublicPool = isPublicPool;
        _lockPeriod = locked;
        _depositFixedFee = depositFixedFee;
        _referralDepositFee = referralDepositFee;
        _auctionCreationFeeMultiplier = auctionCreationFeeMultiplier;
        _auctionContractFeeMultiplier = auctionContractFeeMultiplier;
        return true;
    }

    function getInfoPool() public view returns( string memory name,bool isPublicPool,address tokenForTokensale,uint256 locked,uint256 initialBalance)
    {
        return ( _name,_isPublicPool,_tokenForTokensale,_lockPeriod, _initialBalance);
    }
    receive() external payable {}
    function getDeposit(address owner, uint256 index) public view returns(uint256 amount, uint256 time, uint256 lock_period, bool refund_authorize, uint256 amountWithdrawal, address investedToken) {
        return ( _deposites[owner][index].amount, _deposites[owner][index].time,_deposites[owner][index].lock_period, _deposites[owner][index].refund_authorize, _deposites[owner][index].amountWithdrawal, _deposites[owner][index].investedToken);
    }
    function getDepositLength(address owner) public view returns(uint256) {
        return (_deposites[owner].length);
    }
    function getReferral(address lPartner) public view returns (address) {
        return _referrals[lPartner];
    }
    function getInfoPoolFees() public view returns(uint256 rate, uint256 depositFixedFee, uint256 referralDepositFee, uint256 auctionCreationFeeMultiplier, uint256 auctionContractFeeMultiplier, uint256 totalIncome, uint256 premiumFee)
    {
        return (_rate, _depositFixedFee, _referralDepositFee, _auctionCreationFeeMultiplier, _auctionContractFeeMultiplier, _totalIncome, _premiumFee);
    }
    function _approveWithdrawLpartner(address lPartner, uint256 index, uint256 amount, address investedToken) external onlyReturnsInvestmentLpartner returns (bool) {
        _deposites[lPartner][index].refund_authorize = true;
        _deposites[lPartner][index].amountWithdrawal = amount;
        _deposites[lPartner][index].investedToken = investedToken;
        return true;
    }
    function _depositPoolRegistry(address sender, uint256 amount, uint256 feesMultipier) external onlyPoolRegistry returns (bool) {
        require(hasRole(LIMITED_PARTNER_ROLE, sender), "InvestmentPool: the sender does not have permission");
        return _deposit(sender, amount, feesMultipier);
    }
    function _withdrawTeam (address payable sender, uint256 amount) external onlyPoolRegistry returns (bool) {
        require(hasRole(STARTUP_TEAM_ROLE, sender), "InvestmentPool: the sender does not have permission");
        _assetsManageTeam._withdraw(address(this), sender, amount);
        sender.transfer(amount);
        return true;
    }
    function _withdrawTokensToStartup(address payable sender,address token, uint256 amount) external onlyPoolRegistry returns (bool) {
        require(hasRole(STARTUP_TEAM_ROLE, sender), "InvestmentPool: the sender does not have permission");
        _assetsManageTeam._withdrawTokensToStartup(address(this),token, sender, amount);
        IERC20(token).transfer(sender, amount);
        return true;
    }
    function _returnsInTokensFromTeam(address payable sender,address token, uint256 amount) external onlyPoolRegistry returns (bool) {
        require(hasRole(STARTUP_TEAM_ROLE, sender), "InvestmentPool: the sender does not have permission");
        IERC20(token).transferFrom(sender, address(this), amount);
        return true;
    }
    function _withdrawLPartner(address payable sender) external onlyPoolRegistry returns (bool, uint256, address) {
        require(hasRole(LIMITED_PARTNER_ROLE, sender), "InvestmentPool: the sender does not have permission");
        uint256 totalAmountReturn = 0;
        address token = address(0);
        uint256 lengthSender = getDepositLength(sender);
        bool result = false;
        for (uint256 i = 0; i < lengthSender; i++) {
            DepositToPool storage deposit = _deposites[sender][i];
            if (deposit.refund_authorize) {
                token = deposit.investedToken;
                if (deposit.amountWithdrawal > 0) {
                    if (token == address(0)) {
                        sender.transfer(deposit.amountWithdrawal);
                        totalAmountReturn = totalAmountReturn.add(deposit.amountWithdrawal);
                    } else {
                        IERC20(token).transfer(sender, deposit.amountWithdrawal);
                    }
                }
                _deposites[sender][i].refund_authorize = false;
                _deposites[sender][i].amountWithdrawal = 0;
            }
        }
        return (result,totalAmountReturn,token);
    }
    function _withdrawSuperAdmin(address payable sender,address token, uint256 amount) external onlyPoolRegistry returns (bool) {
        require(hasRole(SUPER_ADMIN_ROLE, sender), "InvestmentPool: the sender does not have permission");
        if (amount > 0) {
            if (token == address(0)) {
                sender.transfer(amount);
                return true;
            } else {
                IERC20(token).transfer(sender, amount);
                return true;
            }
        }
        return false;
    }
    function _activateDepositToPool() external onlyPoolRegistry returns (bool) {
        require(!_isPublicPool, "InvestmentPool: the pool is already activated");
        _isPublicPool = true;
        return true;
    }
    function _disactivateDepositToPool() external onlyPoolRegistry returns (bool) {
        require(_isPublicPool, "InvestmentPool: the pool is already deactivated");
        _isPublicPool = false;
        return true;
    }
    function _setReferral(address sender, address lPartner, address referral) external onlyPoolRegistry onlyAdmin(sender) returns (bool) {
        _referrals[lPartner] = referral;
        return true;
    }

    function _setRate(uint256 rate) external onlyPoolRegistry returns (bool) {
        _rate = rate;
        return true;
    }
    function _setPoolValues(uint256 poolValueUSD,uint256 poolValue,string calldata proofOfValue) external onlyPoolRegistry returns (bool) {
        _poolValueUSD = poolValueUSD;
        _poolValue = poolValue;
        _proofOfValue = proofOfValue;
        return true;
    }
    function _setAuction(address newAuction) public onlyTeam {
        _auction = newAuction;
    }
    function auction() public view returns (address)  {
        return _auction;
    }
    function getPoolValues() public view returns(uint256 poolValueUSD, uint256 poolValue, string memory proofOfValue)
    {
        return (_poolValueUSD, _poolValue, _proofOfValue);
    }
    function _depositInvestmentInTokensToPool(address payable sender, uint256 amount, address token) external onlyPoolRegistry returns (bool) {
        require(hasRole(LIMITED_PARTNER_ROLE, sender), "InvestmentPool: the sender does not have permission");
        uint256 depositFee = amount.mul(_depositFixedFee).div(100);
        uint256 depositFeeReferrer = amount.mul(_referralDepositFee).div(100);
        uint256 totalDeposit = 0;
        if (_referrals[sender] != address(0)) {
            totalDeposit = amount.sub(depositFee).sub(depositFeeReferrer);
        } else {
            totalDeposit = amount.sub(depositFee);
        }
        _deposites[sender].push(DepositToPool(totalDeposit, block.timestamp, _lockPeriod, false, 0, token));
        return true;
    }
    uint256 private initialPriceInt = 88800000000000000;// 88800000000000000 - 0.0888 BNB one token, 18446744073709551615 - MATIC one token
    function getInitialPriceInt() public view returns (uint256)  {
        return initialPriceInt;
    }

//    uint256 private _tokensaleTotalAmount = (10 ** uint256(18)).mul(8000);// 8000 obs
    uint256 private _tokensaleTotalSold;

    function purchaseTokensQuantityFor(uint256 amount) public view returns (uint256,uint256) {
        uint256 delta = _initialBalance.sub(_tokensaleTotalSold);
        uint256 newPrice = initialPriceInt.mul(_initialBalance).div(delta);
        return (amount.mul(10 ** uint256(18)).div(newPrice),_initialBalance.sub(_tokensaleTotalSold));
    }

    function purchaseTokens() public payable returns (uint256) {
        require(msg.value > 100000000000000000, "TokensalePool: minimal purchase 0.1BNB.");
        uint256 amountTokens;
        uint256 balance;
        (amountTokens,balance) = purchaseTokensQuantityFor(msg.value);
        require(amountTokens > 0, "TokensalePool: we can't sell 0 tokens.");
        require(amountTokens < balance.div(3), "TokensalePool: we can't sell more than 30% from one transaction. Please decrease investment amount.");
        IERC20(_tokenForTokensale).transfer(msg.sender, amountTokens);
        _tokensaleTotalSold = _tokensaleTotalSold.add(amountTokens);
        return amountTokens;
    }
    uint256 constant private multiplierDefault = 100000;

    function _deposit(address sender, uint256 amount, uint256 feesMultipier) private returns (bool) {
        require(_isPublicPool, "InvestmentPool: pool deposit blocked");
        address payable team = payable(getRoleMember(GENERAL_PARTNER_ROLE,0));
        uint256 depositFee = amount.mul(_depositFixedFee).div(100).div(feesMultipier).mul(multiplierDefault);
        uint256 depositFeeReferrer = amount.mul(_referralDepositFee).div(100).div(feesMultipier).mul(multiplierDefault);
        uint256 totalDeposit = 0;
        if (_referrals[sender] != address(0)) {
            payable(_referrals[sender]).transfer(depositFeeReferrer);
            team.transfer(depositFee);
            totalDeposit = amount.sub(depositFee).sub(depositFeeReferrer);
        } else {
            team.transfer(depositFee);
            totalDeposit = amount.sub(depositFee);
        }
        _deposites[sender].push(DepositToPool(totalDeposit, block.timestamp, _lockPeriod, false, 0, address(0)));
        _totalIncome = _totalIncome.add(amount);
        emit Deposit(sender, amount);
        return true;
    }
    function _transferGeneralPartner(uint256 amount) private returns (bool) {
        address payable gPartner = payable(getMembersRole(GENERAL_PARTNER_ROLE)[0]);
        gPartner.transfer(amount);
        return true;
    }
    function _getTokenAmount(uint256 weiAmount) public view returns (uint256) {
        uint8 DECIMALS = IERC20(_token).decimals();
        return (weiAmount.mul(_rate)).div(10 ** uint256(DECIMALS));
    }
    function isContract(address _addr) private view returns (bool is_contract) {
        uint length;
        assembly {
            length := extcodesize(_addr)
        }
        return (length>0);
    }

    function _removeIndexArray(uint256 index, DepositToPool[] storage array) internal virtual {
        for(uint256 i = index; i < array.length-1; i++) {
            array[i] = array[i+1];
        }
        array.pop();
    }

    function contractsNFTWhitelisted() public view returns (address[] memory) {
        return IOpenBiSeaAuction(_auction).contractsNFTWhitelisted();
    }

    function whitelistContractCreator( address _contractNFT ) public payable {
        require(msg.value >= initialPriceInt.mul(_auctionCreationFeeMultiplier), "OpenBiSea: you must send minimal amount or more");
        IOpenBiSeaAuction(_auction).whitelistContractCreator(_contractNFT,msg.value);
        _totalIncome = _totalIncome.add(msg.value);
    }

    function whitelistContractCreatorTokens( address _contractNFT ) public {
        uint256 amount = (10 ** uint256(18)).mul(_auctionCreationFeeMultiplier);
        IERC20(_tokenForTokensale).transferFrom(msg.sender,address(this),amount);
        _totalIncome = _totalIncome.add(initialPriceInt.mul(amount).div(10 ** uint256(18)));
        IOpenBiSeaAuction(_auction).whitelistContractCreator(_contractNFT,initialPriceInt.mul(amount));
    }
    function createAuction( address _contractNFT, uint256 _tokenId, uint256 _price,uint256 _deadline, bool _isERC1155, bool _isUSD ) public {
        IOpenBiSeaAuction(_auction).createAuction(_contractNFT,_tokenId, _price, _deadline,_isERC1155, msg.sender, _isUSD);
    }
    function bidUSD( address _contractNFT,uint256 _tokenId, uint256 _bidAmount, bool _isERC1155 ) public {
        IERC20(_busdContract).transferFrom(msg.sender,address(this),_bidAmount);
        bool isWin;
        uint256 amountTransferBack;
        address auctionLatestBidderOrSeller;
        bool isUSD;
        (isWin,amountTransferBack,auctionLatestBidderOrSeller,isUSD) = IOpenBiSeaAuction(_auction).bid( _contractNFT, _tokenId, _bidAmount, _isERC1155, msg.sender );
        if (isWin) {
            if (isUSD) {
                uint256 depositFee = _bidAmount.mul(_depositFixedFee).div(100);
                uint256 depositFeeReferrer = _bidAmount.mul(_referralDepositFee).div(100);
                uint256 totalSellerAmount = _bidAmount.sub(depositFee);
                if (_referrals[msg.sender] != address(0)) {
                    totalSellerAmount = totalSellerAmount.sub(depositFeeReferrer);
                    IERC20(_busdContract).transfer(_referrals[msg.sender],depositFeeReferrer);
                    IERC20(_busdContract).transfer(getRoleMember(GENERAL_PARTNER_ROLE,0),depositFee);
                } else {
                    IERC20(_busdContract).transfer(getRoleMember(GENERAL_PARTNER_ROLE,0),depositFee);
                }
                IERC20(_busdContract).transfer(auctionLatestBidderOrSeller,totalSellerAmount);
            }
        } else {
            if (amountTransferBack > 0 && isUSD) {
                IERC20(_busdContract).transfer(auctionLatestBidderOrSeller,amountTransferBack);
            }
        }
    }
    function bid( address _contractNFT,uint256 _tokenId, bool _isERC1155 ) public payable {
        bool isWin;
        uint256 amountTransferBack;
        address auctionLatestBidderOrSeller;
        bool isUSD;
        (isWin,amountTransferBack,auctionLatestBidderOrSeller,isUSD) = IOpenBiSeaAuction(_auction).bid( _contractNFT, _tokenId, msg.value, _isERC1155, msg.sender );
        if (isWin) {
            if (!isUSD) {
                uint256 depositFee = msg.value.mul(_depositFixedFee).div(100);
                uint256 depositFeeReferrer = msg.value.mul(_referralDepositFee).div(100);
                uint256 totalSellerAmount = msg.value.sub(depositFee);
                if (_referrals[msg.sender] != address(0)) {
                    totalSellerAmount = totalSellerAmount.sub(depositFeeReferrer);
                    payable(_referrals[msg.sender]).transfer(depositFeeReferrer);
                    payable(getRoleMember(GENERAL_PARTNER_ROLE,0)).transfer(depositFee);
                } else {
                    payable(getRoleMember(GENERAL_PARTNER_ROLE,0)).transfer(depositFee);
                }
                payable(auctionLatestBidderOrSeller).transfer(totalSellerAmount);
            }
        } else {
            if (amountTransferBack > 0 && !isUSD) {
                payable(auctionLatestBidderOrSeller).transfer(amountTransferBack);
            }
        }
    }
    function cancelAuction( address _contractNFT, uint256 _tokenId, bool _isERC1155 ) public {
        IOpenBiSeaAuction(_auction).cancelAuction(_contractNFT,_tokenId,msg.sender,_isERC1155);
    }
    function checkTokensForClaim( address customer, uint256 priceMainToUSD) public view returns (uint256,uint256,uint256,bool) {
        return IOpenBiSeaAuction(_auction).checkTokensForClaim(customer,priceMainToUSD);
    }
    event ClaimFreeTokens(uint256 amount, address investor,bool result);
    function claimFreeTokens() public returns (bool) {
        uint256 priceMainToUSD;
        uint8 decimals;
        (priceMainToUSD,decimals) = _poolRegistry.getOracleContract().getLatestPrice();

        uint256 tokensToPay;
        (tokensToPay,,,)= checkTokensForClaim(msg.sender,priceMainToUSD.div(10 ** uint256(decimals)));
        bool result = false;
        if (tokensToPay > 0) {
            IERC20(_tokenForTokensale).transfer(msg.sender, tokensToPay);
            IOpenBiSeaAuction(_auction).setConsumersReceivedMainTokenLatestDate(msg.sender);
            result = true;
        }
        emit ClaimFreeTokens(tokensToPay,msg.sender,result);
        return result;
    }
}
        

Context.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
contract Context {
    constructor () internal { }
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode
        return msg.data;
    }
}
          

AccessControl.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;

import "../utils/EnumerableSet.sol";
import "../GSN/Context.sol";

contract AccessControl is Context {
    using EnumerableSet for EnumerableSet.AddressSet;
    struct RoleData {
        EnumerableSet.AddressSet members;
        bytes32 adminRole;
    }
    mapping (bytes32 => RoleData) private _roles;
    mapping (bytes32 => address[]) private _addressesRoles;
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
    function hasRole(bytes32 role, address account) public view returns (bool) {
        return _roles[role].members.contains(account);
    }
    function getRoleMemberCount(bytes32 role) public view returns (uint256) {
        return _roles[role].members.length();
    }
   function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
        return _roles[role].members.at(index);
    }
    function getRoleAdmin(bytes32 role) public view returns (bytes32) {
        return _roles[role].adminRole;
    }
    function getMembersRole(bytes32 role) public view returns (address[] memory Accounts) {
        return _addressesRoles[role];
    }
    function grantRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");
        _grantRole(role, account);
    }
    function revokeRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");

        _revokeRole(role, account);
    }
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        _roles[role].adminRole = adminRole;
    }
    function _grantRole(bytes32 role, address account) private {
        if (_roles[role].members.add(account)) {
            _addressesRoles[role].push(account);
            emit RoleGranted(role, account, _msgSender());
        }
    }
    function _revokeRole(bytes32 role, address account) private {
        if (_roles[role].members.remove(account)) {
            for (uint256 i; i < _addressesRoles[role].length; i++) {
                if (_addressesRoles[role][i] == account) {
                    _removeIndexArray(i, _addressesRoles[role]);
                    break;
                }
            }
            emit RoleRevoked(role, account, _msgSender());
        }
    }
    function _removeIndexArray(uint256 index, address[] storage array) internal virtual {
        for(uint256 i = index; i < array.length-1; i++) {
            array[i] = array[i+1];
        }
        array.pop();
    }
}
          

PoolRoles.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
import "./AccessControl.sol";
import "../ownership/Ownable.sol";
import "../interface/IRoleModel.sol";
contract PoolRoles is AccessControl, Ownable, IRoleModel {
    bool private _finalized = false;
    event Finalized();
    modifier onlyGPartner() {
        require(hasRole(GENERAL_PARTNER_ROLE, msg.sender), "Roles: caller does not have the general partner role");
        _;
    }
    modifier onlyLPartner() {
        require(hasRole(LIMITED_PARTNER_ROLE, msg.sender), "Roles: caller does not have the limited partner role");
        _;
    }
    modifier onlyStartupTeam() {
        require(hasRole(STARTUP_TEAM_ROLE, msg.sender), "Roles: caller does not have the team role");
        _;
    }
    modifier onlyPoolRegistry() {
        require(hasRole(POOL_REGISTRY, msg.sender), "Roles: caller does not have the pool regystry role");
        _;
    }
    modifier onlyReturnsInvestmentLpartner() {
        require(hasRole(RETURN_INVESTMENT_LPARTNER, msg.sender), "Roles: caller does not have the return invesment lpartner role");
        _;
    }
    modifier onlyOracle() {
        require(hasRole(ORACLE, msg.sender), "Roles: caller does not have oracle role");
        _;
    }
    constructor () public {
        _setRoleAdmin(GENERAL_PARTNER_ROLE, SUPER_ADMIN_ROLE);
        _setRoleAdmin(LIMITED_PARTNER_ROLE, SUPER_ADMIN_ROLE);
        _setRoleAdmin(STARTUP_TEAM_ROLE, SUPER_ADMIN_ROLE);
        _setRoleAdmin(POOL_REGISTRY, SUPER_ADMIN_ROLE);
        _setRoleAdmin(RETURN_INVESTMENT_LPARTNER, SUPER_ADMIN_ROLE);
        _setRoleAdmin(ORACLE, SUPER_ADMIN_ROLE);
    }
    function addAdmin(bytes32 role, address account) public onlyOwner returns (bool) {
        require(!_finalized, "ManagerRole: already finalized");

        _setupRole(role, account);
        return true;
    }
    function finalize() public onlyOwner {
        require(!_finalized, "ManagerRole: already finalized");
        _finalized = true;
        emit Finalized();
    }
}
          

TeamRole.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
import "./lib/Roles.sol";
contract TeamRole {
    using Roles for Roles.Role;
    event TeamAdded(address indexed account);
    event TeamRemoved(address indexed account);
    event OracleAdded(address indexed account);
    event OracleRemoved(address indexed account);
    Roles.Role private _team;
    Roles.Role private _oracle;
    constructor () internal {
        _addTeam(msg.sender);
    }
    modifier onlyTeam() {
        require(isTeam(msg.sender), "TeamRole: caller does not have the Team role");
        _;
    }
    modifier onlyRegistryOracle() {
        require(isOracle(msg.sender), "TeamRole: caller does not have the Oracle role");
        _;
    }

    function isOracle(address account) public view returns (bool) {
        return _oracle.has(account);
    }
    function getOracleAddresses() public view returns (address[] memory) {
        return _oracle.accounts;
    }

    function addOracle(address account) public onlyTeam {
        _addOracle(account);
    }
    function _addOracle(address account) internal {
        _oracle.add(account);
        emit OracleAdded(account);
    }
    function renounceOracle() public {
        _removeOracle(msg.sender);
    }
    function _removeOracle(address account) internal {
        _oracle.remove(account);
        emit OracleRemoved(account);
    }

    function isTeam(address account) public view returns (bool) {
        return _team.has(account);
    }
    function getTeamAddresses() public view returns (address[] memory) {
        return _team.accounts;
    }
    function addTeam(address account) public onlyTeam {
        _addTeam(account);
    }
    function renounceTeam() public onlyTeam {
        _removeTeam(msg.sender);
    }
    function _addTeam(address account) internal {
        _team.add(account);
        emit TeamAdded(account);
    }
    function _removeTeam(address account) internal {
        _team.remove(account);
        emit TeamRemoved(account);
    }
}
          

Roles.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
library Roles {
    struct Role {
        address[] accounts;
        mapping (address => bool) bearer;
        mapping (bytes32 => uint256) _indexes;
    }
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
        role.accounts.push(account);
        role._indexes[bytes32(uint256(account))] = role.accounts.length;
    }
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        uint256 valueIndex = role._indexes[bytes32(uint256(account))];
        if (valueIndex != 0) { // Equivalent to contains()
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = role.accounts.length - 1;
            address lastValue = role.accounts[lastIndex];
            role.accounts[toDeleteIndex] = lastValue;
            role.accounts.pop();
            delete role._indexes[bytes32(uint256(account))];
        }
//        for (uint256 i; i < role.accounts.length; i++) {
//            if (role.accounts[i] == account) {
//                _removeIndexArray(i, role.accounts);
//                break;
//            }
//        }
        role.bearer[account] = false;
    }
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
//    function _removeIndexArray(uint256 index, address[] storage array) internal virtual {
//        for(uint256 i = index; i < array.length-1; i++) {
//            array[i] = array[i+1];
//        }
//        array.pop();
//    }
}
          

IAssetsManageTeam.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
interface IAssetsManageTeam {
    function _depositToken(address pool, address team, address token, uint256 amount) external returns (bool);
    function _withdraw(address pool, address team, uint256 amount) external returns (bool);
    function _withdrawTokensToStartup(address pool,address token, address team, uint256 amount) external returns (bool);
    function _request(bool withdraw, address pool, address team, uint256 maxValue) external returns(bool);
    function _requestTokensWidthdrawalFromStartup(address pool, address token, address team, uint256 maxValue) external returns(bool);
    function _approve(address pool, address team, address owner) external returns(bool);
    function _approveTokensWidthdrawalFromStartup(address pool, address token, address team, address owner) external returns(bool);
    function _disapprove(address pool, address team, address owner) external returns(bool);
    function _lock(address pool, address team, address owner) external returns(bool);
    function _unlock(address pool, address team, address owner) external returns(bool);
    function addManager(address account) external;
    function getPerformedOperationsLength(address pool, address owner) external view returns(uint256 length);
    function getPerformedOperations(address pool, address owner, uint256 index) external view returns(address token, uint256 amountToken, uint256 withdraw, uint256 time);
    function getRequests(address pool) external view returns(address[] memory);
    function getApproval(address pool) external view returns(address[] memory);
    function getRequestTeamAddress(address pool, address team) external view returns(bool lock, uint256 maxValueToken, uint256 madeValueToken, uint256 maxValue, uint256 madeValue);
    function getApproveTeamAddress(address pool, address team) external view returns(bool lock, uint256 maxValueToken, uint256 madeValueToken, uint256 maxValue, uint256 madeValueE);
}
          

IERC20.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function decimals() external view returns (uint8);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
          

IOpenBiSeaAuction.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
interface IOpenBiSeaAuction {
    function contractsNFTWhitelisted() external view returns (address[] memory);
    function whitelistContractCreator( address _contractNFT, uint256 fee ) external payable;
    function createAuction( address _contractNFT, uint256 _tokenId, uint256 _price,uint256 _deadline, bool _isERC1155, address _sender, bool _isUSD ) external;
    function bid( address _contractNFT,uint256 _tokenId, uint256 _price, bool _isERC1155, address _sender ) external returns (bool, uint256, address, bool);
    function cancelAuction( address _contractNFT, uint256 _tokenId, address _sender, bool _isERC1155 ) external;
    function checkTokensForClaim( address customer, uint256 priceMainToUSD) external view returns (uint256,uint256,uint256,bool);
    function setConsumersReceivedMainTokenLatestDate(address _sender) external;
}
          

IOracle.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
interface IOracle {
    function getLatestPrice() external view returns ( uint256,uint8);
    function getCustomPrice(address aggregator) external view returns (uint256,uint8);
}
          

IPoolRegistry.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
import "./IOracle.sol";
interface IPoolRegistry {
    function isTeam(address account) external view returns (bool);
    function getTeamAddresses() external view returns (address[] memory);
    function getOracleContract() external view returns (IOracle);
    function feesMultipier(address sender) external view returns (uint256);
}
          

IRoleModel.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
contract IRoleModel {
    bytes32 public constant SUPER_ADMIN_ROLE = keccak256("SUPER_ADMIN_ROLE");
    bytes32 public constant GENERAL_PARTNER_ROLE = keccak256("GENERAL_PARTNER_ROLE");
    bytes32 public constant LIMITED_PARTNER_ROLE = keccak256("LIMITED_PARTNER_ROLE");
    bytes32 public constant STARTUP_TEAM_ROLE = keccak256("STARTUP_TEAM_ROLE");
    bytes32 public constant POOL_REGISTRY = keccak256("POOL_REGISTRY");
    bytes32 public constant RETURN_INVESTMENT_LPARTNER = keccak256("RETURN_INVESTMENT_LPARTNER");
    bytes32 public constant ORACLE = keccak256("ORACLE");
    bytes32 public constant REFERER_ROLE = keccak256("REFERER_ROLE");
}
          

SafeMath.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
library SafeMath {
     function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
         if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
}
          

Ownable.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
import "../GSN/Context.sol";
contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
    constructor() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    /**
    * @dev Transfers ownership of the contract to a new account (`newOwner`).
    * Can only be called by the current owner.
    */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
          

EnumerableSet.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
library EnumerableSet {
    struct Set {
        bytes32[] _values;
        address[] _collection;
        mapping (bytes32 => uint256) _indexes;
    }
    function _add(Set storage set, bytes32 value, address addressValue) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._collection.push(addressValue);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) { // Equivalent to contains(set, value)
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastValue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastValue;
            set._values.pop();

            address lastvalueAddress = set._collection[lastIndex];
            set._collection[toDeleteIndex] = lastvalueAddress;
            set._collection.pop();

            set._indexes[lastValue] = toDeleteIndex + 1; // All indexes are 1-based
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }
    function _collection(Set storage set) private view returns (address[] memory) {
        return set._collection;    
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }
    struct AddressSet {
        Set _inner;
    }
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(value)), value);
    }
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(value)));
    }
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(value)));
    }
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }
    function collection(AddressSet storage set) internal view returns (address[] memory) {
        return _collection(set._inner);
    }
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint256(_at(set._inner, index)));
    }
}
          

EnumerableUintSet.sol

// SPDX-License-Identifier: UNLICENSED
// (c) Oleksii Vynogradov 2021, All rights reserved, contact alex@cfc.io if you like to use code
pragma solidity ^0.6.8;
library EnumerableUintSet {
    struct Set {
        bytes32[] _values;
        uint256[] _collection;
        mapping (bytes32 => uint256) _indexes;
    }
    function _add(Set storage set, bytes32 value, uint256 savedValue) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._collection.push(savedValue);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) { // Equivalent to contains(set, value)
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastValue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastValue;
            set._values.pop();

            uint256 lastvalueAddress = set._collection[lastIndex];
            set._collection[toDeleteIndex] = lastvalueAddress;
            set._collection.pop();

            set._indexes[lastValue] = toDeleteIndex + 1; // All indexes are 1-based
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }
    function _collection(Set storage set) private view returns (uint256[] memory) {
        return set._collection;    
    }

    function _at(Set storage set, uint256 index) private view returns (uint256) {
        require(set._collection.length > index, "EnumerableSet: index out of bounds");
        return set._collection[index];
    }
    struct UintSet {
        Set _inner;
    }
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(value)), value);
    }
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(value)));
    }
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(value)));
    }
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }
    function collection(UintSet storage set) internal view returns (uint256[] memory) {
        return _collection(set._inner);
    }
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return _at(set._inner, index);
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"tokenForTokensale","internalType":"address"},{"type":"address","name":"superAdmin","internalType":"address"},{"type":"address","name":"gPartner","internalType":"address"},{"type":"address","name":"lPartner","internalType":"address"},{"type":"address","name":"team","internalType":"address"},{"type":"address","name":"poolRegistry","internalType":"address"},{"type":"address","name":"returnInvestmentLpartner","internalType":"address"},{"type":"address","name":"assetsManageTeam","internalType":"contract IAssetsManageTeam"},{"type":"uint256","name":"initialBalance","internalType":"uint256"},{"type":"address","name":"busdContract","internalType":"address"}]},{"type":"event","name":"ClaimFreeTokens","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"investor","internalType":"address","indexed":false},{"type":"bool","name":"result","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"DebugWithdrawLPartner","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":false},{"type":"address","name":"owner","internalType":"address","indexed":false},{"type":"uint256","name":"getDepositLengthSender","internalType":"uint256","indexed":false},{"type":"uint256","name":"getDepositLengthOwner","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalAmountReturn","internalType":"uint256","indexed":false},{"type":"uint256","name":"indexesDepositLength","internalType":"uint256","indexed":false},{"type":"uint256","name":"balanceThis","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Finalized","inputs":[],"anonymous":false},{"type":"event","name":"OracleAdded","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OracleRemoved","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TeamAdded","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TeamRemoved","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"GENERAL_PARTNER_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"LIMITED_PARTNER_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"ORACLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"POOL_REGISTRY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"REFERER_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"RETURN_INVESTMENT_LPARTNER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"STARTUP_TEAM_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"SUPER_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_activateDepositToPool","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_approveWithdrawLpartner","inputs":[{"type":"address","name":"lPartner","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"investedToken","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_depositInvestmentInTokensToPool","inputs":[{"type":"address","name":"sender","internalType":"address payable"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_depositPoolRegistry","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"feesMultipier","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_disactivateDepositToPool","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getTokenAmount","inputs":[{"type":"uint256","name":"weiAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_returnsInTokensFromTeam","inputs":[{"type":"address","name":"sender","internalType":"address payable"},{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setAuction","inputs":[{"type":"address","name":"newAuction","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_setPoolValues","inputs":[{"type":"uint256","name":"poolValueUSD","internalType":"uint256"},{"type":"uint256","name":"poolValue","internalType":"uint256"},{"type":"string","name":"proofOfValue","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_setRate","inputs":[{"type":"uint256","name":"rate","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_setReferral","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"lPartner","internalType":"address"},{"type":"address","name":"referral","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_updatePool","inputs":[{"type":"string","name":"name","internalType":"string"},{"type":"bool","name":"isPublicPool","internalType":"bool"},{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"locked","internalType":"uint256"},{"type":"uint256","name":"depositFixedFee","internalType":"uint256"},{"type":"uint256","name":"referralDepositFee","internalType":"uint256"},{"type":"uint256","name":"auctionCreationFeeMultiplier","internalType":"uint256"},{"type":"uint256","name":"auctionContractFeeMultiplier","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}],"name":"_withdrawLPartner","inputs":[{"type":"address","name":"sender","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_withdrawSuperAdmin","inputs":[{"type":"address","name":"sender","internalType":"address payable"},{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_withdrawTeam","inputs":[{"type":"address","name":"sender","internalType":"address payable"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_withdrawTokensToStartup","inputs":[{"type":"address","name":"sender","internalType":"address payable"},{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"addAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addOracle","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addTeam","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"auction","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"bid","inputs":[{"type":"address","name":"_contractNFT","internalType":"address"},{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"bool","name":"_isERC1155","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"bidUSD","inputs":[{"type":"address","name":"_contractNFT","internalType":"address"},{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"uint256","name":"_bidAmount","internalType":"uint256"},{"type":"bool","name":"_isERC1155","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancelAuction","inputs":[{"type":"address","name":"_contractNFT","internalType":"address"},{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"bool","name":"_isERC1155","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bool","name":"","internalType":"bool"}],"name":"checkTokensForClaim","inputs":[{"type":"address","name":"customer","internalType":"address"},{"type":"uint256","name":"priceMainToUSD","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"claimFreeTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"contractsNFTWhitelisted","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createAuction","inputs":[{"type":"address","name":"_contractNFT","internalType":"address"},{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_deadline","internalType":"uint256"},{"type":"bool","name":"_isERC1155","internalType":"bool"},{"type":"bool","name":"_isUSD","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"finalize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"time","internalType":"uint256"},{"type":"uint256","name":"lock_period","internalType":"uint256"},{"type":"bool","name":"refund_authorize","internalType":"bool"},{"type":"uint256","name":"amountWithdrawal","internalType":"uint256"},{"type":"address","name":"investedToken","internalType":"address"}],"name":"getDeposit","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getDepositLength","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"name","internalType":"string"},{"type":"bool","name":"isPublicPool","internalType":"bool"},{"type":"address","name":"tokenForTokensale","internalType":"address"},{"type":"uint256","name":"locked","internalType":"uint256"},{"type":"uint256","name":"initialBalance","internalType":"uint256"}],"name":"getInfoPool","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"rate","internalType":"uint256"},{"type":"uint256","name":"depositFixedFee","internalType":"uint256"},{"type":"uint256","name":"referralDepositFee","internalType":"uint256"},{"type":"uint256","name":"auctionCreationFeeMultiplier","internalType":"uint256"},{"type":"uint256","name":"auctionContractFeeMultiplier","internalType":"uint256"},{"type":"uint256","name":"totalIncome","internalType":"uint256"},{"type":"uint256","name":"premiumFee","internalType":"uint256"}],"name":"getInfoPoolFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getInitialPriceInt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"Accounts","internalType":"address[]"}],"name":"getMembersRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getOracleAddresses","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"poolValueUSD","internalType":"uint256"},{"type":"uint256","name":"poolValue","internalType":"uint256"},{"type":"string","name":"proofOfValue","internalType":"string"}],"name":"getPoolValues","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getReferral","inputs":[{"type":"address","name":"lPartner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getRoleMember","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getRoleMemberCount","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getTeamAddresses","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOracle","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isTeam","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"purchaseTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"purchaseTokensQuantityFor","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOracle","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceTeam","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"whitelistContractCreator","inputs":[{"type":"address","name":"_contractNFT","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"whitelistContractCreatorTokens","inputs":[{"type":"address","name":"_contractNFT","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x6002805460a060020a60ff0219169055600a805460ff191660011790556000600f81905560105560c0604052600760808190527f6e6f7468696e670000000000000000000000000000000000000000000000000060a090815262000067916011919062000d0d565b5067013b7b21280e0000601e553480156200008157600080fd5b50604051620064fa380380620064fa8339818101604052610140811015620000a857600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e0880151610100890151610120909901519798969795969495939492939192909160006200010064010000000062000648810204565b60028054600160a060020a031916600160a060020a038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604080517f47454e4552414c5f504152544e45525f524f4c4500000000000000000000000081528151908190036014018120600080516020620064da83398151915282529151908190036010019020620001b291906401000000006200064d810204565b604080517f4c494d495445445f504152544e45525f524f4c4500000000000000000000000081528151908190036014018120600080516020620064da833981519152825291519081900360100190206200021691906401000000006200064d810204565b604080517f535441525455505f5445414d5f524f4c4500000000000000000000000000000081528151908190036011018120600080516020620064da833981519152825291519081900360100190206200027a91906401000000006200064d810204565b604080517f504f4f4c5f5245474953545259000000000000000000000000000000000000008152815190819003600d018120600080516020620064da83398151915282529151908190036010019020620002de91906401000000006200064d810204565b604080517f52455455524e5f494e564553544d454e545f4c504152544e45520000000000008152815190819003601a018120600080516020620064da833981519152825291519081900360100190206200034291906401000000006200064d810204565b604080517f4f5241434c45000000000000000000000000000000000000000000000000000081528151908190036006018120600080516020620064da83398151915282529151908190036010019020620003a691906401000000006200064d810204565b620003ba3364010000000062000662810204565b601c8054600160a060020a03808d16600160a060020a031992831617909255601a8054868416908316179055601b8054888416908316179055601d849055600b80549284169290911691909117905560408051600080516020620064da8339815191528152905190819003601001902062000444903364010000000062001e5d620006b482021704565b5060408051600080516020620064da8339815191528152905190819003601001902062000480908a64010000000062001e5d620006b482021704565b5060408051600080516020620064da83398151915281529051908190036010019020620004bc908664010000000062001e5d620006b482021704565b50620004d564010000000062001ae4620007de82021704565b604080517f47454e4552414c5f504152544e45525f524f4c45000000000000000000000000815290519081900360140190206200051c90896401000000006200093a810204565b604080517f4c494d495445445f504152544e45525f524f4c45000000000000000000000000815290519081900360140190206200056390886401000000006200093a810204565b604080517f535441525455505f5445414d5f524f4c4500000000000000000000000000000081529051908190036011019020620005aa90876401000000006200093a810204565b604080517f504f4f4c5f5245474953545259000000000000000000000000000000000000008152905190819003600d019020620005f190866401000000006200093a810204565b604080517f52455455524e5f494e564553544d454e545f4c504152544e45520000000000008152905190819003601a0190206200063890856401000000006200093a810204565b5050505050505050505062000daf565b335b90565b60009182526020829052604090912060030155565b6200067d60038264010000000062004472620009e382021704565b604051600160a060020a038216907f3f5f1db80208f0d453083a86e16909cecc1e95e2618d5d927c93ace22b8200fc90600090a250565b6000620006c964010000000062000648810204565b600254600160a060020a039081169116146200073557604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201819052602482015260008051602062006498833981519152604482015290519081900360640190fd5b60025474010000000000000000000000000000000000000000900460ff1615620007c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d616e61676572526f6c653a20616c72656164792066696e616c697a65640000604482015290519081900360640190fd5b620007d58383640100000000620009ca810204565b50600192915050565b620007f164010000000062000648810204565b600254600160a060020a039081169116146200085d57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201819052602482015260008051602062006498833981519152604482015290519081900360640190fd5b60025474010000000000000000000000000000000000000000900460ff1615620008e857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d616e61676572526f6c653a20616c72656164792066696e616c697a65640000604482015290519081900360640190fd5b6002805460a060020a60ff021916740100000000000000000000000000000000000000001790556040517f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768190600090a1565b60008281526020819052604090206003015462000973906200096464010000000062000648810204565b64010000000062000ac0810204565b620009ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018062006469602f913960400191505060405180910390fd5b620009df828264010000000062000aef810204565b5050565b620009f8828264010000000062000baa810204565b1562000a6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b600160a060020a03166000818152600183810160209081526040808420805460ff191684179055855492830186558584528184209092018054600160a060020a03191685179055845493835260029094019093529190912055565b600082815260208190526040812062000ae890836401000000006200452c62000c3082021704565b9392505050565b600082815260208190526040902062000b1790826401000000006200454162000c5082021704565b15620009df5760008281526001602081815260408320805492830181558352909120018054600160a060020a031916600160a060020a03831617905562000b6664010000000062000648810204565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000600160a060020a03821662000c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620064b86022913960400191505060405180910390fd5b50600160a060020a03166000908152600191909101602052604090205460ff1690565b600062000ae883600160a060020a03841664010000000062000c71810204565b600062000ae883600160a060020a0384168464010000000062000c89810204565b60009081526002919091016020526040902054151590565b600062000ca0848464010000000062000c71810204565b62000d0357508254600180820185556000858152602080822090930185905581860180548084018255908252838220018054600160a060020a031916600160a060020a038616179055855485825260028701909352604090209190915562000ae8565b5060009392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000d5057805160ff191683800117855562000d80565b8280016001018555821562000d80579182015b8281111562000d8057825182559160200191906001019062000d63565b5062000d8e92915062000d92565b5090565b6200064a91905b8082111562000d8e576000815560010162000d99565b6156aa8062000dbf6000396000f3fe6080604052600436106103b55760003560e060020a900480639010d07c116101eb578063d5c5e43411610111578063e89ec45f116100a4578063f66fdcca11610073578063f66fdcca14610ff9578063fd66c06714611094578063fe070e9d146110e9578063fedf51e9146110fe576103bc565b8063e89ec45f14610f35578063f14d218114610f6e578063f2fde38b14610f83578063f45efe6714610fb6576103bc565b8063d9a431b3116100e0578063d9a431b314610e69578063dae06b7214610e7e578063dca80c1914610ec1578063df5dd1a514610f02576103bc565b8063d5c5e43414610d54578063d69df4c714610db0578063d6d6878414610def578063d93f48b014610e22576103bc565b8063b463a75c11610189578063cb4ff7f211610158578063cb4ff7f214610c02578063cbc5906e14610c47578063d2f0d2a814610c5c578063d547741f14610d1b576103bc565b8063b463a75c14610b07578063bd8afbf814610b3a578063c1abd75714610bc3578063ca15c87314610bd8576103bc565b80639cf6cc70116101c55780639cf6cc701461099c5780639f2ac7f8146109c6578063a97e5c9314610a27578063b06fd88f14610a5a576103bc565b80639010d07c1461090957806391d148541461093957806394707a9514610972576103bc565b8063594ce4c7116102db5780637a99bb0a1161026e57806387ac828a1161023d57806387ac828a1461087957806389e52771146108ac5780638c533ba7146108c15780638da5cb5b146108f4576103bc565b80637a99bb0a146107c35780637d9f6db5146107ed5780637fdbc08b14610802578063878d9b7a14610845576103bc565b80636d8664e0116102aa5780636d8664e01461073d5780637330aba214610752578063770108a7146107675780637837efdc146107ae576103bc565b8063594ce4c7146106975780635ac8b005146106da5780636176dd9f146106ef5780636419bcdb14610704576103bc565b80632dc20f621161035357806338013f021161032257806338013f02146106095780633b0f0f2f1461061e5780634460bdd61461066d5780634bb278f314610682576103bc565b80632dc20f621461058b5780632f2ff15d146105b35780633049ea33146105ec5780633290ce2914610601576103bc565b8063248519141161038f57806324851914146104a4578063248a9ca3146104d7578063261fef02146105015780632726b50614610516576103bc565b8063052c09fd146103c157806316fb3c15146104265780631cda4a8d1461047d576103bc565b366103bc57005b600080fd5b3480156103cd57600080fd5b506103d661114b565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104125781810151838201526020016103fa565b505050509050019250505060405180910390f35b34801561043257600080fd5b506104696004803603606081101561044957600080fd5b50600160a060020a0381358116916020810135909116906040013561126d565b604080519115158252519081900360200190f35b34801561048957600080fd5b50610492611477565b60408051918252519081900360200190f35b3480156104b057600080fd5b50610469600480360360208110156104c757600080fd5b5035600160a060020a031661149a565b3480156104e357600080fd5b50610492600480360360208110156104fa57600080fd5b50356114b3565b34801561050d57600080fd5b506104926114c8565b34801561052257600080fd5b5061054f6004803603604081101561053957600080fd5b50600160a060020a0381351690602001356114fd565b6040805196875260208701959095528585019390935290151560608501526080840152600160a060020a031660a0830152519081900360c00190f35b6105b1600480360360208110156105a157600080fd5b5035600160a060020a03166116a3565b005b3480156105bf57600080fd5b506105b1600480360360408110156105d657600080fd5b5080359060200135600160a060020a031661179e565b3480156105f857600080fd5b5061046961180d565b6104926118d1565b34801561061557600080fd5b50610492611a5c565b34801561062a57600080fd5b506106516004803603602081101561064157600080fd5b5035600160a060020a0316611a91565b60408051600160a060020a039092168252519081900360200190f35b34801561067957600080fd5b50610492611aaf565b34801561068e57600080fd5b506105b1611ae4565b3480156106a357600080fd5b50610469600480360360608110156106ba57600080fd5b50600160a060020a03813581169160208101359091169060400135611c24565b3480156106e657600080fd5b50610492611d69565b3480156106fb57600080fd5b50610469611d9e565b34801561071057600080fd5b506104696004803603604081101561072757600080fd5b5080359060200135600160a060020a0316611e5d565b34801561074957600080fd5b50610492611f52565b34801561075e57600080fd5b506103d6611f58565b34801561077357600080fd5b506105b16004803603608081101561078a57600080fd5b50600160a060020a0381351690602081013590604081013590606001351515611fbd565b3480156107ba57600080fd5b506105b1612515565b3480156107cf57600080fd5b50610492600480360360208110156107e657600080fd5b5035612520565b3480156107f957600080fd5b506106516125c3565b34801561080e57600080fd5b506104696004803603606081101561082557600080fd5b50600160a060020a038135811691602081013590911690604001356125d7565b6105b16004803603606081101561085b57600080fd5b50600160a060020a03813516906020810135906040013515156127b3565b34801561088557600080fd5b506104926004803603602081101561089c57600080fd5b5035600160a060020a0316612abd565b3480156108b857600080fd5b506103d6612ad8565b3480156108cd57600080fd5b506105b1600480360360208110156108e457600080fd5b5035600160a060020a0316612b3b565b34801561090057600080fd5b50610651612cc9565b34801561091557600080fd5b506106516004803603604081101561092c57600080fd5b5080359060200135612cd8565b34801561094557600080fd5b506104696004803603604081101561095c57600080fd5b5080359060200135600160a060020a0316612cf6565b34801561097e57600080fd5b506104696004803603602081101561099557600080fd5b5035612d14565b3480156109a857600080fd5b506103d6600480360360208110156109bf57600080fd5b5035612d88565b3480156109d257600080fd5b506109ff600480360360408110156109e957600080fd5b50600160a060020a038135169060200135612df4565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b348015610a3357600080fd5b5061046960048036036020811015610a4a57600080fd5b5035600160a060020a0316612ebd565b348015610a6657600080fd5b506104696004803603610100811015610a7e57600080fd5b810190602081018135640100000000811115610a9957600080fd5b820183602082011115610aab57600080fd5b80359060200191846001830284011164010000000083111715610acd57600080fd5b91935091508035151590600160a060020a036020820135169060408101359060608101359060808101359060a08101359060c00135612ed0565b348015610b1357600080fd5b506105b160048036036020811015610b2a57600080fd5b5035600160a060020a0316612f79565b348015610b4657600080fd5b5061046960048036036060811015610b5d57600080fd5b813591602081013591810190606081016040820135640100000000811115610b8457600080fd5b820183602082011115610b9657600080fd5b80359060200191846001830284011164010000000083111715610bb857600080fd5b509092509050612fcc565b348015610bcf57600080fd5b50610492613059565b348015610be457600080fd5b5061049260048036036020811015610bfb57600080fd5b503561307c565b348015610c0e57600080fd5b5061046960048036036060811015610c2557600080fd5b50600160a060020a038135811691602081013582169160409091013516613093565b348015610c5357600080fd5b50610492613283565b348015610c6857600080fd5b50610c716132a6565b60405180806020018615151515815260200185600160a060020a0316600160a060020a03168152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b83811015610cdc578181015183820152602001610cc4565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b348015610d2757600080fd5b506105b160048036036040811015610d3e57600080fd5b5080359060200135600160a060020a0316613373565b348015610d6057600080fd5b50610d8760048036036020811015610d7757600080fd5b5035600160a060020a03166133d9565b6040805193151584526020840192909252600160a060020a031682820152519081900360600190f35b348015610dbc57600080fd5b5061046960048036036060811015610dd357600080fd5b50600160a060020a0381351690602081013590604001356136be565b348015610dfb57600080fd5b506105b160048036036020811015610e1257600080fd5b5035600160a060020a03166137a4565b348015610e2e57600080fd5b5061046960048036036080811015610e4557600080fd5b50600160a060020a0381358116916020810135916040820135916060013516613820565b348015610e7557600080fd5b506105b16139a5565b348015610e8a57600080fd5b50610ea860048036036020811015610ea157600080fd5b50356139f5565b6040805192835260208301919091528051918290030190f35b348015610ecd57600080fd5b506105b160048036036060811015610ee457600080fd5b50600160a060020a0381351690602081013590604001351515613a6e565b348015610f0e57600080fd5b506105b160048036036020811015610f2557600080fd5b5035600160a060020a0316613b04565b348015610f4157600080fd5b5061046960048036036040811015610f5857600080fd5b50600160a060020a038135169060200135613b54565b348015610f7a57600080fd5b50610469613d08565b348015610f8f57600080fd5b506105b160048036036020811015610fa657600080fd5b5035600160a060020a0316613f9b565b348015610fc257600080fd5b5061046960048036036060811015610fd957600080fd5b50600160a060020a038135811691602081013591604090910135166140ac565b34801561100557600080fd5b5061100e6142d1565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561105757818101518382015260200161103f565b50505050905090810190601f1680156110845780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156110a057600080fd5b506105b1600480360360c08110156110b757600080fd5b50600160a060020a0381351690602081013590604081013590606081013590608081013515159060a001351515614385565b3480156110f557600080fd5b50610492614431565b34801561110a57600080fd5b50611113614454565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6060600a60019054906101000a9004600160a060020a0316600160a060020a031663052c09fd6040518163ffffffff1660e060020a02815260040160006040518083038186803b15801561119e57600080fd5b505afa1580156111b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156111db57600080fd5b81019080805160405193929190846401000000008211156111fb57600080fd5b90830190602082018581111561121057600080fd5b825186602082028301116401000000008211171561122d57600080fd5b82525081516020918201928201910280838360005b8381101561125a578181015183820152602001611242565b5050505090500160405250505090505b90565b6040805160008051602061531d8339815191528152905190819003600d01902060009061129a9033612cf6565b6112d85760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b60408051600080516020615528833981519152815290519081900360110190206113029085612cf6565b6113405760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b601a54604080517fe33d8221000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0386811660248301528781166044830152606482018690529151919092169163e33d82219160848083019260209291908290030181600087803b1580156113bd57600080fd5b505af11580156113d1573d6000803e3d6000fd5b505050506040513d60208110156113e757600080fd5b50506040805160e060020a63a9059cbb028152600160a060020a0386811660048301526024820185905291519185169163a9059cbb916044808201926020929091908290030181600087803b15801561143f57600080fd5b505af1158015611453573d6000803e3d6000fd5b505050506040513d602081101561146957600080fd5b5060019150505b9392505050565b6040805160008051602061531d8339815191528152905190819003600d01902081565b60006114ad60038363ffffffff61455716565b92915050565b60009081526020819052604090206003015490565b604080517f52455455524e5f494e564553544d454e545f4c504152544e45520000000000008152905190819003601a01902081565b6000806000806000806018600089600160a060020a0316600160a060020a03168152602001908152602001600020878154811061153657fe5b60009182526020808320600690920290910154600160a060020a038b1683526018909152604090912080548990811061156b57fe5b906000526020600020906006020160010154601860008b600160a060020a0316600160a060020a0316815260200190815260200160002089815481106115ad57fe5b906000526020600020906006020160020154601860008c600160a060020a0316600160a060020a031681526020019081526020016000208a815481106115ef57fe5b6000918252602080832060036006909302019190910154600160a060020a038e16835260189091526040909120805460ff909216918c90811061162e57fe5b906000526020600020906006020160040154601860008e600160a060020a0316600160a060020a031681526020019081526020016000208c8154811061167057fe5b6000918252602090912060069091020160050154949d939c50919a5098509650600160a060020a03909116945092505050565b601454601e546116b89163ffffffff6145c416565b3410156116f95760405160e560020a62461bcd02815260040180806020018281038252602f8152602001806155b8602f913960400191505060405180910390fd5b600a54604080517f4f63d3ce000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152346024830152915161010090930490911691634f63d3ce9160448082019260009290919082900301818387803b15801561176c57600080fd5b505af1158015611780573d6000803e3d6000fd5b5050601654611798925090503463ffffffff61462016565b60165550565b6000828152602081905260409020600301546117c1906117bc61467d565b612cf6565b6117ff5760405160e560020a62461bcd02815260040180806020018281038252602f8152602001806152bb602f913960400191505060405180910390fd5b6118098282614681565b5050565b6040805160008051602061531d8339815191528152905190819003600d01902060009061183a9033612cf6565b6118785760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b600a5460ff16156118bd5760405160e560020a62461bcd02815260040180806020018281038252602d815260200180615548602d913960400191505060405180910390fd5b50600a805460ff1916600190811790915590565b600067016345785d8a0000341161191c5760405160e560020a62461bcd0281526004018080602001828103825260278152602001806155016027913960400191505060405180910390fd5b600080611928346139f5565b90925090508161196c5760405160e560020a62461bcd0281526004018080602001828103825260268152602001806153d56026913960400191505060405180910390fd5b61197d81600363ffffffff61472616565b82106119bd5760405160e560020a62461bcd02815260040180806020018281038252606381526020018061546f6063913960800191505060405180910390fd5b601c546040805160e060020a63a9059cbb028152336004820152602481018590529051600160a060020a039092169163a9059cbb916044808201926020929091908290030181600087803b158015611a1457600080fd5b505af1158015611a28573d6000803e3d6000fd5b505050506040513d6020811015611a3e57600080fd5b5050601f54611a53908363ffffffff61462016565b601f5550905090565b604080517f4f5241434c4500000000000000000000000000000000000000000000000000008152905190819003600601902081565b600160a060020a039081166000908152601960205260409020541690565b604080517f53555045525f41444d494e5f524f4c45000000000000000000000000000000008152905190819003601001902081565b611aec61467d565b600254600160a060020a03908116911614611b51576040805160e560020a62461bcd02815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60025474010000000000000000000000000000000000000000900460ff1615611bc4576040805160e560020a62461bcd02815260206004820152601e60248201527f4d616e61676572526f6c653a20616c72656164792066696e616c697a65640000604482015290519081900360640190fd5b6002805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768190600090a1565b6040805160008051602061531d8339815191528152905190819003600d019020600090611c519033612cf6565b611c8f5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061552883398151915281529051908190036011019020611cb99085612cf6565b611cf75760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152306024830152604482018590529151918516916323b872dd916064808201926020929091908290030181600087803b15801561143f57600080fd5b604080517f524546455245525f524f4c4500000000000000000000000000000000000000008152905190819003600c01902081565b6040805160008051602061531d8339815191528152905190819003600d019020600090611dcb9033612cf6565b611e095760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b600a5460ff16611e4d5760405160e560020a62461bcd02815260040180806020018281038252602f8152602001806154d2602f913960400191505060405180910390fd5b50600a805460ff19169055600190565b6000611e6761467d565b600254600160a060020a03908116911614611ecc576040805160e560020a62461bcd02815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60025474010000000000000000000000000000000000000000900460ff1615611f3f576040805160e560020a62461bcd02815260206004820152601e60248201527f4d616e61676572526f6c653a20616c72656164792066696e616c697a65640000604482015290519081900360640190fd5b611f4983836117ff565b50600192915050565b601e5490565b60606006600001805480602002602001604051908101604052809291908181526020018280548015611fb357602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611f95575b5050505050905090565b600b54604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018590529051600160a060020a03909216916323b872dd916064808201926020929091908290030181600087803b15801561203057600080fd5b505af1158015612044573d6000803e3d6000fd5b505050506040513d602081101561205a57600080fd5b5050600a54604080517f15b60639000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152602482018790526044820186905284151560648301523360848301529151600093849384938493610100909304909116916315b606399160a48082019260809290919082900301818787803b1580156120ee57600080fd5b505af1158015612102573d6000803e3d6000fd5b505050506040513d608081101561211857600080fd5b5080516020820151604083015160609093015191965094509092509050831561247357801561246e576000612169606461215d6012548a6145c490919063ffffffff16565b9063ffffffff61472616565b90506000612187606461215d6013548b6145c490919063ffffffff16565b9050600061219b898463ffffffff61476816565b33600090815260196020526040902054909150600160a060020a031615612325576121cc818363ffffffff61476816565b600b5433600090815260196020908152604080832054815160e060020a63a9059cbb028152600160a060020a0391821660048201526024810189905291519596509093169363a9059cbb93604480820194918390030190829087803b15801561223457600080fd5b505af1158015612248573d6000803e3d6000fd5b505050506040513d602081101561225e57600080fd5b5050600b546040805160008051602061538383398151915281529051908190036014019020600160a060020a039091169063a9059cbb906122a0906000612cd8565b856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156122f357600080fd5b505af1158015612307573d6000803e3d6000fd5b505050506040513d602081101561231d57600080fd5b506123e59050565b600b546040805160008051602061538383398151915281529051908190036014019020600160a060020a039091169063a9059cbb90612365906000612cd8565b856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156123b857600080fd5b505af11580156123cc573d6000803e3d6000fd5b505050506040513d60208110156123e257600080fd5b50505b600b546040805160e060020a63a9059cbb028152600160a060020a038881166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561243e57600080fd5b505af1158015612452573d6000803e3d6000fd5b505050506040513d602081101561246857600080fd5b50505050505b61250b565b6000831180156124805750805b1561250b57600b546040805160e060020a63a9059cbb028152600160a060020a038581166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156124de57600080fd5b505af11580156124f2573d6000803e3d6000fd5b505050506040513d602081101561250857600080fd5b50505b5050505050505050565b61251e336147aa565b565b600080600c60009054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561257457600080fd5b505afa158015612588573d6000803e3d6000fd5b505050506040513d602081101561259e57600080fd5b5051600e549091506114709060ff8316600a0a9061215d90869063ffffffff6145c416565b600a546101009004600160a060020a031690565b6040805160008051602061531d8339815191528152905190819003600d0190206000906126049033612cf6565b6126425760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b604080517f53555045525f41444d494e5f524f4c45000000000000000000000000000000008152905190819003601001902061267e9085612cf6565b6126bc5760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b81156127a957600160a060020a03831661271057604051600160a060020a0385169083156108fc029084906000818181858888f19350505050158015612706573d6000803e3d6000fd5b5060019050611470565b82600160a060020a031663a9059cbb85846040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561277357600080fd5b505af1158015612787573d6000803e3d6000fd5b505050506040513d602081101561279d57600080fd5b50600191506114709050565b5060009392505050565b600a54604080517f15b60639000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820186905234604483015284151560648301523360848301529151600093849384938493610100909304909116916315b606399160a48082019260809290919082900301818787803b15801561284457600080fd5b505af1158015612858573d6000803e3d6000fd5b505050506040513d608081101561286e57600080fd5b50805160208201516040830151606090930151919650945090925090508315612a6b5780612a665760006128b2606461215d601254346145c490919063ffffffff16565b905060006128d0606461215d601354346145c490919063ffffffff16565b905060006128e4348463ffffffff61476816565b33600090815260196020526040902054909150600160a060020a0316156129c657612915818363ffffffff61476816565b33600090815260196020526040808220549051929350600160a060020a03169184156108fc0291859190818181858888f1935050505015801561295c573d6000803e3d6000fd5b506040805160008051602061538383398151915281529051908190036014019020612988906000612cd8565b600160a060020a03166108fc849081150290604051600060405180830381858888f193505050501580156129c0573d6000803e3d6000fd5b50612a2b565b60408051600080516020615383833981519152815290519081900360140190206129f1906000612cd8565b600160a060020a03166108fc849081150290604051600060405180830381858888f19350505050158015612a29573d6000803e3d6000fd5b505b604051600160a060020a0386169082156108fc029083906000818181858888f19350505050158015612a61573d6000803e3d6000fd5b505050505b612ab4565b600083118015612a79575080155b15612ab457604051600160a060020a0383169084156108fc029085906000818181858888f1935050505015801561250b573d6000803e3d6000fd5b50505050505050565b600160a060020a031660009081526018602052604090205490565b60606003600001805480602002602001604051908101604052809291908181526020018280548015611fb357602002820191906000526020600020908154600160a060020a03168152600190910190602001808311611f95575050505050905090565b601454600090612b5a90670de0b6b3a76400009063ffffffff6145c416565b601c54604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490529051929350600160a060020a03909116916323b872dd916064808201926020929091908290030181600087803b158015612bd057600080fd5b505af1158015612be4573d6000803e3d6000fd5b505050506040513d6020811015612bfa57600080fd5b5050601e54612c3090612c2190670de0b6b3a76400009061215d908563ffffffff6145c416565b6016549063ffffffff61462016565b601655600a54601e54610100909104600160a060020a031690634f63d3ce908490612c5b90856145c4565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015612cad57600080fd5b505af1158015612cc1573d6000803e3d6000fd5b505050505050565b600254600160a060020a031690565b6000828152602081905260408120611470908363ffffffff6147f216565b6000828152602081905260408120611470908363ffffffff61452c16565b6040805160008051602061531d8339815191528152905190819003600d019020600090612d419033612cf6565b612d7f5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b50600e55600190565b600081815260016020908152604091829020805483518184028101840190945280845260609392830182828015612de857602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311612dca575b50505050509050919050565b600080600080600a60019054906101000a9004600160a060020a0316600160a060020a0316639f2ac7f887876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a031681526020018281526020019250505060806040518083038186803b158015612e7057600080fd5b505afa158015612e84573d6000803e3d6000fd5b505050506040513d6080811015612e9a57600080fd5b508051602082015160408301516060909301519199909850919650945092505050565b60006114ad60068363ffffffff61455716565b6040805160008051602061531d8339815191528152905190819003600d019020600090612efd9033612cf6565b612f3b5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b612f4760098b8b615200565b5050600a805460ff191697151597909717909655600d9390935560129190915560135560145550601555506001919050565b612f823361149a565b612fc05760405160e560020a62461bcd02815260040180806020018281038252602c8152602001806155e7602c913960400191505060405180910390fd5b612fc9816147fe565b50565b6040805160008051602061531d8339815191528152905190819003600d019020600090612ff99033612cf6565b6130375760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b600f859055601084905561304d60118484615200565b50600195945050505050565b604080516000805160206153838339815191528152905190819003601401902081565b60008181526020819052604081206114ad90614846565b6040805160008051602061531d8339815191528152905190819003600d0190206000906130c09033612cf6565b6130fe5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061538383398151915281529051908190036014019020849061312a9082612cf6565b8061316c5750604080517f53555045525f41444d494e5f524f4c45000000000000000000000000000000008152905190819003601001902061316c9082612cf6565b806132055750601b54604080517f24851914000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916324851914916024808301926020929190829003018186803b1580156131d857600080fd5b505afa1580156131ec573d6000803e3d6000fd5b505050506040513d602081101561320257600080fd5b50515b1561324157600160a060020a0384811660009081526019602052604090208054600160a060020a0319169185169190911790556001915061327b565b60405160e560020a62461bcd02815260040180806020018281038252602381526020018061542b6023913960400191505060405180910390fd5b509392505050565b604080516000805160206155288339815191528152905190819003601101902081565b600a54601c54600d54601d546009805460408051602060026101006001861615026000190190941693909304601f81018490048402820184019092528181526060976000978897889788979660ff90941695600160a060020a039093169491939092879183018282801561335b5780601f106133305761010080835404028352916020019161335b565b820191906000526020600020905b81548152906001019060200180831161333e57829003601f168201915b50505050509450945094509450945094509091929394565b600082815260208190526040902060030154613391906117bc61467d565b6133cf5760405160e560020a62461bcd0281526004018080602001828103825260308152602001806153fb6030913960400191505060405180910390fd5b6118098282614851565b600080600061340b604051808060008051602061531d833981519152815250600d019050604051809103902033612cf6565b6134495760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061533d833981519152815290519081900360140190206134739085612cf6565b6134b15760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b600080806134be87612abd565b90506000805b828110156136af57600160a060020a03891660009081526018602052604081208054839081106134f057fe5b60009182526020909120600690910201600381015490915060ff16156136a65760058101546004820154600160a060020a0390911695501561362557600160a060020a038516613591576004810154604051600160a060020a038c169180156108fc02916000818181858888f19350505050158015613573573d6000803e3d6000fd5b50600481015461358a90879063ffffffff61462016565b9550613625565b84600160a060020a031663a9059cbb8b83600401546040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156135f857600080fd5b505af115801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b50505b600160a060020a038a16600090815260186020526040812080548490811061364957fe5b60009182526020808320600692909202909101600301805460ff191693151593909317909255600160a060020a038c16815260189091526040812080548490811061369057fe5b9060005260206000209060060201600401819055505b506001016134c4565b50979296509094509092505050565b6040805160008051602061531d8339815191528152905190819003600d0190206000906136eb9033612cf6565b6137295760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061533d833981519152815290519081900360140190206137539085612cf6565b6137915760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b61379c848484614941565b949350505050565b6137ad3361149a565b6137eb5760405160e560020a62461bcd02815260040180806020018281038252602c8152602001806155e7602c913960400191505060405180910390fd5b600a8054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b604080517f52455455524e5f494e564553544d454e545f4c504152544e45520000000000008152905190819003601a01902060009061385f9033612cf6565b61389d5760405160e560020a62461bcd02815260040180806020018281038252603e815260200180615637603e913960400191505060405180910390fd5b600160a060020a0385166000908152601860205260409020805460019190869081106138c557fe5b906000526020600020906006020160030160006101000a81548160ff021916908315150217905550826018600087600160a060020a0316600160a060020a03168152602001908152602001600020858154811061391e57fe5b906000526020600020906006020160040181905550816018600087600160a060020a0316600160a060020a03168152602001908152602001600020858154811061396457fe5b906000526020600020906006020160050160006101000a815481600160a060020a030219169083600160a060020a0316021790555060019050949350505050565b6139ae3361149a565b6139ec5760405160e560020a62461bcd02815260040180806020018281038252602c8152602001806155e7602c913960400191505060405180910390fd5b61251e33614c25565b6000806000613a11601f54601d5461476890919063ffffffff16565b90506000613a308261215d601d54601e546145c490919063ffffffff16565b9050613a4e8161215d87670de0b6b3a764000063ffffffff6145c416565b601f54601d54613a639163ffffffff61476816565b935093505050915091565b600a54604080517f9b58a9a8000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018690523360448301528415156064830152915161010090930490911691639b58a9a89160848082019260009290919082900301818387803b158015613af057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b613b0d3361149a565b613b4b5760405160e560020a62461bcd02815260040180806020018281038252602c8152602001806155e7602c913960400191505060405180910390fd5b612fc981614c6d565b6040805160008051602061531d8339815191528152905190819003600d019020600090613b819033612cf6565b613bbf5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061552883398151915281529051908190036011019020613be99084612cf6565b613c275760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b601a54604080517f1208333a000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0386811660248301526044820186905291519190921691631208333a9160648083019260209291908290030181600087803b158015613c9c57600080fd5b505af1158015613cb0573d6000803e3d6000fd5b505050506040513d6020811015613cc657600080fd5b5050604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015613cfe573d6000803e3d6000fd5b5060019392505050565b6000806000601b60009054906101000a9004600160a060020a0316600160a060020a031663e3bbb5656040518163ffffffff1660e060020a02815260040160206040518083038186803b158015613d5e57600080fd5b505afa158015613d72573d6000803e3d6000fd5b505050506040513d6020811015613d8857600080fd5b5051604080517f8e15f4730000000000000000000000000000000000000000000000000000000081528151600160a060020a0390931692638e15f47392600480840193919291829003018186803b158015613de257600080fd5b505afa158015613df6573d6000803e3d6000fd5b505050506040513d6040811015613e0c57600080fd5b50805160209091015190925090506000613e3b33613e368560ff8616600a0a63ffffffff61472616565b612df4565b5091925060009150508115613f5357601c546040805160e060020a63a9059cbb028152336004820152602481018590529051600160a060020a039092169163a9059cbb916044808201926020929091908290030181600087803b158015613ea157600080fd5b505af1158015613eb5573d6000803e3d6000fd5b505050506040513d6020811015613ecb57600080fd5b5050600a54604080517fbb7598060000000000000000000000000000000000000000000000000000000081523360048201529051610100909204600160a060020a03169163bb7598069160248082019260009290919082900301818387803b158015613f3657600080fd5b505af1158015613f4a573d6000803e3d6000fd5b50505050600190505b604080518381523360208201528215158183015290517f9d6ad47cb919b7aa19b4e438ceeaa7b16afb7e9a6afe89335044b64c3cb4adca9181900360600190a1935050505090565b613fa361467d565b600254600160a060020a03908116911614614008576040805160e560020a62461bcd02815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600160a060020a0381166140505760405160e560020a62461bcd02815260040180806020018281038252602681526020018061535d6026913960400191505060405180910390fd5b600254604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360028054600160a060020a031916600160a060020a0392909216919091179055565b6040805160008051602061531d8339815191528152905190819003600d0190206000906140d99033612cf6565b6141175760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061533d833981519152815290519081900360140190206141419085612cf6565b61417f5760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b600061419b606461215d601254876145c490919063ffffffff16565b905060006141b9606461215d601354886145c490919063ffffffff16565b600160a060020a03878116600090815260196020526040812054929350911615614204576141fd826141f1888663ffffffff61476816565b9063ffffffff61476816565b9050614217565b614214868463ffffffff61476816565b90505b600160a060020a039687166000908152601860209081526040808320815160c08101835294855242858401908152600d5492860192835260608601858152608087018681529a8d1660a088019081528354600180820186559488529590962096516006909502909601938455518382015590516002830155925160038201805460ff1916911515919091179055955160048701555160059095018054600160a060020a031916959097169490941790955550909392505050565b6000806060600f546010546011808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143735780601f1061434857610100808354040283529160200191614373565b820191906000526020600020905b81548152906001019060200180831161435657829003601f168201915b50505050509050925092509250909192565b600a54604080517f854fe7ac000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015260248201899052604482018890526064820187905285151560848301523360a483015284151560c483015291516101009093049091169163854fe7ac9160e48082019260009290919082900301818387803b15801561441d57600080fd5b505af1158015612508573d6000803e3d6000fd5b6040805160008051602061533d8339815191528152905190819003601401902081565b600e5460125460135460145460155460165460175490919293949596565b61447c8282614557565b156144d1576040805160e560020a62461bcd02815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b600160a060020a03166000818152600183810160209081526040808420805460ff191684179055855492830186558584528184209092018054600160a060020a03191685179055845493835260029094019093529190912055565b600061147083600160a060020a038416614cb4565b600061147083600160a060020a03841684614ccc565b6000600160a060020a0382166145a15760405160e560020a62461bcd0281526004018080602001828103825260228152602001806155966022913960400191505060405180910390fd5b50600160a060020a03166000908152600191909101602052604090205460ff1690565b6000826145d3575060006114ad565b828202828482816145e057fe5b04146114705760405160e560020a62461bcd0281526004018080602001828103825260218152602001806155756021913960400191505060405180910390fd5b600082820183811015611470576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b600082815260208190526040902061469f908263ffffffff61454116565b156118095760008281526001602081815260408320805492830181558352909120018054600160a060020a031916600160a060020a0383161790556146e261467d565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061147083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614d41565b600061147083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614de6565b6147bb60068263ffffffff614e4316565b604051600160a060020a038216907f9c8e7d83025bef8a04c664b2f753f64b8814bdb7e27291d7e50935f18cc3c71290600090a250565b60006114708383614f8b565b61480f60038263ffffffff61447216565b604051600160a060020a038216907f3f5f1db80208f0d453083a86e16909cecc1e95e2618d5d927c93ace22b8200fc90600090a250565b60006114ad82614ff2565b600082815260208190526040902061486f908263ffffffff614ff616565b156118095760005b6000838152600160205260409020548110156148f45760008381526001602052604090208054600160a060020a0384169190839081106148b357fe5b600091825260209091200154600160a060020a031614156148ec5760008381526001602052604090206148e790829061500b565b6148f4565b600101614877565b506148fd61467d565b600160a060020a031681600160a060020a0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600a5460009060ff166149885760405160e560020a62461bcd0281526004018080602001828103825260248152602001806156136024913960400191505060405180910390fd5b60408051600080516020615383833981519152815290519081900360140190206000906149b59082612cd8565b905060006149ea620186a06149de8661215d606461215d6012548c6145c490919063ffffffff16565b9063ffffffff6145c416565b90506000614a13620186a06149de8761215d606461215d6013548d6145c490919063ffffffff16565b600160a060020a03888116600090815260196020526040812054929350911615614ad157600160a060020a0380891660009081526019602052604080822054905192169184156108fc0291859190818181858888f19350505050158015614a7e573d6000803e3d6000fd5b50604051600160a060020a0385169084156108fc029085906000818181858888f19350505050158015614ab5573d6000803e3d6000fd5b50614aca826141f1898663ffffffff61476816565b9050614b1b565b604051600160a060020a0385169084156108fc029085906000818181858888f19350505050158015614b07573d6000803e3d6000fd5b50614b18878463ffffffff61476816565b90505b600160a060020a038881166000908152601860209081526040808320815160c08101835286815242818501908152600d54938201938452606082018681526080830187815260a08401888152855460018082018855968a529790982093516006909702909301958655905192850192909255915160028401555160038301805460ff1916911515919091179055516004820155905160059091018054600160a060020a03191691909216179055601654614bd59088614620565b601655604080518881529051600160a060020a038a16917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a2506001979650505050505050565b614c3660038263ffffffff614e4316565b604051600160a060020a038216907f26b6063d78aefcf96f02ff06bc9822b5a623278253add7fffa5fb453db39981090600090a250565b614c7e60068263ffffffff61447216565b604051600160a060020a038216907e47706786c922d17b39285dc59d696bafea72c0b003d3841ae1202076f4c2e490600090a250565b60009081526002919091016020526040902054151590565b6000614cd88484614cb4565b614d3957508254600180820185556000858152602080822090930185905581860180548084018255908252838220018054600160a060020a031916600160a060020a0386161790558554858252600287019093526040902091909155611470565b506000611470565b60008183614dd05760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614d95578181015183820152602001614d7d565b50505050905090810190601f168015614dc25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614ddc57fe5b0495945050505050565b60008184841115614e3b5760405160e560020a62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315614d95578181015183820152602001614d7d565b505050900390565b614e4d8282614557565b614e8b5760405160e560020a62461bcd02815260040180806020018281038252602181526020018061544e6021913960400191505060405180910390fd5b600160a060020a03811660009081526002830160205260409020548015614f665782546000198083019190810190600090869083908110614ec857fe5b6000918252602090912001548654600160a060020a0390911691508190879085908110614ef157fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790558554869080614f2557fe5b6000828152602080822083016000199081018054600160a060020a0319169055909201909255600160a060020a038716825260028801905260408120555050505b50600160a060020a03166000908152600190910160205260409020805460ff19169055565b81546000908210614fd05760405160e560020a62461bcd0281526004018080602001828103825260228152602001806152996022913960400191505060405180910390fd5b826000018281548110614fdf57fe5b9060005260206000200154905092915050565b5490565b600061147083600160a060020a0384166150b5565b815b8154600019018110156150845781816001018154811061502957fe5b9060005260206000200160009054906101000a9004600160a060020a031682828154811061505357fe5b60009182526020909120018054600160a060020a031916600160a060020a039290921691909117905560010161500d565b508080548061508f57fe5b60008281526020902081016000199081018054600160a060020a03191690550190555050565b600081815260028301602052604081205480156151f657835460001980830191908101906000908790839081106150e857fe5b906000526020600020015490508087600001848154811061510557fe5b600091825260209091200155865487908061511c57fe5b60019003818190600052602060002001600090559055600087600101838154811061514357fe5b600091825260209091200154600189018054600160a060020a03909216925082918690811061516e57fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550876001018054806151a957fe5b6000828152602080822083016000199081018054600160a060020a031916905590920190925592815260028901909252506040808220600194850190558682528120555091506114ad9050565b60009150506114ad565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106152415782800160ff1982351617855561526e565b8280016001018555821561526e579182015b8281111561526e578235825591602001919060010190615253565b5061527a92915061527e565b5090565b61126a91905b8082111561527a576000815560010161528456fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74496e766573746d656e74506f6f6c3a207468652073656e64657220646f6573206e6f742068617665207065726d697373696f6e504f4f4c5f5245474953545259000000000000000000000000000000000000004c494d495445445f504152544e45525f524f4c450000000000000000000000004f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737347454e4552414c5f504152544e45525f524f4c45000000000000000000000000526f6c65733a2063616c6c657220646f6573206e6f7420686176652074686520706f6f6c20726567797374727920726f6c65546f6b656e73616c65506f6f6c3a2077652063616e27742073656c6c203020746f6b656e732e416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b655468652073656e64657220646f6573206e6f742068617665207065726d697373696f6e526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65546f6b656e73616c65506f6f6c3a2077652063616e27742073656c6c206d6f7265207468616e203330252066726f6d206f6e65207472616e73616374696f6e2e20506c6561736520646563726561736520696e766573746d656e7420616d6f756e742e496e766573746d656e74506f6f6c3a2074686520706f6f6c20697320616c7265616479206465616374697661746564546f6b656e73616c65506f6f6c3a206d696e696d616c20707572636861736520302e31424e422e535441525455505f5445414d5f524f4c45000000000000000000000000000000496e766573746d656e74506f6f6c3a2074686520706f6f6c20697320616c726561647920616374697661746564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f70656e42695365613a20796f75206d7573742073656e64206d696e696d616c20616d6f756e74206f72206d6f72655465616d526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205465616d20726f6c65496e766573746d656e74506f6f6c3a20706f6f6c206465706f73697420626c6f636b6564526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652072657475726e20696e7665736d656e74206c706172746e657220726f6c65a2646970667358221220174c52d2ed826333fc4d005e6a466b4cfa69f8ff022cf7c8d95ca3cb1a7566d264736f6c63430006080033416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e744f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f206164647265737353555045525f41444d494e5f524f4c45000000000000000000000000000000000000000000000000000000003db648a8173abaf27a5705c079a0bf951ff284320000000000000000000000004f476c35f1d823c24c476db1eecb97db3a6a49a1000000000000000000000000027d865ef0b4d1372affe941272f47e013cac669000000000000000000000000f52e9da33ffde0a12418e93ce6fe8b56912121640000000000000000000000004e54b369aecfe04e6ef3f6c768f7a77f39c388c8000000000000000000000000cd74bd3d38c0a91cee6e3337b00aca9eda08afe80000000000000000000000001d93805d2108cc70969b762d2df4f1cbe2deadd800000000000000000000000078fd6789af23762fc706fec9c86af10cfe3f996c0000000000000000000000000000000000000000000001b1ae4d6e2ef5000000000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a

Deployed ByteCode

0x6080604052600436106103b55760003560e060020a900480639010d07c116101eb578063d5c5e43411610111578063e89ec45f116100a4578063f66fdcca11610073578063f66fdcca14610ff9578063fd66c06714611094578063fe070e9d146110e9578063fedf51e9146110fe576103bc565b8063e89ec45f14610f35578063f14d218114610f6e578063f2fde38b14610f83578063f45efe6714610fb6576103bc565b8063d9a431b3116100e0578063d9a431b314610e69578063dae06b7214610e7e578063dca80c1914610ec1578063df5dd1a514610f02576103bc565b8063d5c5e43414610d54578063d69df4c714610db0578063d6d6878414610def578063d93f48b014610e22576103bc565b8063b463a75c11610189578063cb4ff7f211610158578063cb4ff7f214610c02578063cbc5906e14610c47578063d2f0d2a814610c5c578063d547741f14610d1b576103bc565b8063b463a75c14610b07578063bd8afbf814610b3a578063c1abd75714610bc3578063ca15c87314610bd8576103bc565b80639cf6cc70116101c55780639cf6cc701461099c5780639f2ac7f8146109c6578063a97e5c9314610a27578063b06fd88f14610a5a576103bc565b80639010d07c1461090957806391d148541461093957806394707a9514610972576103bc565b8063594ce4c7116102db5780637a99bb0a1161026e57806387ac828a1161023d57806387ac828a1461087957806389e52771146108ac5780638c533ba7146108c15780638da5cb5b146108f4576103bc565b80637a99bb0a146107c35780637d9f6db5146107ed5780637fdbc08b14610802578063878d9b7a14610845576103bc565b80636d8664e0116102aa5780636d8664e01461073d5780637330aba214610752578063770108a7146107675780637837efdc146107ae576103bc565b8063594ce4c7146106975780635ac8b005146106da5780636176dd9f146106ef5780636419bcdb14610704576103bc565b80632dc20f621161035357806338013f021161032257806338013f02146106095780633b0f0f2f1461061e5780634460bdd61461066d5780634bb278f314610682576103bc565b80632dc20f621461058b5780632f2ff15d146105b35780633049ea33146105ec5780633290ce2914610601576103bc565b8063248519141161038f57806324851914146104a4578063248a9ca3146104d7578063261fef02146105015780632726b50614610516576103bc565b8063052c09fd146103c157806316fb3c15146104265780631cda4a8d1461047d576103bc565b366103bc57005b600080fd5b3480156103cd57600080fd5b506103d661114b565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104125781810151838201526020016103fa565b505050509050019250505060405180910390f35b34801561043257600080fd5b506104696004803603606081101561044957600080fd5b50600160a060020a0381358116916020810135909116906040013561126d565b604080519115158252519081900360200190f35b34801561048957600080fd5b50610492611477565b60408051918252519081900360200190f35b3480156104b057600080fd5b50610469600480360360208110156104c757600080fd5b5035600160a060020a031661149a565b3480156104e357600080fd5b50610492600480360360208110156104fa57600080fd5b50356114b3565b34801561050d57600080fd5b506104926114c8565b34801561052257600080fd5b5061054f6004803603604081101561053957600080fd5b50600160a060020a0381351690602001356114fd565b6040805196875260208701959095528585019390935290151560608501526080840152600160a060020a031660a0830152519081900360c00190f35b6105b1600480360360208110156105a157600080fd5b5035600160a060020a03166116a3565b005b3480156105bf57600080fd5b506105b1600480360360408110156105d657600080fd5b5080359060200135600160a060020a031661179e565b3480156105f857600080fd5b5061046961180d565b6104926118d1565b34801561061557600080fd5b50610492611a5c565b34801561062a57600080fd5b506106516004803603602081101561064157600080fd5b5035600160a060020a0316611a91565b60408051600160a060020a039092168252519081900360200190f35b34801561067957600080fd5b50610492611aaf565b34801561068e57600080fd5b506105b1611ae4565b3480156106a357600080fd5b50610469600480360360608110156106ba57600080fd5b50600160a060020a03813581169160208101359091169060400135611c24565b3480156106e657600080fd5b50610492611d69565b3480156106fb57600080fd5b50610469611d9e565b34801561071057600080fd5b506104696004803603604081101561072757600080fd5b5080359060200135600160a060020a0316611e5d565b34801561074957600080fd5b50610492611f52565b34801561075e57600080fd5b506103d6611f58565b34801561077357600080fd5b506105b16004803603608081101561078a57600080fd5b50600160a060020a0381351690602081013590604081013590606001351515611fbd565b3480156107ba57600080fd5b506105b1612515565b3480156107cf57600080fd5b50610492600480360360208110156107e657600080fd5b5035612520565b3480156107f957600080fd5b506106516125c3565b34801561080e57600080fd5b506104696004803603606081101561082557600080fd5b50600160a060020a038135811691602081013590911690604001356125d7565b6105b16004803603606081101561085b57600080fd5b50600160a060020a03813516906020810135906040013515156127b3565b34801561088557600080fd5b506104926004803603602081101561089c57600080fd5b5035600160a060020a0316612abd565b3480156108b857600080fd5b506103d6612ad8565b3480156108cd57600080fd5b506105b1600480360360208110156108e457600080fd5b5035600160a060020a0316612b3b565b34801561090057600080fd5b50610651612cc9565b34801561091557600080fd5b506106516004803603604081101561092c57600080fd5b5080359060200135612cd8565b34801561094557600080fd5b506104696004803603604081101561095c57600080fd5b5080359060200135600160a060020a0316612cf6565b34801561097e57600080fd5b506104696004803603602081101561099557600080fd5b5035612d14565b3480156109a857600080fd5b506103d6600480360360208110156109bf57600080fd5b5035612d88565b3480156109d257600080fd5b506109ff600480360360408110156109e957600080fd5b50600160a060020a038135169060200135612df4565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b348015610a3357600080fd5b5061046960048036036020811015610a4a57600080fd5b5035600160a060020a0316612ebd565b348015610a6657600080fd5b506104696004803603610100811015610a7e57600080fd5b810190602081018135640100000000811115610a9957600080fd5b820183602082011115610aab57600080fd5b80359060200191846001830284011164010000000083111715610acd57600080fd5b91935091508035151590600160a060020a036020820135169060408101359060608101359060808101359060a08101359060c00135612ed0565b348015610b1357600080fd5b506105b160048036036020811015610b2a57600080fd5b5035600160a060020a0316612f79565b348015610b4657600080fd5b5061046960048036036060811015610b5d57600080fd5b813591602081013591810190606081016040820135640100000000811115610b8457600080fd5b820183602082011115610b9657600080fd5b80359060200191846001830284011164010000000083111715610bb857600080fd5b509092509050612fcc565b348015610bcf57600080fd5b50610492613059565b348015610be457600080fd5b5061049260048036036020811015610bfb57600080fd5b503561307c565b348015610c0e57600080fd5b5061046960048036036060811015610c2557600080fd5b50600160a060020a038135811691602081013582169160409091013516613093565b348015610c5357600080fd5b50610492613283565b348015610c6857600080fd5b50610c716132a6565b60405180806020018615151515815260200185600160a060020a0316600160a060020a03168152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b83811015610cdc578181015183820152602001610cc4565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b348015610d2757600080fd5b506105b160048036036040811015610d3e57600080fd5b5080359060200135600160a060020a0316613373565b348015610d6057600080fd5b50610d8760048036036020811015610d7757600080fd5b5035600160a060020a03166133d9565b6040805193151584526020840192909252600160a060020a031682820152519081900360600190f35b348015610dbc57600080fd5b5061046960048036036060811015610dd357600080fd5b50600160a060020a0381351690602081013590604001356136be565b348015610dfb57600080fd5b506105b160048036036020811015610e1257600080fd5b5035600160a060020a03166137a4565b348015610e2e57600080fd5b5061046960048036036080811015610e4557600080fd5b50600160a060020a0381358116916020810135916040820135916060013516613820565b348015610e7557600080fd5b506105b16139a5565b348015610e8a57600080fd5b50610ea860048036036020811015610ea157600080fd5b50356139f5565b6040805192835260208301919091528051918290030190f35b348015610ecd57600080fd5b506105b160048036036060811015610ee457600080fd5b50600160a060020a0381351690602081013590604001351515613a6e565b348015610f0e57600080fd5b506105b160048036036020811015610f2557600080fd5b5035600160a060020a0316613b04565b348015610f4157600080fd5b5061046960048036036040811015610f5857600080fd5b50600160a060020a038135169060200135613b54565b348015610f7a57600080fd5b50610469613d08565b348015610f8f57600080fd5b506105b160048036036020811015610fa657600080fd5b5035600160a060020a0316613f9b565b348015610fc257600080fd5b5061046960048036036060811015610fd957600080fd5b50600160a060020a038135811691602081013591604090910135166140ac565b34801561100557600080fd5b5061100e6142d1565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561105757818101518382015260200161103f565b50505050905090810190601f1680156110845780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156110a057600080fd5b506105b1600480360360c08110156110b757600080fd5b50600160a060020a0381351690602081013590604081013590606081013590608081013515159060a001351515614385565b3480156110f557600080fd5b50610492614431565b34801561110a57600080fd5b50611113614454565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6060600a60019054906101000a9004600160a060020a0316600160a060020a031663052c09fd6040518163ffffffff1660e060020a02815260040160006040518083038186803b15801561119e57600080fd5b505afa1580156111b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156111db57600080fd5b81019080805160405193929190846401000000008211156111fb57600080fd5b90830190602082018581111561121057600080fd5b825186602082028301116401000000008211171561122d57600080fd5b82525081516020918201928201910280838360005b8381101561125a578181015183820152602001611242565b5050505090500160405250505090505b90565b6040805160008051602061531d8339815191528152905190819003600d01902060009061129a9033612cf6565b6112d85760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b60408051600080516020615528833981519152815290519081900360110190206113029085612cf6565b6113405760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b601a54604080517fe33d8221000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0386811660248301528781166044830152606482018690529151919092169163e33d82219160848083019260209291908290030181600087803b1580156113bd57600080fd5b505af11580156113d1573d6000803e3d6000fd5b505050506040513d60208110156113e757600080fd5b50506040805160e060020a63a9059cbb028152600160a060020a0386811660048301526024820185905291519185169163a9059cbb916044808201926020929091908290030181600087803b15801561143f57600080fd5b505af1158015611453573d6000803e3d6000fd5b505050506040513d602081101561146957600080fd5b5060019150505b9392505050565b6040805160008051602061531d8339815191528152905190819003600d01902081565b60006114ad60038363ffffffff61455716565b92915050565b60009081526020819052604090206003015490565b604080517f52455455524e5f494e564553544d454e545f4c504152544e45520000000000008152905190819003601a01902081565b6000806000806000806018600089600160a060020a0316600160a060020a03168152602001908152602001600020878154811061153657fe5b60009182526020808320600690920290910154600160a060020a038b1683526018909152604090912080548990811061156b57fe5b906000526020600020906006020160010154601860008b600160a060020a0316600160a060020a0316815260200190815260200160002089815481106115ad57fe5b906000526020600020906006020160020154601860008c600160a060020a0316600160a060020a031681526020019081526020016000208a815481106115ef57fe5b6000918252602080832060036006909302019190910154600160a060020a038e16835260189091526040909120805460ff909216918c90811061162e57fe5b906000526020600020906006020160040154601860008e600160a060020a0316600160a060020a031681526020019081526020016000208c8154811061167057fe5b6000918252602090912060069091020160050154949d939c50919a5098509650600160a060020a03909116945092505050565b601454601e546116b89163ffffffff6145c416565b3410156116f95760405160e560020a62461bcd02815260040180806020018281038252602f8152602001806155b8602f913960400191505060405180910390fd5b600a54604080517f4f63d3ce000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152346024830152915161010090930490911691634f63d3ce9160448082019260009290919082900301818387803b15801561176c57600080fd5b505af1158015611780573d6000803e3d6000fd5b5050601654611798925090503463ffffffff61462016565b60165550565b6000828152602081905260409020600301546117c1906117bc61467d565b612cf6565b6117ff5760405160e560020a62461bcd02815260040180806020018281038252602f8152602001806152bb602f913960400191505060405180910390fd5b6118098282614681565b5050565b6040805160008051602061531d8339815191528152905190819003600d01902060009061183a9033612cf6565b6118785760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b600a5460ff16156118bd5760405160e560020a62461bcd02815260040180806020018281038252602d815260200180615548602d913960400191505060405180910390fd5b50600a805460ff1916600190811790915590565b600067016345785d8a0000341161191c5760405160e560020a62461bcd0281526004018080602001828103825260278152602001806155016027913960400191505060405180910390fd5b600080611928346139f5565b90925090508161196c5760405160e560020a62461bcd0281526004018080602001828103825260268152602001806153d56026913960400191505060405180910390fd5b61197d81600363ffffffff61472616565b82106119bd5760405160e560020a62461bcd02815260040180806020018281038252606381526020018061546f6063913960800191505060405180910390fd5b601c546040805160e060020a63a9059cbb028152336004820152602481018590529051600160a060020a039092169163a9059cbb916044808201926020929091908290030181600087803b158015611a1457600080fd5b505af1158015611a28573d6000803e3d6000fd5b505050506040513d6020811015611a3e57600080fd5b5050601f54611a53908363ffffffff61462016565b601f5550905090565b604080517f4f5241434c4500000000000000000000000000000000000000000000000000008152905190819003600601902081565b600160a060020a039081166000908152601960205260409020541690565b604080517f53555045525f41444d494e5f524f4c45000000000000000000000000000000008152905190819003601001902081565b611aec61467d565b600254600160a060020a03908116911614611b51576040805160e560020a62461bcd02815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60025474010000000000000000000000000000000000000000900460ff1615611bc4576040805160e560020a62461bcd02815260206004820152601e60248201527f4d616e61676572526f6c653a20616c72656164792066696e616c697a65640000604482015290519081900360640190fd5b6002805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768190600090a1565b6040805160008051602061531d8339815191528152905190819003600d019020600090611c519033612cf6565b611c8f5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061552883398151915281529051908190036011019020611cb99085612cf6565b611cf75760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152306024830152604482018590529151918516916323b872dd916064808201926020929091908290030181600087803b15801561143f57600080fd5b604080517f524546455245525f524f4c4500000000000000000000000000000000000000008152905190819003600c01902081565b6040805160008051602061531d8339815191528152905190819003600d019020600090611dcb9033612cf6565b611e095760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b600a5460ff16611e4d5760405160e560020a62461bcd02815260040180806020018281038252602f8152602001806154d2602f913960400191505060405180910390fd5b50600a805460ff19169055600190565b6000611e6761467d565b600254600160a060020a03908116911614611ecc576040805160e560020a62461bcd02815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60025474010000000000000000000000000000000000000000900460ff1615611f3f576040805160e560020a62461bcd02815260206004820152601e60248201527f4d616e61676572526f6c653a20616c72656164792066696e616c697a65640000604482015290519081900360640190fd5b611f4983836117ff565b50600192915050565b601e5490565b60606006600001805480602002602001604051908101604052809291908181526020018280548015611fb357602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611f95575b5050505050905090565b600b54604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018590529051600160a060020a03909216916323b872dd916064808201926020929091908290030181600087803b15801561203057600080fd5b505af1158015612044573d6000803e3d6000fd5b505050506040513d602081101561205a57600080fd5b5050600a54604080517f15b60639000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152602482018790526044820186905284151560648301523360848301529151600093849384938493610100909304909116916315b606399160a48082019260809290919082900301818787803b1580156120ee57600080fd5b505af1158015612102573d6000803e3d6000fd5b505050506040513d608081101561211857600080fd5b5080516020820151604083015160609093015191965094509092509050831561247357801561246e576000612169606461215d6012548a6145c490919063ffffffff16565b9063ffffffff61472616565b90506000612187606461215d6013548b6145c490919063ffffffff16565b9050600061219b898463ffffffff61476816565b33600090815260196020526040902054909150600160a060020a031615612325576121cc818363ffffffff61476816565b600b5433600090815260196020908152604080832054815160e060020a63a9059cbb028152600160a060020a0391821660048201526024810189905291519596509093169363a9059cbb93604480820194918390030190829087803b15801561223457600080fd5b505af1158015612248573d6000803e3d6000fd5b505050506040513d602081101561225e57600080fd5b5050600b546040805160008051602061538383398151915281529051908190036014019020600160a060020a039091169063a9059cbb906122a0906000612cd8565b856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156122f357600080fd5b505af1158015612307573d6000803e3d6000fd5b505050506040513d602081101561231d57600080fd5b506123e59050565b600b546040805160008051602061538383398151915281529051908190036014019020600160a060020a039091169063a9059cbb90612365906000612cd8565b856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156123b857600080fd5b505af11580156123cc573d6000803e3d6000fd5b505050506040513d60208110156123e257600080fd5b50505b600b546040805160e060020a63a9059cbb028152600160a060020a038881166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561243e57600080fd5b505af1158015612452573d6000803e3d6000fd5b505050506040513d602081101561246857600080fd5b50505050505b61250b565b6000831180156124805750805b1561250b57600b546040805160e060020a63a9059cbb028152600160a060020a038581166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156124de57600080fd5b505af11580156124f2573d6000803e3d6000fd5b505050506040513d602081101561250857600080fd5b50505b5050505050505050565b61251e336147aa565b565b600080600c60009054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561257457600080fd5b505afa158015612588573d6000803e3d6000fd5b505050506040513d602081101561259e57600080fd5b5051600e549091506114709060ff8316600a0a9061215d90869063ffffffff6145c416565b600a546101009004600160a060020a031690565b6040805160008051602061531d8339815191528152905190819003600d0190206000906126049033612cf6565b6126425760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b604080517f53555045525f41444d494e5f524f4c45000000000000000000000000000000008152905190819003601001902061267e9085612cf6565b6126bc5760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b81156127a957600160a060020a03831661271057604051600160a060020a0385169083156108fc029084906000818181858888f19350505050158015612706573d6000803e3d6000fd5b5060019050611470565b82600160a060020a031663a9059cbb85846040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561277357600080fd5b505af1158015612787573d6000803e3d6000fd5b505050506040513d602081101561279d57600080fd5b50600191506114709050565b5060009392505050565b600a54604080517f15b60639000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820186905234604483015284151560648301523360848301529151600093849384938493610100909304909116916315b606399160a48082019260809290919082900301818787803b15801561284457600080fd5b505af1158015612858573d6000803e3d6000fd5b505050506040513d608081101561286e57600080fd5b50805160208201516040830151606090930151919650945090925090508315612a6b5780612a665760006128b2606461215d601254346145c490919063ffffffff16565b905060006128d0606461215d601354346145c490919063ffffffff16565b905060006128e4348463ffffffff61476816565b33600090815260196020526040902054909150600160a060020a0316156129c657612915818363ffffffff61476816565b33600090815260196020526040808220549051929350600160a060020a03169184156108fc0291859190818181858888f1935050505015801561295c573d6000803e3d6000fd5b506040805160008051602061538383398151915281529051908190036014019020612988906000612cd8565b600160a060020a03166108fc849081150290604051600060405180830381858888f193505050501580156129c0573d6000803e3d6000fd5b50612a2b565b60408051600080516020615383833981519152815290519081900360140190206129f1906000612cd8565b600160a060020a03166108fc849081150290604051600060405180830381858888f19350505050158015612a29573d6000803e3d6000fd5b505b604051600160a060020a0386169082156108fc029083906000818181858888f19350505050158015612a61573d6000803e3d6000fd5b505050505b612ab4565b600083118015612a79575080155b15612ab457604051600160a060020a0383169084156108fc029085906000818181858888f1935050505015801561250b573d6000803e3d6000fd5b50505050505050565b600160a060020a031660009081526018602052604090205490565b60606003600001805480602002602001604051908101604052809291908181526020018280548015611fb357602002820191906000526020600020908154600160a060020a03168152600190910190602001808311611f95575050505050905090565b601454600090612b5a90670de0b6b3a76400009063ffffffff6145c416565b601c54604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490529051929350600160a060020a03909116916323b872dd916064808201926020929091908290030181600087803b158015612bd057600080fd5b505af1158015612be4573d6000803e3d6000fd5b505050506040513d6020811015612bfa57600080fd5b5050601e54612c3090612c2190670de0b6b3a76400009061215d908563ffffffff6145c416565b6016549063ffffffff61462016565b601655600a54601e54610100909104600160a060020a031690634f63d3ce908490612c5b90856145c4565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015612cad57600080fd5b505af1158015612cc1573d6000803e3d6000fd5b505050505050565b600254600160a060020a031690565b6000828152602081905260408120611470908363ffffffff6147f216565b6000828152602081905260408120611470908363ffffffff61452c16565b6040805160008051602061531d8339815191528152905190819003600d019020600090612d419033612cf6565b612d7f5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b50600e55600190565b600081815260016020908152604091829020805483518184028101840190945280845260609392830182828015612de857602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311612dca575b50505050509050919050565b600080600080600a60019054906101000a9004600160a060020a0316600160a060020a0316639f2ac7f887876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a031681526020018281526020019250505060806040518083038186803b158015612e7057600080fd5b505afa158015612e84573d6000803e3d6000fd5b505050506040513d6080811015612e9a57600080fd5b508051602082015160408301516060909301519199909850919650945092505050565b60006114ad60068363ffffffff61455716565b6040805160008051602061531d8339815191528152905190819003600d019020600090612efd9033612cf6565b612f3b5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b612f4760098b8b615200565b5050600a805460ff191697151597909717909655600d9390935560129190915560135560145550601555506001919050565b612f823361149a565b612fc05760405160e560020a62461bcd02815260040180806020018281038252602c8152602001806155e7602c913960400191505060405180910390fd5b612fc9816147fe565b50565b6040805160008051602061531d8339815191528152905190819003600d019020600090612ff99033612cf6565b6130375760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b600f859055601084905561304d60118484615200565b50600195945050505050565b604080516000805160206153838339815191528152905190819003601401902081565b60008181526020819052604081206114ad90614846565b6040805160008051602061531d8339815191528152905190819003600d0190206000906130c09033612cf6565b6130fe5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061538383398151915281529051908190036014019020849061312a9082612cf6565b8061316c5750604080517f53555045525f41444d494e5f524f4c45000000000000000000000000000000008152905190819003601001902061316c9082612cf6565b806132055750601b54604080517f24851914000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916324851914916024808301926020929190829003018186803b1580156131d857600080fd5b505afa1580156131ec573d6000803e3d6000fd5b505050506040513d602081101561320257600080fd5b50515b1561324157600160a060020a0384811660009081526019602052604090208054600160a060020a0319169185169190911790556001915061327b565b60405160e560020a62461bcd02815260040180806020018281038252602381526020018061542b6023913960400191505060405180910390fd5b509392505050565b604080516000805160206155288339815191528152905190819003601101902081565b600a54601c54600d54601d546009805460408051602060026101006001861615026000190190941693909304601f81018490048402820184019092528181526060976000978897889788979660ff90941695600160a060020a039093169491939092879183018282801561335b5780601f106133305761010080835404028352916020019161335b565b820191906000526020600020905b81548152906001019060200180831161333e57829003601f168201915b50505050509450945094509450945094509091929394565b600082815260208190526040902060030154613391906117bc61467d565b6133cf5760405160e560020a62461bcd0281526004018080602001828103825260308152602001806153fb6030913960400191505060405180910390fd5b6118098282614851565b600080600061340b604051808060008051602061531d833981519152815250600d019050604051809103902033612cf6565b6134495760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061533d833981519152815290519081900360140190206134739085612cf6565b6134b15760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b600080806134be87612abd565b90506000805b828110156136af57600160a060020a03891660009081526018602052604081208054839081106134f057fe5b60009182526020909120600690910201600381015490915060ff16156136a65760058101546004820154600160a060020a0390911695501561362557600160a060020a038516613591576004810154604051600160a060020a038c169180156108fc02916000818181858888f19350505050158015613573573d6000803e3d6000fd5b50600481015461358a90879063ffffffff61462016565b9550613625565b84600160a060020a031663a9059cbb8b83600401546040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156135f857600080fd5b505af115801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b50505b600160a060020a038a16600090815260186020526040812080548490811061364957fe5b60009182526020808320600692909202909101600301805460ff191693151593909317909255600160a060020a038c16815260189091526040812080548490811061369057fe5b9060005260206000209060060201600401819055505b506001016134c4565b50979296509094509092505050565b6040805160008051602061531d8339815191528152905190819003600d0190206000906136eb9033612cf6565b6137295760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061533d833981519152815290519081900360140190206137539085612cf6565b6137915760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b61379c848484614941565b949350505050565b6137ad3361149a565b6137eb5760405160e560020a62461bcd02815260040180806020018281038252602c8152602001806155e7602c913960400191505060405180910390fd5b600a8054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b604080517f52455455524e5f494e564553544d454e545f4c504152544e45520000000000008152905190819003601a01902060009061385f9033612cf6565b61389d5760405160e560020a62461bcd02815260040180806020018281038252603e815260200180615637603e913960400191505060405180910390fd5b600160a060020a0385166000908152601860205260409020805460019190869081106138c557fe5b906000526020600020906006020160030160006101000a81548160ff021916908315150217905550826018600087600160a060020a0316600160a060020a03168152602001908152602001600020858154811061391e57fe5b906000526020600020906006020160040181905550816018600087600160a060020a0316600160a060020a03168152602001908152602001600020858154811061396457fe5b906000526020600020906006020160050160006101000a815481600160a060020a030219169083600160a060020a0316021790555060019050949350505050565b6139ae3361149a565b6139ec5760405160e560020a62461bcd02815260040180806020018281038252602c8152602001806155e7602c913960400191505060405180910390fd5b61251e33614c25565b6000806000613a11601f54601d5461476890919063ffffffff16565b90506000613a308261215d601d54601e546145c490919063ffffffff16565b9050613a4e8161215d87670de0b6b3a764000063ffffffff6145c416565b601f54601d54613a639163ffffffff61476816565b935093505050915091565b600a54604080517f9b58a9a8000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018690523360448301528415156064830152915161010090930490911691639b58a9a89160848082019260009290919082900301818387803b158015613af057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b613b0d3361149a565b613b4b5760405160e560020a62461bcd02815260040180806020018281038252602c8152602001806155e7602c913960400191505060405180910390fd5b612fc981614c6d565b6040805160008051602061531d8339815191528152905190819003600d019020600090613b819033612cf6565b613bbf5760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061552883398151915281529051908190036011019020613be99084612cf6565b613c275760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b601a54604080517f1208333a000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0386811660248301526044820186905291519190921691631208333a9160648083019260209291908290030181600087803b158015613c9c57600080fd5b505af1158015613cb0573d6000803e3d6000fd5b505050506040513d6020811015613cc657600080fd5b5050604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015613cfe573d6000803e3d6000fd5b5060019392505050565b6000806000601b60009054906101000a9004600160a060020a0316600160a060020a031663e3bbb5656040518163ffffffff1660e060020a02815260040160206040518083038186803b158015613d5e57600080fd5b505afa158015613d72573d6000803e3d6000fd5b505050506040513d6020811015613d8857600080fd5b5051604080517f8e15f4730000000000000000000000000000000000000000000000000000000081528151600160a060020a0390931692638e15f47392600480840193919291829003018186803b158015613de257600080fd5b505afa158015613df6573d6000803e3d6000fd5b505050506040513d6040811015613e0c57600080fd5b50805160209091015190925090506000613e3b33613e368560ff8616600a0a63ffffffff61472616565b612df4565b5091925060009150508115613f5357601c546040805160e060020a63a9059cbb028152336004820152602481018590529051600160a060020a039092169163a9059cbb916044808201926020929091908290030181600087803b158015613ea157600080fd5b505af1158015613eb5573d6000803e3d6000fd5b505050506040513d6020811015613ecb57600080fd5b5050600a54604080517fbb7598060000000000000000000000000000000000000000000000000000000081523360048201529051610100909204600160a060020a03169163bb7598069160248082019260009290919082900301818387803b158015613f3657600080fd5b505af1158015613f4a573d6000803e3d6000fd5b50505050600190505b604080518381523360208201528215158183015290517f9d6ad47cb919b7aa19b4e438ceeaa7b16afb7e9a6afe89335044b64c3cb4adca9181900360600190a1935050505090565b613fa361467d565b600254600160a060020a03908116911614614008576040805160e560020a62461bcd02815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600160a060020a0381166140505760405160e560020a62461bcd02815260040180806020018281038252602681526020018061535d6026913960400191505060405180910390fd5b600254604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360028054600160a060020a031916600160a060020a0392909216919091179055565b6040805160008051602061531d8339815191528152905190819003600d0190206000906140d99033612cf6565b6141175760405160e560020a62461bcd0281526004018080602001828103825260328152602001806153a36032913960400191505060405180910390fd5b6040805160008051602061533d833981519152815290519081900360140190206141419085612cf6565b61417f5760405160e560020a62461bcd0281526004018080602001828103825260338152602001806152ea6033913960400191505060405180910390fd5b600061419b606461215d601254876145c490919063ffffffff16565b905060006141b9606461215d601354886145c490919063ffffffff16565b600160a060020a03878116600090815260196020526040812054929350911615614204576141fd826141f1888663ffffffff61476816565b9063ffffffff61476816565b9050614217565b614214868463ffffffff61476816565b90505b600160a060020a039687166000908152601860209081526040808320815160c08101835294855242858401908152600d5492860192835260608601858152608087018681529a8d1660a088019081528354600180820186559488529590962096516006909502909601938455518382015590516002830155925160038201805460ff1916911515919091179055955160048701555160059095018054600160a060020a031916959097169490941790955550909392505050565b6000806060600f546010546011808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143735780601f1061434857610100808354040283529160200191614373565b820191906000526020600020905b81548152906001019060200180831161435657829003601f168201915b50505050509050925092509250909192565b600a54604080517f854fe7ac000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015260248201899052604482018890526064820187905285151560848301523360a483015284151560c483015291516101009093049091169163854fe7ac9160e48082019260009290919082900301818387803b15801561441d57600080fd5b505af1158015612508573d6000803e3d6000fd5b6040805160008051602061533d8339815191528152905190819003601401902081565b600e5460125460135460145460155460165460175490919293949596565b61447c8282614557565b156144d1576040805160e560020a62461bcd02815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b600160a060020a03166000818152600183810160209081526040808420805460ff191684179055855492830186558584528184209092018054600160a060020a03191685179055845493835260029094019093529190912055565b600061147083600160a060020a038416614cb4565b600061147083600160a060020a03841684614ccc565b6000600160a060020a0382166145a15760405160e560020a62461bcd0281526004018080602001828103825260228152602001806155966022913960400191505060405180910390fd5b50600160a060020a03166000908152600191909101602052604090205460ff1690565b6000826145d3575060006114ad565b828202828482816145e057fe5b04146114705760405160e560020a62461bcd0281526004018080602001828103825260218152602001806155756021913960400191505060405180910390fd5b600082820183811015611470576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b600082815260208190526040902061469f908263ffffffff61454116565b156118095760008281526001602081815260408320805492830181558352909120018054600160a060020a031916600160a060020a0383161790556146e261467d565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061147083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614d41565b600061147083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614de6565b6147bb60068263ffffffff614e4316565b604051600160a060020a038216907f9c8e7d83025bef8a04c664b2f753f64b8814bdb7e27291d7e50935f18cc3c71290600090a250565b60006114708383614f8b565b61480f60038263ffffffff61447216565b604051600160a060020a038216907f3f5f1db80208f0d453083a86e16909cecc1e95e2618d5d927c93ace22b8200fc90600090a250565b60006114ad82614ff2565b600082815260208190526040902061486f908263ffffffff614ff616565b156118095760005b6000838152600160205260409020548110156148f45760008381526001602052604090208054600160a060020a0384169190839081106148b357fe5b600091825260209091200154600160a060020a031614156148ec5760008381526001602052604090206148e790829061500b565b6148f4565b600101614877565b506148fd61467d565b600160a060020a031681600160a060020a0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600a5460009060ff166149885760405160e560020a62461bcd0281526004018080602001828103825260248152602001806156136024913960400191505060405180910390fd5b60408051600080516020615383833981519152815290519081900360140190206000906149b59082612cd8565b905060006149ea620186a06149de8661215d606461215d6012548c6145c490919063ffffffff16565b9063ffffffff6145c416565b90506000614a13620186a06149de8761215d606461215d6013548d6145c490919063ffffffff16565b600160a060020a03888116600090815260196020526040812054929350911615614ad157600160a060020a0380891660009081526019602052604080822054905192169184156108fc0291859190818181858888f19350505050158015614a7e573d6000803e3d6000fd5b50604051600160a060020a0385169084156108fc029085906000818181858888f19350505050158015614ab5573d6000803e3d6000fd5b50614aca826141f1898663ffffffff61476816565b9050614b1b565b604051600160a060020a0385169084156108fc029085906000818181858888f19350505050158015614b07573d6000803e3d6000fd5b50614b18878463ffffffff61476816565b90505b600160a060020a038881166000908152601860209081526040808320815160c08101835286815242818501908152600d54938201938452606082018681526080830187815260a08401888152855460018082018855968a529790982093516006909702909301958655905192850192909255915160028401555160038301805460ff1916911515919091179055516004820155905160059091018054600160a060020a03191691909216179055601654614bd59088614620565b601655604080518881529051600160a060020a038a16917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a2506001979650505050505050565b614c3660038263ffffffff614e4316565b604051600160a060020a038216907f26b6063d78aefcf96f02ff06bc9822b5a623278253add7fffa5fb453db39981090600090a250565b614c7e60068263ffffffff61447216565b604051600160a060020a038216907e47706786c922d17b39285dc59d696bafea72c0b003d3841ae1202076f4c2e490600090a250565b60009081526002919091016020526040902054151590565b6000614cd88484614cb4565b614d3957508254600180820185556000858152602080822090930185905581860180548084018255908252838220018054600160a060020a031916600160a060020a0386161790558554858252600287019093526040902091909155611470565b506000611470565b60008183614dd05760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614d95578181015183820152602001614d7d565b50505050905090810190601f168015614dc25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614ddc57fe5b0495945050505050565b60008184841115614e3b5760405160e560020a62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315614d95578181015183820152602001614d7d565b505050900390565b614e4d8282614557565b614e8b5760405160e560020a62461bcd02815260040180806020018281038252602181526020018061544e6021913960400191505060405180910390fd5b600160a060020a03811660009081526002830160205260409020548015614f665782546000198083019190810190600090869083908110614ec857fe5b6000918252602090912001548654600160a060020a0390911691508190879085908110614ef157fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790558554869080614f2557fe5b6000828152602080822083016000199081018054600160a060020a0319169055909201909255600160a060020a038716825260028801905260408120555050505b50600160a060020a03166000908152600190910160205260409020805460ff19169055565b81546000908210614fd05760405160e560020a62461bcd0281526004018080602001828103825260228152602001806152996022913960400191505060405180910390fd5b826000018281548110614fdf57fe5b9060005260206000200154905092915050565b5490565b600061147083600160a060020a0384166150b5565b815b8154600019018110156150845781816001018154811061502957fe5b9060005260206000200160009054906101000a9004600160a060020a031682828154811061505357fe5b60009182526020909120018054600160a060020a031916600160a060020a039290921691909117905560010161500d565b508080548061508f57fe5b60008281526020902081016000199081018054600160a060020a03191690550190555050565b600081815260028301602052604081205480156151f657835460001980830191908101906000908790839081106150e857fe5b906000526020600020015490508087600001848154811061510557fe5b600091825260209091200155865487908061511c57fe5b60019003818190600052602060002001600090559055600087600101838154811061514357fe5b600091825260209091200154600189018054600160a060020a03909216925082918690811061516e57fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550876001018054806151a957fe5b6000828152602080822083016000199081018054600160a060020a031916905590920190925592815260028901909252506040808220600194850190558682528120555091506114ad9050565b60009150506114ad565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106152415782800160ff1982351617855561526e565b8280016001018555821561526e579182015b8281111561526e578235825591602001919060010190615253565b5061527a92915061527e565b5090565b61126a91905b8082111561527a576000815560010161528456fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74496e766573746d656e74506f6f6c3a207468652073656e64657220646f6573206e6f742068617665207065726d697373696f6e504f4f4c5f5245474953545259000000000000000000000000000000000000004c494d495445445f504152544e45525f524f4c450000000000000000000000004f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737347454e4552414c5f504152544e45525f524f4c45000000000000000000000000526f6c65733a2063616c6c657220646f6573206e6f7420686176652074686520706f6f6c20726567797374727920726f6c65546f6b656e73616c65506f6f6c3a2077652063616e27742073656c6c203020746f6b656e732e416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b655468652073656e64657220646f6573206e6f742068617665207065726d697373696f6e526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65546f6b656e73616c65506f6f6c3a2077652063616e27742073656c6c206d6f7265207468616e203330252066726f6d206f6e65207472616e73616374696f6e2e20506c6561736520646563726561736520696e766573746d656e7420616d6f756e742e496e766573746d656e74506f6f6c3a2074686520706f6f6c20697320616c7265616479206465616374697661746564546f6b656e73616c65506f6f6c3a206d696e696d616c20707572636861736520302e31424e422e535441525455505f5445414d5f524f4c45000000000000000000000000000000496e766573746d656e74506f6f6c3a2074686520706f6f6c20697320616c726561647920616374697661746564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f70656e42695365613a20796f75206d7573742073656e64206d696e696d616c20616d6f756e74206f72206d6f72655465616d526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205465616d20726f6c65496e766573746d656e74506f6f6c3a20706f6f6c206465706f73697420626c6f636b6564526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652072657475726e20696e7665736d656e74206c706172746e657220726f6c65a2646970667358221220174c52d2ed826333fc4d005e6a466b4cfa69f8ff022cf7c8d95ca3cb1a7566d264736f6c63430006080033