ETH Price: $2,576.63 (-1.32%)

Contract

0xbf0e13ab37573ABB68ff9C33Ee9FF8148b8a61E2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer And Cal...208373602024-09-26 21:04:114 days ago1727384651IN
0xbf0e13ab...48b8a61E2
0 ETH0.0015415519.95830678
Approve208339292024-09-26 9:35:475 days ago1727343347IN
0xbf0e13ab...48b8a61E2
0 ETH0.0008149717.67642922
Approve208270792024-09-25 10:38:476 days ago1727260727IN
0xbf0e13ab...48b8a61E2
0 ETH0.0012044126.12337738
Transfer And Cal...208263512024-09-25 8:12:356 days ago1727251955IN
0xbf0e13ab...48b8a61E2
0 ETH0.0014694419.0246701
Approve208263332024-09-25 8:08:596 days ago1727251739IN
0xbf0e13ab...48b8a61E2
0 ETH0.0004544518.78449059
Transfer And Cal...208263182024-09-25 8:05:596 days ago1727251559IN
0xbf0e13ab...48b8a61E2
0 ETH0.0016614421.51045135
Approve208242532024-09-25 1:10:356 days ago1727226635IN
0xbf0e13ab...48b8a61E2
0 ETH0.000774516.79879378
Approve208242482024-09-25 1:09:356 days ago1727226575IN
0xbf0e13ab...48b8a61E2
0 ETH0.0004281817.69858271
Approve208241932024-09-25 0:58:356 days ago1727225915IN
0xbf0e13ab...48b8a61E2
0 ETH0.000876519.01099401
Approve208241862024-09-25 0:57:116 days ago1727225831IN
0xbf0e13ab...48b8a61E2
0 ETH0.0004716819.49678652
Approve208241322024-09-25 0:46:236 days ago1727225183IN
0xbf0e13ab...48b8a61E2
0 ETH0.0008754918.98905009
Approve208241282024-09-25 0:45:356 days ago1727225135IN
0xbf0e13ab...48b8a61E2
0 ETH0.000431217.82361318
Transfer And Cal...208240562024-09-25 0:31:116 days ago1727224271IN
0xbf0e13ab...48b8a61E2
0 ETH0.0014073518.22081782
Approve208234492024-09-24 22:29:116 days ago1727216951IN
0xbf0e13ab...48b8a61E2
0 ETH0.0008082217.53013227
Approve208234462024-09-24 22:28:356 days ago1727216915IN
0xbf0e13ab...48b8a61E2
0 ETH0.0003922116.21212651
Approve208234022024-09-24 22:19:476 days ago1727216387IN
0xbf0e13ab...48b8a61E2
0 ETH0.0009223120.00472156
Approve208233962024-09-24 22:18:356 days ago1727216315IN
0xbf0e13ab...48b8a61E2
0 ETH0.0004633319.1516929
Approve208233742024-09-24 22:14:116 days ago1727216051IN
0xbf0e13ab...48b8a61E2
0 ETH0.000931220.19754221
Approve208233682024-09-24 22:12:596 days ago1727215979IN
0xbf0e13ab...48b8a61E2
0 ETH0.0004453218.4073166
Approve208232652024-09-24 21:52:236 days ago1727214743IN
0xbf0e13ab...48b8a61E2
0 ETH0.000881119.11075248
Approve208232612024-09-24 21:51:356 days ago1727214695IN
0xbf0e13ab...48b8a61E2
0 ETH0.0003747415.48962331
Approve208232442024-09-24 21:48:116 days ago1727214491IN
0xbf0e13ab...48b8a61E2
0 ETH0.0008599118.65125289
Approve208232392024-09-24 21:47:116 days ago1727214431IN
0xbf0e13ab...48b8a61E2
0 ETH0.0004250117.56775803
Approve208232002024-09-24 21:39:236 days ago1727213963IN
0xbf0e13ab...48b8a61E2
0 ETH0.0010740923.29670619
Approve208231392024-09-24 21:27:116 days ago1727213231IN
0xbf0e13ab...48b8a61E2
0 ETH0.0007630131.53852394
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
110993272020-10-21 11:49:041441 days ago1603280944  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DraggableShares

Compiler Version
v0.7.3+commit.9bfce1f6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 9: DraggableShares.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.7;

import "./ERC20Recoverable.sol";
import "./ERC20Draggable.sol";

/**
 * @title Draggable CompanyName AG Shares
 * @author Benjamin Rickenbacher, [email protected]
 * @author Luzius Meisser, [email protected]
 *
 * This is an ERC-20 token representing shares of CompanyName AG that are bound to
 * a shareholder agreement that can be found at the URL defined in the constant 'terms'.
 * The shareholder agreement is partially enforced through this smart contract. The agreement
 * is designed to facilitate a complete acquisition of the firm even if a minority of shareholders
 * disagree with the acquisition, to protect the interest of the minority shareholders by requiring
 * the acquirer to offer the same conditions to everyone when acquiring the company, and to
 * facilitate an update of the shareholder agreement even if a minority of the shareholders that
 * are bound to this agreement disagree. The name "draggable" stems from the convention of calling
 * the right to drag a minority along with a sale of the company "drag-along" rights. The name is
 * chosen to ensure that token holders are aware that they are bound to such an agreement.
 *
 * The percentage of token holders that must agree with an update of the terms is defined by the
 * constant UPDATE_QUORUM. The precentage of yes-votes that is needed to successfully complete an
 * acquisition is defined in the constant ACQUISITION_QUORUM. Note that the update quorum is based
 * on the total number of tokens in circulation. In contrast, the acquisition quorum is based on the
 * number of votes cast during the voting period, not taking into account those who did not bother
 * to vote.
 */

contract DraggableShares is ERC20Recoverable, ERC20Draggable {

    using SafeMath for uint256;

    string public terms;

    /**
     * Designed to be used with the Crypto Franc as currency token. See also parent constructor.
     */
    constructor(string memory _terms, address wrappedToken, uint256 quorum)
        ERC20Draggable(wrappedToken, quorum, quorum) {
        IRecoverable(wrappedToken).setRecoverable(false);
        terms = _terms; // to update the terms, migrate to a new contract. That way it is ensured that the terms can only be updated when the quorom agrees.
    }

    /* function _mint(address account, uint256 amount) virtual override(ERC20Draggable, ERC20) internal {
        super._mint(account, amount);
    } */

    function _burn(address account, uint256 amount) virtual override(ERC20Draggable, ERC20) internal {
        super._burn(account, amount);
    }

    function _transfer(address from, address to, uint256 value) override(ERC20Draggable, ERC20) internal {
        super._transfer(from, to, value);
    }

    function transfer(address to, uint256 value) override(ERC20Recoverable, ERC20) public returns (bool) {
        return super.transfer(to, value);
    }

    function getClaimDeleter() public view override returns (address) {
        return IRecoverable(address(wrapped)).getClaimDeleter();
    }

    function getCollateralRate(address collateralType) public view override returns (uint256) {
        uint256 rate = super.getCollateralRate(collateralType);
        if (rate > 0) {
            return rate;
        } else if (collateralType == address(wrapped)) {
            return unwrapConversionFactor;
        } else {
            // If the wrapped contract allows for a specific collateral, we should too.
            // If the wrapped contract is not IRecoverable, we will fail here, but would fail anyway.
            return IRecoverable(address(wrapped)).getCollateralRate(collateralType).mul(unwrapConversionFactor);
        }
    }

}

abstract contract IRecoverable {
    function setRecoverable(bool) public virtual;
    function getCollateralRate(address) public virtual view returns (uint256);
    function getClaimDeleter() public virtual view returns (address);
}

File 2 of 9: Acquisition.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.7;

import "./SafeMath.sol";
import "./IERC20.sol";

/**
 * @title Acquisition Attempt
 * @author Benjamin Rickenbacher, [email protected]
 * @author Luzius Meisser, [email protected]
 *
 */

contract Acquisition {

    using SafeMath for uint256;

    uint256 public constant VOTING_PERIOD = 60 days;    // 2months/60days
    uint256 public constant VALIDITY_PERIOD = 90 days;  // 3months/90days

    uint256 public quorum;                              // Percentage of votes needed to start drag-along process

    address private parent;                             // the parent contract
    address payable public buyer;                       // the person who made the offer
    
    address public currency;
    uint256 public price;                               // the price offered per share
    uint256 public timestamp;                           // the timestamp of the block in which the acquisition was created

    uint256 public noVotes;                             // number of tokens voting for no
    uint256 public yesVotes;                            // number of tokens voting for yes

    enum Vote { NONE, YES, NO }                         // Used internally, represents not voted yet or yes/no vote.
    mapping (address => Vote) private votes;            // Who votes what

    event VotesChanged(uint256 newYesVotes, uint256 newNoVotes);

    constructor (address payable buyer_, address currency_, uint256 price_, uint256 quorum_) {
        require(price_ > 0, "invalid price");
        parent = msg.sender;
        buyer = buyer_;
        currency = currency_;
        price = price_;
        quorum = quorum_;
        timestamp = block.timestamp;
    }

    function isWellFunded(uint256 sharesToAcquire) public view returns (bool) {
        IERC20 cur = IERC20(currency);
        uint256 buyerBalance = cur.balanceOf(buyer);
        uint256 buyerAllowance = cur.allowance(buyer, parent);
        uint256 xchfNeeded = sharesToAcquire.mul(price);
        return xchfNeeded <= buyerBalance && xchfNeeded <= buyerAllowance;
    }

    function isQuorumReached() public view returns (bool) {
        if (isVotingOpen()) {
            // is it already clear that 75% will vote yes even though the vote is not over yet?
            return yesVotes.mul(10000).div(IERC20(parent).totalSupply()) >= quorum;
        } else {
            // did 75% of all cast votes say 'yes'?
            return yesVotes.mul(10000).div(yesVotes.add(noVotes)) >= quorum;
        }
    }

    function quorumHasFailed() public view returns (bool) {
        if (isVotingOpen()) {
            // is it already clear that 25% will vote no even though the vote is not over yet?
            return (IERC20(parent).totalSupply().sub(noVotes)).mul(10000).div(IERC20(parent).totalSupply()) < quorum;
        } else {
            // did 25% of all cast votes say 'no'?
            return yesVotes.mul(10000).div(yesVotes.add(noVotes)) < quorum;
        }
    }

    function adjustVotes(address from, address to, uint256 value) public parentOnly() {
        if (isVotingOpen()) {
            Vote fromVoting = votes[from];
            Vote toVoting = votes[to];
            update(fromVoting, toVoting, value);
        }
    }

    function update(Vote previousVote, Vote newVote, uint256 votes_) internal {
        if (previousVote != newVote) {
            if (previousVote == Vote.NO) {
                noVotes = noVotes.sub(votes_);
            } else if (previousVote == Vote.YES) {
                yesVotes = yesVotes.sub(votes_);
            }
            if (newVote == Vote.NO) {
                noVotes = noVotes.add(votes_);
            } else if (newVote == Vote.YES) {
                yesVotes = yesVotes.add(votes_);
            }
            emit VotesChanged(yesVotes, noVotes);
        }
    }

    function isVotingOpen() public view returns (bool) {
        uint256 age = block.timestamp.sub(timestamp);
        return age <= VOTING_PERIOD;
    }

    function hasExpired() public view returns (bool) {
        uint256 age = block.timestamp.sub(timestamp);
        return age > VALIDITY_PERIOD;
    }

    modifier votingOpen() {
        require(isVotingOpen(), "The vote has ended.");
        _;
    }

    function voteYes(address sender, uint256 votes_) public parentOnly() votingOpen() {
        vote(Vote.YES, votes_, sender);
    }

    function voteNo(address sender, uint256 votes_) public parentOnly() votingOpen() {
        vote(Vote.NO, votes_, sender);
    }

    function vote(Vote newVote, uint256 votes_, address voter) internal {
        Vote previousVote = votes[voter];
        votes[voter] = newVote;
        update(previousVote, newVote, votes_);
    }

    function hasVotedYes(address voter) public view returns (bool) {
        return votes[voter] == Vote.YES;
    }

    function hasVotedNo(address voter) public view returns (bool) {
        return votes[voter] == Vote.NO;
    }

    function kill() public parentOnly() {
        selfdestruct(buyer);
    }

    modifier parentOnly () {
        require(msg.sender == parent, "not parent");
        _;
    }
}

File 3 of 9: ERC20.sol
/**
* SPDX-License-Identifier: MIT
*
* Copyright (c) 2016-2019 zOS Global Limited
*
* With modifications to support ERC-677
*/
pragma solidity >=0.7;

import "./IERC20.sol";
import "./SafeMath.sol";
import "./IERC677Receiver.sol";

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

abstract contract ERC20 is IERC20 {

    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    uint8 public override decimals;

    constructor(uint8 _decimals) {
        decimals = _decimals;
    }

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

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

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

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

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

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

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

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

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

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    // ERC-677 functionality, can be useful for Market Maker and also wrapping tokens
    function transferAndCall(address recipient, uint amount, bytes calldata data) public returns (bool) {
        bool success = transfer(recipient, amount);
        if (success){
            IERC677Receiver(recipient).onTokenTransfer(msg.sender, amount, data);
        }
        return success;
    }

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

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

     /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a `Transfer` event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 value) internal virtual {
        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

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

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}

File 4 of 9: ERC20Draggable.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.7;

import "./IERC20.sol";
import "./SafeMath.sol";
import "./ERC20.sol";
import "./Acquisition.sol";
import "./IMigratable.sol";
import "./IERC677Receiver.sol";

/**
 * @title CompanyName Shareholder Agreement
 * @author Benjamin Rickenbacher, [email protected]
 * @author Luzius Meisser, [email protected]
 * @dev These tokens are based on the ERC20 standard and the open-zeppelin library.
 *
 * This is an ERC-20 token representing shares of CompanyName AG that are bound to
 * a shareholder agreement that can be found at the URL defined in the constant 'terms'
 * of the 'DraggableCompanyNameShares' contract. The agreement is partially enforced
 * through the Swiss legal system, and partially enforced through this smart contract.
 * In particular, this smart contract implements a drag-along clause which allows the
 * majority of token holders to force the minority sell their shares along with them in
 * case of an acquisition. That's why the tokens are called "Draggable CompanyName AG Shares."
 */

