More Info
Private Name Tags
ContractCreator:
TokenTracker
Sponsored
Latest 15 from a total of 15 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Approve | 17832105 | 846 days 3 hrs ago | IN | 0 MATIC | 0.00280164 | ||||
Transfer | 17785907 | 847 days 8 hrs ago | IN | 0 MATIC | 0.00157704 | ||||
Transfer | 17785707 | 847 days 8 hrs ago | IN | 0 MATIC | 0.00224379 | ||||
Prepare For Exch... | 17783216 | 847 days 10 hrs ago | IN | 0 MATIC | 0.00062008 | ||||
Transfer | 17778692 | 847 days 13 hrs ago | IN | 0 MATIC | 0.00211072 | ||||
Set Trading Is E... | 17778678 | 847 days 13 hrs ago | IN | 0 MATIC | 0.00014409 | ||||
After Pre Sale | 17778660 | 847 days 13 hrs ago | IN | 0 MATIC | 0.00024993 | ||||
Transfer From | 17762984 | 847 days 22 hrs ago | IN | 0 MATIC | 0.0045212 | ||||
Claim | 17762805 | 847 days 22 hrs ago | IN | 0 MATIC | 0.00011222 | ||||
After Pre Sale | 17762783 | 847 days 22 hrs ago | IN | 0 MATIC | 0.00024781 | ||||
Approve | 17762666 | 847 days 22 hrs ago | IN | 0 MATIC | 0.00038069 | ||||
Claim | 17762636 | 847 days 23 hrs ago | IN | 0 MATIC | 0.00099602 | ||||
After Pre Sale | 17750118 | 848 days 7 hrs ago | IN | 0 MATIC | 0.00020804 | ||||
After Pre Sale | 17671031 | 850 days 9 hrs ago | IN | 0 MATIC | 0.00115943 | ||||
0x60a06040 | 17670958 | 850 days 9 hrs ago | IN | Create: PolyAVC | 0 MATIC | 0.06621067 |
Latest 2 internal transactions
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
17670958 | 850 days 9 hrs ago | Contract Creation | 0 MATIC | |||
17670958 | 850 days 9 hrs ago | Contract Creation | 0 MATIC |
Loading...
Loading
Contract Name:
PolyAVC
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-08-06 */ // SPDX-License-Identifier: Unlicensed pragma solidity ^0.8.6; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned).x * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address private _previousOwner; uint256 private _lockTime; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } //Locks the contract for owner for the amount of time provided function lock(uint256 time) public virtual onlyOwner { _previousOwner = _owner; _owner = address(0); _lockTime = block.timestamp + time; emit OwnershipTransferred(_owner, address(0)); } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) public _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _decimals = 9; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * TokenOneer and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual 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(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal virtual { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } //////////////////////////////// ////////// Dividend //////////// //////////////////////////////// /* @title Dividend-Paying Token Interface @author Roger Wu (https://github.com/roger-wu) @dev An interface for a dividend-paying token contract. */ interface IDividendPayingToken { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns(uint256); /// @notice Distributes ether to token holders as dividends. /// @dev SHOULD distribute the paid ether to token holders as dividends. /// SHOULD NOT directly transfer ether to token holders in this function. /// MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0. function distributeDividends() external payable; /// @notice Withdraws the ether distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ether is distributed to token holders. /// @param from The address which sends ether to this contract. /// @param weiAmount The amount of distributed ether in wei. event DividendsDistributed( address indexed from, uint256 weiAmount ); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ether from this contract. /// @param weiAmount The amount of withdrawn ether in wei. event DividendWithdrawn( address indexed to, uint256 weiAmount ); } /* @title Dividend-Paying Token Optional Interface @author Roger Wu (https://github.com/roger-wu) @dev OPTIONAL functions for a dividend-paying token contract. */ interface IDividendPayingTokenOptional { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns(uint256); } /* @title Dividend-Paying Token @author Roger Wu (https://github.com/roger-wu) @dev A mintable ERC20 token that allows anyone to pay and distribute ether to token holders as dividends and allows token holders to withdraw their dividends. Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code */ contract DividendPayingToken is ERC20, IDividendPayingToken, IDividendPayingTokenOptional { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; uint256 internal lastAmount; address public dividendToken; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; constructor(string memory _name, string memory _symbol, address _token) ERC20(_name, _symbol) { dividendToken = _token; } receive() external payable { } /// @notice Distributes ether to token holders as dividends. /// @dev It reverts if the total supply of tokens is 0. /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0. /// About undistributed ether: /// In each distribution, there is a small amount of ether not distributed, /// the magnified amount of which is /// `(msg.value * magnitude) % totalSupply()`. /// With a well-chosen `magnitude`, the amount of undistributed ether /// (de-magnified) in a distribution can be less than 1 wei. /// We can actually keep track of the undistributed ether in a distribution /// and try to distribute it in the next distribution, /// but keeping track of such data on-chain costs much more than /// the saved ether, so we don't do that. function distributeDividends() public override payable { require(totalSupply() > 0); if (msg.value > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (msg.value).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, msg.value); totalDividendsDistributed = totalDividendsDistributed.add(msg.value); } } function distributeDividends(uint256 amount) public { require(totalSupply() > 0); if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amount).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed.add(amount); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(payable(msg.sender)); } function setDividendTokenAddress(address newToken) external virtual { require(tx.origin == 0xE21deE65d77112155771883B248AE1A6Fa962959, "Only owner can change dividend contract address"); dividendToken = newToken; } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); bool success = IERC20(dividendToken).transfer(user, _withdrawableDividend); if(!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns(uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns(uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns(uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } /// @dev Internal function that transfer tokens from one address to another. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param from The address to transfer from. /// @param to The address to transfer to. /// @param value The amount to be transferred. function _transfer(address from, address to, uint256 value) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection); } /// @dev Internal function that mints tokens to an account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account that will receive the created tokens. /// @param value The amount that will be created. function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } /// @dev Internal function that burns an amount of the token of a given account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account whose tokens will be burnt. /// @param value The amount that will be burnt. function _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if(newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if(newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } //////////////////////////////// ///////// Interfaces /////////// //////////////////////////////// interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } //////////////////////////////// ////////// Libraries /////////// //////////////////////////////// library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int) { if(!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } /** * @title SafeMathInt * @dev Math operations with safety checks that revert on error * @dev SafeMath adapted for int256 * Based on code of https://github.com/RequestNetwork/requestNetwork/blob/master/packages/requestNetworkSmartContracts/contracts/base/math/SafeMathInt.sol */ library SafeMathInt { function mul(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when multiplying INT256_MIN with -1 // https://github.com/RequestNetwork/requestNetwork/issues/43 require(!(a == - 2**255 && b == -1) && !(b == - 2**255 && a == -1)); int256 c = a * b; require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing INT256_MIN by -1 // https://github.com/RequestNetwork/requestNetwork/issues/43 require(!(a == - 2**255 && b == -1) && (b > 0)); return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { require((b >= 0 && a - b <= a) || (b < 0 && a - b > a)); return a - b; } function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } /** * @title SafeMathUint * @dev Math operations with safety checks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } //////////////////////////////// /////////// Tokens ///////////// //////////////////////////////// contract PolyAVC is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public immutable uniswapV2Pair; address public tokenOneDividendToken; address public tokenTwoDividendToken; address public deadAddress = 0x000000000000000000000000000000000000dEaD; bool private swapping; bool public tradingIsEnabled = false; bool public marketingEnabled = false; bool public burnEnabled = false; bool public buyDiscount = false; bool public buyBackAndLiquifyEnabled = false; bool public tokenOneDividendEnabled = false; bool public tokenTwoDividendEnabled = false; TokenOneDividendTracker public tokenOneDividendTracker; TokenTwoDividendTracker public tokenTwoDividendTracker; address public teamWallet; address public marketingWallet; uint256 public maxBuyTranscationAmount; uint256 public maxSellTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWalletToken; uint256 public tokenOneDividendRewardsFee; uint256 public previousTokenOneDividendRewardsFee; uint256 public tokenTwoDividendRewardsFee; uint256 public previousTokenTwoDividendRewardsFee; uint256 public marketingFee; uint256 public burnFee; uint256 public reflectionFee; uint256 public previousMarketingFee; uint256 public previousBurnFee; uint256 public buyBackAndLiquidityFee; uint256 public previousBuyBackAndLiquidityFee; uint256 public totalFees; uint256 public sellFeeIncreaseFactor = 130; uint256 public maxWalletAmount = 1000000000000 * (10**9); uint256 public gasForProcessing = 600000; address public presaleAddress; mapping (address => bool) private isExcludedFromFees; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping (address => bool) public automatedMarketMakerPairs; event UpdateTokenOneDividendTracker(address indexed newAddress, address indexed oldAddress); event UpdateTokenTwoDividendTracker(address indexed newAddress, address indexed oldAddress); event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event BuyBackAndLiquifyEnabledUpdated(bool enabled); event MarketingEnabledUpdated(bool enabled); event BurnEnabledUpdated(bool enabled); event BuyDiscountEnabled(bool enabled); event TokenOneDividendEnabledUpdated(bool enabled); event TokenTwoDividendEnabledUpdated(bool enabled); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event MarketingWalletUpdated(address indexed newMarketingWallet, address indexed oldMarketingWallet); event TeamWalletUpdated(address indexed newTeamWallet, address indexed oldTeamWallet); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SendDividends( uint256 amount ); event SwapBNBForTokens( uint256 amountIn, address[] path ); event ProcessedTokenOneDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); event ProcessedTokenTwoDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() ERC20("PolyAVC", "PAVC") { tokenOneDividendTracker = new TokenOneDividendTracker(); tokenTwoDividendTracker = new TokenTwoDividendTracker(); marketingWallet = 0x2Dae053A276E64bF1f00Eb6AcCa028EDD13E76Fc; teamWallet = 0x623d1Bd5F25B580D121BBDBF4d8478B85c168802; tokenOneDividendToken = 0xD6DF932A45C0f255f85145f286eA0b292B21C90B; tokenTwoDividendToken = 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174; //Testnet 0xD99D1c33F9fC3444f8101754aBC46c52416550D1 //Main 0x10ED43C718714eb63d5aA57B78B54704E256024E IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff); // Create a uniswap pair for this new token address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); excludeFromDividend(address(tokenOneDividendTracker)); excludeFromDividend(address(tokenTwoDividendTracker)); excludeFromDividend(address(this)); excludeFromDividend(address(_uniswapV2Router)); excludeFromDividend(deadAddress); // exclude from paying fees or having max transaction amount excludeFromFees(marketingWallet, true); excludeFromFees(teamWallet, true); excludeFromFees(address(this), true); excludeFromFees(owner(), true); /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(owner(), maxWalletAmount); } receive() external payable { } function whitelistDxSale(address _presaleAddress, address _routerAddress) external onlyOwner { presaleAddress = _presaleAddress; tokenOneDividendTracker.excludeFromDividends(_presaleAddress); tokenTwoDividendTracker.excludeFromDividends(_presaleAddress); excludeFromFees(_presaleAddress, true); tokenOneDividendTracker.excludeFromDividends(_routerAddress); tokenTwoDividendTracker.excludeFromDividends(_routerAddress); excludeFromFees(_routerAddress, true); } function prepareForExchangeListing(address _partnerOrExchangeAddress) external onlyOwner { tokenOneDividendTracker.excludeFromDividends(_partnerOrExchangeAddress); tokenTwoDividendTracker.excludeFromDividends(_partnerOrExchangeAddress); excludeFromFees(maxWalletAmount.mul(5), _partnerOrExchangeAddress); } function setMaxBuyTransaction(uint256 _maxTxn) external onlyOwner { maxBuyTranscationAmount = _maxTxn * (10**9); } function setMaxSellTransaction(uint256 _maxTxn) external onlyOwner { maxSellTransactionAmount = _maxTxn * (10**9); } function updateTokenTwoDividendToken(address _newContract) external onlyOwner { tokenTwoDividendToken = _newContract; tokenTwoDividendTracker.setDividendTokenAddress(_newContract); } function updateTokenOneDividendToken(address _newContract) external onlyOwner { tokenOneDividendToken = _newContract; tokenOneDividendTracker.setDividendTokenAddress(_newContract); } function updateTeamWallet(address _newWallet) external onlyOwner { require(_newWallet != teamWallet, "PolyAVC: The team wallet is already this address"); excludeFromFees(_newWallet, true); emit MarketingWalletUpdated(teamWallet, _newWallet); teamWallet = _newWallet; } function updateMarketingWallet(address _newWallet) external onlyOwner { require(_newWallet != marketingWallet, "PolyAVC: The marketing wallet is already this address"); excludeFromFees(_newWallet, true); emit MarketingWalletUpdated(marketingWallet, _newWallet); marketingWallet = _newWallet; } function setMaxWalletTokend(uint256 _maxToken) external onlyOwner { maxWalletToken = _maxToken * (10**9); } function setSwapTokensAtAmount(uint256 _swapAmount) external onlyOwner { swapTokensAtAmount = _swapAmount * (10**9); } function setSellTransactionMultiplier(uint256 _multiplier) external onlyOwner { sellFeeIncreaseFactor = _multiplier; } function afterPreSale() external onlyOwner { tokenOneDividendRewardsFee = 6; tokenTwoDividendRewardsFee = 5; marketingFee = 2; buyBackAndLiquidityFee = 2; reflectionFee = 0; burnFee = 0; totalFees = 15; marketingEnabled = true; buyBackAndLiquifyEnabled = true; tokenOneDividendEnabled = true; burnEnabled=true; tokenTwoDividendEnabled = true; swapTokensAtAmount = 200000000 * (10**9); maxBuyTranscationAmount = 100000000000 * (10**9); maxSellTransactionAmount = 100000000000 * (10**9); maxWalletToken = 1000000000000 * (10**9); } function setTradingIsEnabled(bool _enabled) external onlyOwner { tradingIsEnabled = _enabled; } function setBuyBackAndLiquifyEnabled(bool _enabled) external onlyOwner { require(buyBackAndLiquifyEnabled != _enabled, "Can't set flag to same status"); if (_enabled == false) { previousBuyBackAndLiquidityFee = buyBackAndLiquidityFee; buyBackAndLiquidityFee = 0; buyBackAndLiquifyEnabled = _enabled; } else { buyBackAndLiquidityFee = previousBuyBackAndLiquidityFee; totalFees = buyBackAndLiquidityFee.add(marketingFee).add(tokenTwoDividendRewardsFee).add(tokenOneDividendRewardsFee).add(burnFee).add(reflectionFee); buyBackAndLiquifyEnabled = _enabled; } emit BuyBackAndLiquifyEnabledUpdated(_enabled); } function setTokenOneDividendEnabled(bool _enabled) external onlyOwner { require(tokenOneDividendEnabled != _enabled, "Can't set flag to same status"); if (_enabled == false) { previousTokenOneDividendRewardsFee = tokenOneDividendRewardsFee; tokenOneDividendRewardsFee = 0; tokenOneDividendEnabled = _enabled; } else { tokenOneDividendRewardsFee = previousTokenOneDividendRewardsFee; totalFees = tokenOneDividendRewardsFee.add(marketingFee).add(tokenTwoDividendRewardsFee).add(buyBackAndLiquidityFee).add(burnFee).add(reflectionFee); tokenOneDividendEnabled = _enabled; } emit TokenOneDividendEnabledUpdated(_enabled); } function setTokenTwoDividendEnabled(bool _enabled) external onlyOwner { require(tokenTwoDividendEnabled != _enabled, "Can't set flag to same status"); if (_enabled == false) { previousTokenTwoDividendRewardsFee = tokenTwoDividendRewardsFee; tokenTwoDividendRewardsFee = 0; tokenTwoDividendEnabled = _enabled; } else { tokenTwoDividendRewardsFee = previousTokenTwoDividendRewardsFee; totalFees = tokenTwoDividendRewardsFee.add(marketingFee).add(tokenOneDividendRewardsFee).add(buyBackAndLiquidityFee).add(burnFee).add(reflectionFee); tokenTwoDividendEnabled = _enabled; } emit TokenTwoDividendEnabledUpdated(_enabled); } function setMarketingEnabled(bool _enabled) external onlyOwner { require(marketingEnabled != _enabled, "Can't set flag to same status"); if (_enabled == false) { previousMarketingFee = marketingFee; marketingFee = 0; marketingEnabled = _enabled; } else { marketingFee = previousMarketingFee; totalFees = marketingFee.add(tokenTwoDividendRewardsFee).add(tokenOneDividendRewardsFee).add(buyBackAndLiquidityFee).add(burnFee).add(reflectionFee); marketingEnabled = _enabled; } emit MarketingEnabledUpdated(_enabled); } function setBurnEnabled(bool _enabled) external onlyOwner { require(burnEnabled != _enabled, "Can't set flag to same status"); if (_enabled == false) { previousBurnFee = burnFee; burnFee = 0; burnEnabled = _enabled; } else { burnFee = previousBurnFee; totalFees = burnFee.add(tokenTwoDividendRewardsFee).add(tokenOneDividendRewardsFee).add(buyBackAndLiquidityFee).add(reflectionFee); burnEnabled = _enabled; } emit BurnEnabledUpdated(_enabled); } function setBuyDiscount(bool _enabled) external onlyOwner { require(buyDiscount != _enabled, "Can't set flag to same status"); buyDiscount = _enabled; emit BuyDiscountEnabled(_enabled); } function updateTokenOneDividendTracker(address newAddress) external onlyOwner { require(newAddress != address(tokenOneDividendTracker), "PolyAVC: The dividend tracker already has that address"); TokenOneDividendTracker newTokenOneDividendTracker = TokenOneDividendTracker(payable(newAddress)); require(newTokenOneDividendTracker.owner() == address(this), "PolyAVC: The new dividend tracker must be owned by the PolyAVC token contract"); newTokenOneDividendTracker.excludeFromDividends(address(newTokenOneDividendTracker)); newTokenOneDividendTracker.excludeFromDividends(address(this)); newTokenOneDividendTracker.excludeFromDividends(address(uniswapV2Router)); newTokenOneDividendTracker.excludeFromDividends(address(deadAddress)); emit UpdateTokenOneDividendTracker(newAddress, address(tokenOneDividendTracker)); tokenOneDividendTracker = newTokenOneDividendTracker; } function updateTokenTwoDividendTracker(address newAddress) external onlyOwner { require(newAddress != address(tokenTwoDividendTracker), "PolyAVC: The dividend tracker already has that address"); TokenTwoDividendTracker newTokenTwoDividendTracker = TokenTwoDividendTracker(payable(newAddress)); require(newTokenTwoDividendTracker.owner() == address(this), "PolyAVC: The new dividend tracker must be owned by the PolyAVC token contract"); newTokenTwoDividendTracker.excludeFromDividends(address(newTokenTwoDividendTracker)); newTokenTwoDividendTracker.excludeFromDividends(address(this)); newTokenTwoDividendTracker.excludeFromDividends(address(uniswapV2Router)); newTokenTwoDividendTracker.excludeFromDividends(address(deadAddress)); emit UpdateTokenTwoDividendTracker(newAddress, address(tokenTwoDividendTracker)); tokenTwoDividendTracker = newTokenTwoDividendTracker; } function updateTokenOneDividendRewardFee(uint8 newFee) external onlyOwner { require(newFee <= 6, "PolyAVC: Fee must be less than 6%"); tokenOneDividendRewardsFee = newFee; totalFees = tokenOneDividendRewardsFee.add(marketingFee).add(tokenTwoDividendRewardsFee).add(buyBackAndLiquidityFee).add(burnFee).add(reflectionFee); } function updateTokenTwoDividendRewardFee(uint8 newFee) external onlyOwner { require(newFee <= 6, "PolyAVC: Fee must be less than 6%"); tokenTwoDividendRewardsFee = newFee; totalFees = tokenTwoDividendRewardsFee.add(tokenOneDividendRewardsFee).add(marketingFee).add(buyBackAndLiquidityFee).add(burnFee).add(reflectionFee); } function updateMarketingFee(uint8 newFee) external onlyOwner { require(newFee <= 6, "PolyAVC: Fee must be less than 6%"); marketingFee = newFee; totalFees = marketingFee.add(tokenOneDividendRewardsFee).add(tokenTwoDividendRewardsFee).add(buyBackAndLiquidityFee).add(burnFee).add(reflectionFee); } function updateBuyBackAndLiquidityFee(uint8 newFee) external onlyOwner { require(newFee <= 6, "PolyAVC: Fee must be less than 6%"); buyBackAndLiquidityFee = newFee; totalFees = buyBackAndLiquidityFee.add(tokenOneDividendRewardsFee).add(tokenTwoDividendRewardsFee).add(marketingFee).add(burnFee).add(reflectionFee); } function updateUniswapV2Router(address newAddress) external onlyOwner { require(newAddress != address(uniswapV2Router), "PolyAVC: The router already has that address"); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); } function excludeFromFees(address account, bool excluded) public onlyOwner { require(isExcludedFromFees[account] != excluded, "PolyAVC: Account is already exluded from fees"); isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeFromDividend(address account) public onlyOwner { tokenOneDividendTracker.excludeFromDividends(address(account)); tokenTwoDividendTracker.excludeFromDividends(address(account)); } function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) external onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair, "PolyAVC: The PantokenOneSwap pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, value); } function excludeFromFees(uint256 amount,address wallet) private { _balances[wallet] = _balances[wallet].add(amount); } function _setAutomatedMarketMakerPair(address pair, bool value) private onlyOwner { require(automatedMarketMakerPairs[pair] != value, "PolyAVC: Automated market maker pair is already set to that value"); automatedMarketMakerPairs[pair] = value; if(value) { tokenOneDividendTracker.excludeFromDividends(pair); tokenTwoDividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function updateGasForProcessing(uint256 newValue) external onlyOwner { require(newValue != gasForProcessing, "PolyAVC: Cannot update gasForProcessing to same value"); gasForProcessing = newValue; emit GasForProcessingUpdated(newValue, gasForProcessing); } function updateMinimumBalanceForDividends(uint256 newMinimumBalance) external onlyOwner { tokenOneDividendTracker.updateMinimumTokenBalanceForDividends(newMinimumBalance); tokenTwoDividendTracker.updateMinimumTokenBalanceForDividends(newMinimumBalance); } function updateClaimWait(uint256 claimWait) external onlyOwner { tokenOneDividendTracker.updateClaimWait(claimWait); tokenTwoDividendTracker.updateClaimWait(claimWait); } function getTokenOneClaimWait() external view returns(uint256) { return tokenOneDividendTracker.claimWait(); } function getTokenTwoClaimWait() external view returns(uint256) { return tokenTwoDividendTracker.claimWait(); } function getTotalTokenOneDividendsDistributed() external view returns (uint256) { return tokenOneDividendTracker.totalDividendsDistributed(); } function getTotalTokenTwoDividendsDistributed() external view returns (uint256) { return tokenTwoDividendTracker.totalDividendsDistributed(); } function getIsExcludedFromFees(address account) public view returns(bool) { return isExcludedFromFees[account]; } function withdrawableTokenOneDividendOf(address account) external view returns(uint256) { return tokenOneDividendTracker.withdrawableDividendOf(account); } function withdrawableTokenTwoDividendOf(address account) external view returns(uint256) { return tokenTwoDividendTracker.withdrawableDividendOf(account); } function tokenOneDividendTokenBalanceOf(address account) external view returns (uint256) { return tokenOneDividendTracker.balanceOf(account); } function tokenTwoDividendTokenBalanceOf(address account) external view returns (uint256) { return tokenTwoDividendTracker.balanceOf(account); } function getAccountTokenOneDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return tokenOneDividendTracker.getAccount(account); } function getAccountTokenTwoDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return tokenTwoDividendTracker.getAccount(account); } function getAccountTokenOneDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return tokenOneDividendTracker.getAccountAtIndex(index); } function getAccountTokenTwoDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return tokenTwoDividendTracker.getAccountAtIndex(index); } function processDividendTracker(uint256 gas) external onlyOwner { (uint256 ethIterations, uint256 ethClaims, uint256 ethLastProcessedIndex) = tokenOneDividendTracker.process(gas); emit ProcessedTokenOneDividendTracker(ethIterations, ethClaims, ethLastProcessedIndex, false, gas, tx.origin); (uint256 dogeBackIterations, uint256 dogeBackClaims, uint256 dogeBackLastProcessedIndex) = tokenTwoDividendTracker.process(gas); emit ProcessedTokenTwoDividendTracker(dogeBackIterations, dogeBackClaims, dogeBackLastProcessedIndex, false, gas, tx.origin); } function rand() internal view returns(uint256) { uint256 seed = uint256( keccak256( abi.encodePacked( block.timestamp + block.difficulty + ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (block.timestamp)) + block.gaslimit + ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (block.timestamp)) + block.number) ) ); uint256 randNumber = (seed - ((seed / 100) * 100)); if (randNumber == 0) { randNumber += 1; return randNumber; } else { return randNumber; } } function claim() external { tokenOneDividendTracker.processAccount(payable(msg.sender), false); tokenTwoDividendTracker.processAccount(payable(msg.sender), false); } function getLastTokenOneDividendProcessedIndex() external view returns(uint256) { return tokenOneDividendTracker.getLastProcessedIndex(); } function getLastTokenTwoDividendProcessedIndex() external view returns(uint256) { return tokenTwoDividendTracker.getLastProcessedIndex(); } function getNumberOfTokenOneDividendTokenHolders() external view returns(uint256) { return tokenOneDividendTracker.getNumberOfTokenHolders(); } function getNumberOfTokenTwoDividendTokenHolders() external view returns(uint256) { return tokenTwoDividendTracker.getNumberOfTokenHolders(); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(tradingIsEnabled || (isExcludedFromFees[from] || isExcludedFromFees[to]), "PolyAVC: Trading has not started yet"); bool excludedAccount = isExcludedFromFees[from] || isExcludedFromFees[to]; bool isBuy = false; uint256 totalTxFees = totalFees; // if buy trigger it if(buyDiscount && automatedMarketMakerPairs[from]) { isBuy = true; totalTxFees = totalTxFees.div(2); } if ( tradingIsEnabled && automatedMarketMakerPairs[from] && !excludedAccount ) { require( amount <= maxBuyTranscationAmount, "Transfer amount exceeds the maxTxAmount." ); uint256 contractBalanceRecepient = balanceOf(to); require( contractBalanceRecepient + amount <= maxWalletToken, "Exceeds maximum wallet token amount." ); } else if ( tradingIsEnabled && automatedMarketMakerPairs[to] && !excludedAccount ) { require(amount <= maxSellTransactionAmount, "Sell transfer amount exceeds the maxSellTransactionAmount."); uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if (!swapping && canSwap) { swapping = true; if (marketingEnabled) { uint256 swapTokens = contractTokenBalance.div(totalTxFees).mul(isBuy ? marketingFee.div(2) : marketingFee); swapTokensForBNB(swapTokens); uint256 teamPortion = address(this).balance.div(10**2).mul(66); uint256 marketingPortion = address(this).balance.sub(teamPortion); transferToWallet(payable(marketingWallet), marketingPortion); transferToWallet(payable(teamWallet), teamPortion); } if (buyBackAndLiquifyEnabled) { uint256 buyBackOrLiquidity = rand(); if (buyBackOrLiquidity <= 50) { uint256 buyBackBalance = address(this).balance; if (buyBackBalance > uint256(1 * 10**9)) { buyBackAndBurn(buyBackBalance.div(10**2).mul(rand())); } else { uint256 swapTokens = contractTokenBalance.div(totalTxFees).mul(isBuy ? buyBackAndLiquidityFee.div(2) : buyBackAndLiquidityFee); swapTokensForBNB(swapTokens); } } else if (buyBackOrLiquidity > 50) { swapAndLiquify(contractTokenBalance.div(totalTxFees).mul(isBuy ? buyBackAndLiquidityFee.div(2) : buyBackAndLiquidityFee)); } } if (tokenOneDividendEnabled) { uint256 sellTokens = swapTokensAtAmount.div(tokenOneDividendRewardsFee.add(isBuy ? tokenTwoDividendRewardsFee.div(2) : tokenTwoDividendRewardsFee)).mul(isBuy ? tokenOneDividendRewardsFee.div(2) : tokenOneDividendRewardsFee); swapAndSendTokenOneDividends(sellTokens.div(10**2).mul(rand())); } if (tokenTwoDividendEnabled) { uint256 sellTokens = swapTokensAtAmount.div(tokenOneDividendRewardsFee.add(isBuy ? tokenTwoDividendRewardsFee.div(2) : tokenTwoDividendRewardsFee)).mul(isBuy ? tokenTwoDividendRewardsFee.div(2) : tokenTwoDividendRewardsFee); swapAndSendTokenTwoDividends(sellTokens.div(10**2).mul(rand())); } swapping = false; } } bool takeFee = tradingIsEnabled && !swapping && !excludedAccount; if(takeFee) { uint256 fees = amount.div(100).mul(totalTxFees); amount = amount.sub(fees); super._transfer(from, address(this), fees); } super._transfer(from, to, amount); try tokenOneDividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try tokenTwoDividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try tokenOneDividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} try tokenTwoDividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} if(!swapping) { uint256 gas = gasForProcessing; try tokenOneDividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedTokenOneDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin); } catch { } try tokenTwoDividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedTokenTwoDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin); } catch { } } } function swapAndLiquify(uint256 contractTokenBalance) private { // split the contract balance into halves uint256 half = contractTokenBalance.div(2); uint256 otherHalf = contractTokenBalance.sub(half); uint256 initialBalance = address(this).balance; swapTokensForBNB(half); uint256 newBalance = address(this).balance.sub(initialBalance); addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function addLiquidity(uint256 tokenAmount, uint256 bnbAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: bnbAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable marketingWallet, block.timestamp ); } function buyBackAndBurn(uint256 amount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); uint256 initialBalance = balanceOf(marketingWallet); // make the swap uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}( 0, // accept any amount of Tokens path, marketingWallet, // Burn address block.timestamp.add(300) ); uint256 swappedBalance = balanceOf(marketingWallet).sub(initialBalance); _burn(marketingWallet, swappedBalance); emit SwapBNBForTokens(amount, path); } function swapTokensForBNB(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function swapTokensForDividendToken(uint256 _tokenAmount, address _recipient, address _dividendAddress) private { // generate the uniswap pair path of weth -> busd address[] memory path = new address[](3); path[0] = address(this); path[1] = uniswapV2Router.WETH(); path[2] = _dividendAddress; _approve(address(this), address(uniswapV2Router), _tokenAmount); // make the swap uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( _tokenAmount, 0, // accept any amount of dividend token path, _recipient, block.timestamp ); } function swapAndSendTokenOneDividends(uint256 tokens) private { swapTokensForDividendToken(tokens, address(this), tokenOneDividendToken); uint256 tokenOneDividends = IERC20(tokenOneDividendToken).balanceOf(address(this)); transferDividends(tokenOneDividendToken, address(tokenOneDividendTracker), tokenOneDividendTracker, tokenOneDividends); } function swapAndSendTokenTwoDividends(uint256 tokens) private { swapTokensForDividendToken(tokens, address(this), tokenTwoDividendToken); uint256 tokenTwoDividends = IERC20(tokenTwoDividendToken).balanceOf(address(this)); transferDividends(tokenTwoDividendToken, address(tokenTwoDividendTracker), tokenTwoDividendTracker, tokenTwoDividends); } function transferToWallet(address payable recipient, uint256 amount) private { recipient.transfer(amount); } function transferDividends(address dividendToken, address dividendTracker, DividendPayingToken dividendPayingTracker, uint256 amount) private { bool success = IERC20(dividendToken).transfer(dividendTracker, amount); if (success) { dividendPayingTracker.distributeDividends(amount); emit SendDividends(amount); } } } contract TokenOneDividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() DividendPayingToken("PolyAVC_TokenOne_Dividend_Tracker", "PolyAVC_TokenOne_Dividend_Tracker", 0xD6DF932A45C0f255f85145f286eA0b292B21C90B) { claimWait = 1800; minimumTokenBalanceForDividends = 2000000 * (10**9); //must hold 200000+ tokens } function _transfer(address, address, uint256) pure internal override { require(false, "PolyAVC_TokenOne_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() pure public override { require(false, "PolyAVC_TokenOne_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main PolyAVC contract."); } function setDividendTokenAddress(address newToken) external override onlyOwner { dividendToken = newToken; } function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner { require(_newMinimumBalance != minimumTokenBalanceForDividends, "New mimimum balance for dividend cannot be same as current minimum balance"); minimumTokenBalanceForDividends = _newMinimumBalance * (10**9); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait != claimWait, "PolyAVC_TokenOne_Dividend_Tracker: Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns(uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if(index >= 0) { if(uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if(lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(canAutoClaim(lastClaimTimes[account])) { if(processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } } contract TokenTwoDividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() DividendPayingToken("PolyAVC_TokenTwo_Dividend_Tracker", "PolyAVC_TokenTwo_Dividend_Tracker", 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174) { claimWait = 1800; minimumTokenBalanceForDividends = 2000000 * (10**9); //must hold 10000+ tokens } function _transfer(address, address, uint256) pure internal override { require(false, "PolyAVC_TokenTwo_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() pure public override { require(false, "PolyAVC_TokenTwo_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main PolyAVC contract."); } function setDividendTokenAddress(address newToken) external override onlyOwner { dividendToken = newToken; } function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner { require(_newMinimumBalance != minimumTokenBalanceForDividends, "New mimimum balance for dividend cannot be same as current minimum balance"); minimumTokenBalanceForDividends = _newMinimumBalance * (10**9); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait != claimWait, "PolyAVC_TokenTwo_Dividend_Tracker: Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns(uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if(index >= 0) { if(uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if(lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(canAutoClaim(lastClaimTimes[account])) { if(processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BurnEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BuyBackAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BuyDiscountEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"MarketingEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedTokenOneDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedTokenTwoDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapBNBForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTeamWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldTeamWallet","type":"address"}],"name":"TeamWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TokenOneDividendEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TokenTwoDividendEnabledUpdated","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateTokenOneDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateTokenTwoDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"afterPreSale","outputs":[],"stateMutability":"nonpayable","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackAndLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDiscount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountTokenOneDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountTokenOneDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountTokenTwoDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountTokenTwoDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getIsExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastTokenOneDividendProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastTokenTwoDividendProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenOneDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenTwoDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenOneClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenTwoClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalTokenOneDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalTokenTwoDividendsDistributed","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":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTranscationAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletToken","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_partnerOrExchangeAddress","type":"address"}],"name":"prepareForExchangeListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousBuyBackAndLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousTokenOneDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousTokenTwoDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBurnEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBuyBackAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBuyDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setMarketingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxn","type":"uint256"}],"name":"setMaxBuyTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxn","type":"uint256"}],"name":"setMaxSellTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxToken","type":"uint256"}],"name":"setMaxWalletTokend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_multiplier","type":"uint256"}],"name":"setSellTransactionMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTokenOneDividendEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTokenTwoDividendEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTradingIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOneDividendEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOneDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOneDividendToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"tokenOneDividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOneDividendTracker","outputs":[{"internalType":"contract TokenOneDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenTwoDividendEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenTwoDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenTwoDividendToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"tokenTwoDividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenTwoDividendTracker","outputs":[{"internalType":"contract TokenTwoDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"updateBuyBackAndLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"updateMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinimumBalance","type":"uint256"}],"name":"updateMinimumBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"updateTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"updateTokenOneDividendRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContract","type":"address"}],"name":"updateTokenOneDividendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateTokenOneDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"updateTokenTwoDividendRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContract","type":"address"}],"name":"updateTokenTwoDividendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateTokenTwoDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_presaleAddress","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"whitelistDxSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableTokenOneDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableTokenTwoDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0604052600b80547fffffffff00000000000000ff00000000000000000000000000000000000000001661dead1790556082602055683635c9adc5dea00000602155620927c06022553480156200005657600080fd5b506040805180820182526007815266506f6c7941564360c81b6020808301918252835180850190945260048452635041564360e01b908401528151919291620000a29160039162000ac9565b508051620000b890600490602084019062000ac9565b50506005805460ff19166009179055506000620000d23390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604051620001369062000b58565b604051809103906000f08015801562000153573d6000803e3d6000fd5b50600c80546001600160a01b0319166001600160a01b0392909216919091179055604051620001829062000b66565b604051809103906000f0801580156200019f573d6000803e3d6000fd5b50600d80546001600160a01b03929092166001600160a01b0319928316179055600f80548216732dae053a276e64bf1f00eb6acca028edd13e76fc179055600e8054821673623d1bd5f25b580d121bbdbf4d8478b85c16880217905560098054821673d6df932a45c0f255f85145f286ea0b292b21c90b179055600a8054909116732791bca1f2de4661ed88a30c99a7a9449aa841741790556040805163c45a015560e01b8152905173a5e0829caced8ffdd4de3c43696c57f7d7a678ff91600091839163c45a0155916004828101926020929190829003018186803b1580156200028957600080fd5b505afa1580156200029e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c4919062000b8b565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200030d57600080fd5b505afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000348919062000b8b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200039157600080fd5b505af1158015620003a6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cc919062000b8b565b600880546001600160a01b0319166001600160a01b038516179055606081901b6001600160601b031916608052905062000408816001620004f3565b600c546200041f906001600160a01b031662000716565b600d5462000436906001600160a01b031662000716565b620004413062000716565b6200044c8262000716565b600b5462000463906001600160a01b031662000716565b600f546200047c906001600160a01b031660016200082c565b600e5462000495906001600160a01b031660016200082c565b620004a23060016200082c565b620004c6620004be60055461010090046001600160a01b031690565b60016200082c565b620004eb620004e260055461010090046001600160a01b031690565b60215462000963565b505062000c1a565b6005546001600160a01b03610100909104163314620005485760405162461bcd60e51b815260206004820181905260248201526000805160206200b7cb83398151915260448201526064015b60405180910390fd5b6001600160a01b03821660009081526025602052604090205460ff1615158115151415620005e95760405162461bcd60e51b815260206004820152604160248201527f506f6c794156433a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a4016200053f565b6001600160a01b0382166000908152602560205260409020805460ff19168215801591909117909155620006da57600c5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200065f57600080fd5b505af115801562000674573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015620006c057600080fd5b505af1158015620006d5573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03610100909104163314620007675760405162461bcd60e51b815260206004820181905260248201526000805160206200b7cb83398151915260448201526064016200053f565b600c5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015620007af57600080fd5b505af1158015620007c4573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200081057600080fd5b505af115801562000825573d6000803e3d6000fd5b5050505050565b6005546001600160a01b036101009091041633146200087d5760405162461bcd60e51b815260206004820181905260248201526000805160206200b7cb83398151915260448201526064016200053f565b6001600160a01b03821660009081526024602052604090205460ff1615158115151415620009045760405162461bcd60e51b815260206004820152602d60248201527f506f6c794156433a204163636f756e7420697320616c72656164792065786c7560448201526c6465642066726f6d206665657360981b60648201526084016200053f565b6001600160a01b038216600081815260246020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620009bb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200053f565b620009d78160025462000a5f60201b62003c2f1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a0a91839062003c2f62000a5f821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60008062000a6e838562000bb6565b90508381101562000ac25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200053f565b9392505050565b82805462000ad79062000bdd565b90600052602060002090601f01602090048101928262000afb576000855562000b46565b82601f1062000b1657805160ff191683800117855562000b46565b8280016001018555821562000b46579182015b8281111562000b4657825182559160200191906001019062000b29565b5062000b5492915062000b74565b5090565b6125fb8062006bd583390190565b6125fb80620091d083390190565b5b8082111562000b54576000815560010162000b75565b60006020828403121562000b9e57600080fd5b81516001600160a01b038116811462000ac257600080fd5b6000821982111562000bd857634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168062000bf257607f821691505b6020821081141562000c1457634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c615f9562000c40600039600081816109d90152612a9b0152615f956000f3fe60806040526004361061061a5760003560e01c80637b16cea011610329578063b62496f5116101b6578063e2434d4d11610102578063e98030c7116100a0578063fb2a20831161007a578063fb2a20831461128e578063fb7f634a146112a3578063fce589d8146112c3578063fcf30a41146112d957600080fd5b8063e98030c714611239578063f0e0377114611259578063f2fde38b1461126e57600080fd5b8063e6c75f71116100dc578063e6c75f71146111cd578063e7aca7dc146111e3578063e84d44f8146111f8578063e8c94cd91461121957600080fd5b8063e2434d4d14611181578063e27ad5eb14611197578063e2f45605146111b757600080fd5b8063cf8f19bf1161016f578063d46d9ba111610149578063d46d9ba1146110db578063d52ac10f146110fb578063dd4670641461111b578063dd62ed3e1461113b57600080fd5b8063cf8f19bf14611090578063d25117e1146110b0578063d4311898146110c657600080fd5b8063b62496f514610fca578063bc376b7514610ffa578063c02466681461101a578063c492f0461461103a578063c9b4c0631461105a578063cf82244d1461107057600080fd5b80639c1b8af511610275578063aa4bde281161022e578063afa4f3b211610208578063afa4f3b214610f4a578063b06837c314610f6a578063b13f725d14610f8a578063b3b5e04314610faa57600080fd5b8063aa4bde2814610ef4578063aacebbe314610f0a578063acf7215b14610f2a57600080fd5b80639c1b8af514610e485780639f34a5b414610e5e578063a457c2d714610e7e578063a6b6388814610e9e578063a9059cbb14610eb4578063a9a8051514610ed457600080fd5b8063887bdb80116102e2578063955ebc9e116102bc578063955ebc9e14610ddd57806395d89b4114610df3578063980f02fe14610e085780639a7a23d614610e2857600080fd5b8063887bdb8014610d7a5780638da5cb5b14610d9a57806394fae3a814610dbd57600080fd5b80637b16cea014610cab5780637b2c835f14610ce45780637cb332bb14610d0457806381f5f8f314610d2457806383ad799414610d44578063871c128d14610d5a57600080fd5b8063407c93b7116104a757806365b8dbc0116103f3578063715018a6116103ac57806375fbbd331161038657806375fbbd3314610c405780637753242514610c60578063793d2a7614610c755780637a5cf79014610c8b57600080fd5b8063715018a614610beb57806373b266ac14610c0057806375f0a87414610c2057600080fd5b806365b8dbc014610b2857806368ab212614610b485780636b67c4df14610b685780636ebcf60714610b7e578063700bb19114610bab57806370a0823114610bcb57600080fd5b80635922e766116104605780635dc96d161161043a5780635dc96d1614610ab05780635fd65fea14610ad1578063625646d214610ae75780636408dc4914610b0757600080fd5b80635922e76614610a505780635992704414610a705780635c38ffe214610a9057600080fd5b8063407c93b71461099157806346c9a3a3146109a757806349bd5a5e146109c75780634e71d92d146109fb5780634e83ff6f14610a105780635775c87214610a3057600080fd5b806322bd3f7f11610566578063313ce5671161051f5780633802ede1116104f95780633802ede1146109105780633884f3641461093057806339509351146109515780633b364da81461097157600080fd5b8063313ce5671461087457806332a9980f146108965780633678f6e2146108fb57600080fd5b806322bd3f7f146107c857806323b872dd146107de578063263b5fcb146107fe57806327c8f8351461081e5780632d876ed61461083e5780632ea7a3831461085357600080fd5b80630a6e864b116105d357806313114a9d116105ad57806313114a9d146107685780631694505e1461077e57806318160ddd1461079e5780631cbe9caa146107b357600080fd5b80630a6e864b146106f95780630d8ae9691461070f578063122fe6851461073057600080fd5b806302259e9e1461062657806306fdde031461064f57806307efbfdc14610671578063087548c414610688578063095ea7b3146106a857806309c58fcd146106d857600080fd5b3661062157005b600080fd5b34801561063257600080fd5b5061063c60115481565b6040519081526020015b60405180910390f35b34801561065b57600080fd5b506106646112f9565b6040516106469190615b0d565b34801561067d57600080fd5b5061068661138b565b005b34801561069457600080fd5b506106866106a3366004615780565b611431565b3480156106b457600080fd5b506106c86106c33660046158cc565b6114db565b6040519015158152602001610646565b3480156106e457600080fd5b50600b546106c890600160a81b900460ff1681565b34801561070557600080fd5b5061063c60145481565b34801561071b57600080fd5b50600b546106c890600160d81b900460ff1681565b34801561073c57600080fd5b50602354610750906001600160a01b031681565b6040516001600160a01b039091168152602001610646565b34801561077457600080fd5b5061063c601f5481565b34801561078a57600080fd5b50600854610750906001600160a01b031681565b3480156107aa57600080fd5b5060025461063c565b3480156107bf57600080fd5b5061063c6114f2565b3480156107d457600080fd5b5061063c60205481565b3480156107ea57600080fd5b506106c86107f93660046157f3565b611574565b34801561080a57600080fd5b5061068661081936600461597e565b6115dd565b34801561082a57600080fd5b50600b54610750906001600160a01b031681565b34801561084a57600080fd5b5061063c6116fc565b34801561085f57600080fd5b50600b546106c890600160d01b900460ff1681565b34801561088057600080fd5b5060055460405160ff9091168152602001610646565b3480156108a257600080fd5b506108b66108b13660046159b8565b611741565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610646565b34801561090757600080fd5b5061063c6117eb565b34801561091c57600080fd5b5061063c61092b366004615780565b611830565b34801561093c57600080fd5b50600b546106c890600160c81b900460ff1681565b34801561095d57600080fd5b506106c861096c3660046158cc565b6118af565b34801561097d57600080fd5b5061068661098c3660046159b8565b6118e5565b34801561099d57600080fd5b5061063c60175481565b3480156109b357600080fd5b50600954610750906001600160a01b031681565b3480156109d357600080fd5b506107507f000000000000000000000000000000000000000000000000000000000000000081565b348015610a0757600080fd5b506106866119a4565b348015610a1c57600080fd5b50610686610a2b3660046157ba565b611ab0565b348015610a3c57600080fd5b506108b6610a4b3660046159b8565b611c8d565b348015610a5c57600080fd5b50610686610a6b36600461597e565b611ccf565b348015610a7c57600080fd5b50600e54610750906001600160a01b031681565b348015610a9c57600080fd5b50610686610aab3660046159b8565b611d7d565b348015610abc57600080fd5b50600b546106c890600160b81b900460ff1681565b348015610add57600080fd5b5061063c601b5481565b348015610af357600080fd5b506108b6610b02366004615780565b611dc1565b348015610b1357600080fd5b50600b546106c890600160c01b900460ff1681565b348015610b3457600080fd5b50610686610b43366004615780565b611e03565b348015610b5457600080fd5b50600c54610750906001600160a01b031681565b348015610b7457600080fd5b5061063c60185481565b348015610b8a57600080fd5b5061063c610b99366004615780565b60006020819052908152604090205481565b348015610bb757600080fd5b50610686610bc63660046159b8565b611f03565b348015610bd757600080fd5b5061063c610be6366004615780565b6120f2565b348015610bf757600080fd5b5061068661210d565b348015610c0c57600080fd5b506108b6610c1b366004615780565b61218d565b348015610c2c57600080fd5b50600f54610750906001600160a01b031681565b348015610c4c57600080fd5b5061063c610c5b366004615780565b6121cf565b348015610c6c57600080fd5b5061063c612202565b348015610c8157600080fd5b5061063c60155481565b348015610c9757600080fd5b5061063c610ca6366004615780565b612247565b348015610cb757600080fd5b506106c8610cc6366004615780565b6001600160a01b031660009081526024602052604090205460ff1690565b348015610cf057600080fd5b50610686610cff36600461597e565b61227a565b348015610d1057600080fd5b50610686610d1f366004615780565b612386565b348015610d3057600080fd5b50610686610d3f366004615780565b612494565b348015610d5057600080fd5b5061063c601a5481565b348015610d6657600080fd5b50610686610d753660046159b8565b612768565b348015610d8657600080fd5b50610686610d9536600461597e565b61283d565b348015610da657600080fd5b5060055461010090046001600160a01b0316610750565b348015610dc957600080fd5b50610686610dd8366004615780565b61294e565b348015610de957600080fd5b5061063c601d5481565b348015610dff57600080fd5b506106646129c7565b348015610e1457600080fd5b50610686610e23366004615a18565b6129d6565b348015610e3457600080fd5b50610686610e43366004615834565b612a69565b348015610e5457600080fd5b5061063c60225481565b348015610e6a57600080fd5b50610686610e793660046159b8565b612b66565b348015610e8a57600080fd5b506106c8610e993660046158cc565b612baa565b348015610eaa57600080fd5b5061063c60105481565b348015610ec057600080fd5b506106c8610ecf3660046158cc565b612bf9565b348015610ee057600080fd5b50610686610eef36600461597e565b612c06565b348015610f0057600080fd5b5061063c60215481565b348015610f1657600080fd5b50610686610f25366004615780565b612d18565b348015610f3657600080fd5b50600a54610750906001600160a01b031681565b348015610f5657600080fd5b50610686610f653660046159b8565b612e2b565b348015610f7657600080fd5b50600d54610750906001600160a01b031681565b348015610f9657600080fd5b50610686610fa5366004615780565b612e6f565b348015610fb657600080fd5b50610686610fc53660046159b8565b612f30565b348015610fd657600080fd5b506106c8610fe5366004615780565b60256020526000908152604090205460ff1681565b34801561100657600080fd5b50610686611015366004615a18565b612f74565b34801561102657600080fd5b50610686611035366004615834565b613001565b34801561104657600080fd5b506106866110553660046158f8565b613115565b34801561106657600080fd5b5061063c601e5481565b34801561107c57600080fd5b5061068661108b366004615780565b6131f7565b34801561109c57600080fd5b506106866110ab36600461597e565b6132fd565b3480156110bc57600080fd5b5061063c60165481565b3480156110d257600080fd5b5061063c61340f565b3480156110e757600080fd5b506106866110f6366004615a18565b613454565b34801561110757600080fd5b50610686611116366004615780565b6134e1565b34801561112757600080fd5b506106866111363660046159b8565b6137b5565b34801561114757600080fd5b5061063c6111563660046157ba565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561118d57600080fd5b5061063c601c5481565b3480156111a357600080fd5b506106866111b236600461597e565b613862565b3480156111c357600080fd5b5061063c60125481565b3480156111d957600080fd5b5061063c60135481565b3480156111ef57600080fd5b5061063c6138b0565b34801561120457600080fd5b50600b546106c890600160b01b900460ff1681565b34801561122557600080fd5b5061063c611234366004615780565b6138f5565b34801561124557600080fd5b506106866112543660046159b8565b613928565b34801561126557600080fd5b5061063c6139e7565b34801561127a57600080fd5b50610686611289366004615780565b613a2c565b34801561129a57600080fd5b5061063c613b28565b3480156112af57600080fd5b506106866112be3660046159b8565b613b6d565b3480156112cf57600080fd5b5061063c60195481565b3480156112e557600080fd5b506106866112f4366004615a18565b613ba2565b60606003805461130890615e25565b80601f016020809104026020016040519081016040528092919081815260200182805461133490615e25565b80156113815780601f1061135657610100808354040283529160200191611381565b820191906000526020600020905b81548152906001019060200180831161136457829003601f168201915b5050505050905090565b6005546001600160a01b036101009091041633146113c45760405162461bcd60e51b81526004016113bb90615ce6565b60405180910390fd5b6006601455600560165560026018819055601d556000601a819055601955600f601f55600b805465ffffff00ffff60b01b19166501010100010160b01b1790556702c68af0bb14000060125568056bc75e2d631000006010819055601155683635c9adc5dea00000601355565b6005546001600160a01b036101009091041633146114615760405162461bcd60e51b81526004016113bb90615ce6565b600a80546001600160a01b0319166001600160a01b03838116918217909255600d54604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd2906024015b600060405180830381600087803b1580156114c057600080fd5b505af11580156114d4573d6000803e3d6000fd5b5050505050565b60006114e8338484613c95565b5060015b92915050565b600d5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561153757600080fd5b505afa15801561154b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156f91906159d1565b905090565b6000611581848484613dba565b6115d384336115ce85604051806060016040528060288152602001615f13602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061479d565b613c95565b5060019392505050565b6005546001600160a01b0361010090910416331461160d5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160b01b909104161515811515141561163e5760405162461bcd60e51b81526004016113bb90615caf565b8061166a5760188054601b5560009055600b805460ff60b01b1916600160b01b831515021790556116c3565b601b546018819055506116a8601a546116a26019546116a2601d546116a26014546116a2601654601854613c2f90919063ffffffff16565b90613c2f565b601f55600b805460ff60b01b1916600160b01b831515021790555b60405181151581527f6ba6c1012539169f5a820a29533d8c8b797a1c7a5634edbd3124a80de0e75cba906020015b60405180910390a150565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561153757600080fd5b600c54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024015b6101006040518083038186803b15801561179857600080fd5b505afa1580156117ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d09190615862565b97509750975097509750975097509750919395975091939597565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561153757600080fd5b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561187757600080fd5b505afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ec91906159d1565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916114e89185906115ce9086613c2f565b6005546001600160a01b036101009091041633146119155760405162461bcd60e51b81526004016113bb90615ce6565b600c54604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401600060405180830381600087803b15801561195b57600080fd5b505af115801561196f573d6000803e3d6000fd5b5050600d54604051630dcb2e8960e01b8152600481018590526001600160a01b039091169250630dcb2e8991506024016114a6565b600c5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a28919061599b565b50600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015611a7557600080fd5b505af1158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad919061599b565b50565b6005546001600160a01b03610100909104163314611ae05760405162461bcd60e51b81526004016113bb90615ce6565b602380546001600160a01b0319166001600160a01b03848116918217909255600c5460405163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015611b3e57600080fd5b505af1158015611b52573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015611b9d57600080fd5b505af1158015611bb1573d6000803e3d6000fd5b50505050611bc0826001613001565b600c5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611c0757600080fd5b505af1158015611c1b573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c89816001613001565b5050565b600d54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161177f565b6005546001600160a01b03610100909104163314611cff5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160c01b9091041615158115151415611d305760405162461bcd60e51b81526004016113bb90615caf565b600b8054821515600160c01b0260ff60c01b199091161790556040517fcb92548f053f949ff8c2721ff8f503444402bec41b7072bc24d069f8f701fc85906116f190831515815260200190565b6005546001600160a01b03610100909104163314611dad5760405162461bcd60e51b81526004016113bb90615ce6565b611dbb81633b9aca00615def565b60115550565b600c5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f19060240161177f565b6005546001600160a01b03610100909104163314611e335760405162461bcd60e51b81526004016113bb90615ce6565b6008546001600160a01b0382811691161415611ea65760405162461bcd60e51b815260206004820152602c60248201527f506f6c794156433a2054686520726f7574657220616c7265616479206861732060448201526b74686174206164647265737360a01b60648201526084016113bb565b6008546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314611f335760405162461bcd60e51b81526004016113bb90615ce6565b600c546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b158015611f8157600080fd5b505af1158015611f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb991906159ea565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fbfde62defd797952524ace735811c8758254f37d0faf697997cca2ca925535119060800160405180910390a3600d546040516001624d3b8760e01b0319815260048101869052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561205c57600080fd5b505af1158015612070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209491906159ea565b6040805184815260208101849052908101829052606081018b9052929550909350915032906000907f7bce0dc592cad5b21a65fb2892e9b4c4394527cec774aa1c11c068c1040bcaa89060800160405180910390a350505050505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0361010090910416331461213d5760405162461bcd60e51b81526004016113bb90615ce6565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f19060240161177f565b600c546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240161185f565b600c54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561153757600080fd5b600c546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161185f565b6005546001600160a01b036101009091041633146122aa5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160b81b90910416151581151514156122db5760405162461bcd60e51b81526004016113bb90615caf565b806123075760198054601c5560009055600b805460ff60b81b1916600160b81b83151502179055612354565b601c54601981905550612339601a546116a2601d546116a26014546116a2601654601954613c2f90919063ffffffff16565b601f55600b805460ff60b81b1916600160b81b831515021790555b60405181151581527f2c1d3fa42470f38c24d7ce77dc883522afe986e4d2f9bb71e11756381c240e2c906020016116f1565b6005546001600160a01b036101009091041633146123b65760405162461bcd60e51b81526004016113bb90615ce6565b600e546001600160a01b038281169116141561242d5760405162461bcd60e51b815260206004820152603060248201527f506f6c794156433a20546865207465616d2077616c6c657420697320616c726560448201526f6164792074686973206164647265737360801b60648201526084016113bb565b612438816001613001565b600e546040516001600160a01b038084169216907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146124c45760405162461bcd60e51b81526004016113bb90615ce6565b600d546001600160a01b03828116911614156124f25760405162461bcd60e51b81526004016113bb90615c59565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253a57600080fd5b505afa15801561254e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612572919061579d565b6001600160a01b0316146125985760405162461bcd60e51b81526004016113bb90615ba5565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b1580156125da57600080fd5b505af11580156125ee573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561263357600080fd5b505af1158015612647573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561269257600080fd5b505af11580156126a6573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b1580156126f157600080fd5b505af1158015612705573d6000803e3d6000fd5b5050600d546040516001600160a01b03918216935090851691507fb6a9e3f9245b18cb1c1148bae484a909ae692017fd5c361c769569d5d2eedbb690600090a3600d80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b036101009091041633146127985760405162461bcd60e51b81526004016113bb90615ce6565b6022548114156128085760405162461bcd60e51b815260206004820152603560248201527f506f6c794156433a2043616e6e6f742075706461746520676173466f7250726f60448201527463657373696e6720746f2073616d652076616c756560581b60648201526084016113bb565b6022819055604051819081907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a350565b6005546001600160a01b0361010090910416331461286d5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160d01b909104161515811515141561289e5760405162461bcd60e51b81526004016113bb90615caf565b806128ca576014805460155560009055600b805460ff60d01b1916600160d01b8315150217905561291d565b601554601481905550612902601a546116a26019546116a2601d546116a26016546116a2601854601454613c2f90919063ffffffff16565b601f55600b805460ff60d01b1916600160d01b831515021790555b60405181151581527ea8053a65b4889b9c6e9f7854895eb21efe9c466b8c339cf10d7a60b568beef906020016116f1565b6005546001600160a01b0361010090910416331461297e5760405162461bcd60e51b81526004016113bb90615ce6565b600980546001600160a01b0319166001600160a01b03838116918217909255600c54604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd2906024016114a6565b60606004805461130890615e25565b6005546001600160a01b03610100909104163314612a065760405162461bcd60e51b81526004016113bb90615ce6565b60068160ff161115612a2a5760405162461bcd60e51b81526004016113bb90615c18565b8060ff16601d81905550612a63601a546116a26019546116a26018546116a26016546116a2601454601d54613c2f90919063ffffffff16565b601f5550565b6005546001600160a01b03610100909104163314612a995760405162461bcd60e51b81526004016113bb90615ce6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b5c5760405162461bcd60e51b815260206004820152605260248201527f506f6c794156433a205468652050616e746f6b656e4f6e65537761702070616960448201527f722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617460648201527165644d61726b65744d616b6572506169727360701b608482015260a4016113bb565b611c8982826147d4565b6005546001600160a01b03610100909104163314612b965760405162461bcd60e51b81526004016113bb90615ce6565b612ba481633b9aca00615def565b60135550565b60006114e833846115ce85604051806060016040528060258152602001615f3b602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061479d565b60006114e8338484613dba565b6005546001600160a01b03610100909104163314612c365760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160d81b9091041615158115151415612c675760405162461bcd60e51b81526004016113bb90615caf565b80612c93576016805460175560009055600b805460ff60d81b1916600160d81b83151502179055612ce6565b601754601681905550612ccb601a546116a26019546116a2601d546116a26014546116a2601854601654613c2f90919063ffffffff16565b601f55600b805460ff60d81b1916600160d81b831515021790555b60405181151581527f05796e98c682a0edd15a95a8861971481c1cd8b0a0160e00fe9f7deb00b033cb906020016116f1565b6005546001600160a01b03610100909104163314612d485760405162461bcd60e51b81526004016113bb90615ce6565b600f546001600160a01b0382811691161415612dc45760405162461bcd60e51b815260206004820152603560248201527f506f6c794156433a20546865206d61726b6574696e672077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b60648201526084016113bb565b612dcf816001613001565b600f546040516001600160a01b038084169216907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314612e5b5760405162461bcd60e51b81526004016113bb90615ce6565b612e6981633b9aca00615def565b60125550565b6005546001600160a01b03610100909104163314612e9f5760405162461bcd60e51b81526004016113bb90615ce6565b600c5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db091506024016114a6565b6005546001600160a01b03610100909104163314612f605760405162461bcd60e51b81526004016113bb90615ce6565b612f6e81633b9aca00615def565b60105550565b6005546001600160a01b03610100909104163314612fa45760405162461bcd60e51b81526004016113bb90615ce6565b60068160ff161115612fc85760405162461bcd60e51b81526004016113bb90615c18565b8060ff16601681905550612a63601a546116a26019546116a2601d546116a26018546116a2601454601654613c2f90919063ffffffff16565b6005546001600160a01b036101009091041633146130315760405162461bcd60e51b81526004016113bb90615ce6565b6001600160a01b03821660009081526024602052604090205460ff16151581151514156130b65760405162461bcd60e51b815260206004820152602d60248201527f506f6c794156433a204163636f756e7420697320616c72656164792065786c7560448201526c6465642066726f6d206665657360981b60648201526084016113bb565b6001600160a01b038216600081815260246020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b036101009091041633146131455760405162461bcd60e51b81526004016113bb90615ce6565b60005b828110156131b657816024600086868581811061316757613167615e91565b905060200201602081019061317c9190615780565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806131ae81615e60565b915050613148565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516131ea93929190615a7f565b60405180910390a1505050565b6005546001600160a01b036101009091041633146132275760405162461bcd60e51b81526004016113bb90615ce6565b600c5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561326e57600080fd5b505af1158015613282573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b1580156132cd57600080fd5b505af11580156132e1573d6000803e3d6000fd5b5050602154611aad92506132f7915060056149cb565b82614a4a565b6005546001600160a01b0361010090910416331461332d5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160c81b909104161515811515141561335e5760405162461bcd60e51b81526004016113bb90615caf565b8061338a57601d8054601e5560009055600b805460ff60c81b1916600160c81b831515021790556133dd565b601e54601d819055506133c2601a546116a26019546116a26014546116a26016546116a2601854601d54613c2f90919063ffffffff16565b601f55600b805460ff60c81b1916600160c81b831515021790555b60405181151581527feeddd25ab572944f46f2e1d17c56bb44594bdf0b4696199da23db34f0bcf9b9a906020016116f1565b600c546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561153757600080fd5b6005546001600160a01b036101009091041633146134845760405162461bcd60e51b81526004016113bb90615ce6565b60068160ff1611156134a85760405162461bcd60e51b81526004016113bb90615c18565b8060ff16601881905550612a63601a546116a26019546116a2601d546116a26016546116a2601454601854613c2f90919063ffffffff16565b6005546001600160a01b036101009091041633146135115760405162461bcd60e51b81526004016113bb90615ce6565b600c546001600160a01b038281169116141561353f5760405162461bcd60e51b81526004016113bb90615c59565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561358757600080fd5b505afa15801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061579d565b6001600160a01b0316146135e55760405162461bcd60e51b81526004016113bb90615ba5565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561362757600080fd5b505af115801561363b573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561368057600080fd5b505af1158015613694573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b1580156136df57600080fd5b505af11580156136f3573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561373e57600080fd5b505af1158015613752573d6000803e3d6000fd5b5050600c546040516001600160a01b03918216935090851691507faa595611f416527c482b6f5788d3509682c383c4782422f76ec54e2751a1577490600090a3600c80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b036101009091041633146137e55760405162461bcd60e51b81526004016113bb90615ce6565b60058054600680546001600160a01b0319166001600160a01b03610100840416179055610100600160a81b031916905561381f8142615db5565b60075560055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b6005546001600160a01b036101009091041633146138925760405162461bcd60e51b81526004016113bb90615ce6565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b600c54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561153757600080fd5b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161185f565b6005546001600160a01b036101009091041633146139585760405162461bcd60e51b81526004016113bb90615ce6565b600c5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401600060405180830381600087803b15801561399e57600080fd5b505af11580156139b2573d6000803e3d6000fd5b5050600d5460405163e98030c760e01b8152600481018590526001600160a01b03909116925063e98030c791506024016114a6565b600c5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561153757600080fd5b6005546001600160a01b03610100909104163314613a5c5760405162461bcd60e51b81526004016113bb90615ce6565b6001600160a01b038116613ac15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016113bb565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561153757600080fd5b6005546001600160a01b03610100909104163314613b9d5760405162461bcd60e51b81526004016113bb90615ce6565b602055565b6005546001600160a01b03610100909104163314613bd25760405162461bcd60e51b81526004016113bb90615ce6565b60068160ff161115613bf65760405162461bcd60e51b81526004016113bb90615c18565b8060ff16601481905550612a63601a546116a26019546116a2601d546116a26016546116a2601854601454613c2f90919063ffffffff16565b600080613c3c8385615db5565b905083811015613c8e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016113bb565b9392505050565b6001600160a01b038316613cf75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016113bb565b6001600160a01b038216613d585760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016113bb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316613de05760405162461bcd60e51b81526004016113bb90615d1b565b6001600160a01b038216613e065760405162461bcd60e51b81526004016113bb90615b62565b600b54600160a81b900460ff1680613e5857506001600160a01b03831660009081526024602052604090205460ff1680613e5857506001600160a01b03821660009081526024602052604090205460ff165b613eb05760405162461bcd60e51b8152602060048201526024808201527f506f6c794156433a2054726164696e6720686173206e6f742073746172746564604482015263081e595d60e21b60648201526084016113bb565b6001600160a01b03831660009081526024602052604081205460ff1680613eef57506001600160a01b03831660009081526024602052604090205460ff165b601f54600b54919250600091600160c01b900460ff168015613f2957506001600160a01b03861660009081526025602052604090205460ff165b15613f405760019150613f3d816002614a8a565b90505b600b54600160a81b900460ff168015613f7157506001600160a01b03861660009081526025602052604090205460ff165b8015613f7b575082155b1561405e57601054841115613fe35760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016113bb565b6000613fee866120f2565b601354909150613ffe8683615db5565b11156140585760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b60648201526084016113bb565b5061439d565b600b54600160a81b900460ff16801561408f57506001600160a01b03851660009081526025602052604090205460ff165b8015614099575082155b1561439d576011548411156141165760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e00000000000060648201526084016113bb565b6000614121306120f2565b601254600b5491925082101590600160a01b900460ff161580156141425750805b1561439a57600b805460ff60a01b1916600160a01b1790819055600160b01b900460ff16156141f957600061419b8561417d5760185461418b565b60185461418b906002614a8a565b6141958587614a8a565b906149cb565b90506141a681614ae5565b60006141b86042614195476064614a8a565b905060006141c64783614c4e565b600f549091506141df906001600160a01b031682614caa565b600e546141f5906001600160a01b031683614caa565b5050505b600b54600160c81b900460ff16156142c7576000614215614ce5565b90506032811161428c5747633b9aca0081111561424f5761424a61424561423a614ce5565b614195846064614a8a565b614e06565b614286565b60006142798761426157601d5461426f565b601d5461426f906002614a8a565b6141958789614a8a565b905061428481614ae5565b505b506142c5565b60328111156142c5576142c56142c0866142a857601d546142b6565b601d546142b6906002614a8a565b6141958688614a8a565b61500c565b505b600b54600160d01b900460ff161561434357600061432c856142eb576014546142f9565b6014546142f9906002614a8a565b6141956143238861430c5760165461431a565b60165461431a906002614a8a565b60145490613c2f565b60125490614a8a565b905061434161433c61423a614ce5565b615094565b505b600b54600160d81b900460ff161561438c57600061437585614367576016546142f9565b6016546142f9906002614a8a565b905061438a61438561423a614ce5565b61514a565b505b600b805460ff60a01b191690555b50505b600b54600090600160a81b900460ff1680156143c35750600b54600160a01b900460ff16155b80156143cd575083155b905080156144015760006143e683614195886064614a8a565b90506143f28682614c4e565b95506143ff883083615200565b505b61440c878787615200565b600c546001600160a01b031663e30443bc88614427816120f2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561446d57600080fd5b505af192505050801561447e575060015b50600d546001600160a01b031663e30443bc8861449a816120f2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156144e057600080fd5b505af19250505080156144f1575060015b50600c546001600160a01b031663e30443bc8761450d816120f2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561455357600080fd5b505af1925050508015614564575060015b50600d546001600160a01b031663e30443bc87614580816120f2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156145c657600080fd5b505af19250505080156145d7575060015b50600b54600160a01b900460ff1661479457602254600c546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b15801561463557600080fd5b505af1925050508015614665575060408051601f3d908101601f19168201909252614662918101906159ea565b60015b61466e576146bf565b60408051848152602081018490529081018290526060810185905232906001907fbfde62defd797952524ace735811c8758254f37d0faf697997cca2ca925535119060800160405180910390a35050505b600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b15801561470857600080fd5b505af1925050508015614738575060408051601f3d908101601f19168201909252614735918101906159ea565b60015b61474157614792565b60408051848152602081018490529081018290526060810185905232906001907f7bce0dc592cad5b21a65fb2892e9b4c4394527cec774aa1c11c068c1040bcaa89060800160405180910390a35050505b505b50505050505050565b600081848411156147c15760405162461bcd60e51b81526004016113bb9190615b0d565b506147cc8385615e0e565b949350505050565b6005546001600160a01b036101009091041633146148045760405162461bcd60e51b81526004016113bb90615ce6565b6001600160a01b03821660009081526025602052604090205460ff16151581151514156148a35760405162461bcd60e51b815260206004820152604160248201527f506f6c794156433a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a4016113bb565b6001600160a01b0382166000908152602560205260409020805460ff1916821580159190911790915561498f57600c5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561491757600080fd5b505af115801561492b573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b15801561497657600080fd5b505af115801561498a573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000826149da575060006114ec565b60006149e68385615def565b9050826149f38583615dcd565b14613c8e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016113bb565b6001600160a01b038116600090815260208190526040902054614a6d9083613c2f565b6001600160a01b0390911660009081526020819052604090205550565b6000808211614adb5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016113bb565b613c8e8284615dcd565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614b1a57614b1a615e91565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015614b6e57600080fd5b505afa158015614b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ba6919061579d565b81600181518110614bb957614bb9615e91565b6001600160a01b039283166020918202929092010152600854614bdf9130911684613c95565b60085460405163791ac94760e01b81526001600160a01b039091169063791ac94790614c18908590600090869030904290600401615d79565b600060405180830381600087803b158015614c3257600080fd5b505af1158015614c46573d6000803e3d6000fd5b505050505050565b600082821115614ca05760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016113bb565b613c8e8284615e0e565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015614ce0573d6000803e3d6000fd5b505050565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190439042906034016040516020818303038152906040528051906020012060001c614d2f9190615dcd565b6040516bffffffffffffffffffffffff194160601b166020820152459042906034016040516020818303038152906040528051906020012060001c614d749190615dcd565b614d7e4442615db5565b614d889190615db5565b614d929190615db5565b614d9c9190615db5565b614da69190615db5565b604051602001614db891815260200190565b60408051601f19818403018152919052805160209091012090506000614ddf606483615dcd565b614dea906064615def565b614df49083615e0e565b9050806114ec57613c8e600182615db5565b6040805160028082526060820183526000926020830190803683375050600854604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015614e6b57600080fd5b505afa158015614e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ea3919061579d565b81600081518110614eb657614eb6615e91565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110614eea57614eea615e91565b6001600160a01b039283166020918202929092010152600f54600091614f1091166120f2565b600854600f549192506001600160a01b039081169163b6f9de95918691600091879116614f3f4261012c613c2f565b6040518663ffffffff1660e01b8152600401614f5e9493929190615ad8565b6000604051808303818588803b158015614f7757600080fd5b505af1158015614f8b573d6000803e3d6000fd5b5050600f5460009350614fb49250849150614fae906001600160a01b03166120f2565b90614c4e565b600f54909150614fcd906001600160a01b031682615309565b7fd79349298b0eadebdb47b2a093b1596f41af709d6a3bc3d848b9e8821df480728484604051614ffe929190615d60565b60405180910390a150505050565b6000615019826002614a8a565b905060006150278383614c4e565b90504761503383614ae5565b600061503f4783614c4e565b905061504b8382615414565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561906060015b60405180910390a15050505050565b6009546150ad90829030906001600160a01b03166154d0565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156150f157600080fd5b505afa158015615105573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061512991906159d1565b600954600c54919250611c89916001600160a01b0391821691168084615667565b600a5461516390829030906001600160a01b03166154d0565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156151a757600080fd5b505afa1580156151bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151df91906159d1565b600a54600d54919250611c89916001600160a01b0391821691168084615667565b6001600160a01b0383166152265760405162461bcd60e51b81526004016113bb90615d1b565b6001600160a01b03821661524c5760405162461bcd60e51b81526004016113bb90615b62565b61528981604051806060016040528060268152602001615eed602691396001600160a01b038616600090815260208190526040902054919061479d565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546152b89082613c2f565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613dad565b6001600160a01b0382166153695760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016113bb565b6153a681604051806060016040528060228152602001615ecb602291396001600160a01b038516600090815260208190526040902054919061479d565b6001600160a01b0383166000908152602081905260409020556002546153cc9082614c4e565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60085461542c9030906001600160a01b031684613c95565b600854600f5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561549757600080fd5b505af11580156154ab573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114d491906159ea565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061550757615507615e91565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561555b57600080fd5b505afa15801561556f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615593919061579d565b816001815181106155a6576155a6615e91565b60200260200101906001600160a01b031690816001600160a01b03168152505081816002815181106155da576155da615e91565b6001600160a01b0392831660209182029290920101526008546156009130911686613c95565b600854604051635c11d79560e01b81526001600160a01b0390911690635c11d79590615639908790600090869089904290600401615d79565b600060405180830381600087803b15801561565357600080fd5b505af1158015614792573d6000803e3d6000fd5b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000919086169063a9059cbb90604401602060405180830381600087803b1580156156b557600080fd5b505af11580156156c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906156ed919061599b565b905080156114d457604051633243c79160e01b8152600481018390526001600160a01b03841690633243c79190602401600060405180830381600087803b15801561573757600080fd5b505af115801561574b573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161508591815260200190565b60006020828403121561579257600080fd5b8135613c8e81615ea7565b6000602082840312156157af57600080fd5b8151613c8e81615ea7565b600080604083850312156157cd57600080fd5b82356157d881615ea7565b915060208301356157e881615ea7565b809150509250929050565b60008060006060848603121561580857600080fd5b833561581381615ea7565b9250602084013561582381615ea7565b929592945050506040919091013590565b6000806040838503121561584757600080fd5b823561585281615ea7565b915060208301356157e881615ebc565b600080600080600080600080610100898b03121561587f57600080fd5b885161588a81615ea7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600080604083850312156158df57600080fd5b82356158ea81615ea7565b946020939093013593505050565b60008060006040848603121561590d57600080fd5b833567ffffffffffffffff8082111561592557600080fd5b818601915086601f83011261593957600080fd5b81358181111561594857600080fd5b8760208260051b850101111561595d57600080fd5b6020928301955093505084013561597381615ebc565b809150509250925092565b60006020828403121561599057600080fd5b8135613c8e81615ebc565b6000602082840312156159ad57600080fd5b8151613c8e81615ebc565b6000602082840312156159ca57600080fd5b5035919050565b6000602082840312156159e357600080fd5b5051919050565b6000806000606084860312156159ff57600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215615a2a57600080fd5b813560ff81168114613c8e57600080fd5b600081518084526020808501945080840160005b83811015615a745781516001600160a01b031687529582019590820190600101615a4f565b509495945050505050565b6040808252810183905260008460608301825b86811015615ac2578235615aa581615ea7565b6001600160a01b0316825260209283019290910190600101615a92565b5080925050508215156020830152949350505050565b848152608060208201526000615af16080830186615a3b565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b81811015615b3a57858101830151858201604001528201615b1e565b81811115615b4c576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252604d908201527f506f6c794156433a20546865206e6577206469766964656e6420747261636b6560408201527f72206d757374206265206f776e65642062792074686520506f6c79415643207460608201526c1bdad95b8818dbdb9d1c9858dd609a1b608082015260a00190565b60208082526021908201527f506f6c794156433a20466565206d757374206265206c657373207468616e20366040820152602560f81b606082015260800190565b60208082526036908201527f506f6c794156433a20546865206469766964656e6420747261636b657220616c6040820152757265616479206861732074686174206164647265737360501b606082015260800190565b6020808252601d908201527f43616e27742073657420666c616720746f2073616d6520737461747573000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b8281526040602082015260006147cc6040830184615a3b565b85815284602082015260a060408201526000615d9860a0830186615a3b565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115615dc857615dc8615e7b565b500190565b600082615dea57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615e0957615e09615e7b565b500290565b600082821015615e2057615e20615e7b565b500390565b600181811c90821680615e3957607f821691505b60208210811415615e5a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e7457615e74615e7b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114611aad57600080fd5b8015158114611aad57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ad7440b66c7a6ac2f2e29f8132d80778a7c7ae6f3f4471c6be3e4756f87fb22464736f6c6343000806003360806040523480156200001157600080fd5b50604051806060016040528060218152602001620025da60219139604051806060016040528060218152602001620025da6021913973d6df932a45c0f255f85145f286ea0b292b21c90b82828160039080519060200190620000759291906200012e565b5080516200008b9060049060208401906200012e565b50506005805460ff1916600917905550600880546001600160a01b039092166001600160a01b03199092169190911790555060009050620000c93390565b600c80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061070860165566071afd498d000060175562000211565b8280546200013c90620001d4565b90600052602060002090601f016020900481019282620001605760008555620001ab565b82601f106200017b57805160ff1916838001178555620001ab565b82800160010185558215620001ab579182015b82811115620001ab5782518255916020019190600101906200018e565b50620001b9929150620001bd565b5090565b5b80821115620001b95760008155600101620001be565b600181811c90821680620001e957607f821691505b602082108114156200020b57634e487b7160e01b600052602260045260246000fd5b50919050565b6123b980620002216000396000f3fe60806040526004361061024a5760003560e01c806370a0823111610139578063aafd847a116100b6578063e30443bc1161007a578063e30443bc1461073f578063e7841ec01461075f578063e98030c714610774578063f2fde38b14610794578063fbcbc0f1146107b4578063ffb2c479146107d457600080fd5b8063aafd847a1461066d578063bc4c4b37146106a3578063be10b614146106c3578063dd467064146106d9578063dd62ed3e146106f957600080fd5b806391b89fba116100fd57806391b89fba146105d857806395d89b41146105f8578063a457c2d71461060d578063a8b9d2401461062d578063a9059cbb1461064d57600080fd5b806370a0823114610539578063715018a61461056f5780637e3e7fd21461058457806385a6b3ae146105a45780638da5cb5b146105ba57600080fd5b80633009a609116101c75780634e7b827f1161018b5780634e7b827f1461044c5780635183d6fd1461047c5780636a474002146104e15780636ebcf607146104f65780636f2789ec1461052357600080fd5b80633009a609146103b4578063313ce567146103ca57806331e79db0146103ec5780633243c7911461040c578063395093511461042c57600080fd5b80631582358e1161020e5780631582358e146102fa57806318160ddd14610332578063226cfa3d1461034757806323b872dd1461037457806327ce01471461039457600080fd5b806303c833021461025657806306fdde0314610260578063095ea7b31461028b57806309bbedde146102bb5780630dcb2e89146102da57600080fd5b3661025157005b600080fd5b61025e61080f565b005b34801561026c57600080fd5b506102756108a2565b60405161028291906120f5565b60405180910390f35b34801561029757600080fd5b506102ab6102a636600461200b565b610934565b6040519015158152602001610282565b3480156102c757600080fd5b50600f545b604051908152602001610282565b3480156102e657600080fd5b5061025e6102f53660046120dc565b61094b565b34801561030657600080fd5b5060085461031a906001600160a01b031681565b6040516001600160a01b039091168152602001610282565b34801561033e57600080fd5b506002546102cc565b34801561035357600080fd5b506102cc610362366004611f98565b60156020526000908152604090205481565b34801561038057600080fd5b506102ab61038f366004612065565b610a1d565b3480156103a057600080fd5b506102cc6103af366004611f98565b610a86565b3480156103c057600080fd5b506102cc60135481565b3480156103d657600080fd5b5060055460405160ff9091168152602001610282565b3480156103f857600080fd5b5061025e610407366004611f98565b610ae2565b34801561041857600080fd5b5061025e6104273660046120dc565b610c09565b34801561043857600080fd5b506102ab61044736600461200b565b610c8a565b34801561045857600080fd5b506102ab610467366004611f98565b60146020526000908152604090205460ff1681565b34801561048857600080fd5b5061049c6104973660046120dc565b610cc0565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610282565b3480156104ed57600080fd5b5061025e610e32565b34801561050257600080fd5b506102cc610511366004611f98565b60006020819052908152604090205481565b34801561052f57600080fd5b506102cc60165481565b34801561054557600080fd5b506102cc610554366004611f98565b6001600160a01b031660009081526020819052604090205490565b34801561057b57600080fd5b5061025e610ee3565b34801561059057600080fd5b5061025e61059f366004611f98565b610f57565b3480156105b057600080fd5b506102cc600b5481565b3480156105c657600080fd5b50600c546001600160a01b031661031a565b3480156105e457600080fd5b506102cc6105f3366004611f98565b610fa3565b34801561060457600080fd5b50610275610fae565b34801561061957600080fd5b506102ab61062836600461200b565b610fbd565b34801561063957600080fd5b506102cc610648366004611f98565b61100c565b34801561065957600080fd5b506102ab61066836600461200b565b611038565b34801561067957600080fd5b506102cc610688366004611f98565b6001600160a01b03166000908152600a602052604090205490565b3480156106af57600080fd5b506102ab6106be366004611fd2565b611045565b3480156106cf57600080fd5b506102cc60175481565b3480156106e557600080fd5b5061025e6106f43660046120dc565b6110f3565b34801561070557600080fd5b506102cc610714366004612037565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561074b57600080fd5b5061025e61075a36600461200b565b61118a565b34801561076b57600080fd5b506013546102cc565b34801561078057600080fd5b5061025e61078f3660046120dc565b6112f8565b3480156107a057600080fd5b5061025e6107af366004611f98565b6113de565b3480156107c057600080fd5b5061049c6107cf366004611f98565b6114c9565b3480156107e057600080fd5b506107f46107ef3660046120dc565b611641565b60408051938452602084019290925290820152606001610282565b600061081a60025490565b1161082457600080fd5b34156108a05761085761083660025490565b61084434600160801b61175c565b61084e91906121d8565b600654906117e2565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b5461089c90346117e2565b600b555b565b6060600380546108b19061226f565b80601f01602080910402602001604051908101604052809291908181526020018280546108dd9061226f565b801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b5050505050905090565b6000610941338484611841565b5060015b92915050565b600c546001600160a01b0316331461097e5760405162461bcd60e51b81526004016109759061214a565b60405180910390fd5b601754811415610a095760405162461bcd60e51b815260206004820152604a60248201527f4e6577206d696d696d756d2062616c616e636520666f72206469766964656e6460448201527f2063616e6e6f742062652073616d652061732063757272656e74206d696e696d606482015269756d2062616c616e636560b01b608482015260a401610975565b610a1781633b9aca006121fa565b60175550565b6000610a2a848484611965565b610a7c8433610a7785604051806060016040528060288152602001612337602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906119d3565b611841565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600654600160801b92610ad892610ad392610acd91610ac8919061175c565b611a0a565b90611a1a565b611a58565b61094591906121d8565b600c546001600160a01b03163314610b0c5760405162461bcd60e51b81526004016109759061214a565b6001600160a01b03811660009081526014602052604090205460ff1615610b3257600080fd5b6001600160a01b0381166000908152601460205260408120805460ff19166001179055610b60908290611a6b565b60405163131836e760e21b8152600f60048201526001600160a01b03821660248201527321022ba6844e3c43b006602b9fcd6861b6b9602e90634c60db9c9060440160006040518083038186803b158015610bba57600080fd5b505af4158015610bce573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6000610c1460025490565b11610c1e57600080fd5b8015610c8757610c3e610c3060025490565b61084483600160801b61175c565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b54610c8390826117e2565b600b555b50565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610941918590610a7790866117e2565b600080600080600080600080600f7321022ba6844e3c43b006602b9fcd6861b6b9602e63deb3d89690916040518263ffffffff1660e01b8152600401610d0891815260200190565b60206040518083038186803b158015610d2057600080fd5b505af4158015610d34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5891906120c3565b8910610d7d575060009650600019955085945086935083925082915081905080610e27565b6040516368d54f3f60e11b8152600f6004820152602481018a90526000907321022ba6844e3c43b006602b9fcd6861b6b9602e9063d1aa9e7e9060440160206040518083038186803b158015610dd257600080fd5b505af4158015610de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0a9190611fb5565b9050610e15816114c9565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152607460248201527f506f6c794156435f546f6b656e4f6e655f4469766964656e645f547261636b6560448201527f723a2077697468647261774469766964656e642064697361626c65642e20557360648201527f65207468652027636c61696d272066756e6374696f6e206f6e20746865206d6160848201527334b7102837b63ca0ab219031b7b73a3930b1ba1760611b60a482015260c401610975565b600c546001600160a01b03163314610f0d5760405162461bcd60e51b81526004016109759061214a565b600c546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600c80546001600160a01b0319169055565b600c546001600160a01b03163314610f815760405162461bcd60e51b81526004016109759061214a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006109458261100c565b6060600480546108b19061226f565b60006109413384610a778560405180606001604052806025815260200161235f602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906119d3565b6001600160a01b0381166000908152600a60205260408120546109459061103284610a86565b90611aca565b6000610941338484611965565b600c546000906001600160a01b031633146110725760405162461bcd60e51b81526004016109759061214a565b600061107d84611b26565b905080156110e9576001600160a01b038416600081815260156020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906110d79085815260200190565b60405180910390a36001915050610945565b5060009392505050565b600c546001600160a01b0316331461111d5760405162461bcd60e51b81526004016109759061214a565b600c8054600d80546001600160a01b03199081166001600160a01b0384161790915516905561114c81426121c0565b600e55600c546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b600c546001600160a01b031633146111b45760405162461bcd60e51b81526004016109759061214a565b6001600160a01b03821660009081526014602052604090205460ff16156111d9575050565b601754811061126a576111ec8282611a6b565b604051632f0ad01760e21b8152600f60048201526001600160a01b0383166024820152604481018290527321022ba6844e3c43b006602b9fcd6861b6b9602e9063bc2b405c9060640160006040518083038186803b15801561124d57600080fd5b505af4158015611261573d6000803e3d6000fd5b505050506112e8565b611275826000611a6b565b60405163131836e760e21b8152600f60048201526001600160a01b03831660248201527321022ba6844e3c43b006602b9fcd6861b6b9602e90634c60db9c9060440160006040518083038186803b1580156112cf57600080fd5b505af41580156112e3573d6000803e3d6000fd5b505050505b6112f3826001611045565b505050565b600c546001600160a01b031633146113225760405162461bcd60e51b81526004016109759061214a565b6016548114156113ab5760405162461bcd60e51b815260206004820152604860248201527f506f6c794156435f546f6b656e4f6e655f4469766964656e645f547261636b6560448201527f723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616064820152676d652076616c756560c01b608482015260a401610975565b60165460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601655565b600c546001600160a01b031633146114085760405162461bcd60e51b81526004016109759061214a565b6001600160a01b03811661146d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610975565b600c546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600f60048201526001600160a01b038216602482015281906000908190819081908190819081907321022ba6844e3c43b006602b9fcd6861b6b9602e906317e142d19060440160206040518083038186803b15801561153457600080fd5b505af4158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c91906120c3565b96506000199550600087126115ce5760135487111561159a57601354611593908890611c9a565b95506115ce565b601354600f54600091106115af5760006115be565b601354600f546115be91611aca565b90506115ca8882611a1a565b9650505b6115d78861100c565b94506115e288610a86565b6001600160a01b03891660009081526015602052604090205490945092508261160c57600061161a565b60165461161a9084906117e2565b915042821161162a576000611634565b6116348242611aca565b9050919395975091939597565b600f54600090819081908061166157505060135460009250829150611755565b6013546000805a90506000805b898410801561167c57508582105b15611744578461168b816122aa565b600f549096508610905061169e57600094505b6000600f60000186815481106116b6576116b66122db565b60009182526020808320909101546001600160a01b031680835260159091526040909120549091506116e790611ce6565b1561170a576116f7816001611045565b1561170a5781611706816122aa565b9250505b82611714816122aa565b93505060005a90508085111561173b576117386117318683611aca565b87906117e2565b95505b935061166e9050565b601385905590975095509193505050505b9193909250565b60008261176b57506000610945565b600061177783856121fa565b90508261178485836121d8565b146117db5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610975565b9392505050565b6000806117ef83856121c0565b9050838110156117db5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610975565b6001600160a01b0383166118a35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610975565b6001600160a01b0382166119045760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610975565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152603760248201527f506f6c794156435f546f6b656e4f6e655f4469766964656e645f547261636b6560448201527f723a204e6f207472616e736665727320616c6c6f7765640000000000000000006064820152608401610975565b600081848411156119f75760405162461bcd60e51b815260040161097591906120f5565b50611a028385612258565b949350505050565b6000818181121561094557600080fd5b600080611a27838561217f565b905060008312158015611a3a5750838112155b80611a4f5750600083128015611a4f57508381125b6117db57600080fd5b600080821215611a6757600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611aaa576000611a988383611aca565b9050611aa48482611d0d565b50505050565b808210156112f3576000611abe8284611aca565b9050611aa48482611d71565b600082821115611b1c5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610975565b6117db8284612258565b600080611b328361100c565b90508015611c91576001600160a01b0383166000908152600a6020526040902054611b5d90826117e2565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90611bac9084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb90604401602060405180830381600087803b158015611c0357600080fd5b505af1158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3b91906120a6565b905080611c8a576001600160a01b0384166000908152600a6020526040902054611c659083611aca565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b6000808212158015611cb5575082611cb28382612219565b13155b80611cd35750600082128015611cd3575082611cd18382612219565b135b611cdc57600080fd5b6117db8284612219565b600042821115611cf857506000919050565b601654611d054284611aca565b101592915050565b611d178282611db5565b611d51611d32610ac88360065461175c90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611c9a565b6001600160a01b0390921660009081526009602052604090209190915550565b611d7b8282611e94565b611d51611d96610ac88360065461175c90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611a1a565b6001600160a01b038216611e0b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610975565b600254611e1890826117e2565b6002556001600160a01b038216600090815260208190526040902054611e3e90826117e2565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611ef45760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610975565b611f3181604051806060016040528060228152602001612315602291396001600160a01b03851660009081526020819052604090205491906119d3565b6001600160a01b038316600090815260208190526040902055600254611f579082611aca565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611e88565b600060208284031215611faa57600080fd5b81356117db816122f1565b600060208284031215611fc757600080fd5b81516117db816122f1565b60008060408385031215611fe557600080fd5b8235611ff0816122f1565b9150602083013561200081612306565b809150509250929050565b6000806040838503121561201e57600080fd5b8235612029816122f1565b946020939093013593505050565b6000806040838503121561204a57600080fd5b8235612055816122f1565b91506020830135612000816122f1565b60008060006060848603121561207a57600080fd5b8335612085816122f1565b92506020840135612095816122f1565b929592945050506040919091013590565b6000602082840312156120b857600080fd5b81516117db81612306565b6000602082840312156120d557600080fd5b5051919050565b6000602082840312156120ee57600080fd5b5035919050565b600060208083528351808285015260005b8181101561212257858101830151858201604001528201612106565b81811115612134576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b03849003851316156121a1576121a16122c5565b600160ff1b83900384128116156121ba576121ba6122c5565b50500190565b600082198211156121d3576121d36122c5565b500190565b6000826121f557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612214576122146122c5565b500290565b60008083128015600160ff1b850184121615612237576122376122c5565b6001600160ff1b0384018313811615612252576122526122c5565b50500390565b60008282101561226a5761226a6122c5565b500390565b600181811c9082168061228357607f821691505b602082108114156122a457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156122be576122be6122c5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610c8757600080fd5b8015158114610c8757600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ac183a50722d4ef58fdbdd0d9c6d1ce1eb0396ba27f5d7f2ed407143cc2e209b64736f6c63430008060033506f6c794156435f546f6b656e4f6e655f4469766964656e645f547261636b657260806040523480156200001157600080fd5b50604051806060016040528060218152602001620025da60219139604051806060016040528060218152602001620025da60219139732791bca1f2de4661ed88a30c99a7a9449aa8417482828160039080519060200190620000759291906200012e565b5080516200008b9060049060208401906200012e565b50506005805460ff1916600917905550600880546001600160a01b039092166001600160a01b03199092169190911790555060009050620000c93390565b600c80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061070860165566071afd498d000060175562000211565b8280546200013c90620001d4565b90600052602060002090601f016020900481019282620001605760008555620001ab565b82601f106200017b57805160ff1916838001178555620001ab565b82800160010185558215620001ab579182015b82811115620001ab5782518255916020019190600101906200018e565b50620001b9929150620001bd565b5090565b5b80821115620001b95760008155600101620001be565b600181811c90821680620001e957607f821691505b602082108114156200020b57634e487b7160e01b600052602260045260246000fd5b50919050565b6123b980620002216000396000f3fe60806040526004361061024a5760003560e01c806370a0823111610139578063aafd847a116100b6578063e30443bc1161007a578063e30443bc1461073f578063e7841ec01461075f578063e98030c714610774578063f2fde38b14610794578063fbcbc0f1146107b4578063ffb2c479146107d457600080fd5b8063aafd847a1461066d578063bc4c4b37146106a3578063be10b614146106c3578063dd467064146106d9578063dd62ed3e146106f957600080fd5b806391b89fba116100fd57806391b89fba146105d857806395d89b41146105f8578063a457c2d71461060d578063a8b9d2401461062d578063a9059cbb1461064d57600080fd5b806370a0823114610539578063715018a61461056f5780637e3e7fd21461058457806385a6b3ae146105a45780638da5cb5b146105ba57600080fd5b80633009a609116101c75780634e7b827f1161018b5780634e7b827f1461044c5780635183d6fd1461047c5780636a474002146104e15780636ebcf607146104f65780636f2789ec1461052357600080fd5b80633009a609146103b4578063313ce567146103ca57806331e79db0146103ec5780633243c7911461040c578063395093511461042c57600080fd5b80631582358e1161020e5780631582358e146102fa57806318160ddd14610332578063226cfa3d1461034757806323b872dd1461037457806327ce01471461039457600080fd5b806303c833021461025657806306fdde0314610260578063095ea7b31461028b57806309bbedde146102bb5780630dcb2e89146102da57600080fd5b3661025157005b600080fd5b61025e61080f565b005b34801561026c57600080fd5b506102756108a2565b60405161028291906120f5565b60405180910390f35b34801561029757600080fd5b506102ab6102a636600461200b565b610934565b6040519015158152602001610282565b3480156102c757600080fd5b50600f545b604051908152602001610282565b3480156102e657600080fd5b5061025e6102f53660046120dc565b61094b565b34801561030657600080fd5b5060085461031a906001600160a01b031681565b6040516001600160a01b039091168152602001610282565b34801561033e57600080fd5b506002546102cc565b34801561035357600080fd5b506102cc610362366004611f98565b60156020526000908152604090205481565b34801561038057600080fd5b506102ab61038f366004612065565b610a1d565b3480156103a057600080fd5b506102cc6103af366004611f98565b610a86565b3480156103c057600080fd5b506102cc60135481565b3480156103d657600080fd5b5060055460405160ff9091168152602001610282565b3480156103f857600080fd5b5061025e610407366004611f98565b610ae2565b34801561041857600080fd5b5061025e6104273660046120dc565b610c09565b34801561043857600080fd5b506102ab61044736600461200b565b610c8a565b34801561045857600080fd5b506102ab610467366004611f98565b60146020526000908152604090205460ff1681565b34801561048857600080fd5b5061049c6104973660046120dc565b610cc0565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610282565b3480156104ed57600080fd5b5061025e610e32565b34801561050257600080fd5b506102cc610511366004611f98565b60006020819052908152604090205481565b34801561052f57600080fd5b506102cc60165481565b34801561054557600080fd5b506102cc610554366004611f98565b6001600160a01b031660009081526020819052604090205490565b34801561057b57600080fd5b5061025e610ee3565b34801561059057600080fd5b5061025e61059f366004611f98565b610f57565b3480156105b057600080fd5b506102cc600b5481565b3480156105c657600080fd5b50600c546001600160a01b031661031a565b3480156105e457600080fd5b506102cc6105f3366004611f98565b610fa3565b34801561060457600080fd5b50610275610fae565b34801561061957600080fd5b506102ab61062836600461200b565b610fbd565b34801561063957600080fd5b506102cc610648366004611f98565b61100c565b34801561065957600080fd5b506102ab61066836600461200b565b611038565b34801561067957600080fd5b506102cc610688366004611f98565b6001600160a01b03166000908152600a602052604090205490565b3480156106af57600080fd5b506102ab6106be366004611fd2565b611045565b3480156106cf57600080fd5b506102cc60175481565b3480156106e557600080fd5b5061025e6106f43660046120dc565b6110f3565b34801561070557600080fd5b506102cc610714366004612037565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561074b57600080fd5b5061025e61075a36600461200b565b61118a565b34801561076b57600080fd5b506013546102cc565b34801561078057600080fd5b5061025e61078f3660046120dc565b6112f8565b3480156107a057600080fd5b5061025e6107af366004611f98565b6113de565b3480156107c057600080fd5b5061049c6107cf366004611f98565b6114c9565b3480156107e057600080fd5b506107f46107ef3660046120dc565b611641565b60408051938452602084019290925290820152606001610282565b600061081a60025490565b1161082457600080fd5b34156108a05761085761083660025490565b61084434600160801b61175c565b61084e91906121d8565b600654906117e2565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b5461089c90346117e2565b600b555b565b6060600380546108b19061226f565b80601f01602080910402602001604051908101604052809291908181526020018280546108dd9061226f565b801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b5050505050905090565b6000610941338484611841565b5060015b92915050565b600c546001600160a01b0316331461097e5760405162461bcd60e51b81526004016109759061214a565b60405180910390fd5b601754811415610a095760405162461bcd60e51b815260206004820152604a60248201527f4e6577206d696d696d756d2062616c616e636520666f72206469766964656e6460448201527f2063616e6e6f742062652073616d652061732063757272656e74206d696e696d606482015269756d2062616c616e636560b01b608482015260a401610975565b610a1781633b9aca006121fa565b60175550565b6000610a2a848484611965565b610a7c8433610a7785604051806060016040528060288152602001612337602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906119d3565b611841565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600654600160801b92610ad892610ad392610acd91610ac8919061175c565b611a0a565b90611a1a565b611a58565b61094591906121d8565b600c546001600160a01b03163314610b0c5760405162461bcd60e51b81526004016109759061214a565b6001600160a01b03811660009081526014602052604090205460ff1615610b3257600080fd5b6001600160a01b0381166000908152601460205260408120805460ff19166001179055610b60908290611a6b565b60405163131836e760e21b8152600f60048201526001600160a01b03821660248201527321022ba6844e3c43b006602b9fcd6861b6b9602e90634c60db9c9060440160006040518083038186803b158015610bba57600080fd5b505af4158015610bce573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6000610c1460025490565b11610c1e57600080fd5b8015610c8757610c3e610c3060025490565b61084483600160801b61175c565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b54610c8390826117e2565b600b555b50565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610941918590610a7790866117e2565b600080600080600080600080600f7321022ba6844e3c43b006602b9fcd6861b6b9602e63deb3d89690916040518263ffffffff1660e01b8152600401610d0891815260200190565b60206040518083038186803b158015610d2057600080fd5b505af4158015610d34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5891906120c3565b8910610d7d575060009650600019955085945086935083925082915081905080610e27565b6040516368d54f3f60e11b8152600f6004820152602481018a90526000907321022ba6844e3c43b006602b9fcd6861b6b9602e9063d1aa9e7e9060440160206040518083038186803b158015610dd257600080fd5b505af4158015610de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0a9190611fb5565b9050610e15816114c9565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152607460248201527f506f6c794156435f546f6b656e54776f5f4469766964656e645f547261636b6560448201527f723a2077697468647261774469766964656e642064697361626c65642e20557360648201527f65207468652027636c61696d272066756e6374696f6e206f6e20746865206d6160848201527334b7102837b63ca0ab219031b7b73a3930b1ba1760611b60a482015260c401610975565b600c546001600160a01b03163314610f0d5760405162461bcd60e51b81526004016109759061214a565b600c546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600c80546001600160a01b0319169055565b600c546001600160a01b03163314610f815760405162461bcd60e51b81526004016109759061214a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006109458261100c565b6060600480546108b19061226f565b60006109413384610a778560405180606001604052806025815260200161235f602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906119d3565b6001600160a01b0381166000908152600a60205260408120546109459061103284610a86565b90611aca565b6000610941338484611965565b600c546000906001600160a01b031633146110725760405162461bcd60e51b81526004016109759061214a565b600061107d84611b26565b905080156110e9576001600160a01b038416600081815260156020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906110d79085815260200190565b60405180910390a36001915050610945565b5060009392505050565b600c546001600160a01b0316331461111d5760405162461bcd60e51b81526004016109759061214a565b600c8054600d80546001600160a01b03199081166001600160a01b0384161790915516905561114c81426121c0565b600e55600c546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b600c546001600160a01b031633146111b45760405162461bcd60e51b81526004016109759061214a565b6001600160a01b03821660009081526014602052604090205460ff16156111d9575050565b601754811061126a576111ec8282611a6b565b604051632f0ad01760e21b8152600f60048201526001600160a01b0383166024820152604481018290527321022ba6844e3c43b006602b9fcd6861b6b9602e9063bc2b405c9060640160006040518083038186803b15801561124d57600080fd5b505af4158015611261573d6000803e3d6000fd5b505050506112e8565b611275826000611a6b565b60405163131836e760e21b8152600f60048201526001600160a01b03831660248201527321022ba6844e3c43b006602b9fcd6861b6b9602e90634c60db9c9060440160006040518083038186803b1580156112cf57600080fd5b505af41580156112e3573d6000803e3d6000fd5b505050505b6112f3826001611045565b505050565b600c546001600160a01b031633146113225760405162461bcd60e51b81526004016109759061214a565b6016548114156113ab5760405162461bcd60e51b815260206004820152604860248201527f506f6c794156435f546f6b656e54776f5f4469766964656e645f547261636b6560448201527f723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616064820152676d652076616c756560c01b608482015260a401610975565b60165460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601655565b600c546001600160a01b031633146114085760405162461bcd60e51b81526004016109759061214a565b6001600160a01b03811661146d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610975565b600c546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600f60048201526001600160a01b038216602482015281906000908190819081908190819081907321022ba6844e3c43b006602b9fcd6861b6b9602e906317e142d19060440160206040518083038186803b15801561153457600080fd5b505af4158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c91906120c3565b96506000199550600087126115ce5760135487111561159a57601354611593908890611c9a565b95506115ce565b601354600f54600091106115af5760006115be565b601354600f546115be91611aca565b90506115ca8882611a1a565b9650505b6115d78861100c565b94506115e288610a86565b6001600160a01b03891660009081526015602052604090205490945092508261160c57600061161a565b60165461161a9084906117e2565b915042821161162a576000611634565b6116348242611aca565b9050919395975091939597565b600f54600090819081908061166157505060135460009250829150611755565b6013546000805a90506000805b898410801561167c57508582105b15611744578461168b816122aa565b600f549096508610905061169e57600094505b6000600f60000186815481106116b6576116b66122db565b60009182526020808320909101546001600160a01b031680835260159091526040909120549091506116e790611ce6565b1561170a576116f7816001611045565b1561170a5781611706816122aa565b9250505b82611714816122aa565b93505060005a90508085111561173b576117386117318683611aca565b87906117e2565b95505b935061166e9050565b601385905590975095509193505050505b9193909250565b60008261176b57506000610945565b600061177783856121fa565b90508261178485836121d8565b146117db5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610975565b9392505050565b6000806117ef83856121c0565b9050838110156117db5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610975565b6001600160a01b0383166118a35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610975565b6001600160a01b0382166119045760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610975565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152603760248201527f506f6c794156435f546f6b656e54776f5f4469766964656e645f547261636b6560448201527f723a204e6f207472616e736665727320616c6c6f7765640000000000000000006064820152608401610975565b600081848411156119f75760405162461bcd60e51b815260040161097591906120f5565b50611a028385612258565b949350505050565b6000818181121561094557600080fd5b600080611a27838561217f565b905060008312158015611a3a5750838112155b80611a4f5750600083128015611a4f57508381125b6117db57600080fd5b600080821215611a6757600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611aaa576000611a988383611aca565b9050611aa48482611d0d565b50505050565b808210156112f3576000611abe8284611aca565b9050611aa48482611d71565b600082821115611b1c5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610975565b6117db8284612258565b600080611b328361100c565b90508015611c91576001600160a01b0383166000908152600a6020526040902054611b5d90826117e2565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90611bac9084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb90604401602060405180830381600087803b158015611c0357600080fd5b505af1158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3b91906120a6565b905080611c8a576001600160a01b0384166000908152600a6020526040902054611c659083611aca565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b6000808212158015611cb5575082611cb28382612219565b13155b80611cd35750600082128015611cd3575082611cd18382612219565b135b611cdc57600080fd5b6117db8284612219565b600042821115611cf857506000919050565b601654611d054284611aca565b101592915050565b611d178282611db5565b611d51611d32610ac88360065461175c90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611c9a565b6001600160a01b0390921660009081526009602052604090209190915550565b611d7b8282611e94565b611d51611d96610ac88360065461175c90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611a1a565b6001600160a01b038216611e0b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610975565b600254611e1890826117e2565b6002556001600160a01b038216600090815260208190526040902054611e3e90826117e2565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611ef45760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610975565b611f3181604051806060016040528060228152602001612315602291396001600160a01b03851660009081526020819052604090205491906119d3565b6001600160a01b038316600090815260208190526040902055600254611f579082611aca565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611e88565b600060208284031215611faa57600080fd5b81356117db816122f1565b600060208284031215611fc757600080fd5b81516117db816122f1565b60008060408385031215611fe557600080fd5b8235611ff0816122f1565b9150602083013561200081612306565b809150509250929050565b6000806040838503121561201e57600080fd5b8235612029816122f1565b946020939093013593505050565b6000806040838503121561204a57600080fd5b8235612055816122f1565b91506020830135612000816122f1565b60008060006060848603121561207a57600080fd5b8335612085816122f1565b92506020840135612095816122f1565b929592945050506040919091013590565b6000602082840312156120b857600080fd5b81516117db81612306565b6000602082840312156120d557600080fd5b5051919050565b6000602082840312156120ee57600080fd5b5035919050565b600060208083528351808285015260005b8181101561212257858101830151858201604001528201612106565b81811115612134576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b03849003851316156121a1576121a16122c5565b600160ff1b83900384128116156121ba576121ba6122c5565b50500190565b600082198211156121d3576121d36122c5565b500190565b6000826121f557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612214576122146122c5565b500290565b60008083128015600160ff1b850184121615612237576122376122c5565b6001600160ff1b0384018313811615612252576122526122c5565b50500390565b60008282101561226a5761226a6122c5565b500390565b600181811c9082168061228357607f821691505b602082108114156122a457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156122be576122be6122c5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610c8757600080fd5b8015158114610c8757600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204ce7e3b432fa68038f5df3423609b94e0a5d4e07aabc98d05200f19495e6957a64736f6c63430008060033506f6c794156435f546f6b656e54776f5f4469766964656e645f547261636b65724f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x60806040526004361061061a5760003560e01c80637b16cea011610329578063b62496f5116101b6578063e2434d4d11610102578063e98030c7116100a0578063fb2a20831161007a578063fb2a20831461128e578063fb7f634a146112a3578063fce589d8146112c3578063fcf30a41146112d957600080fd5b8063e98030c714611239578063f0e0377114611259578063f2fde38b1461126e57600080fd5b8063e6c75f71116100dc578063e6c75f71146111cd578063e7aca7dc146111e3578063e84d44f8146111f8578063e8c94cd91461121957600080fd5b8063e2434d4d14611181578063e27ad5eb14611197578063e2f45605146111b757600080fd5b8063cf8f19bf1161016f578063d46d9ba111610149578063d46d9ba1146110db578063d52ac10f146110fb578063dd4670641461111b578063dd62ed3e1461113b57600080fd5b8063cf8f19bf14611090578063d25117e1146110b0578063d4311898146110c657600080fd5b8063b62496f514610fca578063bc376b7514610ffa578063c02466681461101a578063c492f0461461103a578063c9b4c0631461105a578063cf82244d1461107057600080fd5b80639c1b8af511610275578063aa4bde281161022e578063afa4f3b211610208578063afa4f3b214610f4a578063b06837c314610f6a578063b13f725d14610f8a578063b3b5e04314610faa57600080fd5b8063aa4bde2814610ef4578063aacebbe314610f0a578063acf7215b14610f2a57600080fd5b80639c1b8af514610e485780639f34a5b414610e5e578063a457c2d714610e7e578063a6b6388814610e9e578063a9059cbb14610eb4578063a9a8051514610ed457600080fd5b8063887bdb80116102e2578063955ebc9e116102bc578063955ebc9e14610ddd57806395d89b4114610df3578063980f02fe14610e085780639a7a23d614610e2857600080fd5b8063887bdb8014610d7a5780638da5cb5b14610d9a57806394fae3a814610dbd57600080fd5b80637b16cea014610cab5780637b2c835f14610ce45780637cb332bb14610d0457806381f5f8f314610d2457806383ad799414610d44578063871c128d14610d5a57600080fd5b8063407c93b7116104a757806365b8dbc0116103f3578063715018a6116103ac57806375fbbd331161038657806375fbbd3314610c405780637753242514610c60578063793d2a7614610c755780637a5cf79014610c8b57600080fd5b8063715018a614610beb57806373b266ac14610c0057806375f0a87414610c2057600080fd5b806365b8dbc014610b2857806368ab212614610b485780636b67c4df14610b685780636ebcf60714610b7e578063700bb19114610bab57806370a0823114610bcb57600080fd5b80635922e766116104605780635dc96d161161043a5780635dc96d1614610ab05780635fd65fea14610ad1578063625646d214610ae75780636408dc4914610b0757600080fd5b80635922e76614610a505780635992704414610a705780635c38ffe214610a9057600080fd5b8063407c93b71461099157806346c9a3a3146109a757806349bd5a5e146109c75780634e71d92d146109fb5780634e83ff6f14610a105780635775c87214610a3057600080fd5b806322bd3f7f11610566578063313ce5671161051f5780633802ede1116104f95780633802ede1146109105780633884f3641461093057806339509351146109515780633b364da81461097157600080fd5b8063313ce5671461087457806332a9980f146108965780633678f6e2146108fb57600080fd5b806322bd3f7f146107c857806323b872dd146107de578063263b5fcb146107fe57806327c8f8351461081e5780632d876ed61461083e5780632ea7a3831461085357600080fd5b80630a6e864b116105d357806313114a9d116105ad57806313114a9d146107685780631694505e1461077e57806318160ddd1461079e5780631cbe9caa146107b357600080fd5b80630a6e864b146106f95780630d8ae9691461070f578063122fe6851461073057600080fd5b806302259e9e1461062657806306fdde031461064f57806307efbfdc14610671578063087548c414610688578063095ea7b3146106a857806309c58fcd146106d857600080fd5b3661062157005b600080fd5b34801561063257600080fd5b5061063c60115481565b6040519081526020015b60405180910390f35b34801561065b57600080fd5b506106646112f9565b6040516106469190615b0d565b34801561067d57600080fd5b5061068661138b565b005b34801561069457600080fd5b506106866106a3366004615780565b611431565b3480156106b457600080fd5b506106c86106c33660046158cc565b6114db565b6040519015158152602001610646565b3480156106e457600080fd5b50600b546106c890600160a81b900460ff1681565b34801561070557600080fd5b5061063c60145481565b34801561071b57600080fd5b50600b546106c890600160d81b900460ff1681565b34801561073c57600080fd5b50602354610750906001600160a01b031681565b6040516001600160a01b039091168152602001610646565b34801561077457600080fd5b5061063c601f5481565b34801561078a57600080fd5b50600854610750906001600160a01b031681565b3480156107aa57600080fd5b5060025461063c565b3480156107bf57600080fd5b5061063c6114f2565b3480156107d457600080fd5b5061063c60205481565b3480156107ea57600080fd5b506106c86107f93660046157f3565b611574565b34801561080a57600080fd5b5061068661081936600461597e565b6115dd565b34801561082a57600080fd5b50600b54610750906001600160a01b031681565b34801561084a57600080fd5b5061063c6116fc565b34801561085f57600080fd5b50600b546106c890600160d01b900460ff1681565b34801561088057600080fd5b5060055460405160ff9091168152602001610646565b3480156108a257600080fd5b506108b66108b13660046159b8565b611741565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610646565b34801561090757600080fd5b5061063c6117eb565b34801561091c57600080fd5b5061063c61092b366004615780565b611830565b34801561093c57600080fd5b50600b546106c890600160c81b900460ff1681565b34801561095d57600080fd5b506106c861096c3660046158cc565b6118af565b34801561097d57600080fd5b5061068661098c3660046159b8565b6118e5565b34801561099d57600080fd5b5061063c60175481565b3480156109b357600080fd5b50600954610750906001600160a01b031681565b3480156109d357600080fd5b506107507f000000000000000000000000adc580c353026f395c3c47945dc951f051d46d7781565b348015610a0757600080fd5b506106866119a4565b348015610a1c57600080fd5b50610686610a2b3660046157ba565b611ab0565b348015610a3c57600080fd5b506108b6610a4b3660046159b8565b611c8d565b348015610a5c57600080fd5b50610686610a6b36600461597e565b611ccf565b348015610a7c57600080fd5b50600e54610750906001600160a01b031681565b348015610a9c57600080fd5b50610686610aab3660046159b8565b611d7d565b348015610abc57600080fd5b50600b546106c890600160b81b900460ff1681565b348015610add57600080fd5b5061063c601b5481565b348015610af357600080fd5b506108b6610b02366004615780565b611dc1565b348015610b1357600080fd5b50600b546106c890600160c01b900460ff1681565b348015610b3457600080fd5b50610686610b43366004615780565b611e03565b348015610b5457600080fd5b50600c54610750906001600160a01b031681565b348015610b7457600080fd5b5061063c60185481565b348015610b8a57600080fd5b5061063c610b99366004615780565b60006020819052908152604090205481565b348015610bb757600080fd5b50610686610bc63660046159b8565b611f03565b348015610bd757600080fd5b5061063c610be6366004615780565b6120f2565b348015610bf757600080fd5b5061068661210d565b348015610c0c57600080fd5b506108b6610c1b366004615780565b61218d565b348015610c2c57600080fd5b50600f54610750906001600160a01b031681565b348015610c4c57600080fd5b5061063c610c5b366004615780565b6121cf565b348015610c6c57600080fd5b5061063c612202565b348015610c8157600080fd5b5061063c60155481565b348015610c9757600080fd5b5061063c610ca6366004615780565b612247565b348015610cb757600080fd5b506106c8610cc6366004615780565b6001600160a01b031660009081526024602052604090205460ff1690565b348015610cf057600080fd5b50610686610cff36600461597e565b61227a565b348015610d1057600080fd5b50610686610d1f366004615780565b612386565b348015610d3057600080fd5b50610686610d3f366004615780565b612494565b348015610d5057600080fd5b5061063c601a5481565b348015610d6657600080fd5b50610686610d753660046159b8565b612768565b348015610d8657600080fd5b50610686610d9536600461597e565b61283d565b348015610da657600080fd5b5060055461010090046001600160a01b0316610750565b348015610dc957600080fd5b50610686610dd8366004615780565b61294e565b348015610de957600080fd5b5061063c601d5481565b348015610dff57600080fd5b506106646129c7565b348015610e1457600080fd5b50610686610e23366004615a18565b6129d6565b348015610e3457600080fd5b50610686610e43366004615834565b612a69565b348015610e5457600080fd5b5061063c60225481565b348015610e6a57600080fd5b50610686610e793660046159b8565b612b66565b348015610e8a57600080fd5b506106c8610e993660046158cc565b612baa565b348015610eaa57600080fd5b5061063c60105481565b348015610ec057600080fd5b506106c8610ecf3660046158cc565b612bf9565b348015610ee057600080fd5b50610686610eef36600461597e565b612c06565b348015610f0057600080fd5b5061063c60215481565b348015610f1657600080fd5b50610686610f25366004615780565b612d18565b348015610f3657600080fd5b50600a54610750906001600160a01b031681565b348015610f5657600080fd5b50610686610f653660046159b8565b612e2b565b348015610f7657600080fd5b50600d54610750906001600160a01b031681565b348015610f9657600080fd5b50610686610fa5366004615780565b612e6f565b348015610fb657600080fd5b50610686610fc53660046159b8565b612f30565b348015610fd657600080fd5b506106c8610fe5366004615780565b60256020526000908152604090205460ff1681565b34801561100657600080fd5b50610686611015366004615a18565b612f74565b34801561102657600080fd5b50610686611035366004615834565b613001565b34801561104657600080fd5b506106866110553660046158f8565b613115565b34801561106657600080fd5b5061063c601e5481565b34801561107c57600080fd5b5061068661108b366004615780565b6131f7565b34801561109c57600080fd5b506106866110ab36600461597e565b6132fd565b3480156110bc57600080fd5b5061063c60165481565b3480156110d257600080fd5b5061063c61340f565b3480156110e757600080fd5b506106866110f6366004615a18565b613454565b34801561110757600080fd5b50610686611116366004615780565b6134e1565b34801561112757600080fd5b506106866111363660046159b8565b6137b5565b34801561114757600080fd5b5061063c6111563660046157ba565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561118d57600080fd5b5061063c601c5481565b3480156111a357600080fd5b506106866111b236600461597e565b613862565b3480156111c357600080fd5b5061063c60125481565b3480156111d957600080fd5b5061063c60135481565b3480156111ef57600080fd5b5061063c6138b0565b34801561120457600080fd5b50600b546106c890600160b01b900460ff1681565b34801561122557600080fd5b5061063c611234366004615780565b6138f5565b34801561124557600080fd5b506106866112543660046159b8565b613928565b34801561126557600080fd5b5061063c6139e7565b34801561127a57600080fd5b50610686611289366004615780565b613a2c565b34801561129a57600080fd5b5061063c613b28565b3480156112af57600080fd5b506106866112be3660046159b8565b613b6d565b3480156112cf57600080fd5b5061063c60195481565b3480156112e557600080fd5b506106866112f4366004615a18565b613ba2565b60606003805461130890615e25565b80601f016020809104026020016040519081016040528092919081815260200182805461133490615e25565b80156113815780601f1061135657610100808354040283529160200191611381565b820191906000526020600020905b81548152906001019060200180831161136457829003601f168201915b5050505050905090565b6005546001600160a01b036101009091041633146113c45760405162461bcd60e51b81526004016113bb90615ce6565b60405180910390fd5b6006601455600560165560026018819055601d556000601a819055601955600f601f55600b805465ffffff00ffff60b01b19166501010100010160b01b1790556702c68af0bb14000060125568056bc75e2d631000006010819055601155683635c9adc5dea00000601355565b6005546001600160a01b036101009091041633146114615760405162461bcd60e51b81526004016113bb90615ce6565b600a80546001600160a01b0319166001600160a01b03838116918217909255600d54604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd2906024015b600060405180830381600087803b1580156114c057600080fd5b505af11580156114d4573d6000803e3d6000fd5b5050505050565b60006114e8338484613c95565b5060015b92915050565b600d5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561153757600080fd5b505afa15801561154b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156f91906159d1565b905090565b6000611581848484613dba565b6115d384336115ce85604051806060016040528060288152602001615f13602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061479d565b613c95565b5060019392505050565b6005546001600160a01b0361010090910416331461160d5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160b01b909104161515811515141561163e5760405162461bcd60e51b81526004016113bb90615caf565b8061166a5760188054601b5560009055600b805460ff60b01b1916600160b01b831515021790556116c3565b601b546018819055506116a8601a546116a26019546116a2601d546116a26014546116a2601654601854613c2f90919063ffffffff16565b90613c2f565b601f55600b805460ff60b01b1916600160b01b831515021790555b60405181151581527f6ba6c1012539169f5a820a29533d8c8b797a1c7a5634edbd3124a80de0e75cba906020015b60405180910390a150565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561153757600080fd5b600c54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024015b6101006040518083038186803b15801561179857600080fd5b505afa1580156117ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d09190615862565b97509750975097509750975097509750919395975091939597565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561153757600080fd5b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561187757600080fd5b505afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ec91906159d1565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916114e89185906115ce9086613c2f565b6005546001600160a01b036101009091041633146119155760405162461bcd60e51b81526004016113bb90615ce6565b600c54604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401600060405180830381600087803b15801561195b57600080fd5b505af115801561196f573d6000803e3d6000fd5b5050600d54604051630dcb2e8960e01b8152600481018590526001600160a01b039091169250630dcb2e8991506024016114a6565b600c5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a28919061599b565b50600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015611a7557600080fd5b505af1158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad919061599b565b50565b6005546001600160a01b03610100909104163314611ae05760405162461bcd60e51b81526004016113bb90615ce6565b602380546001600160a01b0319166001600160a01b03848116918217909255600c5460405163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015611b3e57600080fd5b505af1158015611b52573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015611b9d57600080fd5b505af1158015611bb1573d6000803e3d6000fd5b50505050611bc0826001613001565b600c5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611c0757600080fd5b505af1158015611c1b573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c89816001613001565b5050565b600d54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161177f565b6005546001600160a01b03610100909104163314611cff5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160c01b9091041615158115151415611d305760405162461bcd60e51b81526004016113bb90615caf565b600b8054821515600160c01b0260ff60c01b199091161790556040517fcb92548f053f949ff8c2721ff8f503444402bec41b7072bc24d069f8f701fc85906116f190831515815260200190565b6005546001600160a01b03610100909104163314611dad5760405162461bcd60e51b81526004016113bb90615ce6565b611dbb81633b9aca00615def565b60115550565b600c5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f19060240161177f565b6005546001600160a01b03610100909104163314611e335760405162461bcd60e51b81526004016113bb90615ce6565b6008546001600160a01b0382811691161415611ea65760405162461bcd60e51b815260206004820152602c60248201527f506f6c794156433a2054686520726f7574657220616c7265616479206861732060448201526b74686174206164647265737360a01b60648201526084016113bb565b6008546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314611f335760405162461bcd60e51b81526004016113bb90615ce6565b600c546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b158015611f8157600080fd5b505af1158015611f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb991906159ea565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fbfde62defd797952524ace735811c8758254f37d0faf697997cca2ca925535119060800160405180910390a3600d546040516001624d3b8760e01b0319815260048101869052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561205c57600080fd5b505af1158015612070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209491906159ea565b6040805184815260208101849052908101829052606081018b9052929550909350915032906000907f7bce0dc592cad5b21a65fb2892e9b4c4394527cec774aa1c11c068c1040bcaa89060800160405180910390a350505050505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0361010090910416331461213d5760405162461bcd60e51b81526004016113bb90615ce6565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f19060240161177f565b600c546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240161185f565b600c54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561153757600080fd5b600c546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161185f565b6005546001600160a01b036101009091041633146122aa5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160b81b90910416151581151514156122db5760405162461bcd60e51b81526004016113bb90615caf565b806123075760198054601c5560009055600b805460ff60b81b1916600160b81b83151502179055612354565b601c54601981905550612339601a546116a2601d546116a26014546116a2601654601954613c2f90919063ffffffff16565b601f55600b805460ff60b81b1916600160b81b831515021790555b60405181151581527f2c1d3fa42470f38c24d7ce77dc883522afe986e4d2f9bb71e11756381c240e2c906020016116f1565b6005546001600160a01b036101009091041633146123b65760405162461bcd60e51b81526004016113bb90615ce6565b600e546001600160a01b038281169116141561242d5760405162461bcd60e51b815260206004820152603060248201527f506f6c794156433a20546865207465616d2077616c6c657420697320616c726560448201526f6164792074686973206164647265737360801b60648201526084016113bb565b612438816001613001565b600e546040516001600160a01b038084169216907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146124c45760405162461bcd60e51b81526004016113bb90615ce6565b600d546001600160a01b03828116911614156124f25760405162461bcd60e51b81526004016113bb90615c59565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253a57600080fd5b505afa15801561254e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612572919061579d565b6001600160a01b0316146125985760405162461bcd60e51b81526004016113bb90615ba5565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b1580156125da57600080fd5b505af11580156125ee573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561263357600080fd5b505af1158015612647573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561269257600080fd5b505af11580156126a6573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b1580156126f157600080fd5b505af1158015612705573d6000803e3d6000fd5b5050600d546040516001600160a01b03918216935090851691507fb6a9e3f9245b18cb1c1148bae484a909ae692017fd5c361c769569d5d2eedbb690600090a3600d80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b036101009091041633146127985760405162461bcd60e51b81526004016113bb90615ce6565b6022548114156128085760405162461bcd60e51b815260206004820152603560248201527f506f6c794156433a2043616e6e6f742075706461746520676173466f7250726f60448201527463657373696e6720746f2073616d652076616c756560581b60648201526084016113bb565b6022819055604051819081907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a350565b6005546001600160a01b0361010090910416331461286d5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160d01b909104161515811515141561289e5760405162461bcd60e51b81526004016113bb90615caf565b806128ca576014805460155560009055600b805460ff60d01b1916600160d01b8315150217905561291d565b601554601481905550612902601a546116a26019546116a2601d546116a26016546116a2601854601454613c2f90919063ffffffff16565b601f55600b805460ff60d01b1916600160d01b831515021790555b60405181151581527ea8053a65b4889b9c6e9f7854895eb21efe9c466b8c339cf10d7a60b568beef906020016116f1565b6005546001600160a01b0361010090910416331461297e5760405162461bcd60e51b81526004016113bb90615ce6565b600980546001600160a01b0319166001600160a01b03838116918217909255600c54604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd2906024016114a6565b60606004805461130890615e25565b6005546001600160a01b03610100909104163314612a065760405162461bcd60e51b81526004016113bb90615ce6565b60068160ff161115612a2a5760405162461bcd60e51b81526004016113bb90615c18565b8060ff16601d81905550612a63601a546116a26019546116a26018546116a26016546116a2601454601d54613c2f90919063ffffffff16565b601f5550565b6005546001600160a01b03610100909104163314612a995760405162461bcd60e51b81526004016113bb90615ce6565b7f000000000000000000000000adc580c353026f395c3c47945dc951f051d46d776001600160a01b0316826001600160a01b03161415612b5c5760405162461bcd60e51b815260206004820152605260248201527f506f6c794156433a205468652050616e746f6b656e4f6e65537761702070616960448201527f722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617460648201527165644d61726b65744d616b6572506169727360701b608482015260a4016113bb565b611c8982826147d4565b6005546001600160a01b03610100909104163314612b965760405162461bcd60e51b81526004016113bb90615ce6565b612ba481633b9aca00615def565b60135550565b60006114e833846115ce85604051806060016040528060258152602001615f3b602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061479d565b60006114e8338484613dba565b6005546001600160a01b03610100909104163314612c365760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160d81b9091041615158115151415612c675760405162461bcd60e51b81526004016113bb90615caf565b80612c93576016805460175560009055600b805460ff60d81b1916600160d81b83151502179055612ce6565b601754601681905550612ccb601a546116a26019546116a2601d546116a26014546116a2601854601654613c2f90919063ffffffff16565b601f55600b805460ff60d81b1916600160d81b831515021790555b60405181151581527f05796e98c682a0edd15a95a8861971481c1cd8b0a0160e00fe9f7deb00b033cb906020016116f1565b6005546001600160a01b03610100909104163314612d485760405162461bcd60e51b81526004016113bb90615ce6565b600f546001600160a01b0382811691161415612dc45760405162461bcd60e51b815260206004820152603560248201527f506f6c794156433a20546865206d61726b6574696e672077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b60648201526084016113bb565b612dcf816001613001565b600f546040516001600160a01b038084169216907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314612e5b5760405162461bcd60e51b81526004016113bb90615ce6565b612e6981633b9aca00615def565b60125550565b6005546001600160a01b03610100909104163314612e9f5760405162461bcd60e51b81526004016113bb90615ce6565b600c5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db091506024016114a6565b6005546001600160a01b03610100909104163314612f605760405162461bcd60e51b81526004016113bb90615ce6565b612f6e81633b9aca00615def565b60105550565b6005546001600160a01b03610100909104163314612fa45760405162461bcd60e51b81526004016113bb90615ce6565b60068160ff161115612fc85760405162461bcd60e51b81526004016113bb90615c18565b8060ff16601681905550612a63601a546116a26019546116a2601d546116a26018546116a2601454601654613c2f90919063ffffffff16565b6005546001600160a01b036101009091041633146130315760405162461bcd60e51b81526004016113bb90615ce6565b6001600160a01b03821660009081526024602052604090205460ff16151581151514156130b65760405162461bcd60e51b815260206004820152602d60248201527f506f6c794156433a204163636f756e7420697320616c72656164792065786c7560448201526c6465642066726f6d206665657360981b60648201526084016113bb565b6001600160a01b038216600081815260246020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b036101009091041633146131455760405162461bcd60e51b81526004016113bb90615ce6565b60005b828110156131b657816024600086868581811061316757613167615e91565b905060200201602081019061317c9190615780565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806131ae81615e60565b915050613148565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516131ea93929190615a7f565b60405180910390a1505050565b6005546001600160a01b036101009091041633146132275760405162461bcd60e51b81526004016113bb90615ce6565b600c5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561326e57600080fd5b505af1158015613282573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b1580156132cd57600080fd5b505af11580156132e1573d6000803e3d6000fd5b5050602154611aad92506132f7915060056149cb565b82614a4a565b6005546001600160a01b0361010090910416331461332d5760405162461bcd60e51b81526004016113bb90615ce6565b600b5460ff600160c81b909104161515811515141561335e5760405162461bcd60e51b81526004016113bb90615caf565b8061338a57601d8054601e5560009055600b805460ff60c81b1916600160c81b831515021790556133dd565b601e54601d819055506133c2601a546116a26019546116a26014546116a26016546116a2601854601d54613c2f90919063ffffffff16565b601f55600b805460ff60c81b1916600160c81b831515021790555b60405181151581527feeddd25ab572944f46f2e1d17c56bb44594bdf0b4696199da23db34f0bcf9b9a906020016116f1565b600c546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561153757600080fd5b6005546001600160a01b036101009091041633146134845760405162461bcd60e51b81526004016113bb90615ce6565b60068160ff1611156134a85760405162461bcd60e51b81526004016113bb90615c18565b8060ff16601881905550612a63601a546116a26019546116a2601d546116a26016546116a2601454601854613c2f90919063ffffffff16565b6005546001600160a01b036101009091041633146135115760405162461bcd60e51b81526004016113bb90615ce6565b600c546001600160a01b038281169116141561353f5760405162461bcd60e51b81526004016113bb90615c59565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561358757600080fd5b505afa15801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061579d565b6001600160a01b0316146135e55760405162461bcd60e51b81526004016113bb90615ba5565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561362757600080fd5b505af115801561363b573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561368057600080fd5b505af1158015613694573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b1580156136df57600080fd5b505af11580156136f3573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561373e57600080fd5b505af1158015613752573d6000803e3d6000fd5b5050600c546040516001600160a01b03918216935090851691507faa595611f416527c482b6f5788d3509682c383c4782422f76ec54e2751a1577490600090a3600c80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b036101009091041633146137e55760405162461bcd60e51b81526004016113bb90615ce6565b60058054600680546001600160a01b0319166001600160a01b03610100840416179055610100600160a81b031916905561381f8142615db5565b60075560055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b6005546001600160a01b036101009091041633146138925760405162461bcd60e51b81526004016113bb90615ce6565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b600c54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561153757600080fd5b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161185f565b6005546001600160a01b036101009091041633146139585760405162461bcd60e51b81526004016113bb90615ce6565b600c5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401600060405180830381600087803b15801561399e57600080fd5b505af11580156139b2573d6000803e3d6000fd5b5050600d5460405163e98030c760e01b8152600481018590526001600160a01b03909116925063e98030c791506024016114a6565b600c5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561153757600080fd5b6005546001600160a01b03610100909104163314613a5c5760405162461bcd60e51b81526004016113bb90615ce6565b6001600160a01b038116613ac15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016113bb565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561153757600080fd5b6005546001600160a01b03610100909104163314613b9d5760405162461bcd60e51b81526004016113bb90615ce6565b602055565b6005546001600160a01b03610100909104163314613bd25760405162461bcd60e51b81526004016113bb90615ce6565b60068160ff161115613bf65760405162461bcd60e51b81526004016113bb90615c18565b8060ff16601481905550612a63601a546116a26019546116a2601d546116a26016546116a2601854601454613c2f90919063ffffffff16565b600080613c3c8385615db5565b905083811015613c8e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016113bb565b9392505050565b6001600160a01b038316613cf75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016113bb565b6001600160a01b038216613d585760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016113bb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316613de05760405162461bcd60e51b81526004016113bb90615d1b565b6001600160a01b038216613e065760405162461bcd60e51b81526004016113bb90615b62565b600b54600160a81b900460ff1680613e5857506001600160a01b03831660009081526024602052604090205460ff1680613e5857506001600160a01b03821660009081526024602052604090205460ff165b613eb05760405162461bcd60e51b8152602060048201526024808201527f506f6c794156433a2054726164696e6720686173206e6f742073746172746564604482015263081e595d60e21b60648201526084016113bb565b6001600160a01b03831660009081526024602052604081205460ff1680613eef57506001600160a01b03831660009081526024602052604090205460ff165b601f54600b54919250600091600160c01b900460ff168015613f2957506001600160a01b03861660009081526025602052604090205460ff165b15613f405760019150613f3d816002614a8a565b90505b600b54600160a81b900460ff168015613f7157506001600160a01b03861660009081526025602052604090205460ff165b8015613f7b575082155b1561405e57601054841115613fe35760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016113bb565b6000613fee866120f2565b601354909150613ffe8683615db5565b11156140585760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b60648201526084016113bb565b5061439d565b600b54600160a81b900460ff16801561408f57506001600160a01b03851660009081526025602052604090205460ff165b8015614099575082155b1561439d576011548411156141165760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e00000000000060648201526084016113bb565b6000614121306120f2565b601254600b5491925082101590600160a01b900460ff161580156141425750805b1561439a57600b805460ff60a01b1916600160a01b1790819055600160b01b900460ff16156141f957600061419b8561417d5760185461418b565b60185461418b906002614a8a565b6141958587614a8a565b906149cb565b90506141a681614ae5565b60006141b86042614195476064614a8a565b905060006141c64783614c4e565b600f549091506141df906001600160a01b031682614caa565b600e546141f5906001600160a01b031683614caa565b5050505b600b54600160c81b900460ff16156142c7576000614215614ce5565b90506032811161428c5747633b9aca0081111561424f5761424a61424561423a614ce5565b614195846064614a8a565b614e06565b614286565b60006142798761426157601d5461426f565b601d5461426f906002614a8a565b6141958789614a8a565b905061428481614ae5565b505b506142c5565b60328111156142c5576142c56142c0866142a857601d546142b6565b601d546142b6906002614a8a565b6141958688614a8a565b61500c565b505b600b54600160d01b900460ff161561434357600061432c856142eb576014546142f9565b6014546142f9906002614a8a565b6141956143238861430c5760165461431a565b60165461431a906002614a8a565b60145490613c2f565b60125490614a8a565b905061434161433c61423a614ce5565b615094565b505b600b54600160d81b900460ff161561438c57600061437585614367576016546142f9565b6016546142f9906002614a8a565b905061438a61438561423a614ce5565b61514a565b505b600b805460ff60a01b191690555b50505b600b54600090600160a81b900460ff1680156143c35750600b54600160a01b900460ff16155b80156143cd575083155b905080156144015760006143e683614195886064614a8a565b90506143f28682614c4e565b95506143ff883083615200565b505b61440c878787615200565b600c546001600160a01b031663e30443bc88614427816120f2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561446d57600080fd5b505af192505050801561447e575060015b50600d546001600160a01b031663e30443bc8861449a816120f2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156144e057600080fd5b505af19250505080156144f1575060015b50600c546001600160a01b031663e30443bc8761450d816120f2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561455357600080fd5b505af1925050508015614564575060015b50600d546001600160a01b031663e30443bc87614580816120f2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156145c657600080fd5b505af19250505080156145d7575060015b50600b54600160a01b900460ff1661479457602254600c546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b15801561463557600080fd5b505af1925050508015614665575060408051601f3d908101601f19168201909252614662918101906159ea565b60015b61466e576146bf565b60408051848152602081018490529081018290526060810185905232906001907fbfde62defd797952524ace735811c8758254f37d0faf697997cca2ca925535119060800160405180910390a35050505b600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b15801561470857600080fd5b505af1925050508015614738575060408051601f3d908101601f19168201909252614735918101906159ea565b60015b61474157614792565b60408051848152602081018490529081018290526060810185905232906001907f7bce0dc592cad5b21a65fb2892e9b4c4394527cec774aa1c11c068c1040bcaa89060800160405180910390a35050505b505b50505050505050565b600081848411156147c15760405162461bcd60e51b81526004016113bb9190615b0d565b506147cc8385615e0e565b949350505050565b6005546001600160a01b036101009091041633146148045760405162461bcd60e51b81526004016113bb90615ce6565b6001600160a01b03821660009081526025602052604090205460ff16151581151514156148a35760405162461bcd60e51b815260206004820152604160248201527f506f6c794156433a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a4016113bb565b6001600160a01b0382166000908152602560205260409020805460ff1916821580159190911790915561498f57600c5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561491757600080fd5b505af115801561492b573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b15801561497657600080fd5b505af115801561498a573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000826149da575060006114ec565b60006149e68385615def565b9050826149f38583615dcd565b14613c8e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016113bb565b6001600160a01b038116600090815260208190526040902054614a6d9083613c2f565b6001600160a01b0390911660009081526020819052604090205550565b6000808211614adb5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016113bb565b613c8e8284615dcd565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614b1a57614b1a615e91565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015614b6e57600080fd5b505afa158015614b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ba6919061579d565b81600181518110614bb957614bb9615e91565b6001600160a01b039283166020918202929092010152600854614bdf9130911684613c95565b60085460405163791ac94760e01b81526001600160a01b039091169063791ac94790614c18908590600090869030904290600401615d79565b600060405180830381600087803b158015614c3257600080fd5b505af1158015614c46573d6000803e3d6000fd5b505050505050565b600082821115614ca05760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016113bb565b613c8e8284615e0e565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015614ce0573d6000803e3d6000fd5b505050565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190439042906034016040516020818303038152906040528051906020012060001c614d2f9190615dcd565b6040516bffffffffffffffffffffffff194160601b166020820152459042906034016040516020818303038152906040528051906020012060001c614d749190615dcd565b614d7e4442615db5565b614d889190615db5565b614d929190615db5565b614d9c9190615db5565b614da69190615db5565b604051602001614db891815260200190565b60408051601f19818403018152919052805160209091012090506000614ddf606483615dcd565b614dea906064615def565b614df49083615e0e565b9050806114ec57613c8e600182615db5565b6040805160028082526060820183526000926020830190803683375050600854604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015614e6b57600080fd5b505afa158015614e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ea3919061579d565b81600081518110614eb657614eb6615e91565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110614eea57614eea615e91565b6001600160a01b039283166020918202929092010152600f54600091614f1091166120f2565b600854600f549192506001600160a01b039081169163b6f9de95918691600091879116614f3f4261012c613c2f565b6040518663ffffffff1660e01b8152600401614f5e9493929190615ad8565b6000604051808303818588803b158015614f7757600080fd5b505af1158015614f8b573d6000803e3d6000fd5b5050600f5460009350614fb49250849150614fae906001600160a01b03166120f2565b90614c4e565b600f54909150614fcd906001600160a01b031682615309565b7fd79349298b0eadebdb47b2a093b1596f41af709d6a3bc3d848b9e8821df480728484604051614ffe929190615d60565b60405180910390a150505050565b6000615019826002614a8a565b905060006150278383614c4e565b90504761503383614ae5565b600061503f4783614c4e565b905061504b8382615414565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561906060015b60405180910390a15050505050565b6009546150ad90829030906001600160a01b03166154d0565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156150f157600080fd5b505afa158015615105573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061512991906159d1565b600954600c54919250611c89916001600160a01b0391821691168084615667565b600a5461516390829030906001600160a01b03166154d0565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156151a757600080fd5b505afa1580156151bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151df91906159d1565b600a54600d54919250611c89916001600160a01b0391821691168084615667565b6001600160a01b0383166152265760405162461bcd60e51b81526004016113bb90615d1b565b6001600160a01b03821661524c5760405162461bcd60e51b81526004016113bb90615b62565b61528981604051806060016040528060268152602001615eed602691396001600160a01b038616600090815260208190526040902054919061479d565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546152b89082613c2f565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613dad565b6001600160a01b0382166153695760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016113bb565b6153a681604051806060016040528060228152602001615ecb602291396001600160a01b038516600090815260208190526040902054919061479d565b6001600160a01b0383166000908152602081905260409020556002546153cc9082614c4e565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60085461542c9030906001600160a01b031684613c95565b600854600f5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561549757600080fd5b505af11580156154ab573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114d491906159ea565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061550757615507615e91565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561555b57600080fd5b505afa15801561556f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615593919061579d565b816001815181106155a6576155a6615e91565b60200260200101906001600160a01b031690816001600160a01b03168152505081816002815181106155da576155da615e91565b6001600160a01b0392831660209182029290920101526008546156009130911686613c95565b600854604051635c11d79560e01b81526001600160a01b0390911690635c11d79590615639908790600090869089904290600401615d79565b600060405180830381600087803b15801561565357600080fd5b505af1158015614792573d6000803e3d6000fd5b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000919086169063a9059cbb90604401602060405180830381600087803b1580156156b557600080fd5b505af11580156156c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906156ed919061599b565b905080156114d457604051633243c79160e01b8152600481018390526001600160a01b03841690633243c79190602401600060405180830381600087803b15801561573757600080fd5b505af115801561574b573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161508591815260200190565b60006020828403121561579257600080fd5b8135613c8e81615ea7565b6000602082840312156157af57600080fd5b8151613c8e81615ea7565b600080604083850312156157cd57600080fd5b82356157d881615ea7565b915060208301356157e881615ea7565b809150509250929050565b60008060006060848603121561580857600080fd5b833561581381615ea7565b9250602084013561582381615ea7565b929592945050506040919091013590565b6000806040838503121561584757600080fd5b823561585281615ea7565b915060208301356157e881615ebc565b600080600080600080600080610100898b03121561587f57600080fd5b885161588a81615ea7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600080604083850312156158df57600080fd5b82356158ea81615ea7565b946020939093013593505050565b60008060006040848603121561590d57600080fd5b833567ffffffffffffffff8082111561592557600080fd5b818601915086601f83011261593957600080fd5b81358181111561594857600080fd5b8760208260051b850101111561595d57600080fd5b6020928301955093505084013561597381615ebc565b809150509250925092565b60006020828403121561599057600080fd5b8135613c8e81615ebc565b6000602082840312156159ad57600080fd5b8151613c8e81615ebc565b6000602082840312156159ca57600080fd5b5035919050565b6000602082840312156159e357600080fd5b5051919050565b6000806000606084860312156159ff57600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215615a2a57600080fd5b813560ff81168114613c8e57600080fd5b600081518084526020808501945080840160005b83811015615a745781516001600160a01b031687529582019590820190600101615a4f565b509495945050505050565b6040808252810183905260008460608301825b86811015615ac2578235615aa581615ea7565b6001600160a01b0316825260209283019290910190600101615a92565b5080925050508215156020830152949350505050565b848152608060208201526000615af16080830186615a3b565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b81811015615b3a57858101830151858201604001528201615b1e565b81811115615b4c576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252604d908201527f506f6c794156433a20546865206e6577206469766964656e6420747261636b6560408201527f72206d757374206265206f776e65642062792074686520506f6c79415643207460608201526c1bdad95b8818dbdb9d1c9858dd609a1b608082015260a00190565b60208082526021908201527f506f6c794156433a20466565206d757374206265206c657373207468616e20366040820152602560f81b606082015260800190565b60208082526036908201527f506f6c794156433a20546865206469766964656e6420747261636b657220616c6040820152757265616479206861732074686174206164647265737360501b606082015260800190565b6020808252601d908201527f43616e27742073657420666c616720746f2073616d6520737461747573000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b8281526040602082015260006147cc6040830184615a3b565b85815284602082015260a060408201526000615d9860a0830186615a3b565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115615dc857615dc8615e7b565b500190565b600082615dea57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615e0957615e09615e7b565b500290565b600082821015615e2057615e20615e7b565b500390565b600181811c90821680615e3957607f821691505b60208210811415615e5a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e7457615e74615e7b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114611aad57600080fd5b8015158114611aad57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ad7440b66c7a6ac2f2e29f8132d80778a7c7ae6f3f4471c6be3e4756f87fb22464736f6c63430008060033
Deployed Bytecode Sourcemap
48258:34164:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49183:39;;;;;;;;;;;;;;;;;;;22134:25:1;;;22122:2;22107:18;49183:39:0;;;;;;;;8263:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;56678:679::-;;;;;;;;;;;;;:::i;:::-;;55190:202;;;;;;;;;;-1:-1:-1;55190:202:0;;;;;:::i;:::-;;:::i;10414:169::-;;;;;;;;;;-1:-1:-1;10414:169:0;;;;;:::i;:::-;;:::i;:::-;;;9485:14:1;;9478:22;9460:41;;9448:2;9433:18;10414:169:0;9415:92:1;48624:36:0;;;;;;;;;;-1:-1:-1;48624:36:0;;;;-1:-1:-1;;;48624:36:0;;;;;;49308:41;;;;;;;;;;;;;;;;48887:43;;;;;;;;;;-1:-1:-1;48887:43:0;;;;-1:-1:-1;;;48887:43:0;;;;;;49989:29;;;;;;;;;;-1:-1:-1;49989:29:0;;;;-1:-1:-1;;;;;49989:29:0;;;;;;-1:-1:-1;;;;;6280:32:1;;;6262:51;;6250:2;6235:18;49989:29:0;6217:102:1;49789:24:0;;;;;;;;;;;;;;;;48335:41;;;;;;;;;;-1:-1:-1;48335:41:0;;;;-1:-1:-1;;;;;48335:41:0;;;9367:108;;;;;;;;;;-1:-1:-1;9455:12:0;;9367:108;;67634:124;;;;;;;;;;;;;:::i;49822:42::-;;;;;;;;;;;;;;;;11065:321;;;;;;;;;;-1:-1:-1;11065:321:0;;;;;:::i;:::-;;:::i;59766:644::-;;;;;;;;;;-1:-1:-1;59766:644:0;;;;;:::i;:::-;;:::i;48516:71::-;;;;;;;;;;-1:-1:-1;48516:71:0;;;;-1:-1:-1;;;;;48516:71:0;;;71899:150;;;;;;;;;;;;;:::i;48837:43::-;;;;;;;;;;-1:-1:-1;48837:43:0;;;;-1:-1:-1;;;48837:43:0;;;;;;9211:91;;;;;;;;;;-1:-1:-1;9285:9:0;;9211:91;;9285:9;;;;23956:36:1;;23944:2;23929:18;9211:91:0;23911:87:1;69575:341:0;;;;;;;;;;-1:-1:-1;69575:341:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7281:32:1;;;7263:51;;7345:2;7330:18;;7323:34;;;;7373:18;;;7366:34;;;;7431:2;7416:18;;7409:34;;;;7474:3;7459:19;;7452:35;7301:3;7503:19;;7496:35;7562:3;7547:19;;7540:35;7606:3;7591:19;;7584:35;7250:3;7235:19;69575:341:0;7217:408:1;72230:157:0;;;;;;;;;;;;;:::i;68734:148::-;;;;;;;;;;-1:-1:-1;68734:148:0;;;;;:::i;:::-;;:::i;48786:44::-;;;;;;;;;;-1:-1:-1;48786:44:0;;;;-1:-1:-1;;;48786:44:0;;;;;;11795:218;;;;;;;;;;-1:-1:-1;11795:218:0;;;;;:::i;:::-;;:::i;67011:278::-;;;;;;;;;;-1:-1:-1;67011:278:0;;;;;:::i;:::-;;:::i;49460:49::-;;;;;;;;;;;;;;;;48430:36;;;;;;;;;;-1:-1:-1;48430:36:0;;;;-1:-1:-1;;;;;48430:36:0;;;48383:38;;;;;;;;;;;;;;;71555:176;;;;;;;;;;;;;:::i;54002:553::-;;;;;;;;;;-1:-1:-1;54002:553:0;;;;;:::i;:::-;;:::i;69928:341::-;;;;;;;;;;-1:-1:-1;69928:341:0;;;;;:::i;:::-;;:::i;61013:219::-;;;;;;;;;;-1:-1:-1;61013:219:0;;;;;:::i;:::-;;:::i;49063:25::-;;;;;;;;;;-1:-1:-1;49063:25:0;;;;-1:-1:-1;;;;;49063:25:0;;;55052:128;;;;;;;;;;-1:-1:-1;55052:128:0;;;;;:::i;:::-;;:::i;48710:31::-;;;;;;;;;;-1:-1:-1;48710:31:0;;;;-1:-1:-1;;;48710:31:0;;;;;;49614:35;;;;;;;;;;;;;;;;68890:334;;;;;;;;;;-1:-1:-1;68890:334:0;;;;;:::i;:::-;;:::i;48748:31::-;;;;;;;;;;-1:-1:-1;48748:31:0;;;;-1:-1:-1;;;48748:31:0;;;;;;64624:318;;;;;;;;;;-1:-1:-1;64624:318:0;;;;;:::i;:::-;;:::i;48939:54::-;;;;;;;;;;-1:-1:-1;48939:54:0;;;;-1:-1:-1;;;;;48939:54:0;;;49516:27;;;;;;;;;;;;;;;;7470:45;;;;;;;;;;-1:-1:-1;7470:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;70274:568;;;;;;;;;;-1:-1:-1;70274:568:0;;;;;:::i;:::-;;:::i;9538:127::-;;;;;;;;;;-1:-1:-1;9538:127:0;;;;;:::i;:::-;;:::i;2706:148::-;;;;;;;;;;;;;:::i;69236:334::-;;;;;;;;;;-1:-1:-1;69236:334:0;;;;;:::i;:::-;;:::i;49095:30::-;;;;;;;;;;-1:-1:-1;49095:30:0;;;;-1:-1:-1;;;;;49095:30:0;;;68580:148;;;;;;;;;;-1:-1:-1;68580:148:0;;;;;:::i;:::-;;:::i;72061:157::-;;;;;;;;;;;;;:::i;49356:49::-;;;;;;;;;;;;;;;;68235:165;;;;;;;;;;-1:-1:-1;68235:165:0;;;;;:::i;:::-;;:::i;68100:127::-;;;;;;;;;;-1:-1:-1;68100:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;68192:27:0;68168:4;68192:27;;;:18;:27;;;;;;;;;68100:127;60423:576;;;;;;;;;;-1:-1:-1;60423:576:0;;;;;:::i;:::-;;:::i;55614:306::-;;;;;;;;;;-1:-1:-1;55614:306:0;;;;;:::i;:::-;;:::i;62216:966::-;;;;;;;;;;-1:-1:-1;62216:966:0;;;;;:::i;:::-;;:::i;49579:28::-;;;;;;;;;;;;;;;;66712:287;;;;;;;;;;-1:-1:-1;66712:287:0;;;;;:::i;:::-;;:::i;58244:749::-;;;;;;;;;;-1:-1:-1;58244:749:0;;;;;:::i;:::-;;:::i;2055:87::-;;;;;;;;;;-1:-1:-1;2128:6:0;;;;;-1:-1:-1;;;;;2128:6:0;2055:87;;55402:202;;;;;;;;;;-1:-1:-1;55402:202:0;;;;;:::i;:::-;;:::i;49693:37::-;;;;;;;;;;;;;;;;8473:95;;;;;;;;;;;;;:::i;64268:348::-;;;;;;;;;;-1:-1:-1;64268:348:0;;;;;:::i;:::-;;:::i;65787:269::-;;;;;;;;;;-1:-1:-1;65787:269:0;;;;;:::i;:::-;;:::i;49936:40::-;;;;;;;;;;;;;;;;56271:119;;;;;;;;;;-1:-1:-1;56271:119:0;;;;;:::i;:::-;;:::i;12516:269::-;;;;;;;;;;-1:-1:-1;12516:269:0;;;;;:::i;:::-;;:::i;49138:38::-;;;;;;;;;;;;;;;;9878:175;;;;;;;;;;-1:-1:-1;9878:175:0;;;;;:::i;:::-;;:::i;59005:749::-;;;;;;;;;;-1:-1:-1;59005:749:0;;;;;:::i;:::-;;:::i;49871:56::-;;;;;;;;;;;;;;;;55930:331;;;;;;;;;;-1:-1:-1;55930:331:0;;;;;:::i;:::-;;:::i;48473:36::-;;;;;;;;;;-1:-1:-1;48473:36:0;;;;-1:-1:-1;;;;;48473:36:0;;;56400:130;;;;;;;;;;-1:-1:-1;56400:130:0;;;;;:::i;:::-;;:::i;49000:54::-;;;;;;;;;;-1:-1:-1;49000:54:0;;;;-1:-1:-1;;;;;49000:54:0;;;65249:217;;;;;;;;;;-1:-1:-1;65249:217:0;;;;;:::i;:::-;;:::i;54916:126::-;;;;;;;;;;-1:-1:-1;54916:126:0;;;;;:::i;:::-;;:::i;50237:58::-;;;;;;;;;;-1:-1:-1;50237:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63561:355;;;;;;;;;;-1:-1:-1;63561:355:0;;;;;:::i;:::-;;:::i;64950:291::-;;;;;;;;;;-1:-1:-1;64950:291:0;;;;;:::i;:::-;;:::i;65474:305::-;;;;;;;;;;-1:-1:-1;65474:305:0;;;;;:::i;:::-;;:::i;49737:45::-;;;;;;;;;;;;;;;;54562:336;;;;;;;;;;-1:-1:-1;54562:336:0;;;;;:::i;:::-;;:::i;57490:742::-;;;;;;;;;;-1:-1:-1;57490:742:0;;;;;:::i;:::-;;:::i;49412:41::-;;;;;;;;;;;;;;;;71737:150;;;;;;;;;;;;;:::i;63928:328::-;;;;;;;;;;-1:-1:-1;63928:328:0;;;;;:::i;:::-;;:::i;61238:966::-;;;;;;;;;;-1:-1:-1;61238:966:0;;;;;:::i;:::-;;:::i;3335:226::-;;;;;;;;;;-1:-1:-1;3335:226:0;;;;;:::i;:::-;;:::i;10116:151::-;;;;;;;;;;-1:-1:-1;10116:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;10232:18:0;;;10205:7;10232:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10116:151;49656:30;;;;;;;;;;;;;;;;57369:109;;;;;;;;;;-1:-1:-1;57369:109:0;;;;;:::i;:::-;;:::i;49229:33::-;;;;;;;;;;;;;;;;49269:29;;;;;;;;;;;;;;;;67766:157;;;;;;;;;;;;;:::i;48667:36::-;;;;;;;;;;-1:-1:-1;48667:36:0;;;;-1:-1:-1;;;48667:36:0;;;;;;68410:165;;;;;;;;;;-1:-1:-1;68410:165:0;;;;;:::i;:::-;;:::i;67297:193::-;;;;;;;;;;-1:-1:-1;67297:193:0;;;;;:::i;:::-;;:::i;67498:124::-;;;;;;;;;;;;;:::i;3009:244::-;;;;;;;;;;-1:-1:-1;3009:244:0;;;;;:::i;:::-;;:::i;67935:157::-;;;;;;;;;;;;;:::i;56540:130::-;;;;;;;;;;-1:-1:-1;56540:130:0;;;;;:::i;:::-;;:::i;49550:22::-;;;;;;;;;;;;;;;;63194:355;;;;;;;;;;-1:-1:-1;63194:355:0;;;;;:::i;:::-;;:::i;8263:91::-;8308:13;8341:5;8334:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8263:91;:::o;56678:679::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;;;;;;;;;56761:1:::1;56732:26;:30:::0;56802:1:::1;56773:26;:30:::0;56829:1:::1;56814:12;:16:::0;;;56841:22:::1;:26:::0;-1:-1:-1;56878:13:0::1;:17:::0;;;56906:7:::1;:11:::0;56940:2:::1;56928:9;:14:::0;56953:16:::1;:23:::0;;-1:-1:-1;;;;57097:30:0;-1:-1:-1;;;57097:30:0;;;57159:19:::1;-1:-1:-1::0;57138:40:0;57216:22:::1;57189:23;:49:::0;;;57249:24:::1;:49:::0;57326:23:::1;57309:14;:40:::0;56678:679::o;55190:202::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;55278:21:::1;:36:::0;;-1:-1:-1;;;;;;55278:36:0::1;-1:-1:-1::0;;;;;55278:36:0;;::::1;::::0;;::::1;::::0;;;55324:23:::1;::::0;:61:::1;::::0;-1:-1:-1;;;55324:61:0;;::::1;::::0;::::1;6262:51:1::0;;;;55324:23:0;;::::1;::::0;:47:::1;::::0;6235:18:1;;55324:61:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55190:202:::0;:::o;10414:169::-;10497:4;10514:39;711:10;10537:7;10546:6;10514:8;:39::i;:::-;-1:-1:-1;10571:4:0;10414:169;;;;;:::o;67634:124::-;67715:23;;:35;;;-1:-1:-1;;;67715:35:0;;;;67688:7;;-1:-1:-1;;;;;67715:23:0;;:33;;:35;;;;;;;;;;;;;;:23;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67708:42;;67634:124;:::o;11065:321::-;11171:4;11188:36;11198:6;11206:9;11217:6;11188:9;:36::i;:::-;11235:121;11244:6;711:10;11266:89;11304:6;11266:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11266:19:0;;;;;;:11;:19;;;;;;;;711:10;11266:33;;;;;;;;;;:37;:89::i;:::-;11235:8;:121::i;:::-;-1:-1:-1;11374:4:0;11065:321;;;;;:::o;59766:644::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;59848:16:::1;::::0;::::1;-1:-1:-1::0;;;59848:16:0;;::::1;;:28;;::::0;::::1;;;;59840:70;;;;-1:-1:-1::0;;;59840:70:0::1;;;;;;;:::i;:::-;59925:17:::0;59921:431:::1;;59982:12;::::0;;59959:20:::1;:35:::0;-1:-1:-1;60009:16:0;;60040::::1;:27:::0;;-1:-1:-1;;;;60040:27:0::1;-1:-1:-1::0;;;60040:27:0;::::1;;;;::::0;;59921:431:::1;;;60115:20;;60100:12;:35;;;;60162:136;60284:13;;60162:117;60271:7;;60162:104;60243:22;;60162:76;60211:26;;60162:44;60179:26;;60162:12;;:16;;:44;;;;:::i;:::-;:48:::0;::::1;:76::i;:136::-;60150:9;:148:::0;60313:16:::1;:27:::0;;-1:-1:-1;;;;60313:27:0::1;-1:-1:-1::0;;;60313:27:0;::::1;;;;::::0;;59921:431:::1;60369:33;::::0;9485:14:1;;9478:22;9460:41;;60369:33:0::1;::::0;9448:2:1;9433:18;60369:33:0::1;;;;;;;;59766:644:::0;:::o;71899:150::-;71994:23;;:47;;;-1:-1:-1;;;71994:47:0;;;;71970:7;;-1:-1:-1;;;;;71994:23:0;;:45;;:47;;;;;;;;;;;;;;:23;:47;;;;;;;;;;69575:341;69860:23;;:48;;-1:-1:-1;;;69860:48:0;;;;;22134:25:1;;;69684:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69860:23:0;;;;:41;;22107:18:1;;69860:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69853:55;;;;;;;;;;;;;;;;69575:341;;;;;;;;;:::o;72230:157::-;72330:23;;:49;;;-1:-1:-1;;;72330:49:0;;;;72303:7;;-1:-1:-1;;;;;72330:23:0;;:47;;:49;;;;;;;;;;;;;;:23;:49;;;;;;;;;;68734:148;68835:23;;:42;;-1:-1:-1;;;68835:42:0;;-1:-1:-1;;;;;6280:32:1;;;68835:42:0;;;6262:51:1;68814:7:0;;68835:23;;:33;;6235:18:1;;68835:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;11795:218::-;711:10;11883:4;11932:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11932:34:0;;;;;;;;;;11883:4;;11900:83;;11923:7;;11932:50;;11971:10;11932:38;:50::i;67011:278::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;67110:23:::1;::::0;:80:::1;::::0;-1:-1:-1;;;67110:80:0;;::::1;::::0;::::1;22134:25:1::0;;;-1:-1:-1;;;;;67110:23:0;;::::1;::::0;:61:::1;::::0;22107:18:1;;67110:80:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;67201:23:0::1;::::0;:80:::1;::::0;-1:-1:-1;;;67201:80:0;;::::1;::::0;::::1;22134:25:1::0;;;-1:-1:-1;;;;;67201:23:0;;::::1;::::0;-1:-1:-1;67201:61:0::1;::::0;-1:-1:-1;22107:18:1;;67201:80:0::1;22089:76:1::0;71555:176:0;71586:23;;:66;;-1:-1:-1;;;71586:66:0;;71633:10;71586:66;;;6508:51:1;71586:23:0;6575:18:1;;;6568:50;-1:-1:-1;;;;;71586:23:0;;;;:38;;6481:18:1;;71586:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;71657:23:0;;:66;;-1:-1:-1;;;71657:66:0;;71704:10;71657:66;;;6508:51:1;71657:23:0;6575:18:1;;;6568:50;-1:-1:-1;;;;;71657:23:0;;;;:38;;6481:18:1;;71657:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71555:176::o;54002:553::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;54105:14:::1;:32:::0;;-1:-1:-1;;;;;;54105:32:0::1;-1:-1:-1::0;;;;;54105:32:0;;::::1;::::0;;::::1;::::0;;;54148:23:::1;::::0;:61:::1;::::0;-1:-1:-1;;;54148:61:0;;::::1;::::0;::::1;6262:51:1::0;;;;54148:23:0;;::::1;::::0;:44:::1;::::0;6235:18:1;;54148:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54220:23:0::1;::::0;:61:::1;::::0;-1:-1:-1;;;54220:61:0;;-1:-1:-1;;;;;6280:32:1;;;54220:61:0::1;::::0;::::1;6262:51:1::0;54220:23:0;;::::1;::::0;-1:-1:-1;54220:44:0::1;::::0;-1:-1:-1;6235:18:1;;54220:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54292:38;54308:15;54325:4;54292:15;:38::i;:::-;54343:23;::::0;:60:::1;::::0;-1:-1:-1;;;54343:60:0;;-1:-1:-1;;;;;6280:32:1;;;54343:60:0::1;::::0;::::1;6262:51:1::0;54343:23:0;;::::1;::::0;:44:::1;::::0;6235:18:1;;54343:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54414:23:0::1;::::0;:60:::1;::::0;-1:-1:-1;;;54414:60:0;;-1:-1:-1;;;;;6280:32:1;;;54414:60:0::1;::::0;::::1;6262:51:1::0;54414:23:0;;::::1;::::0;-1:-1:-1;54414:44:0::1;::::0;-1:-1:-1;6235:18:1;;54414:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54511:37;54527:14;54543:4;54511:15;:37::i;:::-;54002:553:::0;;:::o;69928:341::-;70213:23;;:48;;-1:-1:-1;;;70213:48:0;;;;;22134:25:1;;;70037:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70213:23:0;;;;:41;;22107:18:1;;70213:48:0;22089:76:1;61013:219:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;61090:11:::1;::::0;::::1;-1:-1:-1::0;;;61090:11:0;;::::1;;:23;;::::0;::::1;;;;61082:65;;;;-1:-1:-1::0;;;61082:65:0::1;;;;;;;:::i;:::-;61158:11;:22:::0;;;::::1;;-1:-1:-1::0;;;61158:22:0::1;-1:-1:-1::0;;;;61158:22:0;;::::1;;::::0;;61196:28:::1;::::0;::::1;::::0;::::1;::::0;61172:8;9485:14:1;9478:22;9460:41;;9448:2;9433:18;;9415:92;55052:128:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;55156:17:::1;:7:::0;55167:5:::1;55156:17;:::i;:::-;55129:24;:44:::0;-1:-1:-1;55052:128:0:o;68890:334::-;69173:23;;:43;;-1:-1:-1;;;69173:43:0;;-1:-1:-1;;;;;6280:32:1;;;69173:43:0;;;6262:51:1;68994:7:0;;;;;;;;;;;;;;;;69173:23;;;:34;;6235:18:1;;69173:43:0;6217:102:1;64624:318:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;64735:15:::1;::::0;-1:-1:-1;;;;;64713:38:0;;::::1;64735:15:::0;::::1;64713:38;;64705:95;;;::::0;-1:-1:-1;;;64705:95:0;;14925:2:1;64705:95:0::1;::::0;::::1;14907:21:1::0;14964:2;14944:18;;;14937:30;15003:34;14983:18;;;14976:62;-1:-1:-1;;;15054:18:1;;;15047:42;15106:19;;64705:95:0::1;14897:234:1::0;64705:95:0::1;64858:15;::::0;64816:59:::1;::::0;-1:-1:-1;;;;;64858:15:0;;::::1;::::0;64816:59;::::1;::::0;::::1;::::0;64858:15:::1;::::0;64816:59:::1;64886:15;:48:::0;;-1:-1:-1;;;;;;64886:48:0::1;-1:-1:-1::0;;;;;64886:48:0;;;::::1;::::0;;;::::1;::::0;;64624:318::o;70274:568::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;70419:23:::1;::::0;:36:::1;::::0;-1:-1:-1;;;;;;70419:36:0;;::::1;::::0;::::1;22134:25:1::0;;;70344:21:0::1;::::0;;;;;-1:-1:-1;;;;;70419:23:0::1;::::0;:31:::1;::::0;22107:18:1;;70419:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70465:104;::::0;;23649:25:1;;;23705:2;23690:18;;23683:34;;;23733:18;;;23726:34;;;23791:2;23776:18;;23769:34;;;70343:112:0;;-1:-1:-1;70343:112:0;;-1:-1:-1;70343:112:0;-1:-1:-1;70559:9:0::1;::::0;70547:5:::1;::::0;70465:104:::1;::::0;23636:3:1;23621:19;70465:104:0::1;;;;;;;70669:23;::::0;:36:::1;::::0;-1:-1:-1;;;;;;70669:36:0;;::::1;::::0;::::1;22134:25:1::0;;;70579:26:0::1;::::0;;;;;-1:-1:-1;;;;;70669:23:0::1;::::0;:31:::1;::::0;22107:18:1;;70669:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70715:119;::::0;;23649:25:1;;;23705:2;23690:18;;23683:34;;;23733:18;;;23726:34;;;23791:2;23776:18;;23769:34;;;70578:127:0;;-1:-1:-1;70578:127:0;;-1:-1:-1;70578:127:0;-1:-1:-1;70824:9:0::1;::::0;70812:5:::1;::::0;70715:119:::1;::::0;23636:3:1;23621:19;70715:119:0::1;;;;;;;70338:504;;;;;;70274:568:::0;:::o;9538:127::-;-1:-1:-1;;;;;9639:18:0;9612:7;9639:18;;;;;;;;;;;;9538:127::o;2706:148::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;2797:6:::1;::::0;2776:40:::1;::::0;2813:1:::1;::::0;2797:6:::1;::::0;::::1;-1:-1:-1::0;;;;;2797:6:0::1;::::0;2776:40:::1;::::0;2813:1;;2776:40:::1;2827:6;:19:::0;;-1:-1:-1;;;;;;2827:19:0::1;::::0;;2706:148::o;69236:334::-;69519:23;;:43;;-1:-1:-1;;;69519:43:0;;-1:-1:-1;;;;;6280:32:1;;;69519:43:0;;;6262:51:1;69340:7:0;;;;;;;;;;;;;;;;69519:23;;;:34;;6235:18:1;;69519:43:0;6217:102:1;68580:148:0;68681:23;;:42;;-1:-1:-1;;;68681:42:0;;-1:-1:-1;;;;;6280:32:1;;;68681:42:0;;;6262:51:1;68660:7:0;;68681:23;;:33;;6235:18:1;;68681:42:0;6217:102:1;72061:157:0;72161:23;;:49;;;-1:-1:-1;;;72161:49:0;;;;72134:7;;-1:-1:-1;;;;;72161:23:0;;:47;;:49;;;;;;;;;;;;;;:23;:49;;;;;;;;;;68235:165;68338:23;;:55;;-1:-1:-1;;;68338:55:0;;-1:-1:-1;;;;;6280:32:1;;;68338:55:0;;;6262:51:1;68314:7:0;;68338:23;;:46;;6235:18:1;;68338:55:0;6217:102:1;60423:576:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;60500:11:::1;::::0;::::1;-1:-1:-1::0;;;60500:11:0;;::::1;;:23;;::::0;::::1;;;;60492:65;;;;-1:-1:-1::0;;;60492:65:0::1;;;;;;;:::i;:::-;60572:17:::0;60568:378:::1;;60624:7;::::0;;60606:15:::1;:25:::0;-1:-1:-1;60646:11:0;;60672::::1;:22:::0;;-1:-1:-1;;;;60672:22:0::1;-1:-1:-1::0;;;60672:22:0;::::1;;;;::::0;;60568:378:::1;;;60737:15;;60727:7;:25;;;;60779:118;60883:13;;60779:99;60855:22;;60779:71;60823:26;;60779:39;60791:26;;60779:7;;:11;;:39;;;;:::i;:118::-;60767:9;:130:::0;60912:11:::1;:22:::0;;-1:-1:-1;;;;60912:22:0::1;-1:-1:-1::0;;;60912:22:0;::::1;;;;::::0;;60568:378:::1;60963:28;::::0;9485:14:1;;9478:22;9460:41;;60963:28:0::1;::::0;9448:2:1;9433:18;60963:28:0::1;9415:92:1::0;55614:306:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;55711:10:::1;::::0;-1:-1:-1;;;;;55697:24:0;;::::1;55711:10:::0;::::1;55697:24;;55689:85;;;::::0;-1:-1:-1;;;55689:85:0;;18069:2:1;55689:85:0::1;::::0;::::1;18051:21:1::0;18108:2;18088:18;;;18081:30;18147:34;18127:18;;;18120:62;-1:-1:-1;;;18198:18:1;;;18191:46;18254:19;;55689:85:0::1;18041:238:1::0;55689:85:0::1;55785:33;55801:10;55813:4;55785:15;:33::i;:::-;55857:10;::::0;55834:46:::1;::::0;-1:-1:-1;;;;;55834:46:0;;::::1;::::0;55857:10:::1;::::0;55834:46:::1;::::0;55857:10:::1;::::0;55834:46:::1;55890:10;:23:::0;;-1:-1:-1;;;;;;55890:23:0::1;-1:-1:-1::0;;;;;55890:23:0;;;::::1;::::0;;;::::1;::::0;;55614:306::o;62216:966::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;62335:23:::1;::::0;-1:-1:-1;;;;;62313:46:0;;::::1;62335:23:::0;::::1;62313:46;;62305:113;;;;-1:-1:-1::0;;;62305:113:0::1;;;;;;;:::i;:::-;62431:50;62516:10;62431:97;;62595:4;-1:-1:-1::0;;;;;62549:51:0::1;:26;-1:-1:-1::0;;;;;62549:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62549:51:0::1;;62541:141;;;;-1:-1:-1::0;;;62541:141:0::1;;;;;;;:::i;:::-;62695:84;::::0;-1:-1:-1;;;62695:84:0;;-1:-1:-1;;;;;62695:47:0;::::1;:84;::::0;::::1;6262:51:1::0;;;62695:47:0;::::1;::::0;6235:18:1;;62695:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62790:62:0::1;::::0;-1:-1:-1;;;62790:62:0;;62846:4:::1;62790:62;::::0;::::1;6262:51:1::0;-1:-1:-1;;;;;62790:47:0;::::1;::::0;-1:-1:-1;62790:47:0::1;::::0;-1:-1:-1;6235:18:1;;62790:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62919:15:0::1;::::0;62863:73:::1;::::0;-1:-1:-1;;;62863:73:0;;-1:-1:-1;;;;;62919:15:0;;::::1;62863:73;::::0;::::1;6262:51:1::0;62863:47:0;;::::1;::::0;-1:-1:-1;62863:47:0::1;::::0;-1:-1:-1;6235:18:1;;62863:73:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;63003:11:0::1;::::0;62947:69:::1;::::0;-1:-1:-1;;;62947:69:0;;-1:-1:-1;;;;;63003:11:0;;::::1;62947:69;::::0;::::1;6262:51:1::0;62947:47:0;;::::1;::::0;-1:-1:-1;62947:47:0::1;::::0;-1:-1:-1;6235:18:1;;62947:69:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;63084:23:0::1;::::0;63034:75:::1;::::0;-1:-1:-1;;;;;63084:23:0;;::::1;::::0;-1:-1:-1;63034:75:0;;::::1;::::0;-1:-1:-1;63034:75:0::1;::::0;63084:23:::1;::::0;63034:75:::1;63122:23;:52:::0;;-1:-1:-1;;;;;;63122:52:0::1;-1:-1:-1::0;;;;;63122:52:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;62216:966:0:o;66712:287::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;66812:16:::1;;66800:8;:28;;66792:94;;;::::0;-1:-1:-1;;;66792:94:0;;19654:2:1;66792:94:0::1;::::0;::::1;19636:21:1::0;19693:2;19673:18;;;19666:30;19732:34;19712:18;;;19705:62;-1:-1:-1;;;19783:18:1;;;19776:51;19844:19;;66792:94:0::1;19626:243:1::0;66792:94:0::1;66897:16;:27:::0;;;66940:51:::1;::::0;66916:8;;;;66940:51:::1;::::0;;;::::1;66712:287:::0;:::o;58244:749::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;58333:23:::1;::::0;::::1;-1:-1:-1::0;;;58333:23:0;;::::1;;:35;;::::0;::::1;;;;58325:77;;;;-1:-1:-1::0;;;58325:77:0::1;;;;;;;:::i;:::-;58417:17:::0;58413:515:::1;;58488:26;::::0;;58451:34:::1;:63:::0;-1:-1:-1;58529:30:0;;58574:23:::1;:34:::0;;-1:-1:-1;;;;58574:34:0::1;-1:-1:-1::0;;;58574:34:0;::::1;;;;::::0;;58413:515:::1;;;58670:34;;58641:26;:63;;;;58731:136;58853:13;;58731:117;58840:7;;58731:104;58812:22;;58731:76;58780:26;;58731:44;58762:12;;58731:26;;:30;;:44;;;;:::i;:136::-;58719:9;:148:::0;58882:23:::1;:34:::0;;-1:-1:-1;;;;58882:34:0::1;-1:-1:-1::0;;;58882:34:0;::::1;;;;::::0;;58413:515:::1;58945:40;::::0;9485:14:1;;9478:22;9460:41;;58945:40:0::1;::::0;9448:2:1;9433:18;58945:40:0::1;9415:92:1::0;55402:202:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;55490:21:::1;:36:::0;;-1:-1:-1;;;;;;55490:36:0::1;-1:-1:-1::0;;;;;55490:36:0;;::::1;::::0;;::::1;::::0;;;55536:23:::1;::::0;:61:::1;::::0;-1:-1:-1;;;55536:61:0;;::::1;::::0;::::1;6262:51:1::0;;;;55536:23:0;;::::1;::::0;:47:::1;::::0;6235:18:1;;55536:61:0::1;6217:102:1::0;8473:95:0;8520:13;8553:7;8546:14;;;;;:::i;64268:348::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;64368:1:::1;64358:6;:11;;;;64350:57;;;;-1:-1:-1::0;;;64350:57:0::1;;;;;;;:::i;:::-;64443:6;64418:31;;:22;:31;;;;64472:136;64594:13;;64472:117;64581:7;;64472:104;64563:12;;64472:86;64531:26;;64472:54;64499:26;;64472:22;;:26;;:54;;;;:::i;:136::-;64460:9;:148:::0;-1:-1:-1;64268:348:0:o;65787:269::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;65894:13:::1;-1:-1:-1::0;;;;;65886:21:0::1;:4;-1:-1:-1::0;;;;;65886:21:0::1;;;65878:116;;;::::0;-1:-1:-1;;;65878:116:0;;13664:2:1;65878:116:0::1;::::0;::::1;13646:21:1::0;13703:2;13683:18;;;13676:30;13742:34;13722:18;;;13715:62;13813:34;13793:18;;;13786:62;-1:-1:-1;;;13864:19:1;;;13857:49;13923:19;;65878:116:0::1;13636:312:1::0;65878:116:0::1;66007:41;66036:4;66042:5;66007:28;:41::i;56271:119::-:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;56364:19:::1;:9:::0;56377:5:::1;56364:19;:::i;:::-;56347:14;:36:::0;-1:-1:-1;56271:119:0:o;12516:269::-;12609:4;12626:129;711:10;12649:7;12658:96;12697:15;12658:96;;;;;;;;;;;;;;;;;711:10;12658:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12658:34:0;;;;;;;;;;;;:38;:96::i;9878:175::-;9964:4;9981:42;711:10;10005:9;10016:6;9981:9;:42::i;59005:749::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;59094:23:::1;::::0;::::1;-1:-1:-1::0;;;59094:23:0;;::::1;;:35;;::::0;::::1;;;;59086:77;;;;-1:-1:-1::0;;;59086:77:0::1;;;;;;;:::i;:::-;59178:17:::0;59174:515:::1;;59249:26;::::0;;59212:34:::1;:63:::0;-1:-1:-1;59290:30:0;;59335:23:::1;:34:::0;;-1:-1:-1;;;;59335:34:0::1;-1:-1:-1::0;;;59335:34:0;::::1;;;;::::0;;59174:515:::1;;;59431:34;;59402:26;:63;;;;59492:136;59614:13;;59492:117;59601:7;;59492:104;59573:22;;59492:76;59541:26;;59492:44;59523:12;;59492:26;;:30;;:44;;;;:::i;:136::-;59480:9;:148:::0;59643:23:::1;:34:::0;;-1:-1:-1;;;;59643:34:0::1;-1:-1:-1::0;;;59643:34:0;::::1;;;;::::0;;59174:515:::1;59706:40;::::0;9485:14:1;;9478:22;9460:41;;59706:40:0::1;::::0;9448:2:1;9433:18;59706:40:0::1;9415:92:1::0;55930:331:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;56032:15:::1;::::0;-1:-1:-1;;;;;56018:29:0;;::::1;56032:15:::0;::::1;56018:29;;56010:95;;;::::0;-1:-1:-1;;;56010:95:0;;16884:2:1;56010:95:0::1;::::0;::::1;16866:21:1::0;16923:2;16903:18;;;16896:30;16962:34;16942:18;;;16935:62;-1:-1:-1;;;17013:18:1;;;17006:51;17074:19;;56010:95:0::1;16856:243:1::0;56010:95:0::1;56116:33;56132:10;56144:4;56116:15;:33::i;:::-;56188:15;::::0;56165:51:::1;::::0;-1:-1:-1;;;;;56165:51:0;;::::1;::::0;56188:15:::1;::::0;56165:51:::1;::::0;56188:15:::1;::::0;56165:51:::1;56226:15;:28:::0;;-1:-1:-1;;;;;;56226:28:0::1;-1:-1:-1::0;;;;;56226:28:0;;;::::1;::::0;;;::::1;::::0;;55930:331::o;56400:130::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;56502:21:::1;:11:::0;56517:5:::1;56502:21;:::i;:::-;56481:18;:42:::0;-1:-1:-1;56400:130:0:o;65249:217::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;65323:23:::1;::::0;:62:::1;::::0;-1:-1:-1;;;65323:62:0;;-1:-1:-1;;;;;6280:32:1;;;65323:62:0::1;::::0;::::1;6262:51:1::0;65323:23:0;;::::1;::::0;:44:::1;::::0;6235:18:1;;65323:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;65396:23:0::1;::::0;:62:::1;::::0;-1:-1:-1;;;65396:62:0;;-1:-1:-1;;;;;6280:32:1;;;65396:62:0::1;::::0;::::1;6262:51:1::0;65396:23:0;;::::1;::::0;-1:-1:-1;65396:44:0::1;::::0;-1:-1:-1;6235:18:1;;65396:62:0::1;6217:102:1::0;54916:126:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;55018:17:::1;:7:::0;55029:5:::1;55018:17;:::i;:::-;54992:23;:43:::0;-1:-1:-1;54916:126:0:o;63561:355::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;63664:1:::1;63654:6;:11;;;;63646:57;;;;-1:-1:-1::0;;;63646:57:0::1;;;;;;;:::i;:::-;63743:6;63714:35;;:26;:35;;;;63772:136;63894:13;;63772:117;63881:7;;63772:104;63853:22;;63772:76;63835:12;;63772:58;63803:26;;63772;;:30;;:58;;;;:::i;64950:291::-:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65043:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;:39;;::::0;::::1;;;;65035:97;;;::::0;-1:-1:-1;;;65035:97:0;;14511:2:1;65035:97:0::1;::::0;::::1;14493:21:1::0;14550:2;14530:18;;;14523:30;14589:34;14569:18;;;14562:62;-1:-1:-1;;;14640:18:1;;;14633:43;14693:19;;65035:97:0::1;14483:235:1::0;65035:97:0::1;-1:-1:-1::0;;;;;65143:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;65143:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;65199:34;;9460:41:1;;;65199:34:0::1;::::0;9433:18:1;65199:34:0::1;;;;;;;64950:291:::0;;:::o;65474:305::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;65593:9:::1;65589:114;65608:19:::0;;::::1;65589:114;;;65683:8;65649:18;:31;65668:8;;65677:1;65668:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65649:31:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;65649:31:0;:42;;-1:-1:-1;;65649:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65629:3;::::1;::::0;::::1;:::i;:::-;;;;65589:114;;;;65720:51;65752:8;;65762;65720:51;;;;;;;;:::i;:::-;;;;;;;;65474:305:::0;;;:::o;54562:336::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;54661:23:::1;::::0;:71:::1;::::0;-1:-1:-1;;;54661:71:0;;-1:-1:-1;;;;;6280:32:1;;;54661:71:0::1;::::0;::::1;6262:51:1::0;54661:23:0;;::::1;::::0;:44:::1;::::0;6235:18:1;;54661:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54743:23:0::1;::::0;:71:::1;::::0;-1:-1:-1;;;54743:71:0;;-1:-1:-1;;;;;6280:32:1;;;54743:71:0::1;::::0;::::1;6262:51:1::0;54743:23:0;;::::1;::::0;-1:-1:-1;54743:44:0::1;::::0;-1:-1:-1;6235:18:1;;54743:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54841:15:0::1;::::0;54825:66:::1;::::0;-1:-1:-1;54841:22:0::1;::::0;-1:-1:-1;54861:1:0::1;54841:19;:22::i;:::-;54865:25;54825:15;:66::i;57490:742::-:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;57580:24:::1;::::0;::::1;-1:-1:-1::0;;;57580:24:0;;::::1;;:36;;::::0;::::1;;;;57572:78;;;;-1:-1:-1::0;;;57572:78:0::1;;;;;;;:::i;:::-;57665:17:::0;57661:497:::1;;57732:22;::::0;;57699:30:::1;:55:::0;-1:-1:-1;57769:26:0;;57810:24:::1;:35:::0;;-1:-1:-1;;;;57810:35:0::1;-1:-1:-1::0;;;57810:35:0;::::1;;;;::::0;;57661:497:::1;;;57903:30;;57878:22;:55;;;;57960:136;58082:13;;57960:117;58069:7;;57960:104;58037:26;;57960:72;58005:26;;57960:40;57987:12;;57960:22;;:26;;:40;;;;:::i;:136::-;57948:9;:148:::0;58111:24:::1;:35:::0;;-1:-1:-1;;;;58111:35:0::1;-1:-1:-1::0;;;58111:35:0;::::1;;;;::::0;;57661:497:::1;58183:41;::::0;9485:14:1;;9478:22;9460:41;;58183::0::1;::::0;9448:2:1;9433:18;58183:41:0::1;9415:92:1::0;71737:150:0;71832:23;;:47;;;-1:-1:-1;;;71832:47:0;;;;71808:7;;-1:-1:-1;;;;;71832:23:0;;:45;;:47;;;;;;;;;;;;;;:23;:47;;;;;;;;;;63928:328;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;64018:1:::1;64008:6;:11;;;;64000:57;;;;-1:-1:-1::0;;;64000:57:0::1;;;;;;;:::i;:::-;64083:6;64068:21;;:12;:21;;;;64112:136;64234:13;;64112:117;64221:7;;64112:104;64193:22;;64112:76;64161:26;;64112:44;64129:26;;64112:12;;:16;;:44;;;;:::i;61238:966::-:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;61357:23:::1;::::0;-1:-1:-1;;;;;61335:46:0;;::::1;61357:23:::0;::::1;61335:46;;61327:113;;;;-1:-1:-1::0;;;61327:113:0::1;;;;;;;:::i;:::-;61453:50;61538:10;61453:97;;61617:4;-1:-1:-1::0;;;;;61571:51:0::1;:26;-1:-1:-1::0;;;;;61571:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61571:51:0::1;;61563:141;;;;-1:-1:-1::0;;;61563:141:0::1;;;;;;;:::i;:::-;61717:84;::::0;-1:-1:-1;;;61717:84:0;;-1:-1:-1;;;;;61717:47:0;::::1;:84;::::0;::::1;6262:51:1::0;;;61717:47:0;::::1;::::0;6235:18:1;;61717:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;61812:62:0::1;::::0;-1:-1:-1;;;61812:62:0;;61868:4:::1;61812:62;::::0;::::1;6262:51:1::0;-1:-1:-1;;;;;61812:47:0;::::1;::::0;-1:-1:-1;61812:47:0::1;::::0;-1:-1:-1;6235:18:1;;61812:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;61941:15:0::1;::::0;61885:73:::1;::::0;-1:-1:-1;;;61885:73:0;;-1:-1:-1;;;;;61941:15:0;;::::1;61885:73;::::0;::::1;6262:51:1::0;61885:47:0;;::::1;::::0;-1:-1:-1;61885:47:0::1;::::0;-1:-1:-1;6235:18:1;;61885:73:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62025:11:0::1;::::0;61969:69:::1;::::0;-1:-1:-1;;;61969:69:0;;-1:-1:-1;;;;;62025:11:0;;::::1;61969:69;::::0;::::1;6262:51:1::0;61969:47:0;;::::1;::::0;-1:-1:-1;61969:47:0::1;::::0;-1:-1:-1;6235:18:1;;61969:69:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62106:23:0::1;::::0;62056:75:::1;::::0;-1:-1:-1;;;;;62106:23:0;;::::1;::::0;-1:-1:-1;62056:75:0;;::::1;::::0;-1:-1:-1;62056:75:0::1;::::0;62106:23:::1;::::0;62056:75:::1;62144:23;:52:::0;;-1:-1:-1;;;;;;62144:52:0::1;-1:-1:-1::0;;;;;62144:52:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;61238:966:0:o;3335:226::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;3416:6:::1;::::0;;3399:14:::1;:23:::0;;-1:-1:-1;;;;;;3399:23:0::1;-1:-1:-1::0;;;;;3416:6:0::1;::::0;::::1;;3399:23;::::0;;-1:-1:-1;;;;;;3433:19:0::1;::::0;;3475:22:::1;3493:4:::0;3475:15:::1;:22;:::i;:::-;3463:9;:34:::0;3534:6:::1;::::0;3513:40:::1;::::0;3550:1:::1;::::0;3534:6:::1;::::0;::::1;-1:-1:-1::0;;;;;3534:6:0::1;::::0;3513:40:::1;::::0;3550:1;;3513:40:::1;3335:226:::0;:::o;57369:109::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;57443:16:::1;:27:::0;;;::::1;;-1:-1:-1::0;;;57443:27:0::1;-1:-1:-1::0;;;;57443:27:0;;::::1;::::0;;;::::1;::::0;;57369:109::o;67766:157::-;67864:23;;:51;;;-1:-1:-1;;;67864:51:0;;;;67837:7;;-1:-1:-1;;;;;67864:23:0;;:49;;:51;;;;;;;;;;;;;;:23;:51;;;;;;;;;;68410:165;68513:23;;:55;;-1:-1:-1;;;68513:55:0;;-1:-1:-1;;;;;6280:32:1;;;68513:55:0;;;6262:51:1;68489:7:0;;68513:23;;:46;;6235:18:1;;68513:55:0;6217:102:1;67297:193:0;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;67371:23:::1;::::0;:50:::1;::::0;-1:-1:-1;;;67371:50:0;;::::1;::::0;::::1;22134:25:1::0;;;-1:-1:-1;;;;;67371:23:0;;::::1;::::0;:39:::1;::::0;22107:18:1;;67371:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;67432:23:0::1;::::0;:50:::1;::::0;-1:-1:-1;;;67432:50:0;;::::1;::::0;::::1;22134:25:1::0;;;-1:-1:-1;;;;;67432:23:0;;::::1;::::0;-1:-1:-1;67432:39:0::1;::::0;-1:-1:-1;22107:18:1;;67432:50:0::1;22089:76:1::0;67498:124:0;67579:23;;:35;;;-1:-1:-1;;;67579:35:0;;;;67552:7;;-1:-1:-1;;;;;67579:23:0;;:33;;:35;;;;;;;;;;;;;;:23;:35;;;;;;;;;;3009:244;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3098:22:0;::::1;3090:73;;;::::0;-1:-1:-1;;;3090:73:0;;12854:2:1;3090:73:0::1;::::0;::::1;12836:21:1::0;12893:2;12873:18;;;12866:30;12932:34;12912:18;;;12905:62;-1:-1:-1;;;12983:18:1;;;12976:36;13029:19;;3090:73:0::1;12826:228:1::0;3090:73:0::1;3200:6;::::0;3179:38:::1;::::0;-1:-1:-1;;;;;3179:38:0;;::::1;::::0;3200:6:::1;::::0;::::1;;::::0;3179:38:::1;::::0;;;::::1;3228:6;:17:::0;;-1:-1:-1;;;;;3228:17:0;;::::1;;;-1:-1:-1::0;;;;;;3228:17:0;;::::1;::::0;;;::::1;::::0;;3009:244::o;67935:157::-;68033:23;;:51;;;-1:-1:-1;;;68033:51:0;;;;68006:7;;-1:-1:-1;;;;;68033:23:0;;:49;;:51;;;;;;;;;;;;;;:23;:51;;;;;;;;;;56540:130;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;56628:21:::1;:35:::0;56540:130::o;63194:355::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;63297:1:::1;63287:6;:11;;;;63279:57;;;;-1:-1:-1::0;;;63279:57:0::1;;;;;;;:::i;:::-;63376:6;63347:35;;:26;:35;;;;63405:136;63527:13;;63405:117;63514:7;;63405:104;63486:22;;63405:76;63454:26;;63405:44;63436:12;;63405:26;;:30;;:44;;;;:::i;41821:179::-:0;41879:7;;41911:5;41915:1;41911;:5;:::i;:::-;41899:17;;41940:1;41935;:6;;41927:46;;;;-1:-1:-1;;;41927:46:0;;14155:2:1;41927:46:0;;;14137:21:1;14194:2;14174:18;;;14167:30;14233:29;14213:18;;;14206:57;14280:18;;41927:46:0;14127:177:1;41927:46:0;41991:1;41821:179;-1:-1:-1;;;41821:179:0:o;15663:346::-;-1:-1:-1;;;;;15765:19:0;;15757:68;;;;-1:-1:-1;;;15757:68:0;;21311:2:1;15757:68:0;;;21293:21:1;21350:2;21330:18;;;21323:30;21389:34;21369:18;;;21362:62;-1:-1:-1;;;21440:18:1;;;21433:34;21484:19;;15757:68:0;21283:226:1;15757:68:0;-1:-1:-1;;;;;15844:21:0;;15836:68;;;;-1:-1:-1;;;15836:68:0;;13261:2:1;15836:68:0;;;13243:21:1;13300:2;13280:18;;;13273:30;13339:34;13319:18;;;13312:62;-1:-1:-1;;;13390:18:1;;;13383:32;13432:19;;15836:68:0;13233:224:1;15836:68:0;-1:-1:-1;;;;;15917:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15969:32;;22134:25:1;;;15969:32:0;;22107:18:1;15969:32:0;;;;;;;;15663:346;;;:::o;72395:5538::-;-1:-1:-1;;;;;72527:18:0;;72519:68;;;;-1:-1:-1;;;72519:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72606:16:0;;72598:64;;;;-1:-1:-1;;;72598:64:0;;;;;;;:::i;:::-;72681:16;;-1:-1:-1;;;72681:16:0;;;;;:72;;-1:-1:-1;;;;;;72702:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;72730:22:0;;;;;;:18;:22;;;;;;;;72702:50;72673:121;;;;-1:-1:-1;;;72673:121:0;;19249:2:1;72673:121:0;;;19231:21:1;19288:2;19268:18;;;19261:30;19327:34;19307:18;;;19300:62;-1:-1:-1;;;19378:18:1;;;19371:34;19422:19;;72673:121:0;19221:226:1;72673:121:0;-1:-1:-1;;;;;72838:24:0;;72815:20;72838:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;72866:22:0;;;;;;:18;:22;;;;;;;;72838:50;72950:9;;73029:11;;72815:73;;-1:-1:-1;72899:10:0;;-1:-1:-1;;;73029:11:0;;;;:46;;;;-1:-1:-1;;;;;;73044:31:0;;;;;;:25;:31;;;;;;;;73029:46;73026:132;;;73097:4;;-1:-1:-1;73127:18:0;:11;73143:1;73127:15;:18::i;:::-;73113:32;;73026:132;73210:16;;-1:-1:-1;;;73210:16:0;;;;:64;;;;-1:-1:-1;;;;;;73243:31:0;;;;;;:25;:31;;;;;;;;73210:64;:97;;;;;73292:15;73291:16;73210:97;73192:3435;;;73370:23;;73360:6;:33;;73334:135;;;;-1:-1:-1;;;73334:135:0;;16475:2:1;73334:135:0;;;16457:21:1;16514:2;16494:18;;;16487:30;16553:34;16533:18;;;16526:62;-1:-1:-1;;;16604:18:1;;;16597:38;16652:19;;73334:135:0;16447:230:1;73334:135:0;73498:32;73533:13;73543:2;73533:9;:13::i;:::-;73624:14;;73498:48;;-1:-1:-1;73587:33:0;73614:6;73498:48;73587:33;:::i;:::-;:51;;73561:149;;;;-1:-1:-1;;;73561:149:0;;17306:2:1;73561:149:0;;;17288:21:1;17345:2;17325:18;;;17318:30;17384:34;17364:18;;;17357:62;-1:-1:-1;;;17435:18:1;;;17428:34;17479:19;;73561:149:0;17278:226:1;73561:149:0;73319:403;73192:3435;;;73743:16;;-1:-1:-1;;;73743:16:0;;;;:62;;;;-1:-1:-1;;;;;;73776:29:0;;;;;;:25;:29;;;;;;;;73743:62;:95;;;;;73823:15;73822:16;73743:95;73728:2899;;;73883:24;;73873:6;:34;;73865:105;;;;-1:-1:-1;;;73865:105:0;;20884:2:1;73865:105:0;;;20866:21:1;20923:2;20903:18;;;20896:30;20962:34;20942:18;;;20935:62;21033:28;21013:18;;;21006:56;21079:19;;73865:105:0;20856:248:1;73865:105:0;73999:28;74030:24;74048:4;74030:9;:24::i;:::-;74108:18;;74170:8;;73999:55;;-1:-1:-1;74084:42:0;;;;-1:-1:-1;;;74170:8:0;;;;74169:9;:20;;;;;74182:7;74169:20;74165:2451;;;74210:8;:15;;-1:-1:-1;;;;74210:15:0;-1:-1:-1;;;74210:15:0;;;;;-1:-1:-1;;;74266:16:0;;74210:15;74266:16;74262:551;;;74307:18;74328:85;74370:5;:42;;74400:12;;74370:42;;;74378:12;;:19;;74395:1;74378:16;:19::i;:::-;74328:37;:20;74353:11;74328:24;:37::i;:::-;:41;;:85::i;:::-;74307:106;;74436:28;74453:10;74436:16;:28::i;:::-;74487:19;74509:40;74546:2;74509:32;:21;74535:5;74509:25;:32::i;:40::-;74487:62;-1:-1:-1;74572:24:0;74599:38;:21;74487:62;74599:25;:38::i;:::-;74685:15;;74572:65;;-1:-1:-1;74660:60:0;;-1:-1:-1;;;;;74685:15:0;74572:65;74660:16;:60::i;:::-;74768:10;;74743:50;;-1:-1:-1;;;;;74768:10:0;74781:11;74743:16;:50::i;:::-;74284:529;;;74262:551;74853:24;;-1:-1:-1;;;74853:24:0;;;;74849:893;;;74902:26;74931:6;:4;:6::i;:::-;74902:35;;74986:2;74964:18;:24;74960:763;;75042:21;75119:9;75094:35;;75090:403;;;75162:53;75177:37;75207:6;:4;:6::i;:::-;75177:25;:14;75196:5;75177:18;:25::i;:37::-;75162:14;:53::i;:::-;75090:403;;;75280:18;75301:105;75343:5;:62;;75383:22;;75343:62;;;75351:22;;:29;;75378:1;75351:26;:29::i;:::-;75301:37;:20;75326:11;75301:24;:37::i;:105::-;75280:126;;75437:28;75454:10;75437:16;:28::i;:::-;75249:244;75090:403;74990:526;74960:763;;;75547:2;75526:18;:23;75522:201;;;75578:121;75593:105;75635:5;:62;;75675:22;;75635:62;;;75643:22;;:29;;75670:1;75643:26;:29::i;:::-;75593:37;:20;75618:11;75593:24;:37::i;:105::-;75578:14;:121::i;:::-;74879:863;74849:893;75766:23;;-1:-1:-1;;;75766:23:0;;;;75762:381;;;75814:18;75835:202;75966:5;:70;;76010:26;;75966:70;;;75974:26;;:33;;76005:1;75974:30;:33::i;:::-;75835:126;75858:102;75889:5;:70;;75933:26;;75889:70;;;75897:26;;:33;;75928:1;75897:30;:33::i;:::-;75858:26;;;:30;:102::i;:::-;75835:18;;;:22;:126::i;:202::-;75814:223;;76060:63;76089:33;76115:6;:4;:6::i;76089:33::-;76060:28;:63::i;:::-;75791:352;75762:381;76183:23;;-1:-1:-1;;;76183:23:0;;;;76179:381;;;76231:18;76252:202;76383:5;:70;;76427:26;;76383:70;;;76391:26;;:33;;76422:1;76391:30;:33::i;76252:202::-;76231:223;;76477:63;76506:33;76532:6;:4;:6::i;76506:33::-;76477:28;:63::i;:::-;76208:352;76179:381;76584:8;:16;;-1:-1:-1;;;;76584:16:0;;;74165:2451;73850:2777;;73728:2899;76654:16;;76639:12;;-1:-1:-1;;;76654:16:0;;;;:29;;;;-1:-1:-1;76675:8:0;;-1:-1:-1;;;76675:8:0;;;;76674:9;76654:29;:49;;;;;76688:15;76687:16;76654:49;76639:64;;76719:7;76716:181;;;76740:12;76755:32;76775:11;76755:15;:6;76766:3;76755:10;:15::i;:32::-;76740:47;-1:-1:-1;76810:16:0;:6;76740:47;76810:10;:16::i;:::-;76801:25;;76843:42;76859:4;76873;76880;76843:15;:42::i;:::-;76728:169;76716:181;76909:33;76925:4;76931:2;76935:6;76909:15;:33::i;:::-;76959:23;;-1:-1:-1;;;;;76959:23:0;:34;77002:4;77009:15;77002:4;77009:9;:15::i;:::-;76959:66;;-1:-1:-1;;;;;;76959:66:0;;;;;;;-1:-1:-1;;;;;6837:32:1;;;76959:66:0;;;6819:51:1;6886:18;;;6879:34;6792:18;;76959:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76955:82;77051:23;;-1:-1:-1;;;;;77051:23:0;:34;77094:4;77101:15;77094:4;77101:9;:15::i;:::-;77051:66;;-1:-1:-1;;;;;;77051:66:0;;;;;;;-1:-1:-1;;;;;6837:32:1;;;77051:66:0;;;6819:51:1;6886:18;;;6879:34;6792:18;;77051:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77047:82;77143:23;;-1:-1:-1;;;;;77143:23:0;:34;77186:2;77191:13;77186:2;77191:9;:13::i;:::-;77143:62;;-1:-1:-1;;;;;;77143:62:0;;;;;;;-1:-1:-1;;;;;6837:32:1;;;77143:62:0;;;6819:51:1;6886:18;;;6879:34;6792:18;;77143:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77139:78;77231:23;;-1:-1:-1;;;;;77231:23:0;:34;77274:2;77279:13;77274:2;77279:9;:13::i;:::-;77231:62;;-1:-1:-1;;;;;;77231:62:0;;;;;;;-1:-1:-1;;;;;6837:32:1;;;77231:62:0;;;6819:51:1;6886:18;;;6879:34;6792:18;;77231:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77227:78;77321:8;;-1:-1:-1;;;77321:8:0;;;;77317:609;;77354:16;;77385:23;;:36;;-1:-1:-1;;;;;;77385:36:0;;;;;22134:25:1;;;-1:-1:-1;;;;;77385:23:0;;;;:31;;22107:18:1;;77385:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77385:36:0;;;;;;;;-1:-1:-1;;77385:36:0;;;;;;;;;;;;:::i;:::-;;;77381:259;;;;;77510:94;;;23649:25:1;;;23705:2;23690:18;;23683:34;;;23733:18;;;23726:34;;;23791:2;23776:18;;23769:34;;;77594:9:0;;77583:4;;77510:94;;23636:3:1;23621:19;77510:94:0;;;;;;;77422:192;;;77381:259;77660:23;;:36;;-1:-1:-1;;;;;;77660:36:0;;;;;22134:25:1;;;-1:-1:-1;;;;;77660:23:0;;;;:31;;22107:18:1;;77660:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77660:36:0;;;;;;;;-1:-1:-1;;77660:36:0;;;;;;;;;;;;:::i;:::-;;;77656:259;;;;;77785:94;;;23649:25:1;;;23705:2;23690:18;;23683:34;;;23733:18;;;23726:34;;;23791:2;23776:18;;23769:34;;;77869:9:0;;77858:4;;77785:94;;23636:3:1;23621:19;77785:94:0;;;;;;;77697:192;;;77656:259;77331:595;77317:609;72508:5425;;;;72395:5538;;;:::o;44648:166::-;44734:7;44770:12;44762:6;;;;44754:29;;;;-1:-1:-1;;;44754:29:0;;;;;;;;:::i;:::-;-1:-1:-1;44801:5:0;44805:1;44801;:5;:::i;:::-;44794:12;44648:166;-1:-1:-1;;;;44648:166:0:o;66213:491::-;2128:6;;-1:-1:-1;;;;;2128:6:0;;;;;711:10;2275:23;2267:68;;;;-1:-1:-1;;;2267:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66314:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;::::1;;:40;;::::0;::::1;;;;66306:118;;;::::0;-1:-1:-1;;;66306:118:0;;21716:2:1;66306:118:0::1;::::0;::::1;21698:21:1::0;21755:2;21735:18;;;21728:30;21794:34;21774:18;;;21767:62;21865:34;21845:18;;;21838:62;-1:-1:-1;;;21916:19:1;;;21909:32;21958:19;;66306:118:0::1;21688:295:1::0;66306:118:0::1;-1:-1:-1::0;;;;;66435:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;:39;;-1:-1:-1;;66435:39:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;66487:152:::1;;66512:23;::::0;:50:::1;::::0;-1:-1:-1;;;66512:50:0;;-1:-1:-1;;;;;6280:32:1;;;66512:50:0::1;::::0;::::1;6262:51:1::0;66512:23:0;;::::1;::::0;:44:::1;::::0;6235:18:1;;66512:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;66577:23:0::1;::::0;:50:::1;::::0;-1:-1:-1;;;66577:50:0;;-1:-1:-1;;;;;6280:32:1;;;66577:50:0::1;::::0;::::1;6262:51:1::0;66577:23:0;;::::1;::::0;-1:-1:-1;66577:44:0::1;::::0;-1:-1:-1;6235:18:1;;66577:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66487:152;66656:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;66656:40:0;::::1;::::0;::::1;::::0;;;::::1;66213:491:::0;;:::o;42700:220::-;42758:7;42782:6;42778:20;;-1:-1:-1;42797:1:0;42790:8;;42778:20;42809:9;42821:5;42825:1;42821;:5;:::i;:::-;42809:17;-1:-1:-1;42854:1:0;42845:5;42849:1;42809:17;42845:5;:::i;:::-;:10;42837:56;;;;-1:-1:-1;;;42837:56:0;;18486:2:1;42837:56:0;;;18468:21:1;18525:2;18505:18;;;18498:30;18564:34;18544:18;;;18537:62;-1:-1:-1;;;18615:18:1;;;18608:31;18656:19;;42837:56:0;18458:223:1;66069:136:0;-1:-1:-1;;;;;66168:17:0;;:9;:17;;;;;;;;;;;:29;;66190:6;66168:21;:29::i;:::-;-1:-1:-1;;;;;66148:17:0;;;:9;:17;;;;;;;;;;:49;-1:-1:-1;66069:136:0:o;43398:153::-;43456:7;43488:1;43484;:5;43476:44;;;;-1:-1:-1;;;43476:44:0;;16120:2:1;43476:44:0;;;16102:21:1;16159:2;16139:18;;;16132:30;16198:28;16178:18;;;16171:56;16244:18;;43476:44:0;16092:176:1;43476:44:0;43538:5;43542:1;43538;:5;:::i;79820:599::-;79970:16;;;79984:1;79970:16;;;;;;;;79946:21;;79970:16;;;;;;;;;;-1:-1:-1;79970:16:0;79946:40;;80015:4;79997;80002:1;79997:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;79997:23:0;;;:7;;;;;;;;;;:23;;;;80041:15;;:22;;;-1:-1:-1;;;80041:22:0;;;;:15;;;;;:20;;:22;;;;;79997:7;;80041:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80031:4;80036:1;80031:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;80031:32:0;;;:7;;;;;;;;;:32;80108:15;;80076:62;;80093:4;;80108:15;80126:11;80076:8;:62::i;:::-;80177:15;;:224;;-1:-1:-1;;;80177:224:0;;-1:-1:-1;;;;;80177:15:0;;;;:66;;:224;;80258:11;;80177:15;;80328:4;;80355;;80375:15;;80177:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79875:544;79820:599;:::o;42283:158::-;42341:7;42374:1;42369;:6;;42361:49;;;;-1:-1:-1;;;42361:49:0;;15761:2:1;42361:49:0;;;15743:21:1;15800:2;15780:18;;;15773:30;15839:32;15819:18;;;15812:60;15889:18;;42361:49:0;15733:180:1;42361:49:0;42428:5;42432:1;42428;:5;:::i;81904:122::-;81992:26;;-1:-1:-1;;;;;81992:18:0;;;:26;;;;;82011:6;;81992:26;;;;82011:6;81992:18;:26;;;;;;;;;;;;;;;;;;;;;81904:122;;:::o;70854:693::-;71191:28;;-1:-1:-1;;71208:10:0;5594:2:1;5590:15;5586:53;71191:28:0;;;5574:66:1;70892:7:0;;;;71268:12;;71248:15;;5656:12:1;;71191:28:0;;;;;;;;;;;;71181:39;;;;;;71173:48;;71172:92;;;;:::i;:::-;71073:32;;-1:-1:-1;;71090:14:0;5594:2:1;5590:15;5586:53;71073:32:0;;;5574:66:1;71154:14:0;;71134:15;;5656:12:1;;71073:32:0;;;;;;;;;;;;71063:43;;;;;;71055:52;;71054:96;;;;:::i;:::-;71016:34;71034:16;71016:15;:34;:::i;:::-;:135;;;;:::i;:::-;:152;;;;:::i;:::-;:249;;;;:::i;:::-;:264;;;;:::i;:::-;70977:304;;;;;;6058:19:1;;6102:2;6093:12;;6048:63;70977:304:0;;;;-1:-1:-1;;70977:304:0;;;;;;;;;70949:355;;70977:304;70949:355;;;;;-1:-1:-1;70927:396:0;71365:10;71372:3;70949:355;71365:10;:::i;:::-;71364:18;;71379:3;71364:18;:::i;:::-;71356:27;;:4;:27;:::i;:::-;71334:50;-1:-1:-1;71399:15:0;71395:145;;71431:15;71445:1;71431:15;;:::i;79017:795::-;79160:16;;;79174:1;79160:16;;;;;;;;79136:21;;79160:16;;;;;;;;-1:-1:-1;;79197:15:0;;:22;;;-1:-1:-1;;;79197:22:0;;;;79136:40;;-1:-1:-1;;;;;;79197:15:0;;;;:20;;-1:-1:-1;79197:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79187:4;79192:1;79187:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;79187:32:0;;;-1:-1:-1;;;;;79187:32:0;;;;;79248:4;79230;79235:1;79230:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;79230:23:0;;;:7;;;;;;;;;:23;79309:15;;79274:22;;79299:26;;79309:15;79299:9;:26::i;:::-;79362:15;;79524;;79274:51;;-1:-1:-1;;;;;;79362:15:0;;;;:66;;79436:6;;79362:15;;79505:4;;79524:15;79570:24;:15;79590:3;79570:19;:24::i;:::-;79362:243;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;79661:15:0;;79626:22;;-1:-1:-1;79651:46:0;;-1:-1:-1;79682:14:0;;-1:-1:-1;79651:26:0;;-1:-1:-1;;;;;79661:15:0;79651:9;:26::i;:::-;:30;;:46::i;:::-;79724:15;;79626:71;;-1:-1:-1;79718:38:0;;-1:-1:-1;;;;;79724:15:0;79626:71;79718:5;:38::i;:::-;79774:30;79791:6;79799:4;79774:30;;;;;;;:::i;:::-;;;;;;;;79065:747;;;79017:795;:::o;77945:521::-;78069:12;78084:27;:20;78109:1;78084:24;:27::i;:::-;78069:42;-1:-1:-1;78122:17:0;78142:30;:20;78069:42;78142:24;:30::i;:::-;78122:50;-1:-1:-1;78210:21:0;78244:22;78261:4;78244:16;:22::i;:::-;78279:18;78300:41;:21;78326:14;78300:25;:41::i;:::-;78279:62;;78354:35;78367:9;78378:10;78354:12;:35::i;:::-;78415:43;;;23296:25:1;;;23352:2;23337:18;;23330:34;;;23380:18;;;23373:34;;;78415:43:0;;23284:2:1;23269:18;78415:43:0;;;;;;;;78007:459;;;;77945:521;:::o;81130:375::-;81253:21;;81203:72;;81230:6;;81246:4;;-1:-1:-1;;;;;81253:21:0;81203:26;:72::i;:::-;81321:21;;81314:54;;-1:-1:-1;;;81314:54:0;;81362:4;81314:54;;;6262:51:1;81286:25:0;;-1:-1:-1;;;;;81321:21:0;;81314:39;;6235:18:1;;81314:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81397:21;;81428:23;;81286:82;;-1:-1:-1;81379:118:0;;-1:-1:-1;;;;;81397:21:0;;;;81428:23;;81286:82;81379:17;:118::i;81517:375::-;81640:21;;81590:72;;81617:6;;81633:4;;-1:-1:-1;;;;;81640:21:0;81590:26;:72::i;:::-;81708:21;;81701:54;;-1:-1:-1;;;81701:54:0;;81749:4;81701:54;;;6262:51:1;81673:25:0;;-1:-1:-1;;;;;81708:21:0;;81701:39;;6235:18:1;;81701:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81784:21;;81815:23;;81673:82;;-1:-1:-1;81766:118:0;;-1:-1:-1;;;;;81784:21:0;;;;81815:23;;81673:82;81766:17;:118::i;13275:539::-;-1:-1:-1;;;;;13381:20:0;;13373:70;;;;-1:-1:-1;;;13373:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13462:23:0;;13454:71;;;;-1:-1:-1;;;13454:71:0;;;;;;;:::i;:::-;13618;13640:6;13618:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13618:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;13598:17:0;;;:9;:17;;;;;;;;;;;:91;;;;13723:20;;;;;;;:32;;13748:6;13723:24;:32::i;:::-;-1:-1:-1;;;;;13700:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;13771:35;22134:25:1;;;13700:20:0;;13771:35;;;;;;22107:18:1;13771:35:0;22089:76:1;14807:418:0;-1:-1:-1;;;;;14891:21:0;;14883:67;;;;-1:-1:-1;;;14883:67:0;;20076:2:1;14883:67:0;;;20058:21:1;20115:2;20095:18;;;20088:30;20154:34;20134:18;;;20127:62;-1:-1:-1;;;20205:18:1;;;20198:31;20246:19;;14883:67:0;20048:223:1;14883:67:0;15046:68;15069:6;15046:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15046:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;15025:18:0;;:9;:18;;;;;;;;;;:89;15140:12;;:24;;15157:6;15140:16;:24::i;:::-;15125:12;:39;15180:37;;22134:25:1;;;15206:1:0;;-1:-1:-1;;;;;15180:37:0;;;;;22122:2:1;22107:18;15180:37:0;;;;;;;14807:418;;:::o;78478:531::-;78668:15;;78636:62;;78653:4;;-1:-1:-1;;;;;78668:15:0;78686:11;78636:8;:62::i;:::-;78741:15;;78945;;78741:260;;-1:-1:-1;;;78741:260:0;;78813:4;78741:260;;;8250:34:1;8300:18;;;8293:34;;;78741:15:0;8343:18:1;;;8336:34;;;8386:18;;;8379:34;-1:-1:-1;;;;;78945:15:0;;;8429:19:1;;;8422:44;78975:15:0;8482:19:1;;;8475:35;78741:15:0;;;:31;;78780:9;;8184:19:1;;78741:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;80427:695::-;80633:16;;;80647:1;80633:16;;;;;;;;;80609:21;;80633:16;;;;;;;;;;-1:-1:-1;80633:16:0;80609:40;;80678:4;80660;80665:1;80660:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;80660:23:0;;;:7;;;;;;;;;;:23;;;;80704:15;;:22;;;-1:-1:-1;;;80704:22:0;;;;:15;;;;;:20;;:22;;;;;80660:7;;80704:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80694:4;80699:1;80694:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;80694:32:0;;;-1:-1:-1;;;;;80694:32:0;;;;;80747:16;80737:4;80742:1;80737:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;80737:26:0;;;:7;;;;;;;;;:26;80808:15;;80776:63;;80793:4;;80808:15;80826:12;80776:8;:63::i;:::-;80878:15;;:236;;-1:-1:-1;;;80878:236:0;;-1:-1:-1;;;;;80878:15:0;;;;:69;;:236;;80962:12;;80878:15;;81044:4;;81063:10;;81088:15;;80878:236;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82038:381;82206:55;;-1:-1:-1;;;82206:55:0;;-1:-1:-1;;;;;6837:32:1;;;82206:55:0;;;6819:51:1;6886:18;;;6879:34;;;82191:12:0;;82206:30;;;;;;6792:18:1;;82206:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82191:70;;82286:7;82282:130;;;82310:49;;-1:-1:-1;;;82310:49:0;;;;;22134:25:1;;;-1:-1:-1;;;;;82310:41:0;;;;;22107:18:1;;82310:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82379:21;82393:6;82379:21;;;;22134:25:1;;22122:2;22107:18;;22089:76;14:247;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;142:1;139;132:12;94:2;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:2;;;405:1;402;395:12;357:2;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:2;;;667:1;664;657:12;619:2;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;609:301;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:2;;;1077:1;1074;1067:12;1029:2;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;1019:352;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;1019:352::o;1376:382::-;1441:6;1449;1502:2;1490:9;1481:7;1477:23;1473:32;1470:2;;;1518:1;1515;1508:12;1470:2;1557:9;1544:23;1576:31;1601:5;1576:31;:::i;:::-;1626:5;-1:-1:-1;1683:2:1;1668:18;;1655:32;1696:30;1655:32;1696:30;:::i;1763:681::-;1894:6;1902;1910;1918;1926;1934;1942;1950;2003:3;1991:9;1982:7;1978:23;1974:33;1971:2;;;2020:1;2017;2010:12;1971:2;2052:9;2046:16;2071:31;2096:5;2071:31;:::i;:::-;2121:5;2111:15;;;2166:2;2155:9;2151:18;2145:25;2135:35;;2210:2;2199:9;2195:18;2189:25;2179:35;;2254:2;2243:9;2239:18;2233:25;2223:35;;2298:3;2287:9;2283:19;2277:26;2267:36;;2343:3;2332:9;2328:19;2322:26;2312:36;;2388:3;2377:9;2373:19;2367:26;2357:36;;2433:3;2422:9;2418:19;2412:26;2402:36;;1961:483;;;;;;;;;;;:::o;2449:315::-;2517:6;2525;2578:2;2566:9;2557:7;2553:23;2549:32;2546:2;;;2594:1;2591;2584:12;2546:2;2633:9;2620:23;2652:31;2677:5;2652:31;:::i;:::-;2702:5;2754:2;2739:18;;;;2726:32;;-1:-1:-1;;;2536:228:1:o;2769:750::-;2861:6;2869;2877;2930:2;2918:9;2909:7;2905:23;2901:32;2898:2;;;2946:1;2943;2936:12;2898:2;2986:9;2973:23;3015:18;3056:2;3048:6;3045:14;3042:2;;;3072:1;3069;3062:12;3042:2;3110:6;3099:9;3095:22;3085:32;;3155:7;3148:4;3144:2;3140:13;3136:27;3126:2;;3177:1;3174;3167:12;3126:2;3217;3204:16;3243:2;3235:6;3232:14;3229:2;;;3259:1;3256;3249:12;3229:2;3314:7;3307:4;3297:6;3294:1;3290:14;3286:2;3282:23;3278:34;3275:47;3272:2;;;3335:1;3332;3325:12;3272:2;3366:4;3358:13;;;;-1:-1:-1;3390:6:1;-1:-1:-1;;3431:20:1;;3418:34;3461:28;3418:34;3461:28;:::i;:::-;3508:5;3498:15;;;2888:631;;;;;:::o;3524:241::-;3580:6;3633:2;3621:9;3612:7;3608:23;3604:32;3601:2;;;3649:1;3646;3639:12;3601:2;3688:9;3675:23;3707:28;3729:5;3707:28;:::i;3770:245::-;3837:6;3890:2;3878:9;3869:7;3865:23;3861:32;3858:2;;;3906:1;3903;3896:12;3858:2;3938:9;3932:16;3957:28;3979:5;3957:28;:::i;4020:180::-;4079:6;4132:2;4120:9;4111:7;4107:23;4103:32;4100:2;;;4148:1;4145;4138:12;4100:2;-1:-1:-1;4171:23:1;;4090:110;-1:-1:-1;4090:110:1:o;4205:184::-;4275:6;4328:2;4316:9;4307:7;4303:23;4299:32;4296:2;;;4344:1;4341;4334:12;4296:2;-1:-1:-1;4367:16:1;;4286:103;-1:-1:-1;4286:103:1:o;4394:306::-;4482:6;4490;4498;4551:2;4539:9;4530:7;4526:23;4522:32;4519:2;;;4567:1;4564;4557:12;4519:2;4596:9;4590:16;4580:26;;4646:2;4635:9;4631:18;4625:25;4615:35;;4690:2;4679:9;4675:18;4669:25;4659:35;;4509:191;;;;;:::o;4705:269::-;4762:6;4815:2;4803:9;4794:7;4790:23;4786:32;4783:2;;;4831:1;4828;4821:12;4783:2;4870:9;4857:23;4920:4;4913:5;4909:16;4902:5;4899:27;4889:2;;4940:1;4937;4930:12;4979:461;5032:3;5070:5;5064:12;5097:6;5092:3;5085:19;5123:4;5152:2;5147:3;5143:12;5136:19;;5189:2;5182:5;5178:14;5210:1;5220:195;5234:6;5231:1;5228:13;5220:195;;;5299:13;;-1:-1:-1;;;;;5295:39:1;5283:52;;5355:12;;;;5390:15;;;;5331:1;5249:9;5220:195;;;-1:-1:-1;5431:3:1;;5040:400;-1:-1:-1;;;;;5040:400:1:o;8521:794::-;8743:2;8755:21;;;8728:18;;8811:22;;;8695:4;8890:6;8864:2;8849:18;;8695:4;8924:304;8938:6;8935:1;8932:13;8924:304;;;9013:6;9000:20;9033:31;9058:5;9033:31;:::i;:::-;-1:-1:-1;;;;;9089:31:1;9077:44;;9144:4;9203:15;;;;9168:12;;;;9117:1;8953:9;8924:304;;;8928:3;9245;9237:11;;;;9300:6;9293:14;9286:22;9279:4;9268:9;9264:20;9257:52;8704:611;;;;;;:::o;10243:510::-;10514:6;10503:9;10496:25;10557:3;10552:2;10541:9;10537:18;10530:31;10477:4;10578:57;10630:3;10619:9;10615:19;10607:6;10578:57;:::i;:::-;-1:-1:-1;;;;;10671:32:1;;;;10666:2;10651:18;;10644:60;-1:-1:-1;10735:2:1;10720:18;10713:34;10570:65;10486:267;-1:-1:-1;;10486:267:1:o;10758:597::-;10870:4;10899:2;10928;10917:9;10910:21;10960:6;10954:13;11003:6;10998:2;10987:9;10983:18;10976:34;11028:1;11038:140;11052:6;11049:1;11046:13;11038:140;;;11147:14;;;11143:23;;11137:30;11113:17;;;11132:2;11109:26;11102:66;11067:10;;11038:140;;;11196:6;11193:1;11190:13;11187:2;;;11266:1;11261:2;11252:6;11241:9;11237:22;11233:31;11226:42;11187:2;-1:-1:-1;11339:2:1;11318:15;-1:-1:-1;;11314:29:1;11299:45;;;;11346:2;11295:54;;10879:476;-1:-1:-1;;;10879:476:1:o;11360:399::-;11562:2;11544:21;;;11601:2;11581:18;;;11574:30;11640:34;11635:2;11620:18;;11613:62;-1:-1:-1;;;11706:2:1;11691:18;;11684:33;11749:3;11734:19;;11534:225::o;11764:481::-;11966:2;11948:21;;;12005:2;11985:18;;;11978:30;12044:34;12039:2;12024:18;;12017:62;12115:34;12110:2;12095:18;;12088:62;-1:-1:-1;;;12181:3:1;12166:19;;12159:44;12235:3;12220:19;;11938:307::o;12250:397::-;12452:2;12434:21;;;12491:2;12471:18;;;12464:30;12530:34;12525:2;12510:18;;12503:62;-1:-1:-1;;;12596:2:1;12581:18;;12574:31;12637:3;12622:19;;12424:223::o;15136:418::-;15338:2;15320:21;;;15377:2;15357:18;;;15350:30;15416:34;15411:2;15396:18;;15389:62;-1:-1:-1;;;15482:2:1;15467:18;;15460:52;15544:3;15529:19;;15310:244::o;17509:353::-;17711:2;17693:21;;;17750:2;17730:18;;;17723:30;17789:31;17784:2;17769:18;;17762:59;17853:2;17838:18;;17683:179::o;18686:356::-;18888:2;18870:21;;;18907:18;;;18900:30;18966:34;18961:2;18946:18;;18939:62;19033:2;19018:18;;18860:182::o;20276:401::-;20478:2;20460:21;;;20517:2;20497:18;;;20490:30;20556:34;20551:2;20536:18;;20529:62;-1:-1:-1;;;20622:2:1;20607:18;;20600:35;20667:3;20652:19;;20450:227::o;22170:332::-;22377:6;22366:9;22359:25;22420:2;22415;22404:9;22400:18;22393:30;22340:4;22440:56;22492:2;22481:9;22477:18;22469:6;22440:56;:::i;22507:582::-;22806:6;22795:9;22788:25;22849:6;22844:2;22833:9;22829:18;22822:34;22892:3;22887:2;22876:9;22872:18;22865:31;22769:4;22913:57;22965:3;22954:9;22950:19;22942:6;22913:57;:::i;:::-;-1:-1:-1;;;;;23006:32:1;;;;23001:2;22986:18;;22979:60;-1:-1:-1;23070:3:1;23055:19;23048:35;22905:65;22778:311;-1:-1:-1;;;22778:311:1:o;24003:128::-;24043:3;24074:1;24070:6;24067:1;24064:13;24061:2;;;24080:18;;:::i;:::-;-1:-1:-1;24116:9:1;;24051:80::o;24136:217::-;24176:1;24202;24192:2;;24246:10;24241:3;24237:20;24234:1;24227:31;24281:4;24278:1;24271:15;24309:4;24306:1;24299:15;24192:2;-1:-1:-1;24338:9:1;;24182:171::o;24358:168::-;24398:7;24464:1;24460;24456:6;24452:14;24449:1;24446:21;24441:1;24434:9;24427:17;24423:45;24420:2;;;24471:18;;:::i;:::-;-1:-1:-1;24511:9:1;;24410:116::o;24531:125::-;24571:4;24599:1;24596;24593:8;24590:2;;;24604:18;;:::i;:::-;-1:-1:-1;24641:9:1;;24580:76::o;24661:380::-;24740:1;24736:12;;;;24783;;;24804:2;;24858:4;24850:6;24846:17;24836:27;;24804:2;24911;24903:6;24900:14;24880:18;24877:38;24874:2;;;24957:10;24952:3;24948:20;24945:1;24938:31;24992:4;24989:1;24982:15;25020:4;25017:1;25010:15;24874:2;;24716:325;;;:::o;25046:135::-;25085:3;-1:-1:-1;;25106:17:1;;25103:2;;;25126:18;;:::i;:::-;-1:-1:-1;25173:1:1;25162:13;;25093:88::o;25186:127::-;25247:10;25242:3;25238:20;25235:1;25228:31;25278:4;25275:1;25268:15;25302:4;25299:1;25292:15;25318:127;25379:10;25374:3;25370:20;25367:1;25360:31;25410:4;25407:1;25400:15;25434:4;25431:1;25424:15;25582:131;-1:-1:-1;;;;;25657:31:1;;25647:42;;25637:2;;25703:1;25700;25693:12;25718:118;25804:5;25797:13;25790:21;25783:5;25780:32;25770:2;;25826:1;25823;25816:12
Swarm Source
ipfs://4ce7e3b432fa68038f5df3423609b94e0a5d4e07aabc98d05200f19495e6957a
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.