contract ERC20Draggable is ERC20, IERC677Receiver {

    using SafeMath for uint256;

    IERC20 public wrapped;                        // The wrapped contract

    // If the wrapped tokens got replaced in an acquisition, unwrapping might yield many currency tokens
    uint256 public unwrapConversionFactor = 1;

    // The current acquisition attempt, if any. See initiateAcquisition to see the requirements to make a public offer.
    Acquisition public offer;

    uint256 public migrationQuorum;        // Number of tokens that need to be migrated to complete migration
    uint256 public acquisitionQuorum;

    uint256 constant MIN_OFFER_INCREMENT = 10500;  // New offer must be at least 105% of old offer
    uint256 constant MIN_DRAG_ALONG_QUOTA = 3000;  // 30% of the equity needs to be represented by drag along tokens for an offer to be made

    bool public active = true;                     // True as long as this contract is legally binding and the wrapped tokens are locked.

    event OfferCreated(address indexed buyer, uint256 pricePerShare, address currency, address offerContract);
    event OfferEnded(address indexed buyer, address sender, bool success, string message, address offerContract);
    event MigrationSucceeded(address newContractAddress);

    /**
     * CurrencyAddress specifies the currency used in acquisitions. The currency must be
     * an ERC-20 token that returns true on successful transfers and throws an exception or
     * returns false on failure. It can only be updated later if the currency supports the
     * IMigratable interface.
     */
    constructor(
        address wrappedToken,
        uint256 migrationQuorumInBIPS_,
        uint256 acquisitionQuorum_
    ) ERC20(0) {
        wrapped = IERC20(wrappedToken);
        migrationQuorum = migrationQuorumInBIPS_;
        acquisitionQuorum = acquisitionQuorum_;
        IShares(wrappedToken).totalShares(); // check if wrapped token supports this method
    }

    function name() public override view returns (string memory){
        return string(abi.encodePacked("Draggable ", wrapped.name()));
    }

    function symbol() public override view returns (string memory){
        return string(abi.encodePacked("D", wrapped.symbol()));
    }

    function onTokenTransfer(address from, uint256 amount, bytes calldata) override public {
        require(msg.sender == address(wrapped));
        dowrap(from, amount);
    }

    /** Increases the number of drag-along tokens. Requires minter to deposit an equal amount of share tokens */
    function wrap(address shareholder, uint256 amount) public noOfferPending() {
        require(wrapped.transferFrom(msg.sender, address(this), amount));
        dowrap(shareholder, amount);
    }

    function dowrap(address shareholder, uint256 amount) internal noOfferPending() {
        require(active, "not active");
        _mint(shareholder, amount);
    }

    /** Decrease the number of drag-along tokens. The user gets back their shares in return */
    function unwrap(uint256 amount) public returns (address, uint256) {
        require(!active, "active");
        _burn(msg.sender, amount);
        uint256 unwrappedTokens = amount.mul(unwrapConversionFactor);
        require(wrapped.transfer(msg.sender, unwrappedTokens));
        return (address(wrapped), unwrappedTokens); // Pre August 2020 version did not have a return value
    }

    /**
     * Burns both the token itself as well as the wrapped token!
     * If you want to get out of the shareholder agreement, use unwrap after it has been
     * deactivated by a majority vote or acquisition.
     *
     * Burning only works if wrapped token supports burning. Also, the exact meaning of this
     * operation might depend on the circumstances. Burning and reussing the wrapped token
     * does not free the sender from the legal obligations of the shareholder agreement.
     */
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
        IBurnable(address(wrapped)).burn(amount.mul(unwrapConversionFactor));
    }

  /** @dev Function to start drag-along procedure
   *  This can be called by anyone, but there is an upfront payment.
   */
    function initiateAcquisition(uint256 pricePerShare, address currency) public {
        require(active);
        uint256 totalEquity = IShares(address(wrapped)).totalShares();
        require(totalSupply() >= totalEquity.mul(MIN_DRAG_ALONG_QUOTA).div(10000), "This contract does not represent enough equity");

        // License Fee to Aktionariat AG, also ensures that offer is serious
        0x29Fe8914e76da5cE2d90De98a64d0055f199d06D.transfer(3 ether);

        Acquisition newOffer = new Acquisition(msg.sender, currency, pricePerShare, acquisitionQuorum);
        require(newOffer.isWellFunded(totalSupply() - balanceOf(msg.sender)), "Insufficient funding");
        if (offerExists()) {
            require(currency == offer.currency() && pricePerShare >= offer.price().mul(MIN_OFFER_INCREMENT).div(10000), "New offers must be at least 5% higher than the pending offer");
            killAcquisition("Offer replaced by higher bid");
        }
        offer = newOffer;

        emit OfferCreated(msg.sender, pricePerShare, currency, address(offer));
    }

    function voteYes() public offerPending() {
        offer.voteYes(msg.sender, balanceOf(msg.sender));
    }

    function voteNo() public offerPending() {
        offer.voteNo(msg.sender, balanceOf(msg.sender));
    }

    function cancelAcquisition() public offerPending() {
        require(msg.sender == offer.buyer());
        killAcquisition("Cancelled");
    }

    function contestAcquisition() public offerPending() {
        if (offer.hasExpired()) {
            killAcquisition("Expired");
        } else if (offer.quorumHasFailed()) {
            killAcquisition("Not enough support");
        } else if (!offer.isWellFunded(totalSupply() - balanceOf(offer.buyer()))) {
            killAcquisition("Insufficient funds");
        }
    }

    function killAcquisition(string memory message) internal {
        address buyer = offer.buyer();
        emit OfferEnded(
            buyer,
            msg.sender,
            false,
            message,
            address(offer)
        );
        offer.kill();
        offer = Acquisition(address(0));
    }

    function completeAcquisition() public offerPending() {
        require(msg.sender == offer.buyer());
        require(offer.isQuorumReached(), "Insufficient support");
        //not necessary to check funding, will fail anyway if not enough
        //require(offer.isWellFunded(totalSupply() - balanceOf(buyer)), "insufficient funds");
        invertHoldings(msg.sender, offer.currency(), offer.price());
        emit OfferEnded(
            msg.sender,
            msg.sender,
            true,
            "Success",
            address(offer)
        );
    }

    function invertHoldings(address newOwner, address newWrapped, uint256 conversionRate) internal {
        uint256 buyerBalance = balanceOf(newOwner);
        uint256 initialSupply = totalSupply();
        active = false;
        unwrap(buyerBalance);
        uint256 remaining = initialSupply.sub(buyerBalance);
        require(wrapped.transfer(newOwner, remaining));
        wrapped = IERC20(newWrapped);
        unwrapConversionFactor = conversionRate;
        require(wrapped.transferFrom(newOwner, address(this), conversionRate.mul(remaining)));
    }

    function migrate() public {
        require(active, "not active");
        address successor = msg.sender;
        require(balanceOf(successor) >= totalSupply().mul(migrationQuorum).div(10000), "Quorum not reached");

        if (offerExists()) {
            voteNo(); // should shut down the offer
            contestAcquisition();
            assert(!offerExists());
        }

        invertHoldings(successor, successor, 1);
        emit MigrationSucceeded(successor);
    }

    // not needed in the default implementation as wrap requires no offer
    /* function _mint(address account, uint256 amount) virtual override internal {
        super._mint(account, amount);
        if (offerExists() && active) {
            offer.adjustVotes(address(0), account, amount);
        }
    } */

    function _transfer(address from, address to, uint256 value) virtual override internal {
        super._transfer(from, to, value);
        if (offerExists() && active) {
            offer.adjustVotes(from, to, value);
        }
    }

    function _burn(address account, uint256 amount) virtual override internal {
        super._burn(account, amount);
        if (offerExists() && active) {
            offer.adjustVotes(account, address(0), amount);
        }
    }

    function offerExists() internal view returns (bool) {
        return address(offer) != address(0);
    }

    modifier offerPending() {
        require(offerExists() && active, "no pending offer");
        _;
    }

    modifier noOfferPending() {
        require(!offerExists(), "offer pending");
        _;
    }

}

abstract contract IShares {
    function totalShares() virtual public returns (uint256);
}

abstract contract IBurnable {
    function burn(uint256) virtual public;
}

File 5 of 9: ERC20Recoverable.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.7;

import "./SafeMath.sol";
import "./ERC20.sol";
import "./IERC20.sol";

/**
 * @title Recoverable
 * In case of tokens that represent real-world assets such as shares of a company, one needs a way
 * to handle lost private keys. With physical certificates, courts can declare share certificates as
 * invalid so the company can issue replacements. Here, we want a solution that does not depend on
 * third parties to resolve such cases. Instead, when someone has lost a private key, he can use the
 * declareLost function to post a deposit and claim that the shares assigned to a specific address are
 * lost. To prevent front running, a commit reveal scheme is used. If he actually is the owner of the shares,
 * he needs to wait for a certain period and can then reclaim the lost shares as well as the deposit.
 * If he is an attacker trying to claim shares belonging to someone else, he risks losing the deposit
 * as it can be claimed at anytime by the rightful owner.
 * Furthermore, if "getClaimDeleter" is defined in the subclass, the returned address is allowed to
 * delete claims, returning the collateral. This can help to prevent obvious cases of abuse of the claim
 * function.
 */

abstract contract ERC20Recoverable is ERC20 {

    using SafeMath for uint256;

    // A struct that represents a claim made
    struct Claim {
        address claimant; // the person who created the claim
        uint256 collateral; // the amount of collateral deposited
        uint256 timestamp;  // the timestamp of the block in which the claim was made
        address currencyUsed; // The currency (XCHF) can be updated, we record the currency used for every request
    }

    uint256 public claimPeriod = 180 days; // Default of 180 days;

    mapping(address => Claim) public claims; // there can be at most one claim per address, here address is claimed address
    mapping(address => bool) public recoveryDisabled; // disable claimability (e.g. for long term storage)

    // ERC-20 token that can be used as collateral or 0x0 if disabled
    address public customCollateralAddress;
    uint256 public customCollateralRate;

    /**
     * Returns the collateral rate for the given collateral type and 0 if that type
     * of collateral is not accepted. By default, only the token itself is accepted at
     * a rate of 1:1.
     *
     * Subclasses should override this method if they want to add additional types of
     * collateral.
     */
    function getCollateralRate(address collateralType) public virtual view returns (uint256) {
        if (collateralType == address(this)) {
            return 1;
        } else if (collateralType == customCollateralAddress) {
            return customCollateralRate;
        } else {
            return 0;
        }
    }

    /**
     * Allows subclasses to set a custom collateral besides the token itself.
     * The collateral must be an ERC-20 token that returns true on successful transfers and
     * throws an exception or returns false on failure.
     * Also, do not forget to multiply the rate in accordance with the number of decimals of the collateral.
     * For example, rate should be 7*10**18 for 7 units of a collateral with 18 decimals.
     */
    function _setCustomClaimCollateral(address collateral, uint256 rate) internal {
        customCollateralAddress = collateral;
        if (customCollateralAddress == address(0)) {
            customCollateralRate = 0; // disabled
        } else {
            require(rate > 0, "Collateral rate can't be zero");
            customCollateralRate = rate;
        }
        emit CustomClaimCollateralChanged(collateral, rate);
    }

    function getClaimDeleter() virtual public view returns (address);

    /**
     * Allows subclasses to change the claim period, but not to fewer than 90 days.
     */
    function _setClaimPeriod(uint256 claimPeriodInDays) internal {
        require(claimPeriodInDays > 90, "Claim period must be at least 90 days"); // must be at least 90 days
        uint256 claimPeriodInSeconds = claimPeriodInDays.mul(1 days);
        claimPeriod = claimPeriodInSeconds;
        emit ClaimPeriodChanged(claimPeriod);
    }

    function setRecoverable(bool enabled) public {
        recoveryDisabled[msg.sender] = !enabled;
    }

    /**
     * Some users might want to disable claims for their address completely.
     * For example if they use a deep cold storage solution or paper wallet.
     */
    function isRecoveryEnabled(address target) public view returns (bool) {
        return !recoveryDisabled[target];
    }

    event ClaimMade(address indexed lostAddress, address indexed claimant, uint256 balance);
    event ClaimCleared(address indexed lostAddress, uint256 collateral);
    event ClaimDeleted(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event ClaimResolved(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event ClaimPeriodChanged(uint256 newClaimPeriodInDays);
    event CustomClaimCollateralChanged(address newCustomCollateralAddress, uint256 newCustomCollareralRate);

  /** Anyone can declare that the private key to a certain address was lost by calling declareLost
    * providing a deposit/collateral. There are three possibilities of what can happen with the claim:
    * 1) The claim period expires and the claimant can get the deposit and the shares back by calling recover
    * 2) The "lost" private key is used at any time to call clearClaim. In that case, the claim is deleted and
    *    the deposit sent to the shareholder (the owner of the private key). It is recommended to call recover
    *    whenever someone transfers funds to let claims be resolved automatically when the "lost" private key is
    *    used again.
    * 3) The owner deletes the claim and assigns the deposit to the claimant. This is intended to be used to resolve
    *    disputes. Generally, using this function implies that you have to trust the issuer of the tokens to handle
    *    the situation well. As a rule of thumb, the contract owner should assume the owner of the lost address to be the
    *    rightful owner of the deposit.
    * It is highly recommended that the owner observes the claims made and informs the owners of the claimed addresses
    * whenever a claim is made for their address (this of course is only possible if they are known to the owner, e.g.
    * through a shareholder register).
    * To prevent frontrunning attacks, a claim can only be made if the information revealed when calling "declareLost"
    * was previously commited using the "prepareClaim" function.
    */
    function declareLost(address collateralType, address lostAddress) public {
        require(isRecoveryEnabled(lostAddress), "Claims disabled for this address");
        uint256 collateralRate = getCollateralRate(collateralType);
        require(collateralRate > 0, "Unsupported collateral");
        address claimant = msg.sender;
        uint256 balance = balanceOf(lostAddress);
        uint256 collateral = balance.mul(collateralRate);
        IERC20 currency = IERC20(collateralType);
        require(balance > 0, "Claimed address holds no shares");
        require(claims[lostAddress].collateral == 0, "Address already claimed");
        require(currency.transferFrom(claimant, address(this), collateral), "Collateral transfer failed");

        claims[lostAddress] = Claim({
            claimant: claimant,
            collateral: collateral,
            timestamp: block.timestamp,
            currencyUsed: collateralType
        });

        emit ClaimMade(lostAddress, claimant, balance);
    }

    function getClaimant(address lostAddress) public view returns (address) {
        return claims[lostAddress].claimant;
    }

    function getCollateral(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].collateral;
    }

    function getCollateralType(address lostAddress) public view returns (address) {
        return claims[lostAddress].currencyUsed;
    }

    function getTimeStamp(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].timestamp;
    }

    function transfer(address recipient, uint256 amount) override virtual public returns (bool) {
        require(super.transfer(recipient, amount), "Transfer failed");
        clearClaim();
        return true;
    }

    /**
     * Clears a claim after the key has been found again and assigns the collateral to the "lost" address.
     * This is the price an adverse claimer pays for filing a false claim and makes it risky to do so.
     */
    function clearClaim() public {
        if (claims[msg.sender].collateral != 0) {
            uint256 collateral = claims[msg.sender].collateral;
            IERC20 currency = IERC20(claims[msg.sender].currencyUsed);
            delete claims[msg.sender];
            require(currency.transfer(msg.sender, collateral), "Collateral transfer failed");
            emit ClaimCleared(msg.sender, collateral);
        }
    }

   /**
    * After the claim period has passed, the claimant can call this function to send the
    * tokens on the lost address as well as the collateral to himself.
    */
    function recover(address lostAddress) public {
        Claim memory claim = claims[lostAddress];
        uint256 collateral = claim.collateral;
        IERC20 currency = IERC20(claim.currencyUsed);
        require(collateral != 0, "No claim found");
        require(claim.claimant == msg.sender, "Only claimant can resolve claim");
        require(claim.timestamp.add(claimPeriod) <= block.timestamp, "Claim period not over yet");
        address claimant = claim.claimant;
        delete claims[lostAddress];
        require(currency.transfer(claimant, collateral), "Collateral transfer failed");
        _transfer(lostAddress, claimant, balanceOf(lostAddress));
        emit ClaimResolved(lostAddress, claimant, collateral);
    }

    /**
     * This function is to be executed by the claim deleter only in case a dispute needs to be resolved manually.
     */
    function deleteClaim(address lostAddress) public {
        require(msg.sender == getClaimDeleter(), "You cannot delete claims");
        Claim memory claim = claims[lostAddress];
        IERC20 currency = IERC20(claim.currencyUsed);
        require(claim.collateral != 0, "No claim found");
        delete claims[lostAddress];
        require(currency.transfer(claim.claimant, claim.collateral), "Collateral transfer failed");
        emit ClaimDeleted(lostAddress, claim.claimant, claim.collateral);
    }

}

File 6 of 9: IERC20.sol
/**
* SPDX-License-Identifier: MIT
*
* Copyright (c) 2016-2019 zOS Global Limited
*
*/
pragma solidity >=0.7;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */

interface IERC20 {

    // Optional functions
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

File 7 of 9: IERC677Receiver.sol
// SPDX-License-Identifier: MIT
// Copied from https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/UniswapV2Router02.sol
pragma solidity >=0.7;

interface IERC677Receiver {

    function onTokenTransfer(address from, uint256 amount, bytes calldata data) external;

}

File 8 of 9: IMigratable.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.7;

abstract contract IMigratable {
    function migrationToContract() public virtual returns (address);
}

File 9 of 9: SafeMath.sol
/**
* SPDX-License-Identifier: MIT
*
* Copyright (c) 2016-2019 zOS Global Limited
*/
pragma solidity >=0.7;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        c = a * b;
        assert(c / a == b);
        return c;
    }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_terms","type":"string"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"ClaimMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newClaimPeriodInDays","type":"uint256"}],"name":"ClaimPeriodChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newCustomCollateralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newCustomCollareralRate","type":"uint256"}],"name":"CustomClaimCollateralChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newContractAddress","type":"address"}],"name":"MigrationSucceeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"pricePerShare","type":"uint256"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"address","name":"offerContract","type":"address"}],"name":"OfferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"address","name":"offerContract","type":"address"}],"name":"OfferEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acquisitionQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelAcquisition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claims","outputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"currencyUsed","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"completeAcquisition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contestAcquisition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customCollateralAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"},{"internalType":"address","name":"lostAddress","type":"address"}],"name":"declareLost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"deleteClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getClaimDeleter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getClaimant","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"}],"name":"getCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateralType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pricePerShare","type":"uint256"},{"internalType":"address","name":"currency","type":"address"}],"name":"initiateAcquisition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"isRecoveryEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offer","outputs":[{"internalType":"contract Acquisition","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"recoveryDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setRecoverable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unwrap","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unwrapConversionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voteNo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteYes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapped","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405262ed4e006004556001600a819055600e805460ff191690911790553480156200002c57600080fd5b506040516200458838038062004588833981810160405260608110156200005257600080fd5b81019080805160405193929190846401000000008211156200007357600080fd5b9083019060208201858111156200008957600080fd5b8251640100000000811182820188101715620000a457600080fd5b82525081516020918201929091019080838360005b83811015620000d3578181015183820152602001620000b9565b50505050905090810190601f168015620001015780820380516001836020036101000a031916815260200191505b506040818152602083810151938201516003805460ff19169055600980546001600160a01b0319166001600160a01b038716908117909155600c829055600d829055633a98ef3960e01b85529251949650945085938593849392633a98ef39926004808401938290030181600087803b1580156200017e57600080fd5b505af115801562000193573d6000803e3d6000fd5b505050506040513d6020811015620001aa57600080fd5b505060408051636427ed9760e01b815260006004820181905291516001600160a01b0388169550636427ed97945060248083019450909182900301818387803b158015620001f757600080fd5b505af11580156200020c573d6000803e3d6000fd5b50508451620002259250600f915060208601906200022f565b50505050620002cb565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200027257805160ff1916838001178555620002a2565b82800160010185558215620002a2579182015b82811115620002a257825182559160200191906001019062000285565b50620002b0929150620002b4565b5090565b5b80821115620002b05760008155600101620002b5565b6142ad80620002db6000396000f3fe60806040523480156200001157600080fd5b5060043610620002d45760003560e01c80636427ed971162000189578063a457c2d711620000e1578063c6788bdd1162000093578063c6788bdd14620008bc578063d50256251462000922578063dd62ed3e146200092c578063de0e9a3e146200095d578063e1b8c38e14620009a0578063eb470ebf14620009aa57620002d4565b8063a457c2d71462000773578063a4c0ed3614620007a2578063a9059cbb146200082b578063b40e80d1146200085a578063bf376c7a1462000883578063c028df0614620008b257620002d4565b80638fd3ab80116200013b5780638fd3ab8014620006f957806390cf581c146200070357806395d89b41146200070d5780639b56d6c914620007175780639e8a9a5a1462000740578063a3ec1883146200074a57620002d4565b80636427ed9714620006675780636b03ed5f14620006895780636f4b18df146200069357806370a08231146200069d57806377e071ad14620006c65780637dc2cd9814620006ef57620002d4565b80632a0a4ed5116200023d5780634000aea011620001ef5780634000aea0146200057157806341c12a7014620005fa57806342966c68146200060457806349b210b7146200062457806350e70d48146200065357806360918117146200065d57620002d4565b80632a0a4ed514620004bc578063313ce56714620004c657806332a7ae9514620004e65780633549788a146200050f5780633950935114620005195780633bcc45ba146200054857620002d4565b80630cd865ec11620002975780630cd865ec14620003ea578063141c7068146200041557806318160ddd146200041f5780631e3b9de5146200042957806323b872dd146200045257806326773ddd146200048b57620002d4565b806302fb0c5e14620002d957806306fdde0314620002f75780630832e4701462000379578063095ea7b314620003955780630c6f0e5d14620003c4575b600080fd5b620002e3620009d3565b604080519115158252519081900360200190f35b62000301620009dc565b6040805160208082528351818301528351919283929083019185019080838360005b838110156200033d57818101518382015260200162000323565b50505050905090810190601f1680156200036b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6200038362000b97565b60408051918252519081900360200190f35b620002e360048036036040811015620003ad57600080fd5b506001600160a01b03813516906020013562000b9d565b620003ce62000bb6565b604080516001600160a01b039092168252519081900360200190f35b62000413600480360360208110156200040257600080fd5b50356001600160a01b031662000bc5565b005b6200041362000ea9565b62000383620011ca565b620003ce600480360360208110156200044157600080fd5b50356001600160a01b0316620011d0565b620002e3600480360360608110156200046a57600080fd5b506001600160a01b03813581169160208101359091169060400135620011f1565b6200041360048036036040811015620004a357600080fd5b506001600160a01b038135811691602001351662001248565b620003ce62001573565b620004d0620015ec565b6040805160ff9092168252519081900360200190f35b6200041360048036036020811015620004fe57600080fd5b50356001600160a01b0316620015f5565b620003836200185d565b620002e3600480360360408110156200053157600080fd5b506001600160a01b03813516906020013562001863565b620003ce600480360360208110156200056057600080fd5b50356001600160a01b03166200189c565b620002e3600480360360608110156200058957600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115620005b957600080fd5b820183602082011115620005cc57600080fd5b803590602001918460018302840111600160201b83111715620005ee57600080fd5b509092509050620018bd565b6200041362001984565b62000413600480360360208110156200061c57600080fd5b503562001a61565b62000413600480360360408110156200063c57600080fd5b50803590602001356001600160a01b031662001ae5565b620003ce62001f73565b6200038362001f82565b62000413600480360360208110156200067f57600080fd5b5035151562001f88565b6200041362001fa7565b620004136200210c565b6200038360048036036020811015620006b557600080fd5b50356001600160a01b031662002403565b6200038360048036036020811015620006de57600080fd5b50356001600160a01b03166200241e565b62000383620024c0565b62000413620024c6565b6200041362002606565b6200030162002681565b62000383600480360360208110156200072f57600080fd5b50356001600160a01b0316620027f9565b6200038362002817565b620002e3600480360360208110156200076257600080fd5b50356001600160a01b03166200281d565b620002e3600480360360408110156200078b57600080fd5b506001600160a01b0381351690602001356200283c565b6200041360048036036060811015620007ba57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115620007ea57600080fd5b820183602082011115620007fd57600080fd5b803590602001918460018302840111600160201b831117156200081f57600080fd5b50909250905062002875565b620002e3600480360360408110156200084357600080fd5b506001600160a01b03813516906020013562002899565b620002e3600480360360208110156200087257600080fd5b50356001600160a01b0316620028ae565b62000413600480360360408110156200089b57600080fd5b506001600160a01b038135169060200135620028c3565b620003ce620029b3565b620008e560048036036020811015620008d457600080fd5b50356001600160a01b0316620029c2565b60405180856001600160a01b03168152602001848152602001838152602001826001600160a01b0316815260200194505050505060405180910390f35b62000301620029f4565b62000383600480360360408110156200094457600080fd5b506001600160a01b038135811691602001351662002a86565b6200097d600480360360208110156200097557600080fd5b503562002ab1565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6200041362002bc2565b6200038360048036036020811015620009c257600080fd5b50356001600160a01b031662002cde565b600e5460ff1681565b600954604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301926000929190829003018186803b15801562000a2257600080fd5b505afa15801562000a37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101562000a6157600080fd5b8101908080516040519392919084600160201b82111562000a8157600080fd5b90830190602082018581111562000a9757600080fd5b8251600160201b81118282018810171562000ab157600080fd5b82525081516020918201929091019080838360005b8381101562000ae057818101518382015260200162000ac6565b50505050905090810190601f16801562000b0e5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080690223930b3b3b0b13632960b51b815250600a0182805190602001908083835b6020831062000b5e5780518252601f19909201916020918201910162000b3d565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052905090565b600a5481565b600062000bac33848462002cfc565b5060015b92915050565b6007546001600160a01b031681565b62000bcf620035d9565b506001600160a01b038082166000908152600560209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091908162000c67576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b82516001600160a01b0316331462000cc6576040805162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604482015290519081900360640190fd5b4262000ce2600454856040015162002d5e90919063ffffffff16565b111562000d36576040805162461bcd60e51b815260206004820152601960248201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604482015290519081900360640190fd5b82516001600160a01b03808616600090815260056020908152604080832080546001600160a01b031990811682556001820185905560028201859055600390910180549091169055805163a9059cbb60e01b815284861660048201526024810188905290519386169363a9059cbb93604480840194938390030190829087803b15801562000dc357600080fd5b505af115801562000dd8573d6000803e3d6000fd5b505050506040513d602081101562000def57600080fd5b505162000e40576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b62000e57858262000e518862002403565b62002d6c565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee856040518082815260200191505060405180910390a35050505050565b62000eb362002d7e565b801562000ec25750600e5460ff165b62000f07576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b60009054906101000a90046001600160a01b03166001600160a01b0316637150d8ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000f5657600080fd5b505afa15801562000f6b573d6000803e3d6000fd5b505050506040513d602081101562000f8257600080fd5b50516001600160a01b0316331462000f9957600080fd5b600b60009054906101000a90046001600160a01b03166001600160a01b031663d7be4e296040518163ffffffff1660e01b815260040160206040518083038186803b15801562000fe857600080fd5b505afa15801562000ffd573d6000803e3d6000fd5b505050506040513d60208110156200101457600080fd5b50516200105f576040805162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081cdd5c1c1bdc9d60621b604482015290519081900360640190fd5b6200115b33600b60009054906101000a90046001600160a01b03166001600160a01b031663e5a6b10f6040518163ffffffff1660e01b815260040160206040518083038186803b158015620010b357600080fd5b505afa158015620010c8573d6000803e3d6000fd5b505050506040513d6020811015620010df57600080fd5b5051600b546040805163501ad8ff60e11b815290516001600160a01b039092169163a035b1fe91600480820192602092909190829003018186803b1580156200112757600080fd5b505afa1580156200113c573d6000803e3d6000fd5b505050506040513d60208110156200115357600080fd5b505162002d8f565b600b546040805133808252600160208301526001600160a01b039390931660608201526080818301819052600790820152665375636365737360c81b60a082015290517fc88f58ae9feb0742d9422f604dd3c1be6d02818f8dec340c5061f428b554e9759181900360c00190a2565b60025490565b6001600160a01b03808216600090815260056020526040902054165b919050565b60006200120084848462002d6c565b6001600160a01b0384166000908152600160209081526040808320338085529252909120546200123e91869162001238908662002f34565b62002cfc565b5060019392505050565b62001253816200281d565b620012a5576040805162461bcd60e51b815260206004820181905260248201527f436c61696d732064697361626c656420666f7220746869732061646472657373604482015290519081900360640190fd5b6000620012b2836200241e565b90506000811162001303576040805162461bcd60e51b8152602060048201526016602482015275155b9cdd5c1c1bdc9d19590818dbdb1b185d195c985b60521b604482015290519081900360640190fd5b336000620013118462002403565b9050600062001321828562002f47565b9050858262001377576040805162461bcd60e51b815260206004820152601f60248201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604482015290519081900360640190fd5b6001600160a01b03861660009081526005602052604090206001015415620013e6576040805162461bcd60e51b815260206004820152601760248201527f4164647265737320616c726561647920636c61696d6564000000000000000000604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918316916323b872dd916064808201926020929091908290030181600087803b1580156200144057600080fd5b505af115801562001455573d6000803e3d6000fd5b505050506040513d60208110156200146c57600080fd5b5051620014bd576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d8616600081815260058652899020975188549088166001600160a01b0319918216178955935160018901559151600288015551600390960180549690951695909116949094179092558351878152935190937f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535992908290030190a350505050505050565b60095460408051632a0a4ed560e01b815290516000926001600160a01b031691632a0a4ed5916004808301926020929190829003018186803b158015620015b957600080fd5b505afa158015620015ce573d6000803e3d6000fd5b505050506040513d6020811015620015e557600080fd5b5051905090565b60035460ff1681565b620015ff62001573565b6001600160a01b0316336001600160a01b03161462001665576040805162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604482015290519081900360640190fd5b6200166f620035d9565b506001600160a01b03808216600090815260056020908152604091829020825160808101845281548516815260018201549281018390526002820154938101939093526003015490921660608201819052909162001705576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b6001600160a01b03808416600090815260056020908152604080832080546001600160a01b031990811682556001820185905560028201859055600390910180549091169055855186830151825163a9059cbb60e01b81529186166004830152602482015290519385169363a9059cbb93604480840194938390030190829087803b1580156200179457600080fd5b505af1158015620017a9573d6000803e3d6000fd5b505050506040513d6020811015620017c057600080fd5b505162001811576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b815160208084015160408051918252516001600160a01b03938416938716927fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d5928290030190a3505050565b600d5481565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000bac91859062001238908662002d5e565b6001600160a01b039081166000908152600560205260409020600301541690565b600080620018cc868662002899565b905080156200197b57856001600160a01b031663a4c0ed36338787876040518563ffffffff1660e01b815260040180856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156200196157600080fd5b505af115801562001976573d6000803e3d6000fd5b505050505b95945050505050565b6200198e62002d7e565b80156200199d5750600e5460ff165b620019e2576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b546001600160a01b0316634b91562e33620019ff8162002403565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801562001a4657600080fd5b505af115801562001a5b573d6000803e3d6000fd5b50505050565b62001a6d338262002f70565b600954600a546001600160a01b03909116906342966c689062001a9290849062002f47565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801562001ac957600080fd5b505af115801562001ade573d6000803e3d6000fd5b5050505050565b600e5460ff1662001af557600080fd5b60095460408051633a98ef3960e01b815290516000926001600160a01b031691633a98ef3991600480830192602092919082900301818787803b15801562001b3c57600080fd5b505af115801562001b51573d6000803e3d6000fd5b505050506040513d602081101562001b6857600080fd5b5051905062001b8861271062001b8183610bb862002f47565b9062002f7c565b62001b92620011ca565b101562001bd15760405162461bcd60e51b815260040180806020018281038252602e8152602001806200424a602e913960400191505060405180910390fd5b6040517329fe8914e76da5ce2d90de98a64d0055f199d06d906000906729a2241af62c00009082818181858883f1935050505015801562001c16573d6000803e3d6000fd5b506000338385600d5460405162001c2d9062003613565b80856001600160a01b03168152602001846001600160a01b03168152602001838152602001828152602001945050505050604051809103906000f08015801562001c7b573d6000803e3d6000fd5b509050806001600160a01b031663b28fa15262001c983362002403565b62001ca2620011ca565b036040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801562001cd857600080fd5b505afa15801562001ced573d6000803e3d6000fd5b505050506040513d602081101562001d0457600080fd5b505162001d4f576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742066756e64696e6760601b604482015290519081900360640190fd5b62001d5962002d7e565b1562001f0557600b60009054906101000a90046001600160a01b03166001600160a01b031663e5a6b10f6040518163ffffffff1660e01b815260040160206040518083038186803b15801562001dae57600080fd5b505afa15801562001dc3573d6000803e3d6000fd5b505050506040513d602081101562001dda57600080fd5b50516001600160a01b03848116911614801562001e88575062001e8461271062001b81612904600b60009054906101000a90046001600160a01b03166001600160a01b031663a035b1fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801562001e4f57600080fd5b505afa15801562001e64573d6000803e3d6000fd5b505050506040513d602081101562001e7b57600080fd5b50519062002f47565b8410155b62001ec55760405162461bcd60e51b815260040180806020018281038252603c8152602001806200420e603c913960400191505060405180910390fd5b62001f056040518060400160405280601c81526020017f4f66666572207265706c6163656420627920686967686572206269640000000081525062002f90565b600b80546001600160a01b038084166001600160a01b0319909216919091179182905560408051878152868316602082015292909116828201525133917f34e649ce0ed38b68d4a32f1f8fb75a61e4f3a0444c5bae222d20aaf2c3db3677919081900360600190a250505050565b6009546001600160a01b031681565b60085481565b336000908152600660205260409020805460ff19169115919091179055565b33600090815260056020526040902060010154156200210a5733600081815260056020908152604080832060018101805460038301805484546001600160a01b03199081168655938890556002909401879055918316909155825163a9059cbb60e01b8152600481019690965260248601819052915191946001600160a01b0390911693849363a9059cbb93604480850194929391928390030190829087803b1580156200205457600080fd5b505af115801562002069573d6000803e3d6000fd5b505050506040513d60208110156200208057600080fd5b5051620020d1576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b60408051838152905133917f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd919081900360200190a250505b565b6200211662002d7e565b8015620021255750600e5460ff165b6200216a576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b60009054906101000a90046001600160a01b03166001600160a01b03166390e64d136040518163ffffffff1660e01b815260040160206040518083038186803b158015620021b957600080fd5b505afa158015620021ce573d6000803e3d6000fd5b505050506040513d6020811015620021e557600080fd5b5051156200221d576200221760405180604001604052806007815260200166115e1c1a5c995960ca1b81525062002f90565b6200210a565b600b60009054906101000a90046001600160a01b03166001600160a01b031663cf42a9276040518163ffffffff1660e01b815260040160206040518083038186803b1580156200226c57600080fd5b505afa15801562002281573d6000803e3d6000fd5b505050506040513d60208110156200229857600080fd5b505115620022d5576200221760405180604001604052806012815260200171139bdd08195b9bdd59da081cdd5c1c1bdc9d60721b81525062002f90565b600b54604080516338a86c5760e11b815290516001600160a01b039092169163b28fa152916200235b918491637150d8ae916004808301926020929190829003018186803b1580156200232757600080fd5b505afa1580156200233c573d6000803e3d6000fd5b505050506040513d60208110156200235357600080fd5b505162002403565b62002365620011ca565b036040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156200239b57600080fd5b505afa158015620023b0573d6000803e3d6000fd5b505050506040513d6020811015620023c757600080fd5b50516200210a576200210a60405180604001604052806012815260200171496e73756666696369656e742066756e647360701b81525062002f90565b6001600160a01b031660009081526020819052604090205490565b6000806200242c8362003155565b905080156200243d579050620011ec565b6009546001600160a01b03848116911614156200245f575050600a54620011ec565b600a54600954604080516377e071ad60e01b81526001600160a01b0387811660048301529151620024b7949392909216916377e071ad91602480820192602092909190829003018186803b15801562001e4f57600080fd5b915050620011ec565b60045481565b600e5460ff166200250b576040805162461bcd60e51b815260206004820152600a6024820152696e6f742061637469766560b01b604482015290519081900360640190fd5b60003390506200252f61271062001b81600c5462002528620011ca565b9062002f47565b6200253a8262002403565b101562002583576040805162461bcd60e51b8152602060048201526012602482015271145d5bdc9d5b481b9bdd081c995858da195960721b604482015290519081900360640190fd5b6200258d62002d7e565b15620025b9576200259d62001984565b620025a76200210c565b620025b162002d7e565b15620025b957fe5b620025c78182600162002d8f565b604080516001600160a01b038316815290517f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a99181900360200190a150565b6200261062002d7e565b80156200261f5750600e5460ff165b62002664576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b546001600160a01b0316635ff0cf8433620019ff8162002403565b600954604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b158015620026c757600080fd5b505afa158015620026dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200270657600080fd5b8101908080516040519392919084600160201b8211156200272657600080fd5b9083019060208201858111156200273c57600080fd5b8251600160201b8111828201881017156200275657600080fd5b82525081516020918201929091019080838360005b83811015620027855781810151838201526020016200276b565b50505050905090810190601f168015620027b35780820380516001836020036101000a031916815260200191505b506040525050506040516020018080601160fa1b81525060010182805190602001908083836020831062000b5e5780518252601f19909201916020918201910162000b3d565b6001600160a01b031660009081526005602052604090206001015490565b600c5481565b6001600160a01b031660009081526006602052604090205460ff161590565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000bac91859062001238908662002f34565b6009546001600160a01b031633146200288d57600080fd5b62001a5b84846200319c565b6000620028a783836200323a565b9392505050565b60066020526000908152604090205460ff1681565b620028cd62002d7e565b1562002910576040805162461bcd60e51b815260206004820152600d60248201526c6f666665722070656e64696e6760981b604482015290519081900360640190fd5b600954604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156200296b57600080fd5b505af115801562002980573d6000803e3d6000fd5b505050506040513d60208110156200299757600080fd5b5051620029a357600080fd5b620029af82826200319c565b5050565b600b546001600160a01b031681565b60056020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b600f805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801562002a7e5780601f1062002a525761010080835404028352916020019162002a7e565b820191906000526020600020905b81548152906001019060200180831162002a6057829003601f168201915b505050505081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600e54600090819060ff161562002af8576040805162461bcd60e51b815260206004820152600660248201526561637469766560d01b604482015290519081900360640190fd5b62002b04338462002f70565b600062002b1d600a548562002f4790919063ffffffff16565b6009546040805163a9059cbb60e01b81523360048201526024810184905290519293506001600160a01b039091169163a9059cbb916044808201926020929091908290030181600087803b15801562002b7557600080fd5b505af115801562002b8a573d6000803e3d6000fd5b505050506040513d602081101562002ba157600080fd5b505162002bad57600080fd5b6009546001600160a01b031692509050915091565b62002bcc62002d7e565b801562002bdb5750600e5460ff165b62002c20576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b60009054906101000a90046001600160a01b03166001600160a01b0316637150d8ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801562002c6f57600080fd5b505afa15801562002c84573d6000803e3d6000fd5b505050506040513d602081101562002c9b57600080fd5b50516001600160a01b0316331462002cb257600080fd5b6200210a6040518060400160405280600981526020016810d85b98d95b1b195960ba1b81525062002f90565b6001600160a01b031660009081526005602052604090206002015490565b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b8181018281101562000bb057fe5b62002d7983838362003296565b505050565b600b546001600160a01b0316151590565b600062002d9c8462002403565b9050600062002daa620011ca565b600e805460ff19169055905062002dc18262002ab1565b506000905062002dd2828462002f34565b6009546040805163a9059cbb60e01b81526001600160a01b038a8116600483015260248201859052915193945091169163a9059cbb916044808201926020929091908290030181600087803b15801562002e2b57600080fd5b505af115801562002e40573d6000803e3d6000fd5b505050506040513d602081101562002e5757600080fd5b505162002e6357600080fd5b600980546001600160a01b0319166001600160a01b038781169190911791829055600a869055166323b872dd873062002e9d888662002f47565b6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801562002ef457600080fd5b505af115801562002f09573d6000803e3d6000fd5b505050506040513d602081101562002f2057600080fd5b505162002f2c57600080fd5b505050505050565b60008282111562002f4157fe5b50900390565b60008262002f585750600062000bb0565b508181028183828162002f6757fe5b041462000bb057fe5b620029af82826200333e565b600081838162002f8857fe5b049392505050565b600b54604080516338a86c5760e11b815290516000926001600160a01b031691637150d8ae916004808301926020929190829003018186803b15801562002fd657600080fd5b505afa15801562002feb573d6000803e3d6000fd5b505050506040513d60208110156200300257600080fd5b5051600b546040805133808252600060208381018290526001600160a01b039586166060850181905260809585018681528a51968601969096528951979850958816967fc88f58ae9feb0742d9422f604dd3c1be6d02818f8dec340c5061f428b554e97596939592948a94939092909160a08401918601908083838a5b83811015620030995781810151838201526020016200307f565b50505050905090810190601f168015620030c75780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a2600b60009054906101000a90046001600160a01b03166001600160a01b03166341c0e1b56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200312857600080fd5b505af11580156200313d573d6000803e3d6000fd5b5050600b80546001600160a01b031916905550505050565b60006001600160a01b0382163014156200317257506001620011ec565b6007546001600160a01b0383811691161415620031935750600854620011ec565b506000620011ec565b620031a662002d7e565b15620031e9576040805162461bcd60e51b815260206004820152600d60248201526c6f666665722070656e64696e6760981b604482015290519081900360640190fd5b600e5460ff166200322e576040805162461bcd60e51b815260206004820152600a6024820152696e6f742061637469766560b01b604482015290519081900360640190fd5b620029af8282620033d9565b60006200324883836200347a565b6200328c576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b62000bac62001fa7565b620032a383838362003489565b620032ad62002d7e565b8015620032bc5750600e5460ff165b1562002d7957600b5460408051636240a7d760e11b81526001600160a01b0386811660048301528581166024830152604482018590529151919092169163c4814fae91606480830192600092919082900301818387803b1580156200332057600080fd5b505af115801562003335573d6000803e3d6000fd5b50505050505050565b6200334a82826200354d565b6200335462002d7e565b8015620033635750600e5460ff165b15620029af57600b5460408051636240a7d760e11b81526001600160a01b03858116600483015260006024830181905260448301869052925193169263c4814fae9260648084019391929182900301818387803b158015620033c457600080fd5b505af115801562002f2c573d6000803e3d6000fd5b6001600160a01b038216620033ed57600080fd5b600254620033fc908262002d5e565b6002556001600160a01b03821660009081526020819052604090205462003424908262002d5e565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600062000bac33848462002d6c565b6001600160a01b0382166200349d57600080fd5b6001600160a01b038316600090815260208190526040902054620034c2908262002f34565b6001600160a01b038085166000908152602081905260408082209390935590841681522054620034f3908262002d5e565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6002546200355c908262002f34565b6002556001600160a01b03821660009081526020819052604090205462003584908262002f34565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b604051806080016040528060006001600160a01b03168152602001600081526020016000815260200160006001600160a01b031681525090565b610bec80620036228339019056fe608060405234801561001057600080fd5b50604051610bec380380610bec8339818101604052608081101561003357600080fd5b50805160208201516040830151606090930151919290918161008c576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c696420707269636560981b604482015290519081900360640190fd5b600180546001600160a01b03199081163317909155600280546001600160a01b03968716908316179055600380549490951693169290921790925560049190915560005542600555610b09806100e36000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063b1610d7e116100ad578063cf42a92711610071578063cf42a927146102b4578063d7be4e29146102bc578063e5a6b10f146102c4578063fa7f1bae146102cc578063fb286c65146102d45761012c565b8063b1610d7e14610249578063b28fa15214610251578063b5b47f421461026e578063b80777ea14610276578063c4814fae1461027e5761012c565b80635ff0cf84116100f45780635ff0cf84146101c35780637150d8ae146101ef5780638f1b4c6f1461021357806390e64d1314610239578063a035b1fe146102415761012c565b80630c43cd88146101315780631703a0181461014b57806341c0e1b514610153578063448ab4c61461015d5780634b91562e14610197575b600080fd5b6101396102dc565b60408051918252519081900360200190f35b6101396102e3565b61015b6102e9565b005b6101836004803603602081101561017357600080fd5b50356001600160a01b0316610343565b604080519115158252519081900360200190f35b61015b600480360360408110156101ad57600080fd5b506001600160a01b038135169060200135610376565b61015b600480360360408110156101d957600080fd5b506001600160a01b038135169060200135610421565b6101f76104c8565b604080516001600160a01b039092168252519081900360200190f35b6101836004803603602081101561022957600080fd5b50356001600160a01b03166104d7565b6101836104e0565b610139610504565b61013961050a565b6101836004803603602081101561026757600080fd5b5035610511565b61013961064e565b610139610654565b61015b6004803603606081101561029457600080fd5b506001600160a01b0381358116916020810135909116906040013561065a565b6101836106f0565b61018361083b565b6101f76108f4565b610183610903565b610139610927565b6276a70081565b60005481565b6001546001600160a01b03163314610335576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185c995b9d60b21b604482015290519081900360640190fd5b6002546001600160a01b0316ff5b600060015b6001600160a01b03831660009081526008602052604090205460ff16600281111561036f57fe5b1492915050565b6001546001600160a01b031633146103c2576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185c995b9d60b21b604482015290519081900360640190fd5b6103ca610903565b610411576040805162461bcd60e51b81526020600482015260136024820152722a3432903b37ba32903430b99032b73232b21760691b604482015290519081900360640190fd5b61041d6002828461092d565b5050565b6001546001600160a01b0316331461046d576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185c995b9d60b21b604482015290519081900360640190fd5b610475610903565b6104bc576040805162461bcd60e51b81526020600482015260136024820152722a3432903b37ba32903430b99032b73232b21760691b604482015290519081900360640190fd5b61041d6001828461092d565b6002546001600160a01b031681565b60006002610348565b6000806104f86005544261097690919063ffffffff16565b6276a700109150505b90565b60045481565b624f1a0081565b600354600254604080516370a0823160e01b81526001600160a01b03928316600482015290516000939290921691839183916370a0823191602480820192602092909190829003018186803b15801561056957600080fd5b505afa15801561057d573d6000803e3d6000fd5b505050506040513d602081101561059357600080fd5b505160025460015460408051636eb1769f60e11b81526001600160a01b0393841660048201529183166024830152519293506000929185169163dd62ed3e91604480820192602092909190829003018186803b1580156105f257600080fd5b505afa158015610606573d6000803e3d6000fd5b505050506040513d602081101561061c57600080fd5b505160045490915060009061063290879061098d565b90508281111580156106445750818111155b9695505050505050565b60065481565b60055481565b6001546001600160a01b031633146106a6576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185c995b9d60b21b604482015290519081900360640190fd5b6106ae610903565b156106eb576001600160a01b0380841660009081526008602052604080822054928516825290205460ff91821691166106e88282856109b2565b50505b505050565b60006106fa610903565b1561080f57600054600154604080516318160ddd60e01b81529051610807926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561074857600080fd5b505afa15801561075c573d6000803e3d6000fd5b505050506040513d602081101561077257600080fd5b5051600654600154604080516318160ddd60e01b8152905161080193612710936107fb9391926001600160a01b03909116916318160ddd916004808301926020929190829003018186803b1580156107c957600080fd5b505afa1580156107dd573d6000803e3d6000fd5b505050506040513d60208110156107f357600080fd5b505190610976565b9061098d565b90610ab3565b109050610501565b60005461080761082c600654600754610ac690919063ffffffff16565b6007546108019061271061098d565b6000610845610903565b156108d757600054600154604080516318160ddd60e01b815290516108ce926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561089357600080fd5b505afa1580156108a7573d6000803e3d6000fd5b505050506040513d60208110156108bd57600080fd5b50516007546108019061271061098d565b10159050610501565b6000546108ce61082c600654600754610ac690919063ffffffff16565b6003546001600160a01b031681565b60008061091b6005544261097690919063ffffffff16565b624f1a00101591505090565b60075481565b6001600160a01b0381166000908152600860205260409020805460ff811691859160ff1916600183600281111561096057fe5b02179055506109708185856109b2565b50505050565b60008282111561098257fe5b508082035b92915050565b60008261099c57506000610987565b50818102818382816109aa57fe5b041461098757fe5b8160028111156109be57fe5b8360028111156109ca57fe5b146106eb5760028360028111156109dd57fe5b14156109f8576006546109f09082610976565b600655610a1d565b6001836002811115610a0657fe5b1415610a1d57600754610a199082610976565b6007555b6002826002811115610a2b57fe5b1415610a4657600654610a3e9082610ac6565b600655610a6b565b6001826002811115610a5457fe5b1415610a6b57600754610a679082610ac6565b6007555b7f8fcc50c2c4edd06d51ae66e9e21ed76b32a1766c57f491788e1aa24a1b58c256600754600654604051808381526020018281526020019250505060405180910390a1505050565b6000818381610abe57fe5b049392505050565b8181018281101561098757fefea2646970667358221220007e5672de0a55d38eb159fbed0799e7a59e4d0e30b56a4143ea300764e024b664736f6c634300070300334e6577206f6666657273206d757374206265206174206c6561737420352520686967686572207468616e207468652070656e64696e67206f666665725468697320636f6e747261637420646f6573206e6f7420726570726573656e7420656e6f75676820657175697479a26469706673582212200ce406a31e6032107987afee43bb56ad764eadf0920fb4b72165d75b8ca1405c64736f6c63430007030033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000092858d98503b78c6a4b86c8f673f6c9556f38b770000000000000000000000000000000000000000000000000000000000001d4c00000000000000000000000000000000000000000000000000000000000000235465737420416b74696f6e617269617420414720447261676761626c65205465726d730000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620002d45760003560e01c80636427ed971162000189578063a457c2d711620000e1578063c6788bdd1162000093578063c6788bdd14620008bc578063d50256251462000922578063dd62ed3e146200092c578063de0e9a3e146200095d578063e1b8c38e14620009a0578063eb470ebf14620009aa57620002d4565b8063a457c2d71462000773578063a4c0ed3614620007a2578063a9059cbb146200082b578063b40e80d1146200085a578063bf376c7a1462000883578063c028df0614620008b257620002d4565b80638fd3ab80116200013b5780638fd3ab8014620006f957806390cf581c146200070357806395d89b41146200070d5780639b56d6c914620007175780639e8a9a5a1462000740578063a3ec1883146200074a57620002d4565b80636427ed9714620006675780636b03ed5f14620006895780636f4b18df146200069357806370a08231146200069d57806377e071ad14620006c65780637dc2cd9814620006ef57620002d4565b80632a0a4ed5116200023d5780634000aea011620001ef5780634000aea0146200057157806341c12a7014620005fa57806342966c68146200060457806349b210b7146200062457806350e70d48146200065357806360918117146200065d57620002d4565b80632a0a4ed514620004bc578063313ce56714620004c657806332a7ae9514620004e65780633549788a146200050f5780633950935114620005195780633bcc45ba146200054857620002d4565b80630cd865ec11620002975780630cd865ec14620003ea578063141c7068146200041557806318160ddd146200041f5780631e3b9de5146200042957806323b872dd146200045257806326773ddd146200048b57620002d4565b806302fb0c5e14620002d957806306fdde0314620002f75780630832e4701462000379578063095ea7b314620003955780630c6f0e5d14620003c4575b600080fd5b620002e3620009d3565b604080519115158252519081900360200190f35b62000301620009dc565b6040805160208082528351818301528351919283929083019185019080838360005b838110156200033d57818101518382015260200162000323565b50505050905090810190601f1680156200036b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6200038362000b97565b60408051918252519081900360200190f35b620002e360048036036040811015620003ad57600080fd5b506001600160a01b03813516906020013562000b9d565b620003ce62000bb6565b604080516001600160a01b039092168252519081900360200190f35b62000413600480360360208110156200040257600080fd5b50356001600160a01b031662000bc5565b005b6200041362000ea9565b62000383620011ca565b620003ce600480360360208110156200044157600080fd5b50356001600160a01b0316620011d0565b620002e3600480360360608110156200046a57600080fd5b506001600160a01b03813581169160208101359091169060400135620011f1565b6200041360048036036040811015620004a357600080fd5b506001600160a01b038135811691602001351662001248565b620003ce62001573565b620004d0620015ec565b6040805160ff9092168252519081900360200190f35b6200041360048036036020811015620004fe57600080fd5b50356001600160a01b0316620015f5565b620003836200185d565b620002e3600480360360408110156200053157600080fd5b506001600160a01b03813516906020013562001863565b620003ce600480360360208110156200056057600080fd5b50356001600160a01b03166200189c565b620002e3600480360360608110156200058957600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115620005b957600080fd5b820183602082011115620005cc57600080fd5b803590602001918460018302840111600160201b83111715620005ee57600080fd5b509092509050620018bd565b6200041362001984565b62000413600480360360208110156200061c57600080fd5b503562001a61565b62000413600480360360408110156200063c57600080fd5b50803590602001356001600160a01b031662001ae5565b620003ce62001f73565b6200038362001f82565b62000413600480360360208110156200067f57600080fd5b5035151562001f88565b6200041362001fa7565b620004136200210c565b6200038360048036036020811015620006b557600080fd5b50356001600160a01b031662002403565b6200038360048036036020811015620006de57600080fd5b50356001600160a01b03166200241e565b62000383620024c0565b62000413620024c6565b6200041362002606565b6200030162002681565b62000383600480360360208110156200072f57600080fd5b50356001600160a01b0316620027f9565b6200038362002817565b620002e3600480360360208110156200076257600080fd5b50356001600160a01b03166200281d565b620002e3600480360360408110156200078b57600080fd5b506001600160a01b0381351690602001356200283c565b6200041360048036036060811015620007ba57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115620007ea57600080fd5b820183602082011115620007fd57600080fd5b803590602001918460018302840111600160201b831117156200081f57600080fd5b50909250905062002875565b620002e3600480360360408110156200084357600080fd5b506001600160a01b03813516906020013562002899565b620002e3600480360360208110156200087257600080fd5b50356001600160a01b0316620028ae565b62000413600480360360408110156200089b57600080fd5b506001600160a01b038135169060200135620028c3565b620003ce620029b3565b620008e560048036036020811015620008d457600080fd5b50356001600160a01b0316620029c2565b60405180856001600160a01b03168152602001848152602001838152602001826001600160a01b0316815260200194505050505060405180910390f35b62000301620029f4565b62000383600480360360408110156200094457600080fd5b506001600160a01b038135811691602001351662002a86565b6200097d600480360360208110156200097557600080fd5b503562002ab1565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6200041362002bc2565b6200038360048036036020811015620009c257600080fd5b50356001600160a01b031662002cde565b600e5460ff1681565b600954604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301926000929190829003018186803b15801562000a2257600080fd5b505afa15801562000a37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101562000a6157600080fd5b8101908080516040519392919084600160201b82111562000a8157600080fd5b90830190602082018581111562000a9757600080fd5b8251600160201b81118282018810171562000ab157600080fd5b82525081516020918201929091019080838360005b8381101562000ae057818101518382015260200162000ac6565b50505050905090810190601f16801562000b0e5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080690223930b3b3b0b13632960b51b815250600a0182805190602001908083835b6020831062000b5e5780518252601f19909201916020918201910162000b3d565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052905090565b600a5481565b600062000bac33848462002cfc565b5060015b92915050565b6007546001600160a01b031681565b62000bcf620035d9565b506001600160a01b038082166000908152600560209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091908162000c67576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b82516001600160a01b0316331462000cc6576040805162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604482015290519081900360640190fd5b4262000ce2600454856040015162002d5e90919063ffffffff16565b111562000d36576040805162461bcd60e51b815260206004820152601960248201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604482015290519081900360640190fd5b82516001600160a01b03808616600090815260056020908152604080832080546001600160a01b031990811682556001820185905560028201859055600390910180549091169055805163a9059cbb60e01b815284861660048201526024810188905290519386169363a9059cbb93604480840194938390030190829087803b15801562000dc357600080fd5b505af115801562000dd8573d6000803e3d6000fd5b505050506040513d602081101562000def57600080fd5b505162000e40576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b62000e57858262000e518862002403565b62002d6c565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee856040518082815260200191505060405180910390a35050505050565b62000eb362002d7e565b801562000ec25750600e5460ff165b62000f07576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b60009054906101000a90046001600160a01b03166001600160a01b0316637150d8ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000f5657600080fd5b505afa15801562000f6b573d6000803e3d6000fd5b505050506040513d602081101562000f8257600080fd5b50516001600160a01b0316331462000f9957600080fd5b600b60009054906101000a90046001600160a01b03166001600160a01b031663d7be4e296040518163ffffffff1660e01b815260040160206040518083038186803b15801562000fe857600080fd5b505afa15801562000ffd573d6000803e3d6000fd5b505050506040513d60208110156200101457600080fd5b50516200105f576040805162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081cdd5c1c1bdc9d60621b604482015290519081900360640190fd5b6200115b33600b60009054906101000a90046001600160a01b03166001600160a01b031663e5a6b10f6040518163ffffffff1660e01b815260040160206040518083038186803b158015620010b357600080fd5b505afa158015620010c8573d6000803e3d6000fd5b505050506040513d6020811015620010df57600080fd5b5051600b546040805163501ad8ff60e11b815290516001600160a01b039092169163a035b1fe91600480820192602092909190829003018186803b1580156200112757600080fd5b505afa1580156200113c573d6000803e3d6000fd5b505050506040513d60208110156200115357600080fd5b505162002d8f565b600b546040805133808252600160208301526001600160a01b039390931660608201526080818301819052600790820152665375636365737360c81b60a082015290517fc88f58ae9feb0742d9422f604dd3c1be6d02818f8dec340c5061f428b554e9759181900360c00190a2565b60025490565b6001600160a01b03808216600090815260056020526040902054165b919050565b60006200120084848462002d6c565b6001600160a01b0384166000908152600160209081526040808320338085529252909120546200123e91869162001238908662002f34565b62002cfc565b5060019392505050565b62001253816200281d565b620012a5576040805162461bcd60e51b815260206004820181905260248201527f436c61696d732064697361626c656420666f7220746869732061646472657373604482015290519081900360640190fd5b6000620012b2836200241e565b90506000811162001303576040805162461bcd60e51b8152602060048201526016602482015275155b9cdd5c1c1bdc9d19590818dbdb1b185d195c985b60521b604482015290519081900360640190fd5b336000620013118462002403565b9050600062001321828562002f47565b9050858262001377576040805162461bcd60e51b815260206004820152601f60248201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604482015290519081900360640190fd5b6001600160a01b03861660009081526005602052604090206001015415620013e6576040805162461bcd60e51b815260206004820152601760248201527f4164647265737320616c726561647920636c61696d6564000000000000000000604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918316916323b872dd916064808201926020929091908290030181600087803b1580156200144057600080fd5b505af115801562001455573d6000803e3d6000fd5b505050506040513d60208110156200146c57600080fd5b5051620014bd576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d8616600081815260058652899020975188549088166001600160a01b0319918216178955935160018901559151600288015551600390960180549690951695909116949094179092558351878152935190937f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535992908290030190a350505050505050565b60095460408051632a0a4ed560e01b815290516000926001600160a01b031691632a0a4ed5916004808301926020929190829003018186803b158015620015b957600080fd5b505afa158015620015ce573d6000803e3d6000fd5b505050506040513d6020811015620015e557600080fd5b5051905090565b60035460ff1681565b620015ff62001573565b6001600160a01b0316336001600160a01b03161462001665576040805162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604482015290519081900360640190fd5b6200166f620035d9565b506001600160a01b03808216600090815260056020908152604091829020825160808101845281548516815260018201549281018390526002820154938101939093526003015490921660608201819052909162001705576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b6001600160a01b03808416600090815260056020908152604080832080546001600160a01b031990811682556001820185905560028201859055600390910180549091169055855186830151825163a9059cbb60e01b81529186166004830152602482015290519385169363a9059cbb93604480840194938390030190829087803b1580156200179457600080fd5b505af1158015620017a9573d6000803e3d6000fd5b505050506040513d6020811015620017c057600080fd5b505162001811576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b815160208084015160408051918252516001600160a01b03938416938716927fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d5928290030190a3505050565b600d5481565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000bac91859062001238908662002d5e565b6001600160a01b039081166000908152600560205260409020600301541690565b600080620018cc868662002899565b905080156200197b57856001600160a01b031663a4c0ed36338787876040518563ffffffff1660e01b815260040180856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156200196157600080fd5b505af115801562001976573d6000803e3d6000fd5b505050505b95945050505050565b6200198e62002d7e565b80156200199d5750600e5460ff165b620019e2576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b546001600160a01b0316634b91562e33620019ff8162002403565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801562001a4657600080fd5b505af115801562001a5b573d6000803e3d6000fd5b50505050565b62001a6d338262002f70565b600954600a546001600160a01b03909116906342966c689062001a9290849062002f47565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801562001ac957600080fd5b505af115801562001ade573d6000803e3d6000fd5b5050505050565b600e5460ff1662001af557600080fd5b60095460408051633a98ef3960e01b815290516000926001600160a01b031691633a98ef3991600480830192602092919082900301818787803b15801562001b3c57600080fd5b505af115801562001b51573d6000803e3d6000fd5b505050506040513d602081101562001b6857600080fd5b5051905062001b8861271062001b8183610bb862002f47565b9062002f7c565b62001b92620011ca565b101562001bd15760405162461bcd60e51b815260040180806020018281038252602e8152602001806200424a602e913960400191505060405180910390fd5b6040517329fe8914e76da5ce2d90de98a64d0055f199d06d906000906729a2241af62c00009082818181858883f1935050505015801562001c16573d6000803e3d6000fd5b506000338385600d5460405162001c2d9062003613565b80856001600160a01b03168152602001846001600160a01b03168152602001838152602001828152602001945050505050604051809103906000f08015801562001c7b573d6000803e3d6000fd5b509050806001600160a01b031663b28fa15262001c983362002403565b62001ca2620011ca565b036040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801562001cd857600080fd5b505afa15801562001ced573d6000803e3d6000fd5b505050506040513d602081101562001d0457600080fd5b505162001d4f576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742066756e64696e6760601b604482015290519081900360640190fd5b62001d5962002d7e565b1562001f0557600b60009054906101000a90046001600160a01b03166001600160a01b031663e5a6b10f6040518163ffffffff1660e01b815260040160206040518083038186803b15801562001dae57600080fd5b505afa15801562001dc3573d6000803e3d6000fd5b505050506040513d602081101562001dda57600080fd5b50516001600160a01b03848116911614801562001e88575062001e8461271062001b81612904600b60009054906101000a90046001600160a01b03166001600160a01b031663a035b1fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801562001e4f57600080fd5b505afa15801562001e64573d6000803e3d6000fd5b505050506040513d602081101562001e7b57600080fd5b50519062002f47565b8410155b62001ec55760405162461bcd60e51b815260040180806020018281038252603c8152602001806200420e603c913960400191505060405180910390fd5b62001f056040518060400160405280601c81526020017f4f66666572207265706c6163656420627920686967686572206269640000000081525062002f90565b600b80546001600160a01b038084166001600160a01b0319909216919091179182905560408051878152868316602082015292909116828201525133917f34e649ce0ed38b68d4a32f1f8fb75a61e4f3a0444c5bae222d20aaf2c3db3677919081900360600190a250505050565b6009546001600160a01b031681565b60085481565b336000908152600660205260409020805460ff19169115919091179055565b33600090815260056020526040902060010154156200210a5733600081815260056020908152604080832060018101805460038301805484546001600160a01b03199081168655938890556002909401879055918316909155825163a9059cbb60e01b8152600481019690965260248601819052915191946001600160a01b0390911693849363a9059cbb93604480850194929391928390030190829087803b1580156200205457600080fd5b505af115801562002069573d6000803e3d6000fd5b505050506040513d60208110156200208057600080fd5b5051620020d1576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b60408051838152905133917f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd919081900360200190a250505b565b6200211662002d7e565b8015620021255750600e5460ff165b6200216a576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b60009054906101000a90046001600160a01b03166001600160a01b03166390e64d136040518163ffffffff1660e01b815260040160206040518083038186803b158015620021b957600080fd5b505afa158015620021ce573d6000803e3d6000fd5b505050506040513d6020811015620021e557600080fd5b5051156200221d576200221760405180604001604052806007815260200166115e1c1a5c995960ca1b81525062002f90565b6200210a565b600b60009054906101000a90046001600160a01b03166001600160a01b031663cf42a9276040518163ffffffff1660e01b815260040160206040518083038186803b1580156200226c57600080fd5b505afa15801562002281573d6000803e3d6000fd5b505050506040513d60208110156200229857600080fd5b505115620022d5576200221760405180604001604052806012815260200171139bdd08195b9bdd59da081cdd5c1c1bdc9d60721b81525062002f90565b600b54604080516338a86c5760e11b815290516001600160a01b039092169163b28fa152916200235b918491637150d8ae916004808301926020929190829003018186803b1580156200232757600080fd5b505afa1580156200233c573d6000803e3d6000fd5b505050506040513d60208110156200235357600080fd5b505162002403565b62002365620011ca565b036040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156200239b57600080fd5b505afa158015620023b0573d6000803e3d6000fd5b505050506040513d6020811015620023c757600080fd5b50516200210a576200210a60405180604001604052806012815260200171496e73756666696369656e742066756e647360701b81525062002f90565b6001600160a01b031660009081526020819052604090205490565b6000806200242c8362003155565b905080156200243d579050620011ec565b6009546001600160a01b03848116911614156200245f575050600a54620011ec565b600a54600954604080516377e071ad60e01b81526001600160a01b0387811660048301529151620024b7949392909216916377e071ad91602480820192602092909190829003018186803b15801562001e4f57600080fd5b915050620011ec565b60045481565b600e5460ff166200250b576040805162461bcd60e51b815260206004820152600a6024820152696e6f742061637469766560b01b604482015290519081900360640190fd5b60003390506200252f61271062001b81600c5462002528620011ca565b9062002f47565b6200253a8262002403565b101562002583576040805162461bcd60e51b8152602060048201526012602482015271145d5bdc9d5b481b9bdd081c995858da195960721b604482015290519081900360640190fd5b6200258d62002d7e565b15620025b9576200259d62001984565b620025a76200210c565b620025b162002d7e565b15620025b957fe5b620025c78182600162002d8f565b604080516001600160a01b038316815290517f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a99181900360200190a150565b6200261062002d7e565b80156200261f5750600e5460ff165b62002664576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b546001600160a01b0316635ff0cf8433620019ff8162002403565b600954604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b158015620026c757600080fd5b505afa158015620026dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200270657600080fd5b8101908080516040519392919084600160201b8211156200272657600080fd5b9083019060208201858111156200273c57600080fd5b8251600160201b8111828201881017156200275657600080fd5b82525081516020918201929091019080838360005b83811015620027855781810151838201526020016200276b565b50505050905090810190601f168015620027b35780820380516001836020036101000a031916815260200191505b506040525050506040516020018080601160fa1b81525060010182805190602001908083836020831062000b5e5780518252601f19909201916020918201910162000b3d565b6001600160a01b031660009081526005602052604090206001015490565b600c5481565b6001600160a01b031660009081526006602052604090205460ff161590565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000bac91859062001238908662002f34565b6009546001600160a01b031633146200288d57600080fd5b62001a5b84846200319c565b6000620028a783836200323a565b9392505050565b60066020526000908152604090205460ff1681565b620028cd62002d7e565b1562002910576040805162461bcd60e51b815260206004820152600d60248201526c6f666665722070656e64696e6760981b604482015290519081900360640190fd5b600954604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156200296b57600080fd5b505af115801562002980573d6000803e3d6000fd5b505050506040513d60208110156200299757600080fd5b5051620029a357600080fd5b620029af82826200319c565b5050565b600b546001600160a01b031681565b60056020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b600f805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801562002a7e5780601f1062002a525761010080835404028352916020019162002a7e565b820191906000526020600020905b81548152906001019060200180831162002a6057829003601f168201915b505050505081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600e54600090819060ff161562002af8576040805162461bcd60e51b815260206004820152600660248201526561637469766560d01b604482015290519081900360640190fd5b62002b04338462002f70565b600062002b1d600a548562002f4790919063ffffffff16565b6009546040805163a9059cbb60e01b81523360048201526024810184905290519293506001600160a01b039091169163a9059cbb916044808201926020929091908290030181600087803b15801562002b7557600080fd5b505af115801562002b8a573d6000803e3d6000fd5b505050506040513d602081101562002ba157600080fd5b505162002bad57600080fd5b6009546001600160a01b031692509050915091565b62002bcc62002d7e565b801562002bdb5750600e5460ff165b62002c20576040805162461bcd60e51b815260206004820152601060248201526f3737903832b73234b7339037b33332b960811b604482015290519081900360640190fd5b600b60009054906101000a90046001600160a01b03166001600160a01b0316637150d8ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801562002c6f57600080fd5b505afa15801562002c84573d6000803e3d6000fd5b505050506040513d602081101562002c9b57600080fd5b50516001600160a01b0316331462002cb257600080fd5b6200210a6040518060400160405280600981526020016810d85b98d95b1b195960ba1b81525062002f90565b6001600160a01b031660009081526005602052604090206002015490565b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b8181018281101562000bb057fe5b62002d7983838362003296565b505050565b600b546001600160a01b0316151590565b600062002d9c8462002403565b9050600062002daa620011ca565b600e805460ff19169055905062002dc18262002ab1565b506000905062002dd2828462002f34565b6009546040805163a9059cbb60e01b81526001600160a01b038a8116600483015260248201859052915193945091169163a9059cbb916044808201926020929091908290030181600087803b15801562002e2b57600080fd5b505af115801562002e40573d6000803e3d6000fd5b505050506040513d602081101562002e5757600080fd5b505162002e6357600080fd5b600980546001600160a01b0319166001600160a01b038781169190911791829055600a869055166323b872dd873062002e9d888662002f47565b6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801562002ef457600080fd5b505af115801562002f09573d6000803e3d6000fd5b505050506040513d602081101562002f2057600080fd5b505162002f2c57600080fd5b505050505050565b60008282111562002f4157fe5b50900390565b60008262002f585750600062000bb0565b508181028183828162002f6757fe5b041462000bb057fe5b620029af82826200333e565b600081838162002f8857fe5b049392505050565b600b54604080516338a86c5760e11b815290516000926001600160a01b031691637150d8ae916004808301926020929190829003018186803b15801562002fd657600080fd5b505afa15801562002feb573d6000803e3d6000fd5b505050506040513d60208110156200300257600080fd5b5051600b546040805133808252600060208381018290526001600160a01b039586166060850181905260809585018681528a51968601969096528951979850958816967fc88f58ae9feb0742d9422f604dd3c1be6d02818f8dec340c5061f428b554e97596939592948a94939092909160a08401918601908083838a5b83811015620030995781810151838201526020016200307f565b50505050905090810190601f168015620030c75780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a2600b60009054906101000a90046001600160a01b03166001600160a01b03166341c0e1b56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200312857600080fd5b505af11580156200313d573d6000803e3d6000fd5b5050600b80546001600160a01b031916905550505050565b60006001600160a01b0382163014156200317257506001620011ec565b6007546001600160a01b0383811691161415620031935750600854620011ec565b506000620011ec565b620031a662002d7e565b15620031e9576040805162461bcd60e51b815260206004820152600d60248201526c6f666665722070656e64696e6760981b604482015290519081900360640190fd5b600e5460ff166200322e576040805162461bcd60e51b815260206004820152600a6024820152696e6f742061637469766560b01b604482015290519081900360640190fd5b620029af8282620033d9565b60006200324883836200347a565b6200328c576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b62000bac62001fa7565b620032a383838362003489565b620032ad62002d7e565b8015620032bc5750600e5460ff165b1562002d7957600b5460408051636240a7d760e11b81526001600160a01b0386811660048301528581166024830152604482018590529151919092169163c4814fae91606480830192600092919082900301818387803b1580156200332057600080fd5b505af115801562003335573d6000803e3d6000fd5b50505050505050565b6200334a82826200354d565b6200335462002d7e565b8015620033635750600e5460ff165b15620029af57600b5460408051636240a7d760e11b81526001600160a01b03858116600483015260006024830181905260448301869052925193169263c4814fae9260648084019391929182900301818387803b158015620033c457600080fd5b505af115801562002f2c573d6000803e3d6000fd5b6001600160a01b038216620033ed57600080fd5b600254620033fc908262002d5e565b6002556001600160a01b03821660009081526020819052604090205462003424908262002d5e565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600062000bac33848462002d6c565b6001600160a01b0382166200349d57600080fd5b6001600160a01b038316600090815260208190526040902054620034c2908262002f34565b6001600160a01b038085166000908152602081905260408082209390935590841681522054620034f3908262002d5e565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6002546200355c908262002f34565b6002556001600160a01b03821660009081526020819052604090205462003584908262002f34565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b604051806080016040528060006001600160a01b03168152602001600081526020016000815260200160006001600160a01b031681525090565b610bec80620036228339019056fe608060405234801561001057600080fd5b50604051610bec380380610bec8339818101604052608081101561003357600080fd5b50805160208201516040830151606090930151919290918161008c576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c696420707269636560981b604482015290519081900360640190fd5b600180546001600160a01b03199081163317909155600280546001600160a01b03968716908316179055600380549490951693169290921790925560049190915560005542600555610b09806100e36000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063b1610d7e116100ad578063cf42a92711610071578063cf42a927146102b4578063d7be4e29146102bc578063e5a6b10f146102c4578063fa7f1bae146102cc578063fb286c65146102d45761012c565b8063b1610d7e14610249578063b28fa15214610251578063b5b47f421461026e578063b80777ea14610276578063c4814fae1461027e5761012c565b80635ff0cf84116100f45780635ff0cf84146101c35780637150d8ae146101ef5780638f1b4c6f1461021357806390e64d1314610239578063a035b1fe146102415761012c565b80630c43cd88146101315780631703a0181461014b57806341c0e1b514610153578063448ab4c61461015d5780634b91562e14610197575b600080fd5b6101396102dc565b60408051918252519081900360200190f35b6101396102e3565b61015b6102e9565b005b6101836004803603602081101561017357600080fd5b50356001600160a01b0316610343565b604080519115158252519081900360200190f35b61015b600480360360408110156101ad57600080fd5b506001600160a01b038135169060200135610376565b61015b600480360360408110156101d957600080fd5b506001600160a01b038135169060200135610421565b6101f76104c8565b604080516001600160a01b039092168252519081900360200190f35b6101836004803603602081101561022957600080fd5b50356001600160a01b03166104d7565b6101836104e0565b610139610504565b61013961050a565b6101836004803603602081101561026757600080fd5b5035610511565b61013961064e565b610139610654565b61015b6004803603606081101561029457600080fd5b506001600160a01b0381358116916020810135909116906040013561065a565b6101836106f0565b61018361083b565b6101f76108f4565b610183610903565b610139610927565b6276a70081565b60005481565b6001546001600160a01b03163314610335576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185c995b9d60b21b604482015290519081900360640190fd5b6002546001600160a01b0316ff5b600060015b6001600160a01b03831660009081526008602052604090205460ff16600281111561036f57fe5b1492915050565b6001546001600160a01b031633146103c2576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185c995b9d60b21b604482015290519081900360640190fd5b6103ca610903565b610411576040805162461bcd60e51b81526020600482015260136024820152722a3432903b37ba32903430b99032b73232b21760691b604482015290519081900360640190fd5b61041d6002828461092d565b5050565b6001546001600160a01b0316331461046d576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185c995b9d60b21b604482015290519081900360640190fd5b610475610903565b6104bc576040805162461bcd60e51b81526020600482015260136024820152722a3432903b37ba32903430b99032b73232b21760691b604482015290519081900360640190fd5b61041d6001828461092d565b6002546001600160a01b031681565b60006002610348565b6000806104f86005544261097690919063ffffffff16565b6276a700109150505b90565b60045481565b624f1a0081565b600354600254604080516370a0823160e01b81526001600160a01b03928316600482015290516000939290921691839183916370a0823191602480820192602092909190829003018186803b15801561056957600080fd5b505afa15801561057d573d6000803e3d6000fd5b505050506040513d602081101561059357600080fd5b505160025460015460408051636eb1769f60e11b81526001600160a01b0393841660048201529183166024830152519293506000929185169163dd62ed3e91604480820192602092909190829003018186803b1580156105f257600080fd5b505afa158015610606573d6000803e3d6000fd5b505050506040513d602081101561061c57600080fd5b505160045490915060009061063290879061098d565b90508281111580156106445750818111155b9695505050505050565b60065481565b60055481565b6001546001600160a01b031633146106a6576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185c995b9d60b21b604482015290519081900360640190fd5b6106ae610903565b156106eb576001600160a01b0380841660009081526008602052604080822054928516825290205460ff91821691166106e88282856109b2565b50505b505050565b60006106fa610903565b1561080f57600054600154604080516318160ddd60e01b81529051610807926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561074857600080fd5b505afa15801561075c573d6000803e3d6000fd5b505050506040513d602081101561077257600080fd5b5051600654600154604080516318160ddd60e01b8152905161080193612710936107fb9391926001600160a01b03909116916318160ddd916004808301926020929190829003018186803b1580156107c957600080fd5b505afa1580156107dd573d6000803e3d6000fd5b505050506040513d60208110156107f357600080fd5b505190610976565b9061098d565b90610ab3565b109050610501565b60005461080761082c600654600754610ac690919063ffffffff16565b6007546108019061271061098d565b6000610845610903565b156108d757600054600154604080516318160ddd60e01b815290516108ce926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561089357600080fd5b505afa1580156108a7573d6000803e3d6000fd5b505050506040513d60208110156108bd57600080fd5b50516007546108019061271061098d565b10159050610501565b6000546108ce61082c600654600754610ac690919063ffffffff16565b6003546001600160a01b031681565b60008061091b6005544261097690919063ffffffff16565b624f1a00101591505090565b60075481565b6001600160a01b0381166000908152600860205260409020805460ff811691859160ff1916600183600281111561096057fe5b02179055506109708185856109b2565b50505050565b60008282111561098257fe5b508082035b92915050565b60008261099c57506000610987565b50818102818382816109aa57fe5b041461098757fe5b8160028111156109be57fe5b8360028111156109ca57fe5b146106eb5760028360028111156109dd57fe5b14156109f8576006546109f09082610976565b600655610a1d565b6001836002811115610a0657fe5b1415610a1d57600754610a199082610976565b6007555b6002826002811115610a2b57fe5b1415610a4657600654610a3e9082610ac6565b600655610a6b565b6001826002811115610a5457fe5b1415610a6b57600754610a679082610ac6565b6007555b7f8fcc50c2c4edd06d51ae66e9e21ed76b32a1766c57f491788e1aa24a1b58c256600754600654604051808381526020018281526020019250505060405180910390a1505050565b6000818381610abe57fe5b049392505050565b8181018281101561098757fefea2646970667358221220007e5672de0a55d38eb159fbed0799e7a59e4d0e30b56a4143ea300764e024b664736f6c634300070300334e6577206f6666657273206d757374206265206174206c6561737420352520686967686572207468616e207468652070656e64696e67206f666665725468697320636f6e747261637420646f6573206e6f7420726570726573656e7420656e6f75676820657175697479a26469706673582212200ce406a31e6032107987afee43bb56ad764eadf0920fb4b72165d75b8ca1405c64736f6c63430007030033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000092858d98503b78c6a4b86c8f673f6c9556f38b770000000000000000000000000000000000000000000000000000000000001d4c00000000000000000000000000000000000000000000000000000000000000235465737420416b74696f6e617269617420414720447261676761626c65205465726d730000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _terms (string): Test Aktionariat AG Draggable Terms
Arg [1] : wrappedToken (address): 0x92858d98503B78C6A4b86C8f673F6c9556F38B77
Arg [2] : quorum (uint256): 7500

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000092858d98503b78c6a4b86c8f673f6c9556f38b77
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001d4c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [4] : 5465737420416b74696f6e617269617420414720447261676761626c65205465
Arg [5] : 726d730000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

3019:1994:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3219:25:3;;;:::i;:::-;;;;;;;;;;;;;;;;;;4336:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2630:41;;;:::i;:::-;;;;;;;;;;;;;;;;2766:154:2;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2766:154:2;;;;;;;;:::i;3382:38:4:-;;;:::i;:::-;;;;-1:-1:-1;;;;;3382:38:4;;;;;;;;;;;;;;10560:732;;;;;;;;;;;;;;;;-1:-1:-1;10560:732:4;-1:-1:-1;;;;;10560:732:4;;:::i;:::-;;8692:561:3;;;:::i;1783:98:2:-;;;:::i;8980:124:4:-;;;;;;;;;;;;;;;;-1:-1:-1;8980:124:4;-1:-1:-1;;;;;8980:124:4;;:::i;3377:261:2:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3377:261:2;;;;;;;;;;;;;;;;;:::i;7971:1003:4:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7971:1003:4;;;;;;;;;;:::i;4226:138:1:-;;;:::i;1620:30:2:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11428:506:4;;;;;;;;;;;;;;;;-1:-1:-1;11428:506:4;-1:-1:-1;;;;;11428:506:4;;:::i;2939:32:3:-;;;:::i;4033:203:2:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4033:203:2;;;;;;;;:::i;9244:134:4:-;;;;;;;;;;;;;;;;-1:-1:-1;9244:134:4;-1:-1:-1;;;;;9244:134:4;;:::i;5813:297:2:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5813:297:2;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5813:297:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5813:297:2;;;;;;;;;;-1:-1:-1;5813:297:2;;-1:-1:-1;5813:297:2;-1:-1:-1;5813:297:2;:::i;7735:104:3:-;;;:::i;6267:157::-;;;;;;;;;;;;;;;;-1:-1:-1;6267:157:3;;:::i;6555:1062::-;;;;;;;;;;;;;;;;-1:-1:-1;6555:1062:3;;;;;;-1:-1:-1;;;;;6555:1062:3;;:::i;2450:21::-;;;:::i;3426:35:4:-;;;:::i;5503:101::-;;;;;;;;;;;;;;;;-1:-1:-1;5503:101:4;;;;:::i;9961:419::-;;;:::i;7993:375:3:-;;;:::i;1939:117:2:-;;;;;;;;;;;;;;;;-1:-1:-1;1939:117:2;-1:-1:-1;;;;;1939:117:2;;:::i;4370:640:1:-;;;;;;;;;;;;;;;;-1:-1:-1;4370:640:1;-1:-1:-1;;;;;4370:640:1;;:::i;3012:37:4:-;;;:::i;9819:478:3:-;;;:::i;7623:106::-;;;:::i;4480:133::-;;;:::i;9110:128:4:-;;;;;;;;;;;;;;;;-1:-1:-1;9110:128:4;-1:-1:-1;;;;;9110:128:4;;:::i;2829:30:3:-;;;:::i;5780:119:4:-;;;;;;;;;;;;;;;;-1:-1:-1;5780:119:4;-1:-1:-1;;;;;5780:119:4;;:::i;4723:213:2:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4723:213:2;;;;;;;;:::i;4619:173:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4619:173:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4619:173:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4619:173:3;;;;;;;;;;-1:-1:-1;4619:173:3;;-1:-1:-1;4619:173:3;-1:-1:-1;4619:173:3;:::i;4070:150:1:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4070:150:1;;;;;;;;:::i;3204:48:4:-;;;;;;;;;;;;;;;;-1:-1:-1;3204:48:4;-1:-1:-1;;;;;3204:48:4;;:::i;4911:193:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4911:193:3;;;;;;;;:::i;2798:24::-;;;:::i;3080:39:4:-;;;;;;;;;;;;;;;;-1:-1:-1;3080:39:4;-1:-1:-1;;;;;3080:39:4;;:::i;:::-;;;;;-1:-1:-1;;;;;3080:39:4;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3080:39:4;;;;;;;;;;;;;;;;;;3120:19:1;;;:::i;2487:141:2:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2487:141:2;;;;;;;;;;:::i;5372:385:3:-;;;;;;;;;;;;;;;;-1:-1:-1;5372:385:3;;:::i;:::-;;;;-1:-1:-1;;;;;5372:385:3;;;;;;;;;;;;;;;;;;;;;7845:142;;;:::i;9384:126:4:-;;;;;;;;;;;;;;;;-1:-1:-1;9384:126:4;-1:-1:-1;;;;;9384:126:4;;:::i;3219:25:3:-;;;;;;:::o;4336:138::-;4451:7;;:14;;;-1:-1:-1;;;4451:14:3;;;;4382:13;;-1:-1:-1;;;;;4451:7:3;;:12;;:14;;;;;:7;;:14;;;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4451:14:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4451:14:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4451:14:3;;;;;;-1:-1:-1;4451:14:3;;;;;;;;;;-1:-1:-1;4451:14:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4420:46;;;;;;-1:-1:-1;;;4420:46:3;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4420:46:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4406:61;;4336:138;:::o;2630:41::-;;;;:::o;2766:154:2:-;2840:4;2856:36;2865:10;2877:7;2886:5;2856:8;:36::i;:::-;-1:-1:-1;2909:4:2;2766:154;;;;;:::o;3382:38:4:-;;;-1:-1:-1;;;;;3382:38:4;;:::o;10560:732::-;10615:18;;:::i;:::-;-1:-1:-1;;;;;;10636:19:4;;;;;;;:6;:19;;;;;;;;;10615:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10774:15;10766:42;;;;;-1:-1:-1;;;10766:42:4;;;;;;;;;;;;-1:-1:-1;;;10766:42:4;;;;;;;;;;;;;;;10826:14;;-1:-1:-1;;;;;10826:28:4;10844:10;10826:28;10818:72;;;;;-1:-1:-1;;;10818:72:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;10944:15;10908:32;10928:11;;10908:5;:15;;;:19;;:32;;;;:::i;:::-;:51;;10900:89;;;;;-1:-1:-1;;;10900:89:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;11018:14;;-1:-1:-1;;;;;11049:19:4;;;10999:16;11049:19;;;:6;:19;;;;;;;;11042:26;;-1:-1:-1;;;;;;11042:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;11086:39;;-1:-1:-1;;;11086:39:4;;;;;;;;;;;;;;;;;:17;;;;;;:39;;;;;11049:19;11086:39;;;;;;;:17;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11086:39:4;11078:78;;;;;-1:-1:-1;;;11078:78:4;;;;;;;;;;;;-1:-1:-1;;;11078:78:4;;;;;;;;;;;;;;;11166:56;11176:11;11189:8;11199:22;11209:11;11199:9;:22::i;:::-;11166:9;:56::i;:::-;11264:8;-1:-1:-1;;;;;11237:48:4;11251:11;-1:-1:-1;;;;;11237:48:4;;11274:10;11237:48;;;;;;;;;;;;;;;;;;10560:732;;;;;:::o;8692:561:3:-;11241:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;11258:6:3;;;;11241:23;11233:52;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;;;;8777:5:::1;;;;;;;;;-1:-1:-1::0;;;;;8777:5:3::1;-1:-1:-1::0;;;;;8777:11:3::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8777:13:3;-1:-1:-1;;;;;8763:27:3::1;:10;:27;8755:36;;;::::0;::::1;;8809:5;;;;;;;;;-1:-1:-1::0;;;;;8809:5:3::1;-1:-1:-1::0;;;;;8809:21:3::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8809:23:3;8801:56:::1;;;::::0;;-1:-1:-1;;;8801:56:3;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8801:56:3;;;;;;;;;;;;;::::1;;9035:59;9050:10;9062:5;;;;;;;;;-1:-1:-1::0;;;;;9062:5:3::1;-1:-1:-1::0;;;;;9062:14:3::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;9062:16:3;9080:5:::1;::::0;:13:::1;::::0;;-1:-1:-1;;;9080:13:3;;;;-1:-1:-1;;;;;9080:5:3;;::::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;9062:16:::1;::::0;9080:13;;;;;;;;:5;:13;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;9080:13:3;9035:14:::1;:59::i;:::-;9230:5;::::0;9109:137:::1;::::0;;9133:10:::1;9109:137:::0;;;9181:4:::1;9109:137;::::0;::::1;::::0;-1:-1:-1;;;;;9230:5:3;;;::::1;9109:137:::0;;;;;;;;;;;::::1;::::0;;;;-1:-1:-1;;;9109:137:3;;;;;;::::1;::::0;;;;;;;::::1;8692:561::o:0;1783:98:2:-;1862:12;;1783:98;:::o;8980:124:4:-;-1:-1:-1;;;;;9069:19:4;;;9043:7;9069:19;;;:6;:19;;;;;:28;;8980:124;;;;:::o;3377:261:2:-;3475:4;3491:36;3501:6;3509:9;3520:6;3491:9;:36::i;:::-;-1:-1:-1;;;;;3566:19:2;;;;;;:11;:19;;;;;;;;3554:10;3566:31;;;;;;;;;3537:73;;3546:6;;3566:43;;3602:6;3566:35;:43::i;:::-;3537:8;:73::i;:::-;-1:-1:-1;3627:4:2;3377:261;;;;;:::o;7971:1003:4:-;8062:30;8080:11;8062:17;:30::i;:::-;8054:75;;;;;-1:-1:-1;;;8054:75:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8139:22;8164:33;8182:14;8164:17;:33::i;:::-;8139:58;;8232:1;8215:14;:18;8207:53;;;;;-1:-1:-1;;;8207:53:4;;;;;;;;;;;;-1:-1:-1;;;8207:53:4;;;;;;;;;;;;;;;8289:10;8270:16;8327:22;8337:11;8327:9;:22::i;:::-;8309:40;-1:-1:-1;8359:18:4;8380:27;8309:40;8392:14;8380:11;:27::i;:::-;8359:48;-1:-1:-1;8442:14:4;8475:11;8467:55;;;;;-1:-1:-1;;;8467:55:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8540:19:4;;;;;;:6;:19;;;;;:30;;;:35;8532:71;;;;;-1:-1:-1;;;8532:71:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;8621:58;;;-1:-1:-1;;;8621:58:4;;-1:-1:-1;;;;;8621:58:4;;;;;;;8661:4;8621:58;;;;;;;;;;;;:21;;;;;;:58;;;;;;;;;;;;;;;-1:-1:-1;8621:21:4;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8621:58:4;8613:97;;;;;-1:-1:-1;;;8613:97:4;;;;;;;;;;;;-1:-1:-1;;;8613:97:4;;;;;;;;;;;;;;;8743:167;;;;;;;;-1:-1:-1;;;;;8743:167:4;;;;;;;;;;;;;8842:15;8743:167;;;;;;;;;;;;;;;8721:19;;;-1:-1:-1;8721:19:4;;;:6;:19;;;;;:189;;;;;;;-1:-1:-1;;;;;;8721:189:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8926:41;;;;;;;8743:167;;8926:41;;;;;;;;;7971:1003;;;;;;;:::o;4226:138:1:-;4330:7;;4309:48;;;-1:-1:-1;;;4309:48:1;;;;4283:7;;-1:-1:-1;;;;;4330:7:1;;4309:46;;:48;;;;;;;;;;;;;;4330:7;4309:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4309:48:1;;-1:-1:-1;4226:138:1;:::o;1620:30:2:-;;;;;;:::o;11428:506:4:-;11509:17;:15;:17::i;:::-;-1:-1:-1;;;;;11495:31:4;:10;-1:-1:-1;;;;;11495:31:4;;11487:68;;;;;-1:-1:-1;;;11487:68:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;11565:18;;:::i;:::-;-1:-1:-1;;;;;;11586:19:4;;;;;;;:6;:19;;;;;;;;;11565:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11669:48;;;;;-1:-1:-1;;;11669:48:4;;;;;;;;;;;;-1:-1:-1;;;11669:48:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;11734:19:4;;;;;;;:6;:19;;;;;;;;11727:26;;-1:-1:-1;;;;;;11727:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;11789:14;;11805:16;;;;11771:51;;-1:-1:-1;;;11771:51:4;;;;;;;;;;;;;;;:17;;;;;;:51;;;;;11734:19;11771:51;;;;;;;:17;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11771:51:4;11763:90;;;;;-1:-1:-1;;;11763:90:4;;;;;;;;;;;;-1:-1:-1;;;11763:90:4;;;;;;;;;;;;;;;11894:14;;11910:16;;;;;11868:59;;;;;;;-1:-1:-1;;;;;11868:59:4;;;;;;;;;;;;;;;11428:506;;;:::o;2939:32:3:-;;;;:::o;4033:203:2:-;4138:10;4113:4;4159:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4159:32:2;;;;;;;;;;4113:4;;4129:79;;4150:7;;4159:48;;4196:10;4159:36;:48::i;9244:134:4:-;-1:-1:-1;;;;;9339:19:4;;;9313:7;9339:19;;;:6;:19;;;;;:32;;;;;9244:134::o;5813:297:2:-;5907:4;5923:12;5938:27;5947:9;5958:6;5938:8;:27::i;:::-;5923:42;;5979:7;5975:105;;;6017:9;-1:-1:-1;;;;;6001:42:2;;6044:10;6056:6;6064:4;;6001:68;;;;;;;;;;;;;-1:-1:-1;;;;;6001:68:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5975:105;6096:7;5813:297;-1:-1:-1;;;;;5813:297:2:o;7735:104:3:-;11241:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;11258:6:3;;;;11241:23;11233:52;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;;;;7785:5:::1;::::0;-1:-1:-1;;;;;7785:5:3::1;:12;7798:10;7810:21;7798:10:::0;7810:9:::1;:21::i;:::-;7785:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;7785:47:3::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7735:104::o:0;6267:157::-;6314:25;6320:10;6332:6;6314:5;:25::i;:::-;6367:7;;6393:22;;-1:-1:-1;;;;;6367:7:3;;;;6349:32;;6382:34;;:6;;:10;:34::i;:::-;6349:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6267:157;:::o;6555:1062::-;6650:6;;;;6642:15;;;;;;6705:7;;6689:39;;;-1:-1:-1;;;6689:39:3;;;;6667:19;;-1:-1:-1;;;;;6705:7:3;;6689:37;;:39;;;;;;;;;;;;;;6667:19;6705:7;6689:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6689:39:3;;-1:-1:-1;6763:48:3;6805:5;6763:37;6689:39;3117:4;6763:15;:37::i;:::-;:41;;:48::i;:::-;6746:13;:11;:13::i;:::-;:65;;6738:124;;;;-1:-1:-1;;;6738:124:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6950:60;;:42;;:60;;7002:7;;6950:60;;;;7002:7;6950:42;:60;;;;;;;;;;;;;;;;;;;;;7021:20;7060:10;7072:8;7082:13;7097:17;;7044:71;;;;;:::i;:::-;;;-1:-1:-1;;;;;7044:71:3;;;;;;-1:-1:-1;;;;;7044:71:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7021:94;;7133:8;-1:-1:-1;;;;;7133:21:3;;7171;7181:10;7171:9;:21::i;:::-;7155:13;:11;:13::i;:::-;:37;7133:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7133:60:3;7125:93;;;;;-1:-1:-1;;;7125:93:3;;;;;;;;;;;;-1:-1:-1;;;7125:93:3;;;;;;;;;;;;;;;7232:13;:11;:13::i;:::-;7228:276;;;7281:5;;;;;;;;;-1:-1:-1;;;;;7281:5:3;-1:-1:-1;;;;;7281:14:3;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7281:16:3;-1:-1:-1;;;;;7269:28:3;;;;;;:98;;;;;7318:49;7361:5;7318:38;3017:5;7318;;;;;;;;;-1:-1:-1;;;;;7318:5:3;-1:-1:-1;;;;;7318:11:3;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7318:13:3;;:17;:38::i;:49::-;7301:13;:66;;7269:98;7261:171;;;;-1:-1:-1;;;7261:171:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7446:47;;;;;;;;;;;;;;;;;;:15;:47::i;:::-;7513:5;:16;;-1:-1:-1;;;;;7513:16:3;;;-1:-1:-1;;;;;;7513:16:3;;;;;;;;;;;7545:65;;;;;;;;;;;;;7603:5;;;;7545:65;;;;;7558:10;;7545:65;;;;;;;;;;6555:1062;;;;:::o;2450:21::-;;;-1:-1:-1;;;;;2450:21:3;;:::o;3426:35:4:-;;;;:::o;5503:101::-;5575:10;5558:28;;;;:16;:28;;;;;:39;;-1:-1:-1;;5558:39:4;5589:8;;5558:39;;;;;;5503:101::o;9961:419::-;10011:10;10004:18;;;;:6;:18;;;;;:29;;;:34;10000:374;;10082:10;10054:18;10075;;;:6;:18;;;;;;;;:29;;;;;10143:31;;;;;10189:25;;-1:-1:-1;;;;;;10189:25:4;;;;;;;;;-1:-1:-1;10189:25:4;;;;;;;;;;;;10236:41;;-1:-1:-1;;;10236:41:4;;;;;;;;;;;;;;;;;10075:29;;-1:-1:-1;;;;;10143:31:4;;;;;;10236:17;;:41;;;;;10075:18;;10236:41;;;;;;;;;10143:31;10236:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10236:41:4;10228:80;;;;;-1:-1:-1;;;10228:80:4;;;;;;;;;;;;-1:-1:-1;;;10228:80:4;;;;;;;;;;;;;;;10327:36;;;;;;;;10340:10;;10327:36;;;;;;;;;;10000:374;;;9961:419::o;7993:375:3:-;11241:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;11258:6:3;;;;11241:23;11233:52;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;;;;8059:5:::1;;;;;;;;;-1:-1:-1::0;;;;;8059:5:3::1;-1:-1:-1::0;;;;;8059:16:3::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8059:18:3;8055:307:::1;;;8093:26;;;;;;;;;;;;;;-1:-1:-1::0;;;8093:26:3::1;;::::0;:15:::1;:26::i;:::-;8055:307;;;8140:5;;;;;;;;;-1:-1:-1::0;;;;;8140:5:3::1;-1:-1:-1::0;;;;;8140:21:3::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8140:23:3;8136:226:::1;;;8179:37;;;;;;;;;;;;;;-1:-1:-1::0;;;8179:37:3::1;;::::0;:15:::1;:37::i;8136:226::-;8238:5;::::0;8283:13:::1;::::0;;-1:-1:-1;;;8283:13:3;;;;-1:-1:-1;;;;;8238:5:3;;::::1;::::0;:18:::1;::::0;8273:24:::1;::::0;8238:5;;8283:11:::1;::::0;:13:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;8238:5;8283:13;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8283:13:3;8273:9:::1;:24::i;:::-;8257:13;:11;:13::i;:::-;:40;8238:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8238:60:3;8233:129:::1;;8314:37;;;;;;;;;;;;;;-1:-1:-1::0;;;8314:37:3::1;;::::0;:15:::1;:37::i;1939:117:2:-:0;-1:-1:-1;;;;;2031:18:2;2005:7;2031:18;;;;;;;;;;;;1939:117::o;4370:640:1:-;4451:7;4470:12;4485:39;4509:14;4485:23;:39::i;:::-;4470:54;-1:-1:-1;4538:8:1;;4534:470;;4569:4;-1:-1:-1;4562:11:1;;4534:470;4620:7;;-1:-1:-1;;;;;4594:34:1;;;4620:7;;4594:34;4590:414;;;-1:-1:-1;;4651:22:1;;4644:29;;4590:414;4970:22;;4922:7;;4901:64;;;-1:-1:-1;;;4901:64:1;;-1:-1:-1;;;;;4901:64:1;;;;;;;;;:92;;4970:22;4922:7;;;;;4901:48;;:64;;;;;;;;;;;;;;;4922:7;4901:64;;;;;;;;;;:92;4894:99;;;;;3012:37:4;;;;:::o;9819:478:3:-;9863:6;;;;9855:29;;;;;-1:-1:-1;;;9855:29:3;;;;;;;;;;;;-1:-1:-1;;;9855:29:3;;;;;;;;;;;;;;;9894:17;9914:10;9894:30;;9966:45;10005:5;9966:34;9984:15;;9966:13;:11;:13::i;:::-;:17;;:34::i;:45::-;9942:20;9952:9;9942;:20::i;:::-;:69;;9934:100;;;;;-1:-1:-1;;;9934:100:3;;;;;;;;;;;;-1:-1:-1;;;9934:100:3;;;;;;;;;;;;;;;10049:13;:11;:13::i;:::-;10045:152;;;10078:8;:6;:8::i;:::-;10130:20;:18;:20::i;:::-;10172:13;:11;:13::i;:::-;10171:14;10164:22;;;;10207:39;10222:9;10233;10244:1;10207:14;:39::i;:::-;10261:29;;;-1:-1:-1;;;;;10261:29:3;;;;;;;;;;;;;;;9819:478;:::o;7623:106::-;11241:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;11258:6:3;;;;11241:23;11233:52;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;;;;7674:5:::1;::::0;-1:-1:-1;;;;;7674:5:3::1;:13;7688:10;7700:21;7688:10:::0;7700:9:::1;:21::i;4480:133::-:0;4588:7;;:16;;;-1:-1:-1;;;4588:16:3;;;;4528:13;;-1:-1:-1;;;;;4588:7:3;;:14;;:16;;;;;:7;;:16;;;;;;;:7;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4588:16:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4588:16:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4588:16:3;;;;;;-1:-1:-1;4588:16:3;;;;;;;;;;-1:-1:-1;4588:16:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4566:39;;;;;;-1:-1:-1;;;4566:39:3;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4566:39:3;;;;;;;;;;;;9110:128:4;-1:-1:-1;;;;;9201:19:4;9175:7;9201:19;;;:6;:19;;;;;:30;;;;9110:128::o;2829:30:3:-;;;;:::o;5780:119:4:-;-1:-1:-1;;;;;5868:24:4;5844:4;5868:24;;;:16;:24;;;;;;;;5867:25;;5780:119::o;4723:213:2:-;4833:10;4808:4;4854:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4854:32:2;;;;;;;;;;4808:4;;4824:84;;4845:7;;4854:53;;4891:15;4854:36;:53::i;4619:173:3:-;4746:7;;-1:-1:-1;;;;;4746:7:3;4724:10;:30;4716:39;;;;;;4765:20;4772:4;4778:6;4765;:20::i;4070:150:1:-;4165:4;4188:25;4203:2;4207:5;4188:14;:25::i;:::-;4181:32;4070:150;-1:-1:-1;;;4070:150:1:o;3204:48:4:-;;;;;;;;;;;;;;;:::o;4911:193:3:-;11354:13;:11;:13::i;:::-;11353:14;11345:40;;;;;-1:-1:-1;;;11345:40:3;;;;;;;;;;;;-1:-1:-1;;;11345:40:3;;;;;;;;;;;;;;;5004:7:::1;::::0;:55:::1;::::0;;-1:-1:-1;;;5004:55:3;;5025:10:::1;5004:55;::::0;::::1;::::0;5045:4:::1;5004:55:::0;;;;;;;;;;;;-1:-1:-1;;;;;5004:7:3;;::::1;::::0;:20:::1;::::0;:55;;;;;::::1;::::0;;;;;;;;;:7:::1;::::0;:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;5004:55:3;4996:64:::1;;;::::0;::::1;;5070:27;5077:11;5090:6;5070;:27::i;:::-;4911:193:::0;;:::o;2798:24::-;;;-1:-1:-1;;;;;2798:24:3;;:::o;3080:39:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3080:39:4;;;;;;;;:::o;3120:19:1:-;;;;;;;;;;;;;;;-1:-1:-1;;3120:19:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2487:141:2:-;-1:-1:-1;;;;;2594:18:2;;;2568:7;2594:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2487:141::o;5372:385:3:-;5457:6;;5420:7;;;;5457:6;;5456:7;5448:26;;;;;-1:-1:-1;;;5448:26:3;;;;;;;;;;;;-1:-1:-1;;;5448:26:3;;;;;;;;;;;;;;;5484:25;5490:10;5502:6;5484:5;:25::i;:::-;5519:23;5545:34;5556:22;;5545:6;:10;;:34;;;;:::i;:::-;5597:7;;:45;;;-1:-1:-1;;;5597:45:3;;5614:10;5597:45;;;;;;;;;;;;5519:60;;-1:-1:-1;;;;;;5597:7:3;;;;:16;;:45;;;;;;;;;;;;;;;:7;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5597:45:3;5589:54;;;;;;5669:7;;-1:-1:-1;;;;;5669:7:3;;-1:-1:-1;5679:15:3;-1:-1:-1;5372:385:3;;;:::o;7845:142::-;11241:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;11258:6:3;;;;11241:23;11233:52;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;-1:-1:-1;;;11233:52:3;;;;;;;;;;;;;;;7928:5:::1;;;;;;;;;-1:-1:-1::0;;;;;7928:5:3::1;-1:-1:-1::0;;;;;7928:11:3::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;7928:13:3;-1:-1:-1;;;;;7914:27:3::1;:10;:27;7906:36;;;::::0;::::1;;7952:28;;;;;;;;;;;;;;-1:-1:-1::0;;;7952:28:3::1;;::::0;:15:::1;:28::i;9384:126:4:-:0;-1:-1:-1;;;;;9474:19:4;9448:7;9474:19;;;:6;:19;;;;;:29;;;;9384:126::o;7630:172:2:-;-1:-1:-1;;;;;7714:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;7764:31;;;;;;;;;;;;;;;;;7630:172;;;:::o;1373:137:8:-;1456:5;;;1478:6;;;;1471:14;;;3914:150:1;4025:32;4041:4;4047:2;4051:5;4025:15;:32::i;:::-;3914:150;;;:::o;11089:104:3:-;11166:5;;-1:-1:-1;;;;;11166:5:3;11158:28;;11089:104;:::o;9259:554::-;9364:20;9387:19;9397:8;9387:9;:19::i;:::-;9364:42;;9416:21;9440:13;:11;:13::i;:::-;9463:6;:14;;-1:-1:-1;;9463:14:3;;;9416:37;-1:-1:-1;9487:20:3;9494:12;9487:6;:20::i;:::-;-1:-1:-1;9517:17:3;;-1:-1:-1;9537:31:3;:13;9555:12;9537:17;:31::i;:::-;9586:7;;:37;;;-1:-1:-1;;;9586:37:3;;-1:-1:-1;;;;;9586:37:3;;;;;;;;;;;;;;;9517:51;;-1:-1:-1;9586:7:3;;;:16;;:37;;;;;;;;;;;;;;;:7;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9586:37:3;9578:46;;;;;;9634:7;:28;;-1:-1:-1;;;;;;9634:28:3;-1:-1:-1;;;;;9634:28:3;;;;;;;;;;;9672:22;:39;;;9729:7;:20;9750:8;9768:4;9775:29;9672:39;9794:9;9775:18;:29::i;:::-;9729:76;;;;;;;;;;;;;-1:-1:-1;;;;;9729:76:3;;;;;;-1:-1:-1;;;;;9729:76:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9729:76:3;9721:85;;;;;;9259:554;;;;;;:::o;1189:120:8:-;1247:7;1278:1;1273;:6;;1266:14;;;;-1:-1:-1;1297:5:8;;;1189:120::o;288:413::-;346:9;588:6;584:45;;-1:-1:-1;617:1:8;610:8;;584:45;-1:-1:-1;643:5:8;;;647:1;643;:5;:1;665:5;;;;;:10;658:18;;;3766:142:1;3873:28;3885:7;3894:6;3873:11;:28::i;785:290:8:-;843:7;1067:1;1063;:5;;;;;;;785:290;-1:-1:-1;;;785:290:8:o;8374:312:3:-;8457:5;;:13;;;-1:-1:-1;;;8457:13:3;;;;8441;;-1:-1:-1;;;;;8457:5:3;;:11;;:13;;;;;;;;;;;;;;:5;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8457:13:3;8600:5;;8485:131;;;8528:10;8485:131;;;8552:5;8457:13;8485:131;;;;;;-1:-1:-1;;;;;8600:5:3;;;8485:131;;;;;;;;;;;;;;;;;;;;;;;;8457:13;;-1:-1:-1;8485:131:3;;;;;;8528:10;;8552:5;;8571:7;;8600:5;8485:131;;;;;;;;;;;;;;8552:5;8485:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8626:5;;;;;;;;;-1:-1:-1;;;;;8626:5:3;-1:-1:-1;;;;;8626:10:3;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8648:5:3;:31;;-1:-1:-1;;;;;;8648:31:3;;;-1:-1:-1;;;;8374:312:3:o;3789:319:4:-;3869:7;-1:-1:-1;;;;;3892:31:4;;3918:4;3892:31;3888:214;;;-1:-1:-1;3946:1:4;3939:8;;3888:214;3986:23;;-1:-1:-1;;;;;3968:41:4;;;3986:23;;3968:41;3964:138;;;-1:-1:-1;4032:20:4;;4025:27;;3964:138;-1:-1:-1;4090:1:4;4083:8;;5110:161:3;11354:13;:11;:13::i;:::-;11353:14;11345:40;;;;;-1:-1:-1;;;11345:40:3;;;;;;;;;;;;-1:-1:-1;;;11345:40:3;;;;;;;;;;;;;;;5207:6:::1;::::0;::::1;;5199:29;;;::::0;;-1:-1:-1;;;5199:29:3;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;5199:29:3;;;;;;;;;;;;;::::1;;5238:26;5244:11;5257:6;5238:5;:26::i;9516:213:4:-:0;9602:4;9626:33;9641:9;9652:6;9626:14;:33::i;:::-;9618:61;;;;;-1:-1:-1;;;9618:61:4;;;;;;;;;;;;-1:-1:-1;;;9618:61:4;;;;;;;;;;;;;;;9689:12;:10;:12::i;10617:232:3:-;10713:32;10729:4;10735:2;10739:5;10713:15;:32::i;:::-;10759:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;10776:6:3;;;;10759:23;10755:88;;;10798:5;;:34;;;-1:-1:-1;;;10798:34:3;;-1:-1:-1;;;;;10798:34:3;;;;;;;;;;;;;;;;;;;;;;:5;;;;;:17;;:34;;;;;:5;;:34;;;;;;;:5;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10617:232;;;:::o;10855:228::-;10939:28;10951:7;10960:6;10939:11;:28::i;:::-;10981:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;10998:6:3;;;;10981:23;10977:100;;;11020:5;;:46;;;-1:-1:-1;;;11020:46:3;;-1:-1:-1;;;;;11020:46:3;;;;;;;:5;:46;;;;;;;;;;;;;;:5;;;:17;;:46;;;;;:5;;:46;;;;;;:5;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;6380:275:2;-1:-1:-1;;;;;6463:21:2;;6455:30;;;;;;6511:12;;:24;;6528:6;6511:16;:24::i;:::-;6496:12;:39;-1:-1:-1;;;;;6566:18:2;;:9;:18;;;;;;;;;;;:30;;6589:6;6566:22;:30::i;:::-;-1:-1:-1;;;;;6545:18:2;;:9;:18;;;;;;;;;;;:51;;;;6611:37;;;;;;;6545:18;;:9;;6611:37;;;;;;;;;;6380:275;;:::o;2259:170::-;2345:4;2361:40;2371:10;2383:9;2394:6;2361:9;:40::i;5410:311::-;-1:-1:-1;;;;;5515:23:2;;5507:32;;;;;;-1:-1:-1;;;;;5570:17:2;;:9;:17;;;;;;;;;;;:29;;5592:6;5570:21;:29::i;:::-;-1:-1:-1;;;;;5550:17:2;;;:9;:17;;;;;;;;;;;:49;;;;5632:20;;;;;;;:32;;5657:6;5632:24;:32::i;:::-;-1:-1:-1;;;;;5609:20:2;;;:9;:20;;;;;;;;;;;;:55;;;;5679:35;;;;;;;5609:20;;5679:35;;;;;;;;;;;;;5410:311;;;:::o;6975:230::-;7064:12;;:23;;7081:5;7064:16;:23::i;:::-;7049:12;:38;-1:-1:-1;;;;;7118:18:2;;:9;:18;;;;;;;;;;;:29;;7141:5;7118:22;:29::i;:::-;-1:-1:-1;;;;;7097:18:2;;:9;:18;;;;;;;;;;;:50;;;;7162:36;;;;;;;7097:9;;7162:36;;;;;;;;;;;6975:230;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o

Swarm Source

ipfs://0ce406a31e6032107987afee43bb56ad764eadf0920fb4b72165d75b8ca1405c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.