Contract 0xce6ccbb1edad497b4d53d829df491af70065ab5b 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xa0682fa3038abff8cd229a486487a422ca247cb194bde788ed75a86969cc6a1bDeposit194776822021-10-19 5:47:033 mins ago0xd8fc1c6dc9851bd34d9f41dade9fd2396f8586ca IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.045176332635
0x1d84417e98cfc81f3d40871f29f55f6f25513c051bc51e17a59eb93836c9daedEnter Staking194776142021-10-19 5:45:444 mins ago0x7984709f0bf60a83409a7b46f778daeff7b9d234 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.05504104639
0x5a713460011de8b694875f504ecd2c1c23d79456e7b8f2a079c9ccb308354e75Leave Staking194775932021-10-19 5:45:294 mins ago0x7984709f0bf60a83409a7b46f778daeff7b9d234 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.044748815905
0x02696f962143d83d0695fb055d06902d65d59c94606c9153df65fee1b64901e9Deposit194775412021-10-19 5:44:415 mins ago0x3ba5f4bf028b83631f41819636179b5b88c207e7 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.04169020904
0xf51a21adb917036de0c850f7009826170f4cf5c4d8f16c697c0a5a1d7ba43ba1Deposit194775372021-10-19 5:44:345 mins ago0x3ba5f4bf028b83631f41819636179b5b88c207e7 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.04551151904
0xd07a643735a83210ccb951395edc045ffde8fea1d24307dbd0a4dbe03d3c0b52Deposit194775172021-10-19 5:44:206 mins ago0x8ef4da55cee19fb2c3a84b6e08a6a05b7a86526a IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.045896277181
0xc36d0cca5ca9490d09832c461477fd94e69194f9ce6c9719c6a5dc60316e3871Deposit194773192021-10-19 5:41:099 mins ago0x8ef4da55cee19fb2c3a84b6e08a6a05b7a86526a IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.051514789648
0xee4402b0475cc4f58e4f6233f280b0602f21ccf1c727a5c185b512f7d62f713cLeave Staking194772132021-10-19 5:39:1811 mins ago0xb9612af82da62992675b92087ee675f3e4d88344 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.045243861257
0x07df7c3e8e956e8c71ed2a7cd733d5b7cee04a7d689d3ba787451accc2587b4cLeave Staking194770812021-10-19 5:36:5413 mins ago0x4c1565939c8fd702952f70470b88f5f693d6b9e4 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.04675625982
0xa115f793aa3c29d087877bd69f5c3572ac27a2d2ae757cb737c3ccbfa194c1b0Enter Staking194769002021-10-19 5:34:0316 mins ago0xe6610c1964727440800cf7fc7b1b5bc8031e1c36 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.053622402496
0xf36a6a631c6351b731e4acb75d4ce9e42afd9cafe83890db1d1fb52fca23e1cdLeave Staking194768632021-10-19 5:33:3216 mins ago0xe6610c1964727440800cf7fc7b1b5bc8031e1c36 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.043598133696
0xd335bb648ebf125304a1d256909c63b23dee13c1c59fae9edae48ae68129501aLeave Staking194765222021-10-19 5:28:4721 mins ago0xe5831fe0a82ca8c13a2239068fd9fdf87c6d0997 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.04321020352
0x8fc81afd2dce778d785af523211298bd1552bf1ecd0e21fbddfd016ba1f8b6a3Enter Staking194764052021-10-19 5:26:4723 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.05559119035
0xc6e1ab9b2df20eac71ca1f8139dba2005f575ebde8363e0e931a93fa7b10de09Enter Staking194763392021-10-19 5:25:4524 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.05559119035
0xeefb18f7306c89888eb3c365757bfa1ea9e4ae09095f5a848003808f9a87fda5Enter Staking194762582021-10-19 5:24:1526 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.054586466225
0xb6c48b4e969b2bc6436f32176863c226652be4572771008d85ac82ea5690a719Leave Staking194762242021-10-19 5:23:4226 mins ago0x49440043abd06f067e3ce8bb5fd4c26509a53bef IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.044897783611
0xf64d252ef574e7079860f721aa00f01c951c33b50a4c95b3373208771dfc9f6dDeposit194762142021-10-19 5:23:3526 mins ago0x89158b62a4067bf2038265d30d0af827fa3d01ef IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.047897767238
0x06df0f221f54589c0926d643412c933d4594532123c976a3298e885175dd1dddEnter Staking194761152021-10-19 5:22:0428 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.054511212589
0x9b1983e6b81a3505abea8cd0f73bfac643f98bf2e4f23f821d8aa384e64ec82aDeposit194760962021-10-19 5:21:4628 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.037889655216
0x2ae740921433c6990ed744c2105861998201a227cc8a20b2473f5bf902f1e1d3Deposit194760922021-10-19 5:21:4328 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.037889655216
0x9749b47385c87946fa15a84806b8a00b0d876c1ab80c00e64913cba8f0c92ff5Enter Staking194760902021-10-19 5:21:4028 mins ago0xca52dac830a96488ab73038b8ef5bcc43440def3 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.050625910157
0x4dab0cc346bd166a6a294d85c13b99881bcfac8c7eae87dd838cfa3b77a5fcb1Deposit194760892021-10-19 5:21:3728 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.037889655216
0xb67910909c80b2bbb44c84f0451c1b17c349593990ce425f66b89b73a84fcfa7Deposit194760842021-10-19 5:21:3428 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.037889655216
0xeb888eb27558eeb2368b86892f03c897f0d620f38962417d015b7a4b6407b261Deposit194760532021-10-19 5:21:0529 mins ago0xca52dac830a96488ab73038b8ef5bcc43440def3 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.038565364056
0x073f4c34fda828b22c96746f5e6abca9c835cc4272d69f760db8248f73dd3bb0Enter Staking194758732021-10-19 5:18:2332 mins ago0x82426542d6e13f91019f133289e52adbd762fa93 IN  0xce6ccbb1edad497b4d53d829df491af70065ab5b0 FTM0.051633347128
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x0bddc255a52ee3bbf8ade2784f53cebee6982ffa97c2499a34aa23ffd7f17581173378702021-09-20 1:44:4929 days 4 hrs ago 0xfd63bf84471bc55dd9a83fdfa293ccbd27e1f4c8  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SoulSummoner

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-09-20
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/access/IAccessControl.sol
pragma solidity ^0.8.0;

interface IAccessControl {
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/contracts/utils/Context.sol
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/access/AccessControl.sol

abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }


    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }


    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol

abstract contract Pausable is Context {

    event Paused(address account);
    event Unpaused(address account);
    bool private _paused;

    constructor() {
        _paused = false;
    }

    function paused() public view virtual returns (bool) {
        return _paused;
    }

    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

// File: contracts/libraries/ERC20.sol

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);
        

        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

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

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: contracts/SoulPower.sol

contract SoulPower is ERC20('SoulPower', 'SOUL'), AccessControl {

    address public supreme;     // supreme divine
    bytes32 public anunnaki;   // admin role
    bytes32 public thoth;     // minter role

    bytes32 public constant DOMAIN_TYPEHASH = // EIP-712 typehash for the contract's domain
        keccak256('EIP712Domain(string name,uint chainId,address verifyingContract)');
    bytes32 public constant DELEGATION_TYPEHASH = // EIP-712 typehash for the delegation struct used by the contract
        keccak256('Delegation(address delegatee,uint nonce,uint expiry)'); 

    // mappings for user accounts (address)
    mapping(address => mapping(uint => Checkpoint)) public checkpoints;   // vote checkpoints
    mapping(address => uint) public numCheckpoints;                      // checkpoint count
    mapping(address => uint) public nonces;                             // signing / validating states
    mapping(address => address) internal _delegates;                      // each accounts' delegate

    struct Checkpoint {  // checkpoint for marking number of votes from a given timestamp
        uint fromTime;
        uint votes;
    }

    event NewSupreme(address supreme);
    event Rethroned(bytes32 role, address oldAccount, address newAccount);
    event DelegateChanged( // emitted when an account changes its delegate
        address indexed delegator,
        address indexed fromDelegate,
        address indexed toDelegate
    );
    event DelegateVotesChanged( // emitted when a delegate account's vote balance changes
        address indexed delegate,
        uint previousBalance,
        uint newBalance
    );

    // restricted to the house of the role passed as an object to obey
    modifier obey(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    // channels the authority vested in anunnaki and thoth to the supreme
    constructor() {
        supreme = msg.sender;              // WARNING: set to multi-sig when deploying
        anunnaki = keccak256('anunnaki'); // alpha supreme
        thoth = keccak256('thoth');      // god of wisdom and magic

        _divinationRitual(DEFAULT_ADMIN_ROLE, DEFAULT_ADMIN_ROLE, supreme); // supreme as root admin
        _divinationRitual(anunnaki, anunnaki, supreme);                    // anunnaki as admin of anunnaki
        _divinationRitual(thoth, anunnaki, supreme);                      // anunnaki as admin of thoth

        mint(supreme, 50_000_000 * 1e18); // mints initial supply of 50M
    }

    // solidifies roles (internal)
    function _divinationRitual(bytes32 _role, bytes32 _adminRole, address _account) internal {
        _setupRole(_role, _account);
        _setRoleAdmin(_role, _adminRole);
    }

    // grants `role` to `newAccount` && renounces `role` from `oldAccount` (public role)
    function rethroneRitual(bytes32 role, address oldAccount, address newAccount) public obey(role) {
        require(oldAccount != newAccount, 'must be a new address');
        grantRole(role, newAccount);     // grants new account
        renounceRole(role, oldAccount); //  removes old account of role
        
        emit Rethroned(role, oldAccount, newAccount);
    }

    // updates supreme address (public anunnaki)
    function newSupreme(address _supreme) public obey(anunnaki) {
        require(supreme != _supreme, 'make a change, be the change');  //  prevents self-destruct
        rethroneRitual(DEFAULT_ADMIN_ROLE, supreme, _supreme);        //   empowers new supreme
        supreme = _supreme;
        
        emit NewSupreme(supreme);
    }

    // checks whether sender has divine role (public view)
    function hasDivineRole(bytes32 role) public view returns (bool) {
        return hasRole(role, msg.sender);
    }

    // mints soul power as the house of thoth so wills (public thoth)
    function mint(address _to, uint _amount) public obey(thoth) {
        _mint(_to, _amount);
        _moveDelegates(address(0), _delegates[_to], _amount);
    }

    // destroys `amount` tokens from the caller (public)
    function burn(uint amount) public {
        _burn(_msgSender(), amount);
        _moveDelegates(_delegates[_msgSender()], address(0), amount);
    }

    // destroys `amount` tokens from the `account` (public)
    function burnFrom(address account, uint amount) public {
        uint currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, 'burn amount exceeds allowance');

        _approve(account, _msgSender(), currentAllowance - amount);
        _burn(account, amount);
        _moveDelegates(_delegates[account], address(0), amount);
    }

    // returns the address delegated by a given delegator (external view)
    function delegates(address delegator) external view returns (address) {
        return _delegates[delegator];
    }

    // delegates to the `delegatee` (external)
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    // delegates votes from signatory to `delegatee` (external)
    function delegateBySig(
        address delegatee,
        uint nonce,
        uint expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        bytes32 domainSeparator = keccak256(
            abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this))
        );

        bytes32 structHash = keccak256(
            abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)
        );

        bytes32 digest = keccak256(
            abi.encodePacked('\x19\x01', domainSeparator, structHash)
        );

        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), 'delegateBySig: invalid signature');
        require(nonce == nonces[signatory]++, 'delegateBySig: invalid nonce');
        require(block.timestamp <= expiry, 'delegateBySig: signature expired');
        return _delegate(signatory, delegatee);
    }

    // returns current votes balance for `account` (external view)
    function getCurrentVotes(address account) external view returns (uint) {
        uint nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    // returns an account's prior vote count as of a given timestamp (external view)
    function getPriorVotes(address account, uint blockTimestamp) external view returns (uint) {
        require(blockTimestamp < block.timestamp, 'getPriorVotes: not yet determined');
        
        uint nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) { return 0; }

        // checks most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromTime <= blockTimestamp) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // checks implicit zero balance
        if (checkpoints[account][0].fromTime > blockTimestamp) {
            return 0;
        }

        uint lower = 0;
        uint upper = nCheckpoints - 1;
        while (upper > lower) {
            uint center = upper - (upper - lower) / 2; // avoids overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromTime == blockTimestamp) {
                return cp.votes;
            } else if (cp.fromTime < blockTimestamp) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }

        return checkpoints[account][lower].votes;
    }

    function safe256(uint n, string memory errorMessage) internal pure returns (uint) {
        require(n < type(uint).max, errorMessage);
        return uint(n);
    }

    function getChainId() internal view returns (uint) {
        uint chainId;
        assembly { chainId := chainid() }
        return chainId;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = _delegates[delegator];
        uint delegatorBalance = balanceOf(delegator); // balance of underlying SOUL (not scaled)
        _delegates[delegator] = delegatee;
        emit DelegateChanged(delegator, currentDelegate, delegatee);
        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decreases old representative
                uint srcRepNum = numCheckpoints[srcRep];
                uint srcRepOld = srcRepNum > 0
                    ? checkpoints[srcRep][srcRepNum - 1].votes
                    : 0;
                uint srcRepNew = srcRepOld - amount;
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increases new representative
                uint dstRepNum = numCheckpoints[dstRep];
                uint dstRepOld = dstRepNum > 0
                    ? checkpoints[dstRep][dstRepNum - 1].votes
                    : 0;
                uint dstRepNew = dstRepOld + amount;
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint nCheckpoints,
        uint oldVotes,
        uint newVotes
    ) internal {
        uint blockTimestamp = safe256(block.timestamp, 'block timestamp exceeds 256 bits');

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromTime == blockTimestamp) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else { 
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockTimestamp, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }
}

// File: contracts/libraries/Operable.sol

abstract contract Operable is Context, Ownable {

    address[] public operators;
    mapping(address => bool) public operator;

    event OperatorUpdated(address indexed operator, bool indexed access);
    constructor () {
        address msgSender = _msgSender();
        operator[msgSender] = true;
        operators.push(msgSender);
        emit OperatorUpdated(msgSender, true);
    }

    modifier onlyOperator() {
        address msgSender = _msgSender();
        require(operator[msgSender], "Operator: caller is not an operator");
        _;
    }

    function removeOperator(address removingOperator) public virtual onlyOperator {
        require(operator[removingOperator], 'Operable: address is not an operator');
        operator[removingOperator] = false;
        for (uint8 i; i < operators.length; i++) {
            if (operators[i] == removingOperator) {
                operators[i] = operators[i+1];
                operators.pop();
                emit OperatorUpdated(removingOperator, false);
                return;
            }
        }
    }

    function addOperator(address newOperator) public virtual onlyOperator {
        require(newOperator != address(0), "Operable: new operator is the zero address");
        require(!operator[newOperator], 'Operable: address is already an operator');
        operator[newOperator] = true;
        operators.push(newOperator);
        emit OperatorUpdated(newOperator, true);
    }
}

// File: contracts/SeanceCircle.sol

// SeanceCircle with Governance.
contract SeanceCircle is ERC20('SeanceCircle', 'SEANCE'), Ownable, Operable {

    SoulPower public soul;
    bool isInitialized;

    function mint(address _to, uint256 _amount) public onlyOperator {
        require(isInitialized, 'the circle has not yet begun');
        _mint(_to, _amount);
        _moveDelegates(address(0), _delegates[_to], _amount);
    }

    function burn(address _from ,uint256 _amount) public onlyOperator {
        _burn(_from, _amount);
        _moveDelegates(_delegates[_from], address(0), _amount);
    }

    function initialize(SoulPower _soul) external onlyOwner {
        require(!isInitialized, 'the circle has already begun');
        soul = _soul;
        isInitialized = true;
    }

    // safe soul transfer function, just in case if rounding error causes pool to not have enough SOUL.
    function safeSoulTransfer(address _to, uint256 _amount) public onlyOperator {
        uint256 soulBal = soul.balanceOf(address(this));
        if (_amount > soulBal) {
            soul.transfer(_to, soulBal);
        } else {
            soul.transfer(_to, _amount);
        }
    }

    // record of each accounts delegate
    mapping (address => address) internal _delegates;

    // checkpoint for marking number of votes from a given block timestamp
    struct Checkpoint {
        uint256 fromTime;
        uint256 votes;
    }

    // record of votes checkpoints for each account, by index
    mapping (address => mapping (uint256 => Checkpoint)) public checkpoints;

    // number of checkpoints for each account
    mapping (address => uint256) public numCheckpoints;

    // EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    // EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    // record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    // emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    // emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    // returns the address delegated by a given delegator (external view)
    function delegates(address delegator) external view returns (address) { return _delegates[delegator]; }

    // delegates to the `delegatee` (external)
    function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); }

    // delegates votes from signatory to `delegatee` (external)
    function delegateBySig(
        address delegatee,
        uint nonce,
        uint expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        external
    {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name())),
                getChainId(),
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                DELEGATION_TYPEHASH,
                delegatee,
                nonce,
                expiry
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator,
                structHash
            )
        );

        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "SOUL::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "SOUL::delegateBySig: invalid nonce");
        require(block.timestamp <= expiry, "SOUL::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    // returns current votes balance for `account` (external view)
    function getCurrentVotes(address account) external view returns (uint) {
        uint nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    // returns an account's prior vote count as of a given timestamp (external view)
    function getPriorVotes(address account, uint blockTimestamp) external view returns (uint256) {
        require(blockTimestamp < block.timestamp, "SOUL::getPriorVotes: not yet determined");

        uint256 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // checks most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromTime <= blockTimestamp) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // checks implicit zero balance
        if (checkpoints[account][0].fromTime > blockTimestamp) {
            return 0;
        }

        uint256 lower = 0;
        uint256 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromTime == blockTimestamp) {
                return cp.votes;
            } else if (cp.fromTime < blockTimestamp) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); // balance of underlying SOUL (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint256 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld - amount;
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint256 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld + amount;
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint256 nCheckpoints,
        uint256 oldVotes,
        uint256 newVotes
    )
        internal
    {
        uint256 blockTimestamp = safe256(block.timestamp, "SOUL::_writeCheckpoint: block timestamp exceeds 256 bits");

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromTime == blockTimestamp) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockTimestamp, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe256(uint n, string memory errorMessage) internal pure returns (uint256) {
        require(n < type(uint256).max, errorMessage);
        return uint256(n);
    }

    function getChainId() internal view returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }

    function newSoul(SoulPower _soul) external onlyOperator {
        require(soul != _soul, 'must be a new address');
        soul = _soul;
    }

}

// File: contracts/interfaces/IMigrator.sol

interface IMigrator {
    function migrate(IERC20 token) external returns (IERC20);
}

// File: contracts/SoulSummoner.sol

// the summoner of souls | ownership transferred to a governance smart contract 
// upon sufficient distribution + the community's desire to self-govern.

contract SoulSummoner is AccessControl, Pausable, ReentrancyGuard {

    // user info
    struct Users {
        uint amount;           // total tokens user has provided.
        uint rewardDebt;       // reward debt (see below).
        uint rewardDebtAtTime; // the last time user stake.
        uint lastWithdrawTime; // the last time a user withdrew at.
        uint firstDepositTime; // the last time a user deposited at.
        uint timeDelta;        // time passed since withdrawals.
        uint lastDepositTime;  // most recent deposit time.

        //   pending reward = (user.amount * pool.accSoulPerShare) - user.rewardDebt

        // the following occurs when a user +/- tokens to a pool:
        //   1. pool: `accSoulPerShare` and `lastRewardTime` update.
        //   2. user: receives pending reward.
        //   3. user: `amount` updates(+/-).
        //   4. user: `rewardDebt` updates (+/-).
    }

    // pool info
    struct Pools {
        IERC20 lpToken;       // lp token ierc20 contract.
        uint allocPoint;      // allocation points assigned to this pool | SOULs to distribute per second.
        uint lastRewardTime;  // most recent UNIX timestamp during which SOULs distribution occurred in the pool.
        uint accSoulPerShare; // accumulated SOULs per share, times 1e12.
    }

    // soul power: our native utility token
    address private soulAddress;
    SoulPower public soul;
    
    // seance circle: our governance token
    address private seanceAddress;
    SeanceCircle public seance;

    address public team; // receives 1/8 soul supply
    address public dao; // recieves 1/8 soul supply
    address public supreme; // has supreme role

    // migrator contract | has lotsa power
    IMigrator public migrator;

    // blockchain variables accounting for share of overall emissions
    uint public totalWeight;
    uint public weight;

    // soul x day x this.chain
    uint public dailySoul; // = weight * 250K * 1e18;

    // soul x second x this.chain
    uint public soulPerSecond; // = dailySoul / 86400;

    // bonus muliplier for early soul summoners
    uint public bonusMultiplier = 1;

    // timestamp when soul rewards began (initialized)
    uint public startTime;

    // ttl allocation points | must be the sum of all allocation points
    uint public totalAllocPoint;

    // summoner initialized state.
    bool public isInitialized;

    // decay rate on withdrawal fee of 1%.
    uint public immutable dailyDecay = enWei(1);

    // start rate for the withdrawal fee.
    uint public startRate;

    Pools[] public poolInfo; // pool info
    mapping (uint => mapping (address => Users)) public userInfo; // staker data

    // divinated roles
    bytes32 public isis; // soul summoning goddess of magic
    bytes32 public maat; // goddess of cosmic order

    event RoleDivinated(bytes32 role, bytes32 supreme);

    // restricted to the council of the role passed as an object to obey (role)
    modifier obey(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    // prevents: early reward distribution
    modifier isSummoned {
        require(isInitialized, 'rewards have not yet begun');
        _;
    }

    event Deposit(address indexed user, uint indexed pid, uint amount);
    event Withdraw(address indexed user, uint indexed pid, uint amount, uint timeStamp);

    event Initialized(address team, address dao, address soul, address seance, uint totalAllocPoint, uint weight);
    event PoolAdded(uint pid, uint allocPoint, IERC20 lpToken, uint totalAllocPoint);
    event PoolSet(uint pid, uint allocPoint);

    event WeightUpdated(uint weight, uint totalWeight);
    event RewardsUpdated(uint dailySoul, uint soulPerSecond);
    event StartRateUpdated(uint startRate);

    event AccountsUpdated(address dao, address team, address admin);
    event TokensUpdated(address soul, address seance);
    event DepositRevised(uint _pid, address _user, uint _time);

    // validates: pool exists
    modifier validatePoolByPid(uint pid) {
        require(pid < poolInfo.length, 'pool does not exist');
        _;
    }

    // channels the power of the isis and ma'at to the deployer (deployer)
    constructor() {
        supreme = 0x81Dd37687c74Df8F957a370A9A4435D873F5e5A9;    // multi-sig safe
        team = 0x36d0164e87B58427c4153c089aeDDa8Ec0B80B9D;      // team wallet
        dao = 0x1C63C726926197BD3CB75d86bCFB1DaeBcD87250;      // dao treasury (multi-sig)

        isis = keccak256("isis"); // goddess of magic who creates pools
        maat = keccak256("maat"); // goddess of cosmic order who allocates emissions

        _divinationCeremony(DEFAULT_ADMIN_ROLE, DEFAULT_ADMIN_ROLE, supreme);
        _divinationCeremony(isis, isis, supreme); // isis role created -- supreme divined admin
        _divinationCeremony(maat, isis, dao); // maat role created -- isis divined admin
    } 

    function _divinationCeremony(bytes32 _role, bytes32 _adminRole, address _account) 
        internal returns (bool) {
            _setupRole(_role, _account);
            _setRoleAdmin(_role, _adminRole);
        return true;
    }

    // validate: pool uniqueness to eliminate duplication risk (internal view)
    function checkPoolDuplicate(IERC20 _token) internal view {
        uint length = poolInfo.length;

        for (uint pid = 0; pid < length; ++pid) {
            require(poolInfo[pid].lpToken != _token, 'duplicated pool');
        }
    }

    // activates: rewards (owner)
    function initialize() external obey(isis) {
        require(!isInitialized, 'already initialized');

        soulAddress = 0xe2fb177009FF39F52C0134E8007FA0e4BaAcBd07;
        seanceAddress = 0x124B06C5ce47De7A6e9EFDA71a946717130079E6;

        // [required]: update global constants
        startTime = block.timestamp;
        totalWeight = 1000;
        weight = 1000;
        startRate = enWei(14);
        uint allocPoint = 1000;
        soul  = SoulPower(soulAddress);
        seance = SeanceCircle(seanceAddress);

        // updates: dailySoul and soulPerSecond
        updateRewards(weight, totalWeight); 

        // adds: staking pool
        poolInfo.push(Pools({
            lpToken: soul,
            allocPoint: allocPoint,
            lastRewardTime: startTime,
            accSoulPerShare: 0
        }));

        isInitialized = true;           // triggers: initialize state
        totalAllocPoint += allocPoint; // kickstarts: total allocation

        emit Initialized(team, dao, soulAddress, seanceAddress, totalAllocPoint, weight);
    }

    // returns: amount of pools
    function poolLength() external view returns (uint) { return poolInfo.length; }

    // add: new pool (isis)
    function addPool(uint _allocPoint, IERC20 _lpToken, bool _withUpdate) 
        public isSummoned obey(isis) { // isis: the soul summoning goddess whose power transcends them all
            checkPoolDuplicate(_lpToken);
            _addPool(_allocPoint, _lpToken, _withUpdate);
    }

    // add: new pool (internal)
    function _addPool(uint _allocPoint, IERC20 _lpToken, bool _withUpdate) internal {
        if (_withUpdate) { massUpdatePools(); }

        totalAllocPoint += _allocPoint;
        
        poolInfo.push(
        Pools({
            lpToken: _lpToken,
            allocPoint: _allocPoint,
            lastRewardTime: block.timestamp > startTime ? block.timestamp : startTime,
            accSoulPerShare: 0
        }));
        
        updateStakingPool();
        uint pid = poolInfo.length;

        emit PoolAdded(pid, _allocPoint, _lpToken, totalAllocPoint);
    }

    // set: allocation points (maat)
    function set(uint pid, uint allocPoint, bool withUpdate) 
        external isSummoned validatePoolByPid(pid) obey(maat) {
            if (withUpdate) { massUpdatePools(); } // updates all pools
            
            uint prevAllocPoint = poolInfo[pid].allocPoint;
            poolInfo[pid].allocPoint = allocPoint;
            
            if (prevAllocPoint != allocPoint) {
                totalAllocPoint = totalAllocPoint - prevAllocPoint + allocPoint;
                
                updateStakingPool(); // updates only selected pool
        }

        emit PoolSet(pid, allocPoint);
    }

    // set: migrator contract (isis)
    function setMigrator(IMigrator _migrator) external isSummoned obey(isis) {
        migrator = _migrator;
    }

    // view: user delta
	function userDelta(uint256 _pid, address _user) public view returns (uint256 delta) {
        Users memory user = userInfo[_pid][_user];

        return user.lastWithdrawTime > 0
            ? block.timestamp - user.lastWithdrawTime
            : block.timestamp - user.firstDepositTime;
	}

    // migrate: lp tokens to another contract (migrator)
    function migrate(uint pid) external isSummoned validatePoolByPid(pid) {
        require(address(migrator) != address(0), 'no migrator set');
        Pools storage pool = poolInfo[pid];
        IERC20 lpToken = pool.lpToken;

        uint bal = lpToken.balanceOf(address(this));
        lpToken.approve(address(migrator), bal);
        IERC20 _lpToken = migrator.migrate(lpToken);
        
        require(bal == _lpToken.balanceOf(address(this)), "migrate: insufficient balance");
        pool.lpToken = _lpToken;
    }

    // view: bonus multiplier (public view)
    function getMultiplier(uint from, uint to) public view returns (uint) {
        return (to - from) * bonusMultiplier; // todo: minus parens
    }

    // returns: decay rate for a pid (public view)
    function getFeeRate(uint pid, uint timeDelta) public view returns (uint feeRate) {
        uint daysPassed = timeDelta < 1 days ? 0 : timeDelta / 1 days;
        uint rateDecayed = enWei(daysPassed);
        uint _rate = rateDecayed >= startRate ? 0 : startRate - rateDecayed;
        
        // returns 0 for SAS
        return pid == 0 ? 0 : _rate;
    }

    // returns: feeAmount and with withdrawableAmount for a given pid and amount
    function getWithdrawable(uint pid, uint timeDelta, uint amount) public view returns (uint _feeAmount, uint _withdrawable) {
        uint feeRate = fromWei(getFeeRate(pid, timeDelta));
        uint feeAmount = (amount * feeRate) / 100;
        uint withdrawable = amount - feeAmount;

        return (feeAmount, withdrawable);
    }

    // view: pending soul rewards (external)
    function pendingSoul(uint pid, address _user) external view returns (uint pendingAmount) {
        Pools storage pool = poolInfo[pid];
        Users storage user = userInfo[pid][_user];

        uint accSoulPerShare = pool.accSoulPerShare;
        uint lpSupply = pool.lpToken.balanceOf(address(this));

        if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
            uint multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
            uint soulReward = multiplier * soulPerSecond * pool.allocPoint / totalAllocPoint;
            accSoulPerShare = accSoulPerShare + soulReward * 1e12 / lpSupply;
        }

        return user.amount * accSoulPerShare / 1e12 - user.rewardDebt;
    }

    // update: rewards for all pools (public)
    function massUpdatePools() public {
        uint length = poolInfo.length;
        for (uint pid = 0; pid < length; ++pid) { updatePool(pid); }
    }

    // update: rewards for a given pool id (public)
    function updatePool(uint pid) public validatePoolByPid(pid) {
        Pools storage pool = poolInfo[pid];

        if (block.timestamp <= pool.lastRewardTime) { return; }
        uint lpSupply = pool.lpToken.balanceOf(address(this));

        if (lpSupply == 0) { pool.lastRewardTime = block.timestamp; return; } // first staker in pool

        uint multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
        uint soulReward = multiplier * soulPerSecond * pool.allocPoint / totalAllocPoint;
        
        uint divi = soulReward * 1e12 / 8e12;   // 12.5% rewards
        uint divis = divi * 2;                  // total divis
        uint shares = soulReward - divis;       // net shares
        
        soul.mint(team, divi);
        soul.mint(dao, divi);
        soul.mint(address(seance), shares);

        pool.accSoulPerShare = pool.accSoulPerShare + (soulReward * 1e12 / lpSupply);
        pool.lastRewardTime = block.timestamp;
    }

    // deposit: lp tokens (lp owner)
    function deposit(uint pid, uint amount) external nonReentrant validatePoolByPid(pid) whenNotPaused {
        require (pid != 0, 'deposit SOUL by staking');

        Pools storage pool = poolInfo[pid];
        Users storage user = userInfo[pid][msg.sender];
        updatePool(pid);

        if (user.amount > 0) { // already deposited assets
            uint pending = (user.amount * pool.accSoulPerShare) / 1e12 - user.rewardDebt;
            if(pending > 0) { // sends pending rewards, if applicable
                safeSoulTransfer(msg.sender, pending);
            }
        }

        if (amount > 0) { // if adding more
            pool.lpToken.transferFrom(address(msg.sender), address(this), amount);
            user.amount += amount;
        }

        user.rewardDebt = user.amount * pool.accSoulPerShare / 1e12;

        // marks timestamp for first deposit
        user.firstDepositTime = 
            user.firstDepositTime > 0 
                ? user.firstDepositTime
                : block.timestamp;

        emit Deposit(msg.sender, pid, amount);
    }

    // withdraw: lp tokens (external farmers)
    function withdraw(uint pid, uint amount) external nonReentrant validatePoolByPid(pid) {
        require (pid != 0, 'withdraw SOUL by unstaking');
        Pools storage pool = poolInfo[pid];
        Users storage user = userInfo[pid][msg.sender];

        require(user.amount >= amount, 'withdraw not good');
        updatePool(pid);

        uint pending = user.amount * pool.accSoulPerShare / 1e12 - user.rewardDebt;

        if(pending > 0) { safeSoulTransfer(msg.sender, pending); }

        if(amount > 0) {
            if(user.lastDepositTime > 0){
				user.timeDelta = block.timestamp - user.lastDepositTime; }
			else { user.timeDelta = block.timestamp - user.firstDepositTime; }
            
            user.amount = user.amount - amount;
            
        }
        
        uint timeDelta = userInfo[pid][msg.sender].timeDelta;
        (, uint withdrawable) = getWithdrawable(pid, timeDelta, amount); // removes feeAmount from amount
        uint feeAmount = amount - withdrawable;

        pool.lpToken.transfer(address(dao), feeAmount);
        pool.lpToken.transfer(address(msg.sender), withdrawable);

        user.rewardDebt = user.amount * pool.accSoulPerShare / 1e12;
        user.lastWithdrawTime = block.timestamp;

        emit Withdraw(msg.sender, pid, amount, block.timestamp);
    }

    // stake: soul into summoner (external)
    function enterStaking(uint amount) external nonReentrant whenNotPaused {
        Pools storage pool = poolInfo[0];
        Users storage user = userInfo[0][msg.sender];
        updatePool(0);

        if (user.amount > 0) {
            uint pending = user.amount * pool.accSoulPerShare / 1e12 - user.rewardDebt;
            if(pending > 0) {
                safeSoulTransfer(msg.sender, pending);
            }
        } 
        
        if(amount > 0) {
            pool.lpToken.transferFrom(address(msg.sender), address(this), amount);
            user.amount = user.amount + amount;
        }

        // marks timestamp for first deposit
        user.firstDepositTime = 
            user.firstDepositTime > 0 
                ? user.firstDepositTime
                : block.timestamp;

        user.rewardDebt = user.amount * pool.accSoulPerShare / 1e12;

        seance.mint(msg.sender, amount);
        emit Deposit(msg.sender, 0, amount);
    }

    // unstake: your soul (external staker)
    function leaveStaking(uint amount) external nonReentrant {
        Pools storage pool = poolInfo[0];
        Users storage user = userInfo[0][msg.sender];

        require(user.amount >= amount, "withdraw: not good");
        updatePool(0);

        uint pending = user.amount * pool.accSoulPerShare / 1e12 - user.rewardDebt;

        if(pending > 0) {
            safeSoulTransfer(msg.sender, pending);
        }

        if(amount > 0) {
            user.amount = user.amount - amount;
            pool.lpToken.transfer(address(msg.sender), amount);
        }

        user.rewardDebt = user.amount * pool.accSoulPerShare / 1e12;
        user.lastWithdrawTime = block.timestamp;
        
        seance.burn(msg.sender, amount);
        emit Withdraw(msg.sender, 0, amount, block.timestamp);
    }
    
    // transfer: seance (internal)
    function safeSoulTransfer(address account, uint amount) internal {
        seance.safeSoulTransfer(account, amount);
    }

    // ** UPDATE FUNCTIONS ** // 

    // update: weight (maat)
    function updateWeights(uint _weight, uint _totalWeight) external obey(maat) {
        require(weight != _weight || totalWeight != _totalWeight, 'must be at least one new value');
        require(_totalWeight >= _weight, 'weight cannot exceed totalWeight');

        weight = _weight;     
        totalWeight = _totalWeight;

        updateRewards(weight, totalWeight);

        emit WeightUpdated(weight, totalWeight);
    }

    // update: staking pool (internal)
    function updateStakingPool() internal {
        uint length = poolInfo.length;
        uint points;
        
        for (uint pid = 1; pid < length; ++pid) { 
            points = points + poolInfo[pid].allocPoint; 
        }

        if (points != 0) {
            points = points / 3;
            totalAllocPoint = totalAllocPoint - poolInfo[0].allocPoint + points;
            poolInfo[0].allocPoint = points;
        }
    }

    // update: multiplier (maat)
    function updateMultiplier(uint _bonusMultiplier) external obey(maat) {
        bonusMultiplier = _bonusMultiplier;
    }

    // update: rewards (internal)
    function updateRewards(uint _weight, uint _totalWeight) internal {
        uint share = enWei(_weight) / _totalWeight; // share of ttl emissions for chain (chain % ttl emissions)
        
        dailySoul = share * (250_000); // dailySoul (for this.chain) = share (%) x 250K (soul emissions constant)
        soulPerSecond = dailySoul / 1 days; // updates: daily rewards expressed in seconds (1 days = 86,400 secs)

        emit RewardsUpdated(dailySoul, soulPerSecond);
    }

    // update: startRate (maat)
    function updateStartRate(uint _startRate) public obey(maat) {
        require(startRate != enWei(_startRate));
        startRate = enWei(_startRate);
        
        emit StartRateUpdated(startRate);
    }

    // update accounts: dao, team, and supreme addresses (isis)
    function updateAccounts(address _dao, address _team, address _supreme) external obey(isis) {
        require(dao != _dao || team != _team || supreme != _supreme, 'must be a new account');

        dao = _dao;
        team = _team;
        supreme = _supreme;

        emit AccountsUpdated(dao, team, supreme);
    }

    // update tokens: soul and seance addresses (isis)
    function updateTokens(address _soul, address _seance) external obey(isis) {
        require(soul != IERC20(_soul) || seance != IERC20(_seance), 'must be a new token address');

        soul = SoulPower(_soul);
        seance = SeanceCircle(_seance);

        emit TokensUpdated(_soul, _seance);
    }

    // manual override to reassign the first deposit time for a given (pid, account)
    function reviseDeposit(uint _pid, address _user, uint256 _time) public obey(maat) {
        Users storage user = userInfo[_pid][_user];
        user.firstDepositTime = _time;

        emit DepositRevised(_pid, _user, _time);
	}

    // ** HELPER FUNCTIONS ** // 

    // helper functions to convert to wei and 1/100th
    function enWei(uint amount) public pure returns (uint) {  return amount * 1e18; }
    function fromWei(uint amount) public pure returns (uint) { return amount / 1e18; }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dao","type":"address"},{"indexed":false,"internalType":"address","name":"team","type":"address"},{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"AccountsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"}],"name":"DepositRevised","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"team","type":"address"},{"indexed":false,"internalType":"address","name":"dao","type":"address"},{"indexed":false,"internalType":"address","name":"soul","type":"address"},{"indexed":false,"internalType":"address","name":"seance","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAllocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"contract IERC20","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAllocPoint","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"PoolSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dailySoul","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"soulPerSecond","type":"uint256"}],"name":"RewardsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"supreme","type":"bytes32"}],"name":"RoleDivinated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startRate","type":"uint256"}],"name":"StartRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"soul","type":"address"},{"indexed":false,"internalType":"address","name":"seance","type":"address"}],"name":"TokensUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalWeight","type":"uint256"}],"name":"WeightUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailySoul","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"enWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"enterStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fromWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"timeDelta","type":"uint256"}],"name":"getFeeRate","outputs":[{"internalType":"uint256","name":"feeRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"timeDelta","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getWithdrawable","outputs":[{"internalType":"uint256","name":"_feeAmount","type":"uint256"},{"internalType":"uint256","name":"_withdrawable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isis","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"leaveStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maat","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingSoul","outputs":[{"internalType":"uint256","name":"pendingAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accSoulPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"reviseDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seance","outputs":[{"internalType":"contract SeanceCircle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"bool","name":"withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigrator","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soul","outputs":[{"internalType":"contract SoulPower","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"soulPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supreme","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"internalType":"address","name":"_team","type":"address"},{"internalType":"address","name":"_supreme","type":"address"}],"name":"updateAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusMultiplier","type":"uint256"}],"name":"updateMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startRate","type":"uint256"}],"name":"updateStartRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_soul","type":"address"},{"internalType":"address","name":"_seance","type":"address"}],"name":"updateTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weight","type":"uint256"},{"internalType":"uint256","name":"_totalWeight","type":"uint256"}],"name":"updateWeights","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"userDelta","outputs":[{"internalType":"uint256","name":"delta","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardDebtAtTime","type":"uint256"},{"internalType":"uint256","name":"lastWithdrawTime","type":"uint256"},{"internalType":"uint256","name":"firstDepositTime","type":"uint256"},{"internalType":"uint256","name":"timeDelta","type":"uint256"},{"internalType":"uint256","name":"lastDepositTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526001600f556200001b60016200025560201b60201c565b6080908152503480156200002e57600080fd5b506000600160006101000a81548160ff02191690831515021790555060016002819055507381dd37687c74df8f957a370a9a4435d873f5e5a9600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507336d0164e87b58427c4153c089aedda8ec0b80b9d600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731c63c726926197bd3cb75d86bcfb1daebcd87250600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f36d5d8406f8379c6deba01145ec4f6a2966675cc67d71355b397a2a8e3572b296016819055507f0811b25c145e1379dc78112dd91057f09150f6db05dfd7e04deb910e6cefd4b7601781905550620001da6000801b6000801b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200027460201b60201c565b5062000214601654601654600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200027460201b60201c565b506200024e601754601654600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200027460201b60201c565b506200053a565b6000670de0b6b3a7640000826200026d9190620004a0565b9050919050565b6000620002888483620002a560201b60201c565b6200029a8484620002bb60201b60201c565b600190509392505050565b620002b782826200031e60201b60201c565b5050565b6000620002ce836200040f60201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b6200033082826200042e60201b60201c565b6200040b57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003b06200049860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000806000838152602001908152602001600020600101549050919050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000620004ad8262000501565b9150620004ba8362000501565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004f657620004f56200050b565b5b828202905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6080516159346200055660003960006138c001526159346000f3fe608060405234801561001057600080fd5b50600436106103275760003560e01c80637cd07e47116101b8578063a217fddf11610104578063e65d1522116100a2578063f107fd851161007c578063f107fd8514610970578063fb39d1e31461098c578063fc90fdc0146109bc578063fd6f99d0146109da57610327565b8063e65d152214610906578063e7aa29e314610936578063ea4bf4461461095257610327565b8063cf94ee96116100de578063cf94ee9614610882578063d547741f146108b2578063e2bbb158146108ce578063e4090331146108ea57610327565b8063a217fddf14610816578063a8b973a114610834578063bfafcad51461085257610327565b806385f2aef21161017157806393f1a40b1161014b57806393f1a40b1461077457806396c82e57146107aa5780639f6c5426146107c8578063a1aab33f146107f857610327565b806385f2aef2146106f65780638dbb1e3a1461071457806391d148541461074457610327565b80637cd07e47146106455780637d500ec8146106635780637e668b42146106815780638129fc1c146106b2578063815b7a8c146106bc57806382386d58146106da57610327565b8063441a3e70116102775780635c975abb11610230578063630b5ba11161020a578063630b5ba1146105e557806364482f79146105ef57806378e979251461060b5780637abceffd1461062957610327565b80635c975abb1461058d5780635f9bf689146105ab5780635ffe6146146105c957610327565b8063441a3e70146104e1578063454b0608146104fd57806348f8bfea146105195780634a962829146105375780634ca01d451461055357806351eb05a61461057157610327565b806323cf3118116102e457806336568abe116102be57806336568abe1461046d578063392e53cd1461048957806341441d3b146104a75780634162169f146104c357610327565b806323cf311814610405578063248a9ca3146104215780632f2ff15d1461045157610327565b806301ffc9a71461032c578063081e3eda1461035c5780631058d2811461037a5780631254f0dc146103965780631526fe27146103b457806317caf6f1146103e7575b600080fd5b61034660048036038101906103419190614573565b6109f8565b6040516103539190614d08565b60405180910390f35b610364610a72565b6040516103719190615051565b60405180910390f35b610394600480360381019061038f91906145ee565b610a7f565b005b61039e610e00565b6040516103ab9190615051565b60405180910390f35b6103ce60048036038101906103c991906145ee565b610e06565b6040516103de9493929190614d59565b60405180910390f35b6103ef610e66565b6040516103fc9190615051565b60405180910390f35b61041f600480360381019061041a91906145c5565b610e6c565b005b61043b6004803603810190610436919061450e565b610f14565b6040516104489190614d23565b60405180910390f35b61046b60048036038101906104669190614537565b610f33565b005b61048760048036038101906104829190614537565b610f5c565b005b610491610fdf565b60405161049e9190614d08565b60405180910390f35b6104c160048036038101906104bc91906145ee565b610ff2565b005b6104cb611399565b6040516104d89190614bcc565b60405180910390f35b6104fb60048036038101906104f6919061471a565b6113bf565b005b610517600480360381019061051291906145ee565b6118ce565b005b610521611d6f565b60405161052e9190614bcc565b60405180910390f35b610551600480360381019061054c91906145ee565b611d95565b005b61055b611e0c565b6040516105689190614db9565b60405180910390f35b61058b600480360381019061058691906145ee565b611e32565b005b610595612283565b6040516105a29190614d08565b60405180910390f35b6105b361229a565b6040516105c09190615051565b60405180910390f35b6105e360048036038101906105de91906145ee565b6122a0565b005b6105ed6122bf565b005b61060960048036038101906106049190614756565b6122f2565b005b6106136124bc565b6040516106209190615051565b60405180910390f35b610643600480360381019061063e91906146cb565b6124c2565b005b61064d61253f565b60405161065a9190614d9e565b60405180910390f35b61066b612565565b6040516106789190615051565b60405180910390f35b61069b600480360381019061069691906147a5565b61256b565b6040516106a99291906150a3565b60405180910390f35b6106ba6125c1565b005b6106c46129c6565b6040516106d19190614dd4565b60405180910390f35b6106f460048036038101906106ef919061467c565b6129ec565b005b6106fe612a9f565b60405161070b9190614bcc565b60405180910390f35b61072e6004803603810190610729919061471a565b612ac5565b60405161073b9190615051565b60405180910390f35b61075e60048036038101906107599190614537565b612ae8565b60405161076b9190614d08565b60405180910390f35b61078e60048036038101906107899190614640565b612b52565b6040516107a19796959493929190615111565b60405180910390f35b6107b2612ba1565b6040516107bf9190615051565b60405180910390f35b6107e260048036038101906107dd919061471a565b612ba7565b6040516107ef9190615051565b60405180910390f35b610800612c1a565b60405161080d9190615051565b60405180910390f35b61081e612c20565b60405161082b9190614d23565b60405180910390f35b61083c612c27565b6040516108499190615051565b60405180910390f35b61086c60048036038101906108679190614640565b612c2d565b6040516108799190615051565b60405180910390f35b61089c600480360381019061089791906145ee565b612e48565b6040516108a99190615051565b60405180910390f35b6108cc60048036038101906108c79190614537565b612e65565b005b6108e860048036038101906108e3919061471a565b612e8e565b005b61090460048036038101906108ff9190614496565b613234565b005b610920600480360381019061091b91906145ee565b6134f5565b60405161092d9190615051565b60405180910390f35b610950600480360381019061094b919061445a565b613512565b005b61095a6136d0565b6040516109679190614d23565b60405180910390f35b61098a6004803603810190610985919061471a565b6136d6565b005b6109a660048036038101906109a19190614640565b6137dd565b6040516109b39190615051565b60405180910390f35b6109c46138be565b6040516109d19190615051565b60405180910390f35b6109e26138e2565b6040516109ef9190614d23565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6b5750610a6a826138e8565b5b9050919050565b6000601480549050905090565b600280541415610ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abb90614fb1565b60405180910390fd5b6002808190555060006014600081548110610b08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201905060006015600080815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baa90614f51565b60405180910390fd5b610bbd6000611e32565b6000816001015464e8d4a5100084600301548460000154610bde919061522e565b610be891906151fd565b610bf29190615288565b90506000811115610c0857610c073382613952565b5b6000841115610cdc57838260000154610c219190615288565b82600001819055508260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401610c88929190614cdf565b602060405180830381600087803b158015610ca257600080fd5b505af1158015610cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cda91906144e5565b505b64e8d4a5100083600301548360000154610cf6919061522e565b610d0091906151fd565b8260010181905550428260030181905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33866040518363ffffffff1660e01b8152600401610d6e929190614cdf565b600060405180830381600087803b158015610d8857600080fd5b505af1158015610d9c573d6000803e3d6000fd5b5050505060003373ffffffffffffffffffffffffffffffffffffffff167f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca948642604051610dea9291906150a3565b60405180910390a3505050600160028190555050565b60135481565b60148181548110610e1657600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60115481565b601260009054906101000a900460ff16610ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb290615011565b60405180910390fd5b601654610ecf81610eca6139e5565b6139ed565b81600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000806000838152602001908152602001600020600101549050919050565b610f3c82610f14565b610f4d81610f486139e5565b6139ed565b610f578383613a8a565b505050565b610f646139e5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc890614fd1565b60405180910390fd5b610fdb8282613b6a565b5050565b601260009054906101000a900460ff1681565b600280541415611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90614fb1565b60405180910390fd5b60028081905550611046612283565b15611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90614e51565b60405180910390fd5b600060146000815481106110c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201905060006015600080815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506111316000611e32565b60008160000154111561118b576000816001015464e8d4a510008460030154846000015461115f919061522e565b61116991906151fd565b6111739190615288565b90506000811115611189576111883382613952565b5b505b6000831115611261578160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b81526004016111f593929190614ca8565b602060405180830381600087803b15801561120f57600080fd5b505af1158015611223573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124791906144e5565b5082816000015461125891906151a7565b81600001819055505b60008160040154116112735742611279565b80600401545b816004018190555064e8d4a510008260030154826000015461129b919061522e565b6112a591906151fd565b8160010181905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b815260040161130a929190614cdf565b600060405180830381600087803b15801561132457600080fd5b505af1158015611338573d6000803e3d6000fd5b5050505060003373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040516113849190615051565b60405180910390a35050600160028190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600280541415611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90614fb1565b60405180910390fd5b60028081905550816014805490508110611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90614f31565b60405180910390fd5b6000831415611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e90614eb1565b60405180910390fd5b6000601484815481106114d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201905060006015600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050838160000154101561157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590614f71565b60405180910390fd5b61158785611e32565b6000816001015464e8d4a51000846003015484600001546115a8919061522e565b6115b291906151fd565b6115bc9190615288565b905060008111156115d2576115d13382613952565b5b600085111561163757600082600601541115611605578160060154426115f89190615288565b826005018190555061161e565b8160040154426116159190615288565b82600501819055505b84826000015461162e9190615288565b82600001819055505b60006015600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501549050600061169c88838961256b565b915050600081886116ad9190615288565b90508560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401611730929190614cdf565b602060405180830381600087803b15801561174a57600080fd5b505af115801561175e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178291906144e5565b508560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b81526004016117e2929190614cdf565b602060405180830381600087803b1580156117fc57600080fd5b505af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183491906144e5565b5064e8d4a510008660030154866000015461184f919061522e565b61185991906151fd565b8560010181905550428560030181905550883373ffffffffffffffffffffffffffffffffffffffff167f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca948a426040516118b39291906150a3565b60405180910390a35050505050505060016002819055505050565b601260009054906101000a900460ff1661191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191490615011565b60405180910390fd5b806014805490508110611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90614f31565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90614e91565b60405180910390fd5b600060148381548110611a33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aa79190614bcc565b60206040518083038186803b158015611abf57600080fd5b505afa158015611ad3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af79190614617565b90508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401611b56929190614cdf565b602060405180830381600087803b158015611b7057600080fd5b505af1158015611b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba891906144e5565b506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401611c069190614d3e565b602060405180830381600087803b158015611c2057600080fd5b505af1158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c58919061459c565b90508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c939190614bcc565b60206040518083038186803b158015611cab57600080fd5b505afa158015611cbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce39190614617565b8214611d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1b90614ff1565b60405180910390fd5b808460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601754611da981611da46139e5565b6139ed565b611db282612e48565b6013541415611dc057600080fd5b611dc982612e48565b6013819055507f580e2348a4d1118e1f915eeffd71aec4938e749307b28e67f19841ca64117df7601354604051611e009190615051565b60405180910390a15050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b806014805490508110611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7190614f31565b60405180910390fd5b600060148381548110611eb6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201905080600201544211611ed7575061227f565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f369190614bcc565b60206040518083038186803b158015611f4e57600080fd5b505afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f869190614617565b90506000811415611fa157428260020181905550505061227f565b6000611fb1836002015442612ac5565b905060006011548460010154600e5484611fcb919061522e565b611fd5919061522e565b611fdf91906151fd565b90506000650746a528800064e8d4a5100083611ffb919061522e565b61200591906151fd565b90506000600282612016919061522e565b9050600081846120269190615288565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b81526004016120a7929190614cdf565b600060405180830381600087803b1580156120c157600080fd5b505af11580156120d5573d6000803e3d6000fd5b50505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401612158929190614cdf565b600060405180830381600087803b15801561217257600080fd5b505af1158015612186573d6000803e3d6000fd5b50505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612209929190614cdf565b600060405180830381600087803b15801561222357600080fd5b505af1158015612237573d6000803e3d6000fd5b505050508564e8d4a510008561224d919061522e565b61225791906151fd565b876003015461226691906151a7565b8760030181905550428760020181905550505050505050505b5050565b6000600160009054906101000a900460ff16905090565b600e5481565b6017546122b4816122af6139e5565b6139ed565b81600f819055505050565b6000601480549050905060005b818110156122ee576122dd81611e32565b806122e79061544b565b90506122cc565b5050565b601260009054906101000a900460ff16612341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233890615011565b60405180910390fd5b826014805490508110612389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238090614f31565b60405180910390fd5b60175461239d816123986139e5565b6139ed565b82156123ac576123ab6122bf565b5b6000601486815481106123e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016001015490508460148781548110612437577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016001018190555084811461247b5784816011546124629190615288565b61246c91906151a7565b60118190555061247a613c4b565b5b7fd88f859573973e938da5bf3e5100c16eee2090fa720e05ae3d452b4cd05cdcfd86866040516124ac9291906150a3565b60405180910390a1505050505050565b60105481565b601260009054906101000a900460ff16612511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250890615011565b60405180910390fd5b601654612525816125206139e5565b6139ed565b61252e83613da8565b612539848484613ead565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b600080600061258261257d8787612ba7565b6134f5565b9050600060648286612594919061522e565b61259e91906151fd565b9050600081866125ae9190615288565b9050818194509450505050935093915050565b6016546125d5816125d06139e5565b6139ed565b601260009054906101000a900460ff1615612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c90614e71565b60405180910390fd5b73e2fb177009ff39f52c0134e8007fa0e4baacbd07600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073124b06c5ce47de7a6e9efda71a946717130079e6600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426010819055506103e8600b819055506103e8600c819055506126f2600e612e48565b60138190555060006103e89050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506127d3600c54600b54614008565b60146040518060800160405280600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200160105481526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506001601260006101000a81548160ff02191690831515021790555080601160008282546128ee91906151a7565b925050819055507f0476c5e4920930815a67a5a042e26836431f494d3be0f6e10c3034787a7a15f9600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601154600c546040516129ba96959493929190614c47565b60405180910390a15050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601754612a00816129fb6139e5565b6139ed565b60006015600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600401819055507f40d6e8e3d60e4693375c73df2d1a71d582a28197c98fd8d2badad6ead06af64c858585604051612a909392919061506c565b60405180910390a15050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600f548383612ad69190615288565b612ae0919061522e565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6015602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b600b5481565b600080620151808310612bc8576201518083612bc391906151fd565b612bcb565b60005b90506000612bd882612e48565b90506000601354821015612bf95781601354612bf49190615288565b612bfc565b60005b905060008614612c0c5780612c0f565b60005b935050505092915050565b600c5481565b6000801b81565b600f5481565b60008060148481548110612c6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201905060006015600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612d369190614bcc565b60206040518083038186803b158015612d4e57600080fd5b505afa158015612d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d869190614617565b9050836002015442118015612d9c575060008114155b15612e0d576000612db1856002015442612ac5565b905060006011548660010154600e5484612dcb919061522e565b612dd5919061522e565b612ddf91906151fd565b90508264e8d4a5100082612df3919061522e565b612dfd91906151fd565b84612e0891906151a7565b935050505b826001015464e8d4a51000838560000154612e28919061522e565b612e3291906151fd565b612e3c9190615288565b94505050505092915050565b6000670de0b6b3a764000082612e5e919061522e565b9050919050565b612e6e82610f14565b612e7f81612e7a6139e5565b6139ed565b612e898383613b6a565b505050565b600280541415612ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eca90614fb1565b60405180910390fd5b60028081905550816014805490508110612f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1990614f31565b60405180910390fd5b612f2a612283565b15612f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6190614e51565b60405180910390fd5b6000831415612fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa590614ed1565b60405180910390fd5b600060148481548110612fea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201905060006015600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061305785611e32565b6000816000015411156130b1576000816001015464e8d4a5100084600301548460000154613085919061522e565b61308f91906151fd565b6130999190615288565b905060008111156130af576130ae3382613952565b5b505b600084111561318a578160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161311b93929190614ca8565b602060405180830381600087803b15801561313557600080fd5b505af1158015613149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316d91906144e5565b508381600001600082825461318291906151a7565b925050819055505b64e8d4a51000826003015482600001546131a4919061522e565b6131ae91906151fd565b816001018190555060008160040154116131c857426131ce565b80600401545b8160040181905550843373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158660405161321d9190615051565b60405180910390a350505060016002819055505050565b601654613248816132436139e5565b6139ed565b8373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415806132f357508273ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8061334c57508173ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61338b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338290614f11565b60405180910390fd5b83600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f1af7fb2dca603676776ebce7af5086b001c893239c7e2a241e7184e6f3cf9282600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516134e793929190614c10565b60405180910390a150505050565b6000670de0b6b3a76400008261350b91906151fd565b9050919050565b601654613526816135216139e5565b6139ed565b8273ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415806135d157508173ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b613610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360790614ef1565b60405180910390fd5b82600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fdcc6331013de89f8c595d5328f0a724194f113cb6f8f2a707b3dff6de13f0d1783836040516136c3929190614be7565b60405180910390a1505050565b60165481565b6017546136ea816136e56139e5565b6139ed565b82600c541415806136fd575081600b5414155b61373c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373390614e31565b60405180910390fd5b8282101561377f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377690615031565b60405180910390fd5b82600c8190555081600b8190555061379b600c54600b54614008565b7fb298bc23e07860d501fddce288f46d761aa04a0c7c3316099eb50f097aacf304600c54600b546040516137d09291906150a3565b60405180910390a1505050565b6000806015600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481525050905060008160600151116138a45780608001514261389f9190615288565b6138b5565b8060600151426138b49190615288565b5b91505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60175481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2a142aa83836040518363ffffffff1660e01b81526004016139af929190614cdf565b600060405180830381600087803b1580156139c957600080fd5b505af11580156139dd573d6000803e3d6000fd5b505050505050565b600033905090565b6139f78282612ae8565b613a8657613a1c8173ffffffffffffffffffffffffffffffffffffffff16601461408e565b613a2a8360001c602061408e565b604051602001613a3b929190614b92565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7d9190614def565b60405180910390fd5b5050565b613a948282612ae8565b613b6657600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613b0b6139e5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b613b748282612ae8565b15613c4757600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613bec6139e5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006014805490509050600080600190505b82811015613ccf5760148181548110613c9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016001015482613cbc91906151a7565b915080613cc89061544b565b9050613c5d565b5060008114613da457600381613ce591906151fd565b9050806014600081548110613d23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010154601154613d429190615288565b613d4c91906151a7565b601181905550806014600081548110613d8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600101819055505b5050565b6000601480549050905060005b81811015613ea8578273ffffffffffffffffffffffffffffffffffffffff1660148281548110613e0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e8e90614f91565b60405180910390fd5b80613ea19061544b565b9050613db5565b505050565b8015613ebc57613ebb6122bf565b5b8260116000828254613ece91906151a7565b92505081905550601460405180608001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016010544211613f1557601054613f17565b425b81526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301555050613fb9613c4b565b600060148054905090507f20b669aa921947a6d9602a921d2db3b6b30f21b9aca98580fa3972530330b27a818585601154604051613ffa94939291906150cc565b60405180910390a150505050565b60008161401484612e48565b61401e91906151fd565b90506203d0908161402f919061522e565b600d8190555062015180600d5461404691906151fd565b600e819055507fcd7c861d63893659123f817b192b8621ff1923a7c4589c260173cedcf9e986a6600d54600e546040516140819291906150a3565b60405180910390a1505050565b6060600060028360026140a1919061522e565b6140ab91906151a7565b67ffffffffffffffff8111156140ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561411c5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061417a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110614204577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002614244919061522e565b61424e91906151a7565b90505b600181111561433a577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106142b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106142f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061433390615421565b9050614251565b506000841461437e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161437590614e11565b60405180910390fd5b8091505092915050565b6000813590506143978161585d565b92915050565b6000813590506143ac81615874565b92915050565b6000815190506143c181615874565b92915050565b6000813590506143d68161588b565b92915050565b6000813590506143eb816158a2565b92915050565b600081359050614400816158b9565b92915050565b600081519050614415816158b9565b92915050565b60008135905061442a816158d0565b92915050565b60008135905061443f816158e7565b92915050565b600081519050614454816158e7565b92915050565b6000806040838503121561446d57600080fd5b600061447b85828601614388565b925050602061448c85828601614388565b9150509250929050565b6000806000606084860312156144ab57600080fd5b60006144b986828701614388565b93505060206144ca86828701614388565b92505060406144db86828701614388565b9150509250925092565b6000602082840312156144f757600080fd5b6000614505848285016143b2565b91505092915050565b60006020828403121561452057600080fd5b600061452e848285016143c7565b91505092915050565b6000806040838503121561454a57600080fd5b6000614558858286016143c7565b925050602061456985828601614388565b9150509250929050565b60006020828403121561458557600080fd5b6000614593848285016143dc565b91505092915050565b6000602082840312156145ae57600080fd5b60006145bc84828501614406565b91505092915050565b6000602082840312156145d757600080fd5b60006145e58482850161441b565b91505092915050565b60006020828403121561460057600080fd5b600061460e84828501614430565b91505092915050565b60006020828403121561462957600080fd5b600061463784828501614445565b91505092915050565b6000806040838503121561465357600080fd5b600061466185828601614430565b925050602061467285828601614388565b9150509250929050565b60008060006060848603121561469157600080fd5b600061469f86828701614430565b93505060206146b086828701614388565b92505060406146c186828701614430565b9150509250925092565b6000806000606084860312156146e057600080fd5b60006146ee86828701614430565b93505060206146ff868287016143f1565b92505060406147108682870161439d565b9150509250925092565b6000806040838503121561472d57600080fd5b600061473b85828601614430565b925050602061474c85828601614430565b9150509250929050565b60008060006060848603121561476b57600080fd5b600061477986828701614430565b935050602061478a86828701614430565b925050604061479b8682870161439d565b9150509250925092565b6000806000606084860312156147ba57600080fd5b60006147c886828701614430565b93505060206147d986828701614430565b92505060406147ea86828701614430565b9150509250925092565b6147fd816152bc565b82525050565b61480c816152ce565b82525050565b61481b816152da565b82525050565b61482a8161535e565b82525050565b61483981615382565b82525050565b614848816153a6565b82525050565b614857816153ca565b82525050565b600061486882615180565b614872818561518b565b93506148828185602086016153ee565b61488b816154f2565b840191505092915050565b60006148a182615180565b6148ab818561519c565b93506148bb8185602086016153ee565b80840191505092915050565b60006148d460208361518b565b91506148df82615503565b602082019050919050565b60006148f7601e8361518b565b91506149028261552c565b602082019050919050565b600061491a60108361518b565b915061492582615555565b602082019050919050565b600061493d60138361518b565b91506149488261557e565b602082019050919050565b6000614960600f8361518b565b915061496b826155a7565b602082019050919050565b6000614983601a8361518b565b915061498e826155d0565b602082019050919050565b60006149a660178361518b565b91506149b1826155f9565b602082019050919050565b60006149c9601b8361518b565b91506149d482615622565b602082019050919050565b60006149ec60158361518b565b91506149f78261564b565b602082019050919050565b6000614a0f60138361518b565b9150614a1a82615674565b602082019050919050565b6000614a3260128361518b565b9150614a3d8261569d565b602082019050919050565b6000614a5560178361519c565b9150614a60826156c6565b601782019050919050565b6000614a7860118361518b565b9150614a83826156ef565b602082019050919050565b6000614a9b600f8361518b565b9150614aa682615718565b602082019050919050565b6000614abe601f8361518b565b9150614ac982615741565b602082019050919050565b6000614ae160118361519c565b9150614aec8261576a565b601182019050919050565b6000614b04602f8361518b565b9150614b0f82615793565b604082019050919050565b6000614b27601d8361518b565b9150614b32826157e2565b602082019050919050565b6000614b4a601a8361518b565b9150614b558261580b565b602082019050919050565b6000614b6d60208361518b565b9150614b7882615834565b602082019050919050565b614b8c81615354565b82525050565b6000614b9d82614a48565b9150614ba98285614896565b9150614bb482614ad4565b9150614bc08284614896565b91508190509392505050565b6000602082019050614be160008301846147f4565b92915050565b6000604082019050614bfc60008301856147f4565b614c0960208301846147f4565b9392505050565b6000606082019050614c2560008301866147f4565b614c3260208301856147f4565b614c3f60408301846147f4565b949350505050565b600060c082019050614c5c60008301896147f4565b614c6960208301886147f4565b614c7660408301876147f4565b614c8360608301866147f4565b614c906080830185614b83565b614c9d60a0830184614b83565b979650505050505050565b6000606082019050614cbd60008301866147f4565b614cca60208301856147f4565b614cd76040830184614b83565b949350505050565b6000604082019050614cf460008301856147f4565b614d016020830184614b83565b9392505050565b6000602082019050614d1d6000830184614803565b92915050565b6000602082019050614d386000830184614812565b92915050565b6000602082019050614d536000830184614821565b92915050565b6000608082019050614d6e6000830187614821565b614d7b6020830186614b83565b614d886040830185614b83565b614d956060830184614b83565b95945050505050565b6000602082019050614db36000830184614830565b92915050565b6000602082019050614dce600083018461483f565b92915050565b6000602082019050614de9600083018461484e565b92915050565b60006020820190508181036000830152614e09818461485d565b905092915050565b60006020820190508181036000830152614e2a816148c7565b9050919050565b60006020820190508181036000830152614e4a816148ea565b9050919050565b60006020820190508181036000830152614e6a8161490d565b9050919050565b60006020820190508181036000830152614e8a81614930565b9050919050565b60006020820190508181036000830152614eaa81614953565b9050919050565b60006020820190508181036000830152614eca81614976565b9050919050565b60006020820190508181036000830152614eea81614999565b9050919050565b60006020820190508181036000830152614f0a816149bc565b9050919050565b60006020820190508181036000830152614f2a816149df565b9050919050565b60006020820190508181036000830152614f4a81614a02565b9050919050565b60006020820190508181036000830152614f6a81614a25565b9050919050565b60006020820190508181036000830152614f8a81614a6b565b9050919050565b60006020820190508181036000830152614faa81614a8e565b9050919050565b60006020820190508181036000830152614fca81614ab1565b9050919050565b60006020820190508181036000830152614fea81614af7565b9050919050565b6000602082019050818103600083015261500a81614b1a565b9050919050565b6000602082019050818103600083015261502a81614b3d565b9050919050565b6000602082019050818103600083015261504a81614b60565b9050919050565b60006020820190506150666000830184614b83565b92915050565b60006060820190506150816000830186614b83565b61508e60208301856147f4565b61509b6040830184614b83565b949350505050565b60006040820190506150b86000830185614b83565b6150c56020830184614b83565b9392505050565b60006080820190506150e16000830187614b83565b6150ee6020830186614b83565b6150fb6040830185614821565b6151086060830184614b83565b95945050505050565b600060e082019050615126600083018a614b83565b6151336020830189614b83565b6151406040830188614b83565b61514d6060830187614b83565b61515a6080830186614b83565b61516760a0830185614b83565b61517460c0830184614b83565b98975050505050505050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006151b282615354565b91506151bd83615354565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151f2576151f1615494565b5b828201905092915050565b600061520882615354565b915061521383615354565b925082615223576152226154c3565b5b828204905092915050565b600061523982615354565b915061524483615354565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561527d5761527c615494565b5b828202905092915050565b600061529382615354565b915061529e83615354565b9250828210156152b1576152b0615494565b5b828203905092915050565b60006152c782615334565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061531b826152bc565b9050919050565b600061532d826152bc565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061536982615370565b9050919050565b600061537b82615334565b9050919050565b600061538d82615394565b9050919050565b600061539f82615334565b9050919050565b60006153b1826153b8565b9050919050565b60006153c382615334565b9050919050565b60006153d5826153dc565b9050919050565b60006153e782615334565b9050919050565b60005b8381101561540c5780820151818401526020810190506153f1565b8381111561541b576000848401525b50505050565b600061542c82615354565b915060008214156154405761543f615494565b5b600182039050919050565b600061545682615354565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561548957615488615494565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f6d757374206265206174206c65617374206f6e65206e65772076616c75650000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f616c726561647920696e697469616c697a656400000000000000000000000000600082015250565b7f6e6f206d69677261746f72207365740000000000000000000000000000000000600082015250565b7f776974686472617720534f554c20627920756e7374616b696e67000000000000600082015250565b7f6465706f73697420534f554c206279207374616b696e67000000000000000000600082015250565b7f6d7573742062652061206e657720746f6b656e20616464726573730000000000600082015250565b7f6d7573742062652061206e6577206163636f756e740000000000000000000000600082015250565b7f706f6f6c20646f6573206e6f7420657869737400000000000000000000000000600082015250565b7f77697468647261773a206e6f7420676f6f640000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f7769746864726177206e6f7420676f6f64000000000000000000000000000000600082015250565b7f6475706c69636174656420706f6f6c0000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f6d6967726174653a20696e73756666696369656e742062616c616e6365000000600082015250565b7f726577617264732068617665206e6f742079657420626567756e000000000000600082015250565b7f7765696768742063616e6e6f742065786365656420746f74616c576569676874600082015250565b615866816152bc565b811461587157600080fd5b50565b61587d816152ce565b811461588857600080fd5b50565b615894816152da565b811461589f57600080fd5b50565b6158ab816152e4565b81146158b657600080fd5b50565b6158c281615310565b81146158cd57600080fd5b50565b6158d981615322565b81146158e457600080fd5b50565b6158f081615354565b81146158fb57600080fd5b5056fea264697066735822122037d01d0ac65008ac4bd7f298774574a35ee18243723d5bcb755acfb27b24132e64736f6c63430008040033

Deployed ByteCode Sourcemap

34820:20553:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3573:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41597:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51071:822;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37440:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37470:23;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;37195:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43329:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4439:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4572:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4884:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37267:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50039:979;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36455:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48645:1341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43833:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36508:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53797:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36366:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46466:980;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7218:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36889:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53107:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46253:152;;;:::i;:::-;;42670:613;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37092:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41712:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36603:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36797:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45077:337;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;40467:1089;;;:::i;:::-;;36252:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54869:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36401:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44416:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3787:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37513:60;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;36708:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44623:364;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36738:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3414:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36996:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45468:730;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55201:81;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4727:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47492:1098;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54081:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55288:82;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54468:307;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37621:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52140:435;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43471:296;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37345:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37682:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3573:204;3658:4;3697:32;3682:47;;;:11;:47;;;;:87;;;;3733:36;3757:11;3733:23;:36::i;:::-;3682:87;3675:94;;3573:204;;;:::o;41597:78::-;41642:4;41657:8;:15;;;;41650:22;;41597:78;:::o;51071:822::-;7959:1;8179:7;;:19;;8171:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7959:1;8312:7;:18;;;;51139::::1;51160:8;51169:1;51160:11;;;;;;;;;;;;;;;;;;;;;;;;;;51139:32;;51182:18;51203:8;:11;51212:1:::0;51203:11:::1;;;;;;;;;;;:23;51215:10;51203:23;;;;;;;;;;;;;;;51182:44;;51262:6;51247:4;:11;;;:21;;51239:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;51302:13;51313:1;51302:10;:13::i;:::-;51328:12;51387:4;:15;;;51380:4;51357;:20;;;51343:4;:11;;;:34;;;;:::i;:::-;:41;;;;:::i;:::-;:59;;;;:::i;:::-;51328:74;;51428:1;51418:7;:11;51415:80;;;51446:37;51463:10;51475:7;51446:16;:37::i;:::-;51415:80;51519:1;51510:6;:10;51507:141;;;51565:6;51551:4;:11;;;:20;;;;:::i;:::-;51537:4;:11;;:34;;;;51586:4;:12;;;;;;;;;;;;:21;;;51616:10;51629:6;51586:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51507:141;51715:4;51692;:20;;;51678:4;:11;;;:34;;;;:::i;:::-;:41;;;;:::i;:::-;51660:4;:15;;:59;;;;51754:15;51730:4;:21;;:39;;;;51790:6;;;;;;;;;;;:11;;;51802:10;51814:6;51790:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51858:1;51846:10;51837:48;;;51861:6;51869:15;51837:48;;;;;;;:::i;:::-;;;;;;;;8343:1;;;7915::::0;8357:7;:22;;;;51071:822;:::o;37440:21::-;;;;:::o;37470:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37195:27::-;;;;:::o;43329:112::-;38057:13;;;;;;;;;;;38049:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;43396:4:::1;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;43424:9:::2;43413:8;;:20;;;;;;;;;;;;;;;;;;38112:1:::1;43329:112:::0;:::o;4439:123::-;4505:7;4532:6;:12;4539:4;4532:12;;;;;;;;;;;:22;;;4525:29;;4439:123;;;:::o;4572:147::-;4655:18;4668:4;4655:12;:18::i;:::-;3515:30;3526:4;3532:12;:10;:12::i;:::-;3515:10;:30::i;:::-;4686:25:::1;4697:4;4703:7;4686:10;:25::i;:::-;4572:147:::0;;;:::o;4884:218::-;4991:12;:10;:12::i;:::-;4980:23;;:7;:23;;;4972:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;5068:26;5080:4;5086:7;5068:11;:26::i;:::-;4884:218;;:::o;37267:25::-;;;;;;;;;;;;;:::o;50039:979::-;7959:1;8179:7;;:19;;8171:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7959:1;8312:7;:18;;;;7357:8:::1;:6;:8::i;:::-;7356:9;7348:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50121:18:::2;50142:8;50151:1;50142:11;;;;;;;;;;;;;;;;;;;;;;;;;;50121:32;;50164:18;50185:8;:11;50194:1:::0;50185:11:::2;;;;;;;;;;;:23;50197:10;50185:23;;;;;;;;;;;;;;;50164:44;;50219:13;50230:1;50219:10;:13::i;:::-;50263:1;50249:4;:11;;;:15;50245:224;;;50281:12;50340:4;:15;;;50333:4;50310;:20;;;50296:4;:11;;;:34;;;;:::i;:::-;:41;;;;:::i;:::-;:59;;;;:::i;:::-;50281:74;;50383:1;50373:7;:11;50370:88;;;50405:37;50422:10;50434:7;50405:16;:37::i;:::-;50370:88;50245:224;;50502:1;50493:6;:10;50490:160;;;50520:4;:12;;;;;;;;;;;;:25;;;50554:10;50575:4;50582:6;50520:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50632:6;50618:4;:11;;;:20;;;;:::i;:::-;50604:4;:11;;:34;;;;50490:160;50770:1;50746:4;:21;;;:25;:102;;50833:15;50746:102;;;50792:4;:21;;;50746:102;50708:4;:21;;:140;;;;50916:4;50893;:20;;;50879:4;:11;;;:34;;;;:::i;:::-;:41;;;;:::i;:::-;50861:4;:15;;:59;;;;50933:6;;;;;;;;;;;:11;;;50945:10;50957:6;50933:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;51000:1;50988:10;50980:30;;;51003:6;50980:30;;;;;;:::i;:::-;;;;;;;;7397:1;;7915::::0;8357:7;:22;;;;50039:979;:::o;36455:18::-;;;;;;;;;;;;;:::o;48645:1341::-;7959:1;8179:7;;:19;;8171:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7959:1;8312:7;:18;;;;48726:3:::1;38999:8;:15;;;;38993:3;:21;38985:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48758:1:::2;48751:3;:8;;48742:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;48801:18;48822:8;48831:3;48822:13;;;;;;;;;;;;;;;;;;;;;;;;;;48801:34;;48846:18;48867:8;:13;48876:3;48867:13;;;;;;;;;;;:25;48881:10;48867:25;;;;;;;;;;;;;;;48846:46;;48928:6;48913:4;:11;;;:21;;48905:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;48967:15;48978:3;48967:10;:15::i;:::-;48995:12;49054:4;:15;;;49047:4;49024;:20;;;49010:4;:11;;;:34;;;;:::i;:::-;:41;;;;:::i;:::-;:59;;;;:::i;:::-;48995:74;;49095:1;49085:7;:11;49082:58;;;49100:37;49117:10;49129:7;49100:16;:37::i;:::-;49082:58;49164:1;49155:6;:10;49152:282;;;49208:1;49185:4;:20;;;:24;49182:164;;;49252:4;:20;;;49234:15;:38;;;;:::i;:::-;49217:4;:14;;:55;;;;49182:164;;;49322:4;:21;;;49304:15;:39;;;;:::i;:::-;49287:4;:14;;:56;;;;49182:164;49402:6;49388:4;:11;;;:20;;;;:::i;:::-;49374:4;:11;;:34;;;;49152:282;49454:14;49471:8;:13;49480:3;49471:13;;;;;;;;;;;:25;49485:10;49471:25;;;;;;;;;;;;;;;:35;;;49454:52;;49520:17;49541:39;49557:3;49562:9;49573:6;49541:15;:39::i;:::-;49517:63;;;49624:14;49650:12;49641:6;:21;;;;:::i;:::-;49624:38;;49675:4;:12;;;;;;;;;;;;:21;;;49705:3;;;;;;;;;;;49711:9;49675:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49732:4;:12;;;;;;;;;;;;:21;;;49762:10;49775:12;49732:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49856:4;49833;:20;;;49819:4;:11;;;:34;;;;:::i;:::-;:41;;;;:::i;:::-;49801:4;:15;;:59;;;;49895:15;49871:4;:21;;:39;;;;49949:3;49937:10;49928:50;;;49954:6;49962:15;49928:50;;;;;;;:::i;:::-;;;;;;;;39049:1;;;;;;8343::::1;7915::::0;8357:7;:22;;;;48645:1341;;:::o;43833:530::-;38057:13;;;;;;;;;;;38049:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;43898:3:::1;38999:8;:15;;;;38993:3;:21;38985:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43951:1:::2;43922:31;;43930:8;;;;;;;;;;;43922:31;;;;43914:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;43984:18;44005:8;44014:3;44005:13;;;;;;;;;;;;;;;;;;;;;;;;;;43984:34;;44029:14;44046:4;:12;;;;;;;;;;;;44029:29;;44071:8;44082:7;:17;;;44108:4;44082:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44071:43;;44125:7;:15;;;44149:8;;;;;;;;;;;44160:3;44125:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44175:15;44193:8;;;;;;;;;;;:16;;;44210:7;44193:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44175:43;;44254:8;:18;;;44281:4;44254:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44247:3;:40;44239:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;44347:8;44332:4;:12;;;:23;;;;;;;;;;;;;;;;;;39049:1;;;;38112::::1;43833:530:::0;:::o;36508:22::-;;;;;;;;;;;;;:::o;53797:211::-;53851:4;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;53889:17:::1;53895:10;53889:5;:17::i;:::-;53876:9;;:30;;53868:39;;;::::0;::::1;;53930:17;53936:10;53930:5;:17::i;:::-;53918:9;:29;;;;53973:27;53990:9;;53973:27;;;;;;:::i;:::-;;;;;;;;53797:211:::0;;:::o;36366:26::-;;;;;;;;;;;;;:::o;46466:980::-;46521:3;38999:8;:15;;;;38993:3;:21;38985:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;46537:18:::1;46558:8;46567:3;46558:13;;;;;;;;;;;;;;;;;;;;;;;;;;46537:34;;46607:4;:19;;;46588:15;:38;46584:55;;46630:7;;;46584:55;46649:13;46665:4;:12;;;;;;;;;;;;:22;;;46696:4;46665:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46649:53;;46731:1;46719:8;:13;46715:69;;;46758:15;46736:4;:19;;:37;;;;46775:7;;;;46715:69;46820:15;46838:51;46852:4;:19;;;46873:15;46838:13;:51::i;:::-;46820:69;;46900:15;46965;;46947:4;:15;;;46931:13;;46918:10;:26;;;;:::i;:::-;:44;;;;:::i;:::-;:62;;;;:::i;:::-;46900:80;;47001:9;47033:4;47026;47013:10;:17;;;;:::i;:::-;:24;;;;:::i;:::-;47001:36;;47067:10;47087:1;47080:4;:8;;;;:::i;:::-;47067:21;;47131:11;47158:5;47145:10;:18;;;;:::i;:::-;47131:32;;47204:4;;;;;;;;;;;:9;;;47214:4;;;;;;;;;;;47220;47204:21;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47236:4;;;;;;;;;;;:9;;;47246:3;;;;;;;;;;;47251:4;47236:20;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47267:4;;;;;;;;;;;:9;;;47285:6;;;;;;;;;;;47294;47267:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47381:8;47374:4;47361:10;:17;;;;:::i;:::-;:28;;;;:::i;:::-;47337:4;:20;;;:53;;;;:::i;:::-;47314:4;:20;;:76;;;;47423:15;47401:4;:19;;:37;;;;39049:1;;;;;;;;46466:980:::0;;:::o;7218:86::-;7265:4;7289:7;;;;;;;;;;;7282:14;;7218:86;:::o;36889:25::-;;;;:::o;53107:122::-;53170:4;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;53205:16:::1;53187:15;:34;;;;53107:122:::0;;:::o;46253:152::-;46298:11;46312:8;:15;;;;46298:29;;46343:8;46338:60;46363:6;46357:3;:12;46338:60;;;46380:15;46391:3;46380:10;:15::i;:::-;46371:5;;;;:::i;:::-;;;46338:60;;;;46253:152;:::o;42670:613::-;38057:13;;;;;;;;;;;38049:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;42775:3:::1;38999:8;:15;;;;38993:3;:21;38985:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;42785:4:::2;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;42810:10:::3;42806:38;;;42824:17;:15;:17::i;:::-;42806:38;42893:19;42915:8;42924:3;42915:13;;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;42893:46;;42981:10;42954:8;42963:3;42954:13;;;;;;;;;;;;;;;;;;;;;;;;;;:24;;:37;;;;43042:10;43024:14;:28;43020:214;;43126:10;43109:14;43091:15;;:32;;;;:::i;:::-;:45;;;;:::i;:::-;43073:15;:63;;;;43173:19;:17;:19::i;:::-;43020:214;43251:24;43259:3;43264:10;43251:24;;;;;;;:::i;:::-;;;;;;;;37957:1;39049::::2;38112::::1;42670:613:::0;;;:::o;37092:21::-;;;;:::o;41712:287::-;38057:13;;;;;;;;;;;38049:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;41815:4:::1;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;41904:28:::2;41923:8;41904:18;:28::i;:::-;41947:44;41956:11;41969:8;41979:11;41947:8;:44::i;:::-;38112:1:::1;41712:287:::0;;;:::o;36603:25::-;;;;;;;;;;;;;:::o;36797:21::-;;;;:::o;45077:337::-;45162:15;45179:18;45210:12;45225:35;45233:26;45244:3;45249:9;45233:10;:26::i;:::-;45225:7;:35::i;:::-;45210:50;;45271:14;45309:3;45298:7;45289:6;:16;;;;:::i;:::-;45288:24;;;;:::i;:::-;45271:41;;45323:17;45352:9;45343:6;:18;;;;:::i;:::-;45323:38;;45382:9;45393:12;45374:32;;;;;;;45077:337;;;;;;:::o;40467:1089::-;40503:4;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;40529:13:::1;;;;;;;;;;;40528:14;40520:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;40593:42;40579:11;;:56;;;;;;;;;;;;;;;;;;40662:42;40646:13;;:58;;;;;;;;;;;;;;;;;;40777:15;40765:9;:27;;;;40817:4;40803:11;:18;;;;40841:4;40832:6;:13;;;;40868:9;40874:2;40868:5;:9::i;:::-;40856;:21;;;;40888:15;40906:4;40888:22;;40939:11;;;;;;;;;;;40921:4;;:30;;;;;;;;;;;;;;;;;;40984:13;;;;;;;;;;;40962:6;;:36;;;;;;;;;;;;;;;;;;41060:34;41074:6;;41082:11;;41060:13;:34::i;:::-;41139:8;41153:156;;;;;;;;41183:4;;;;;;;;;;;41153:156;;;;;;41214:10;41153:156;;;;41255:9;;41153:156;;;;41296:1;41153:156;;::::0;41139:171:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41339:4;41323:13;;:20;;;;;;;;;;;;;;;;;;41413:10;41394:15;;:29;;;;;;;:::i;:::-;;;;;;;;41473:75;41485:4;;;;;;;;;;;41491:3;;;;;;;;;;;41496:11;;;;;;;;;;;41509:13;;;;;;;;;;;41524:15;;41541:6;;41473:75;;;;;;;;;;;:::i;:::-;;;;;;;;37957:1;40467:1089:::0;:::o;36252:21::-;;;;;;;;;;;;;:::o;54869:232::-;54945:4;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;54962:18:::1;54983:8;:14;54992:4;54983:14;;;;;;;;;;;:21;54998:5;54983:21;;;;;;;;;;;;;;;54962:42;;55039:5;55015:4;:21;;:29;;;;55062:34;55077:4;55083:5;55090;55062:34;;;;;;;;:::i;:::-;;;;;;;;37957:1;54869:232:::0;;;;:::o;36401:19::-;;;;;;;;;;;;;:::o;44416:147::-;44480:4;44518:15;;44510:4;44505:2;:9;;;;:::i;:::-;44504:29;;;;:::i;:::-;44497:36;;44416:147;;;;:::o;3787:139::-;3865:4;3889:6;:12;3896:4;3889:12;;;;;;;;;;;:20;;:29;3910:7;3889:29;;;;;;;;;;;;;;;;;;;;;;;;;3882:36;;3787:139;;;;:::o;37513:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36708:23::-;;;;:::o;44623:364::-;44690:12;44715:15;44745:6;44733:9;:18;:43;;44770:6;44758:9;:18;;;;:::i;:::-;44733:43;;;44754:1;44733:43;44715:61;;44787:16;44806:17;44812:10;44806:5;:17::i;:::-;44787:36;;44834:10;44862:9;;44847:11;:24;;:54;;44890:11;44878:9;;:23;;;;:::i;:::-;44847:54;;;44874:1;44847:54;44834:67;;44966:1;44959:3;:8;:20;;44974:5;44959:20;;;44970:1;44959:20;44952:27;;;;;44623:364;;;;:::o;36738:18::-;;;;:::o;3414:49::-;3459:4;3414:49;;;:::o;36996:31::-;;;;:::o;45468:730::-;45537:18;45568;45589:8;45598:3;45589:13;;;;;;;;;;;;;;;;;;;;;;;;;;45568:34;;45613:18;45634:8;:13;45643:3;45634:13;;;;;;;;;;;:20;45648:5;45634:20;;;;;;;;;;;;;;;45613:41;;45667:20;45690:4;:20;;;45667:43;;45721:13;45737:4;:12;;;;;;;;;;;;:22;;;45768:4;45737:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45721:53;;45809:4;:19;;;45791:15;:37;:54;;;;;45844:1;45832:8;:13;;45791:54;45787:330;;;45862:15;45880:51;45894:4;:19;;;45915:15;45880:13;:51::i;:::-;45862:69;;45946:15;46011;;45993:4;:15;;;45977:13;;45964:10;:26;;;;:::i;:::-;:44;;;;:::i;:::-;:62;;;;:::i;:::-;45946:80;;46097:8;46090:4;46077:10;:17;;;;:::i;:::-;:28;;;;:::i;:::-;46059:15;:46;;;;:::i;:::-;46041:64;;45787:330;;;46175:4;:15;;;46168:4;46150:15;46136:4;:11;;;:29;;;;:::i;:::-;:36;;;;:::i;:::-;:54;;;;:::i;:::-;46129:61;;;;;;45468:730;;;;:::o;55201:81::-;55250:4;55275;55266:6;:13;;;;:::i;:::-;55259:20;;55201:81;;;:::o;4727:149::-;4811:18;4824:4;4811:12;:18::i;:::-;3515:30;3526:4;3532:12;:10;:12::i;:::-;3515:10;:30::i;:::-;4842:26:::1;4854:4;4860:7;4842:11;:26::i;:::-;4727:149:::0;;;:::o;47492:1098::-;7959:1;8179:7;;:19;;8171:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7959:1;8312:7;:18;;;;47572:3:::1;38999:8;:15;;;;38993:3;:21;38985:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;7357:8:::2;:6;:8::i;:::-;7356:9;7348:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;47618:1:::3;47611:3;:8;;47602:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;47660:18;47681:8;47690:3;47681:13;;;;;;;;;;;;;;;;;;;;;;;;;;47660:34;;47705:18;47726:8;:13;47735:3;47726:13;;;;;;;;;;;:25;47740:10;47726:25;;;;;;;;;;;;;;;47705:46;;47762:15;47773:3;47762:10;:15::i;:::-;47808:1;47794:4;:11;;;:15;47790:294;;;47854:12;47915:4;:15;;;47908:4;47884;:20;;;47870:4;:11;;;:34;;;;:::i;:::-;47869:43;;;;:::i;:::-;:61;;;;:::i;:::-;47854:76;;47958:1;47948:7;:11;47945:128;;;48020:37;48037:10;48049:7;48020:16;:37::i;:::-;47945:128;47790:294;;48109:1;48100:6;:10;48096:166;;;48145:4;:12;;;;;;;;;;;;:25;;;48179:10;48200:4;48207:6;48145:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48244:6;48229:4;:11;;;:21;;;;;;;:::i;:::-;;;;;;;;48096:166;48329:4;48306;:20;;;48292:4;:11;;;:34;;;;:::i;:::-;:41;;;;:::i;:::-;48274:4;:15;;:59;;;;48454:1;48430:4;:21;;;:25;:102;;48517:15;48430:102;;;48476:4;:21;;;48430:102;48392:4;:21;;:140;;;;48570:3;48558:10;48550:32;;;48575:6;48550:32;;;;;;:::i;:::-;;;;;;;;7397:1;;8343::::1;7915::::0;8357:7;:22;;;;47492:1098;;:::o;54081:323::-;54166:4;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;54198:4:::1;54191:11;;:3;;;;;;;;;;;:11;;;;:28;;;;54214:5;54206:13;;:4;;;;;;;;;;;:13;;;;54191:28;:51;;;;54234:8;54223:19;;:7;;;;;;;;;;;:19;;;;54191:51;54183:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;54287:4;54281:3;;:10;;;;;;;;;;;;;;;;;;54309:5;54302:4;;:12;;;;;;;;;;;;;;;;;;54335:8;54325:7;;:18;;;;;;;;;;;;;;;;;;54361:35;54377:3;;;;;;;;;;;54382:4;;;;;;;;;;;54388:7;;;;;;;;;;;54361:35;;;;;;;;:::i;:::-;;;;;;;;54081:323:::0;;;;:::o;55288:82::-;55339:4;55363;55354:6;:13;;;;:::i;:::-;55347:20;;55288:82;;;:::o;54468:307::-;54536:4;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;54576:5:::1;54561:21;;:4;;;;;;;;;;;:21;;;;:50;;;;54603:7;54586:25;;:6;;;;;;;;;;;:25;;;;54561:50;54553:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;54673:5;54656:4;;:23;;;;;;;;;;;;;;;;;;54712:7;54690:6;;:30;;;;;;;;;;;;;;;;;;54738:29;54752:5;54759:7;54738:29;;;;;;;:::i;:::-;;;;;;;;54468:307:::0;;;:::o;37621:19::-;;;;:::o;52140:435::-;52210:4;;37916:30;37927:4;37933:12;:10;:12::i;:::-;37916:10;:30::i;:::-;52245:7:::1;52235:6;;:17;;:48;;;;52271:12;52256:11;;:27;;52235:48;52227:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;52353:7;52337:12;:23;;52329:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52419:7;52410:6;:16;;;;52456:12;52442:11;:26;;;;52481:34;52495:6;;52503:11;;52481:13;:34::i;:::-;52533;52547:6;;52555:11;;52533:34;;;;;;;:::i;:::-;;;;;;;;52140:435:::0;;;:::o;43471:296::-;43540:13;43566:17;43586:8;:14;43595:4;43586:14;;;;;;;;;;;:21;43601:5;43586:21;;;;;;;;;;;;;;;43566:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43651:1;43627:4;:21;;;:25;:135;;43741:4;:21;;;43723:15;:39;;;;:::i;:::-;43627:135;;;43686:4;:21;;;43668:15;:39;;;;:::i;:::-;43627:135;43620:142;;;43471:296;;;;:::o;37345:43::-;;;:::o;37682:19::-;;;;:::o;2960:157::-;3045:4;3084:25;3069:40;;;:11;:40;;;;3062:47;;2960:157;;;:::o;51941:124::-;52017:6;;;;;;;;;;;:23;;;52041:7;52050:6;52017:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51941:124;;:::o;904:98::-;957:7;984:10;977:17;;904:98;:::o;3934:497::-;4015:22;4023:4;4029:7;4015;:22::i;:::-;4010:414;;4203:41;4231:7;4203:41;;4241:2;4203:19;:41::i;:::-;4317:38;4345:4;4337:13;;4352:2;4317:19;:38::i;:::-;4108:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4054:358;;;;;;;;;;;:::i;:::-;;;;;;;;4010:414;3934:497;;:::o;5489:229::-;5564:22;5572:4;5578:7;5564;:22::i;:::-;5559:152;;5635:4;5603:6;:12;5610:4;5603:12;;;;;;;;;;;:20;;:29;5624:7;5603:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;5686:12;:10;:12::i;:::-;5659:40;;5677:7;5659:40;;5671:4;5659:40;;;;;;;;;;5559:152;5489:229;;:::o;5726:230::-;5801:22;5809:4;5815:7;5801;:22::i;:::-;5797:152;;;5872:5;5840:6;:12;5847:4;5840:12;;;;;;;;;;;:20;;:29;5861:7;5840:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;5924:12;:10;:12::i;:::-;5897:40;;5915:7;5897:40;;5909:4;5897:40;;;;;;;;;;5797:152;5726:230;;:::o;52623:442::-;52672:11;52686:8;:15;;;;52672:29;;52712:11;52749:8;52760:1;52749:12;;52744:111;52769:6;52763:3;:12;52744:111;;;52818:8;52827:3;52818:13;;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;52809:6;:33;;;;:::i;:::-;52800:42;;52777:5;;;;:::i;:::-;;;52744:111;;;;52881:1;52871:6;:11;52867:191;;52917:1;52908:6;:10;;;;:::i;:::-;52899:19;;52994:6;52969:8;52978:1;52969:11;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;52951:15;;:40;;;;:::i;:::-;:49;;;;:::i;:::-;52933:15;:67;;;;53040:6;53015:8;53024:1;53015:11;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:31;;;;52867:191;52623:442;;:::o;40181:243::-;40249:11;40263:8;:15;;;;40249:29;;40296:8;40291:126;40316:6;40310:3;:12;40291:126;;;40379:6;40354:31;;:8;40363:3;40354:13;;;;;;;;;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:31;;;;40346:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;40324:5;;;;:::i;:::-;;;40291:126;;;;40181:243;;:::o;42040:584::-;42135:11;42131:39;;;42150:17;:15;:17::i;:::-;42131:39;42201:11;42182:15;;:30;;;;;;;:::i;:::-;;;;;;;;42233:8;42257:209;;;;;;;;42287:8;42257:209;;;;;;42322:11;42257:209;;;;42382:9;;42364:15;:27;:57;;42412:9;;42364:57;;;42394:15;42364:57;42257:209;;;;42453:1;42257:209;;;42233:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42488:19;:17;:19::i;:::-;42518:8;42529;:15;;;;42518:26;;42562:54;42572:3;42577:11;42590:8;42600:15;;42562:54;;;;;;;;;:::i;:::-;;;;;;;;42040:584;;;;:::o;53272:484::-;53348:10;53378:12;53361:14;53367:7;53361:5;:14::i;:::-;:29;;;;:::i;:::-;53348:42;;53492:7;53483:5;:17;;;;:::i;:::-;53471:9;:29;;;;53614:6;53602:9;;:18;;;;:::i;:::-;53586:13;:34;;;;53708:40;53723:9;;53734:13;;53708:40;;;;;;;:::i;:::-;;;;;;;;53272:484;;;:::o;2152:451::-;2227:13;2253:19;2298:1;2289:6;2285:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2275:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2253:47;;2311:15;:6;2318:1;2311:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;2337;:6;2344:1;2337:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;2368:9;2393:1;2384:6;2380:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2368:26;;2363:135;2400:1;2396;:5;2363:135;;;2435:12;2456:3;2448:5;:11;2435:25;;;;;;;;;;;;;;;;;;2423:6;2430:1;2423:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;2485:1;2475:11;;;;;2403:3;;;;:::i;:::-;;;2363:135;;;;2525:1;2516:5;:10;2508:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2588:6;2574:21;;;2152:451;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;195:5;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:137::-;345:5;376:6;370:13;361:22;;392:30;416:5;392:30;:::i;:::-;351:77;;;;:::o;434:139::-;480:5;518:6;505:20;496:29;;534:33;561:5;534:33;:::i;:::-;486:87;;;;:::o;579:137::-;624:5;662:6;649:20;640:29;;678:32;704:5;678:32;:::i;:::-;630:86;;;;:::o;722:167::-;782:5;820:6;807:20;798:29;;836:47;877:5;836:47;:::i;:::-;788:101;;;;:::o;895:171::-;966:5;997:6;991:13;982:22;;1013:47;1054:5;1013:47;:::i;:::-;972:94;;;;:::o;1072:175::-;1136:5;1174:6;1161:20;1152:29;;1190:51;1235:5;1190:51;:::i;:::-;1142:105;;;;:::o;1253:139::-;1299:5;1337:6;1324:20;1315:29;;1353:33;1380:5;1353:33;:::i;:::-;1305:87;;;;:::o;1398:143::-;1455:5;1486:6;1480:13;1471:22;;1502:33;1529:5;1502:33;:::i;:::-;1461:80;;;;:::o;1547:407::-;1615:6;1623;1672:2;1660:9;1651:7;1647:23;1643:32;1640:2;;;1688:1;1685;1678:12;1640:2;1731:1;1756:53;1801:7;1792:6;1781:9;1777:22;1756:53;:::i;:::-;1746:63;;1702:117;1858:2;1884:53;1929:7;1920:6;1909:9;1905:22;1884:53;:::i;:::-;1874:63;;1829:118;1630:324;;;;;:::o;1960:552::-;2037:6;2045;2053;2102:2;2090:9;2081:7;2077:23;2073:32;2070:2;;;2118:1;2115;2108:12;2070:2;2161:1;2186:53;2231:7;2222:6;2211:9;2207:22;2186:53;:::i;:::-;2176:63;;2132:117;2288:2;2314:53;2359:7;2350:6;2339:9;2335:22;2314:53;:::i;:::-;2304:63;;2259:118;2416:2;2442:53;2487:7;2478:6;2467:9;2463:22;2442:53;:::i;:::-;2432:63;;2387:118;2060:452;;;;;:::o;2518:278::-;2585:6;2634:2;2622:9;2613:7;2609:23;2605:32;2602:2;;;2650:1;2647;2640:12;2602:2;2693:1;2718:61;2771:7;2762:6;2751:9;2747:22;2718:61;:::i;:::-;2708:71;;2664:125;2592:204;;;;:::o;2802:262::-;2861:6;2910:2;2898:9;2889:7;2885:23;2881:32;2878:2;;;2926:1;2923;2916:12;2878:2;2969:1;2994:53;3039:7;3030:6;3019:9;3015:22;2994:53;:::i;:::-;2984:63;;2940:117;2868:196;;;;:::o;3070:407::-;3138:6;3146;3195:2;3183:9;3174:7;3170:23;3166:32;3163:2;;;3211:1;3208;3201:12;3163:2;3254:1;3279:53;3324:7;3315:6;3304:9;3300:22;3279:53;:::i;:::-;3269:63;;3225:117;3381:2;3407:53;3452:7;3443:6;3432:9;3428:22;3407:53;:::i;:::-;3397:63;;3352:118;3153:324;;;;;:::o;3483:260::-;3541:6;3590:2;3578:9;3569:7;3565:23;3561:32;3558:2;;;3606:1;3603;3596:12;3558:2;3649:1;3674:52;3718:7;3709:6;3698:9;3694:22;3674:52;:::i;:::-;3664:62;;3620:116;3548:195;;;;:::o;3749:312::-;3833:6;3882:2;3870:9;3861:7;3857:23;3853:32;3850:2;;;3898:1;3895;3888:12;3850:2;3941:1;3966:78;4036:7;4027:6;4016:9;4012:22;3966:78;:::i;:::-;3956:88;;3912:142;3840:221;;;;:::o;4067:298::-;4144:6;4193:2;4181:9;4172:7;4168:23;4164:32;4161:2;;;4209:1;4206;4199:12;4161:2;4252:1;4277:71;4340:7;4331:6;4320:9;4316:22;4277:71;:::i;:::-;4267:81;;4223:135;4151:214;;;;:::o;4371:262::-;4430:6;4479:2;4467:9;4458:7;4454:23;4450:32;4447:2;;;4495:1;4492;4485:12;4447:2;4538:1;4563:53;4608:7;4599:6;4588:9;4584:22;4563:53;:::i;:::-;4553:63;;4509:117;4437:196;;;;:::o;4639:284::-;4709:6;4758:2;4746:9;4737:7;4733:23;4729:32;4726:2;;;4774:1;4771;4764:12;4726:2;4817:1;4842:64;4898:7;4889:6;4878:9;4874:22;4842:64;:::i;:::-;4832:74;;4788:128;4716:207;;;;:::o;4929:407::-;4997:6;5005;5054:2;5042:9;5033:7;5029:23;5025:32;5022:2;;;5070:1;5067;5060:12;5022:2;5113:1;5138:53;5183:7;5174:6;5163:9;5159:22;5138:53;:::i;:::-;5128:63;;5084:117;5240:2;5266:53;5311:7;5302:6;5291:9;5287:22;5266:53;:::i;:::-;5256:63;;5211:118;5012:324;;;;;:::o;5342:552::-;5419:6;5427;5435;5484:2;5472:9;5463:7;5459:23;5455:32;5452:2;;;5500:1;5497;5490:12;5452:2;5543:1;5568:53;5613:7;5604:6;5593:9;5589:22;5568:53;:::i;:::-;5558:63;;5514:117;5670:2;5696:53;5741:7;5732:6;5721:9;5717:22;5696:53;:::i;:::-;5686:63;;5641:118;5798:2;5824:53;5869:7;5860:6;5849:9;5845:22;5824:53;:::i;:::-;5814:63;;5769:118;5442:452;;;;;:::o;5900:574::-;5988:6;5996;6004;6053:2;6041:9;6032:7;6028:23;6024:32;6021:2;;;6069:1;6066;6059:12;6021:2;6112:1;6137:53;6182:7;6173:6;6162:9;6158:22;6137:53;:::i;:::-;6127:63;;6083:117;6239:2;6265:67;6324:7;6315:6;6304:9;6300:22;6265:67;:::i;:::-;6255:77;;6210:132;6381:2;6407:50;6449:7;6440:6;6429:9;6425:22;6407:50;:::i;:::-;6397:60;;6352:115;6011:463;;;;;:::o;6480:407::-;6548:6;6556;6605:2;6593:9;6584:7;6580:23;6576:32;6573:2;;;6621:1;6618;6611:12;6573:2;6664:1;6689:53;6734:7;6725:6;6714:9;6710:22;6689:53;:::i;:::-;6679:63;;6635:117;6791:2;6817:53;6862:7;6853:6;6842:9;6838:22;6817:53;:::i;:::-;6807:63;;6762:118;6563:324;;;;;:::o;6893:546::-;6967:6;6975;6983;7032:2;7020:9;7011:7;7007:23;7003:32;7000:2;;;7048:1;7045;7038:12;7000:2;7091:1;7116:53;7161:7;7152:6;7141:9;7137:22;7116:53;:::i;:::-;7106:63;;7062:117;7218:2;7244:53;7289:7;7280:6;7269:9;7265:22;7244:53;:::i;:::-;7234:63;;7189:118;7346:2;7372:50;7414:7;7405:6;7394:9;7390:22;7372:50;:::i;:::-;7362:60;;7317:115;6990:449;;;;;:::o;7445:552::-;7522:6;7530;7538;7587:2;7575:9;7566:7;7562:23;7558:32;7555:2;;;7603:1;7600;7593:12;7555:2;7646:1;7671:53;7716:7;7707:6;7696:9;7692:22;7671:53;:::i;:::-;7661:63;;7617:117;7773:2;7799:53;7844:7;7835:6;7824:9;7820:22;7799:53;:::i;:::-;7789:63;;7744:118;7901:2;7927:53;7972:7;7963:6;7952:9;7948:22;7927:53;:::i;:::-;7917:63;;7872:118;7545:452;;;;;:::o;8003:118::-;8090:24;8108:5;8090:24;:::i;:::-;8085:3;8078:37;8068:53;;:::o;8127:109::-;8208:21;8223:5;8208:21;:::i;:::-;8203:3;8196:34;8186:50;;:::o;8242:118::-;8329:24;8347:5;8329:24;:::i;:::-;8324:3;8317:37;8307:53;;:::o;8366:159::-;8467:51;8512:5;8467:51;:::i;:::-;8462:3;8455:64;8445:80;;:::o;8531:167::-;8636:55;8685:5;8636:55;:::i;:::-;8631:3;8624:68;8614:84;;:::o;8704:173::-;8812:58;8864:5;8812:58;:::i;:::-;8807:3;8800:71;8790:87;;:::o;8883:167::-;8988:55;9037:5;8988:55;:::i;:::-;8983:3;8976:68;8966:84;;:::o;9056:364::-;9144:3;9172:39;9205:5;9172:39;:::i;:::-;9227:71;9291:6;9286:3;9227:71;:::i;:::-;9220:78;;9307:52;9352:6;9347:3;9340:4;9333:5;9329:16;9307:52;:::i;:::-;9384:29;9406:6;9384:29;:::i;:::-;9379:3;9375:39;9368:46;;9148:272;;;;;:::o;9426:377::-;9532:3;9560:39;9593:5;9560:39;:::i;:::-;9615:89;9697:6;9692:3;9615:89;:::i;:::-;9608:96;;9713:52;9758:6;9753:3;9746:4;9739:5;9735:16;9713:52;:::i;:::-;9790:6;9785:3;9781:16;9774:23;;9536:267;;;;;:::o;9809:366::-;9951:3;9972:67;10036:2;10031:3;9972:67;:::i;:::-;9965:74;;10048:93;10137:3;10048:93;:::i;:::-;10166:2;10161:3;10157:12;10150:19;;9955:220;;;:::o;10181:366::-;10323:3;10344:67;10408:2;10403:3;10344:67;:::i;:::-;10337:74;;10420:93;10509:3;10420:93;:::i;:::-;10538:2;10533:3;10529:12;10522:19;;10327:220;;;:::o;10553:366::-;10695:3;10716:67;10780:2;10775:3;10716:67;:::i;:::-;10709:74;;10792:93;10881:3;10792:93;:::i;:::-;10910:2;10905:3;10901:12;10894:19;;10699:220;;;:::o;10925:366::-;11067:3;11088:67;11152:2;11147:3;11088:67;:::i;:::-;11081:74;;11164:93;11253:3;11164:93;:::i;:::-;11282:2;11277:3;11273:12;11266:19;;11071:220;;;:::o;11297:366::-;11439:3;11460:67;11524:2;11519:3;11460:67;:::i;:::-;11453:74;;11536:93;11625:3;11536:93;:::i;:::-;11654:2;11649:3;11645:12;11638:19;;11443:220;;;:::o;11669:366::-;11811:3;11832:67;11896:2;11891:3;11832:67;:::i;:::-;11825:74;;11908:93;11997:3;11908:93;:::i;:::-;12026:2;12021:3;12017:12;12010:19;;11815:220;;;:::o;12041:366::-;12183:3;12204:67;12268:2;12263:3;12204:67;:::i;:::-;12197:74;;12280:93;12369:3;12280:93;:::i;:::-;12398:2;12393:3;12389:12;12382:19;;12187:220;;;:::o;12413:366::-;12555:3;12576:67;12640:2;12635:3;12576:67;:::i;:::-;12569:74;;12652:93;12741:3;12652:93;:::i;:::-;12770:2;12765:3;12761:12;12754:19;;12559:220;;;:::o;12785:366::-;12927:3;12948:67;13012:2;13007:3;12948:67;:::i;:::-;12941:74;;13024:93;13113:3;13024:93;:::i;:::-;13142:2;13137:3;13133:12;13126:19;;12931:220;;;:::o;13157:366::-;13299:3;13320:67;13384:2;13379:3;13320:67;:::i;:::-;13313:74;;13396:93;13485:3;13396:93;:::i;:::-;13514:2;13509:3;13505:12;13498:19;;13303:220;;;:::o;13529:366::-;13671:3;13692:67;13756:2;13751:3;13692:67;:::i;:::-;13685:74;;13768:93;13857:3;13768:93;:::i;:::-;13886:2;13881:3;13877:12;13870:19;;13675:220;;;:::o;13901:402::-;14061:3;14082:85;14164:2;14159:3;14082:85;:::i;:::-;14075:92;;14176:93;14265:3;14176:93;:::i;:::-;14294:2;14289:3;14285:12;14278:19;;14065:238;;;:::o;14309:366::-;14451:3;14472:67;14536:2;14531:3;14472:67;:::i;:::-;14465:74;;14548:93;14637:3;14548:93;:::i;:::-;14666:2;14661:3;14657:12;14650:19;;14455:220;;;:::o;14681:366::-;14823:3;14844:67;14908:2;14903:3;14844:67;:::i;:::-;14837:74;;14920:93;15009:3;14920:93;:::i;:::-;15038:2;15033:3;15029:12;15022:19;;14827:220;;;:::o;15053:366::-;15195:3;15216:67;15280:2;15275:3;15216:67;:::i;:::-;15209:74;;15292:93;15381:3;15292:93;:::i;:::-;15410:2;15405:3;15401:12;15394:19;;15199:220;;;:::o;15425:402::-;15585:3;15606:85;15688:2;15683:3;15606:85;:::i;:::-;15599:92;;15700:93;15789:3;15700:93;:::i;:::-;15818:2;15813:3;15809:12;15802:19;;15589:238;;;:::o;15833:366::-;15975:3;15996:67;16060:2;16055:3;15996:67;:::i;:::-;15989:74;;16072:93;16161:3;16072:93;:::i;:::-;16190:2;16185:3;16181:12;16174:19;;15979:220;;;:::o;16205:366::-;16347:3;16368:67;16432:2;16427:3;16368:67;:::i;:::-;16361:74;;16444:93;16533:3;16444:93;:::i;:::-;16562:2;16557:3;16553:12;16546:19;;16351:220;;;:::o;16577:366::-;16719:3;16740:67;16804:2;16799:3;16740:67;:::i;:::-;16733:74;;16816:93;16905:3;16816:93;:::i;:::-;16934:2;16929:3;16925:12;16918:19;;16723:220;;;:::o;16949:366::-;17091:3;17112:67;17176:2;17171:3;17112:67;:::i;:::-;17105:74;;17188:93;17277:3;17188:93;:::i;:::-;17306:2;17301:3;17297:12;17290:19;;17095:220;;;:::o;17321:118::-;17408:24;17426:5;17408:24;:::i;:::-;17403:3;17396:37;17386:53;;:::o;17445:967::-;17827:3;17849:148;17993:3;17849:148;:::i;:::-;17842:155;;18014:95;18105:3;18096:6;18014:95;:::i;:::-;18007:102;;18126:148;18270:3;18126:148;:::i;:::-;18119:155;;18291:95;18382:3;18373:6;18291:95;:::i;:::-;18284:102;;18403:3;18396:10;;17831:581;;;;;:::o;18418:222::-;18511:4;18549:2;18538:9;18534:18;18526:26;;18562:71;18630:1;18619:9;18615:17;18606:6;18562:71;:::i;:::-;18516:124;;;;:::o;18646:332::-;18767:4;18805:2;18794:9;18790:18;18782:26;;18818:71;18886:1;18875:9;18871:17;18862:6;18818:71;:::i;:::-;18899:72;18967:2;18956:9;18952:18;18943:6;18899:72;:::i;:::-;18772:206;;;;;:::o;18984:442::-;19133:4;19171:2;19160:9;19156:18;19148:26;;19184:71;19252:1;19241:9;19237:17;19228:6;19184:71;:::i;:::-;19265:72;19333:2;19322:9;19318:18;19309:6;19265:72;:::i;:::-;19347;19415:2;19404:9;19400:18;19391:6;19347:72;:::i;:::-;19138:288;;;;;;:::o;19432:775::-;19665:4;19703:3;19692:9;19688:19;19680:27;;19717:71;19785:1;19774:9;19770:17;19761:6;19717:71;:::i;:::-;19798:72;19866:2;19855:9;19851:18;19842:6;19798:72;:::i;:::-;19880;19948:2;19937:9;19933:18;19924:6;19880:72;:::i;:::-;19962;20030:2;20019:9;20015:18;20006:6;19962:72;:::i;:::-;20044:73;20112:3;20101:9;20097:19;20088:6;20044:73;:::i;:::-;20127;20195:3;20184:9;20180:19;20171:6;20127:73;:::i;:::-;19670:537;;;;;;;;;:::o;20213:442::-;20362:4;20400:2;20389:9;20385:18;20377:26;;20413:71;20481:1;20470:9;20466:17;20457:6;20413:71;:::i;:::-;20494:72;20562:2;20551:9;20547:18;20538:6;20494:72;:::i;:::-;20576;20644:2;20633:9;20629:18;20620:6;20576:72;:::i;:::-;20367:288;;;;;;:::o;20661:332::-;20782:4;20820:2;20809:9;20805:18;20797:26;;20833:71;20901:1;20890:9;20886:17;20877:6;20833:71;:::i;:::-;20914:72;20982:2;20971:9;20967:18;20958:6;20914:72;:::i;:::-;20787:206;;;;;:::o;20999:210::-;21086:4;21124:2;21113:9;21109:18;21101:26;;21137:65;21199:1;21188:9;21184:17;21175:6;21137:65;:::i;:::-;21091:118;;;;:::o;21215:222::-;21308:4;21346:2;21335:9;21331:18;21323:26;;21359:71;21427:1;21416:9;21412:17;21403:6;21359:71;:::i;:::-;21313:124;;;;:::o;21443:250::-;21550:4;21588:2;21577:9;21573:18;21565:26;;21601:85;21683:1;21672:9;21668:17;21659:6;21601:85;:::i;:::-;21555:138;;;;:::o;21699:581::-;21890:4;21928:3;21917:9;21913:19;21905:27;;21942:85;22024:1;22013:9;22009:17;22000:6;21942:85;:::i;:::-;22037:72;22105:2;22094:9;22090:18;22081:6;22037:72;:::i;:::-;22119;22187:2;22176:9;22172:18;22163:6;22119:72;:::i;:::-;22201;22269:2;22258:9;22254:18;22245:6;22201:72;:::i;:::-;21895:385;;;;;;;:::o;22286:258::-;22397:4;22435:2;22424:9;22420:18;22412:26;;22448:89;22534:1;22523:9;22519:17;22510:6;22448:89;:::i;:::-;22402:142;;;;:::o;22550:264::-;22664:4;22702:2;22691:9;22687:18;22679:26;;22715:92;22804:1;22793:9;22789:17;22780:6;22715:92;:::i;:::-;22669:145;;;;:::o;22820:258::-;22931:4;22969:2;22958:9;22954:18;22946:26;;22982:89;23068:1;23057:9;23053:17;23044:6;22982:89;:::i;:::-;22936:142;;;;:::o;23084:313::-;23197:4;23235:2;23224:9;23220:18;23212:26;;23284:9;23278:4;23274:20;23270:1;23259:9;23255:17;23248:47;23312:78;23385:4;23376:6;23312:78;:::i;:::-;23304:86;;23202:195;;;;:::o;23403:419::-;23569:4;23607:2;23596:9;23592:18;23584:26;;23656:9;23650:4;23646:20;23642:1;23631:9;23627:17;23620:47;23684:131;23810:4;23684:131;:::i;:::-;23676:139;;23574:248;;;:::o;23828:419::-;23994:4;24032:2;24021:9;24017:18;24009:26;;24081:9;24075:4;24071:20;24067:1;24056:9;24052:17;24045:47;24109:131;24235:4;24109:131;:::i;:::-;24101:139;;23999:248;;;:::o;24253:419::-;24419:4;24457:2;24446:9;24442:18;24434:26;;24506:9;24500:4;24496:20;24492:1;24481:9;24477:17;24470:47;24534:131;24660:4;24534:131;:::i;:::-;24526:139;;24424:248;;;:::o;24678:419::-;24844:4;24882:2;24871:9;24867:18;24859:26;;24931:9;24925:4;24921:20;24917:1;24906:9;24902:17;24895:47;24959:131;25085:4;24959:131;:::i;:::-;24951:139;;24849:248;;;:::o;25103:419::-;25269:4;25307:2;25296:9;25292:18;25284:26;;25356:9;25350:4;25346:20;25342:1;25331:9;25327:17;25320:47;25384:131;25510:4;25384:131;:::i;:::-;25376:139;;25274:248;;;:::o;25528:419::-;25694:4;25732:2;25721:9;25717:18;25709:26;;25781:9;25775:4;25771:20;25767:1;25756:9;25752:17;25745:47;25809:131;25935:4;25809:131;:::i;:::-;25801:139;;25699:248;;;:::o;25953:419::-;26119:4;26157:2;26146:9;26142:18;26134:26;;26206:9;26200:4;26196:20;26192:1;26181:9;26177:17;26170:47;26234:131;26360:4;26234:131;:::i;:::-;26226:139;;26124:248;;;:::o;26378:419::-;26544:4;26582:2;26571:9;26567:18;26559:26;;26631:9;26625:4;26621:20;26617:1;26606:9;26602:17;26595:47;26659:131;26785:4;26659:131;:::i;:::-;26651:139;;26549:248;;;:::o;26803:419::-;26969:4;27007:2;26996:9;26992:18;26984:26;;27056:9;27050:4;27046:20;27042:1;27031:9;27027:17;27020:47;27084:131;27210:4;27084:131;:::i;:::-;27076:139;;26974:248;;;:::o;27228:419::-;27394:4;27432:2;27421:9;27417:18;27409:26;;27481:9;27475:4;27471:20;27467:1;27456:9;27452:17;27445:47;27509:131;27635:4;27509:131;:::i;:::-;27501:139;;27399:248;;;:::o;27653:419::-;27819:4;27857:2;27846:9;27842:18;27834:26;;27906:9;27900:4;27896:20;27892:1;27881:9;27877:17;27870:47;27934:131;28060:4;27934:131;:::i;:::-;27926:139;;27824:248;;;:::o;28078:419::-;28244:4;28282:2;28271:9;28267:18;28259:26;;28331:9;28325:4;28321:20;28317:1;28306:9;28302:17;28295:47;28359:131;28485:4;28359:131;:::i;:::-;28351:139;;28249:248;;;:::o;28503:419::-;28669:4;28707:2;28696:9;28692:18;28684:26;;28756:9;28750:4;28746:20;28742:1;28731:9;28727:17;28720:47;28784:131;28910:4;28784:131;:::i;:::-;28776:139;;28674:248;;;:::o;28928:419::-;29094:4;29132:2;29121:9;29117:18;29109:26;;29181:9;29175:4;29171:20;29167:1;29156:9;29152:17;29145:47;29209:131;29335:4;29209:131;:::i;:::-;29201:139;;29099:248;;;:::o;29353:419::-;29519:4;29557:2;29546:9;29542:18;29534:26;;29606:9;29600:4;29596:20;29592:1;29581:9;29577:17;29570:47;29634:131;29760:4;29634:131;:::i;:::-;29626:139;;29524:248;;;:::o;29778:419::-;29944:4;29982:2;29971:9;29967:18;29959:26;;30031:9;30025:4;30021:20;30017:1;30006:9;30002:17;29995:47;30059:131;30185:4;30059:131;:::i;:::-;30051:139;;29949:248;;;:::o;30203:419::-;30369:4;30407:2;30396:9;30392:18;30384:26;;30456:9;30450:4;30446:20;30442:1;30431:9;30427:17;30420:47;30484:131;30610:4;30484:131;:::i;:::-;30476:139;;30374:248;;;:::o;30628:419::-;30794:4;30832:2;30821:9;30817:18;30809:26;;30881:9;30875:4;30871:20;30867:1;30856:9;30852:17;30845:47;30909:131;31035:4;30909:131;:::i;:::-;30901:139;;30799:248;;;:::o;31053:222::-;31146:4;31184:2;31173:9;31169:18;31161:26;;31197:71;31265:1;31254:9;31250:17;31241:6;31197:71;:::i;:::-;31151:124;;;;:::o;31281:442::-;31430:4;31468:2;31457:9;31453:18;31445:26;;31481:71;31549:1;31538:9;31534:17;31525:6;31481:71;:::i;:::-;31562:72;31630:2;31619:9;31615:18;31606:6;31562:72;:::i;:::-;31644;31712:2;31701:9;31697:18;31688:6;31644:72;:::i;:::-;31435:288;;;;;;:::o;31729:332::-;31850:4;31888:2;31877:9;31873:18;31865:26;;31901:71;31969:1;31958:9;31954:17;31945:6;31901:71;:::i;:::-;31982:72;32050:2;32039:9;32035:18;32026:6;31982:72;:::i;:::-;31855:206;;;;;:::o;32067:581::-;32258:4;32296:3;32285:9;32281:19;32273:27;;32310:71;32378:1;32367:9;32363:17;32354:6;32310:71;:::i;:::-;32391:72;32459:2;32448:9;32444:18;32435:6;32391:72;:::i;:::-;32473:86;32555:2;32544:9;32540:18;32531:6;32473:86;:::i;:::-;32569:72;32637:2;32626:9;32622:18;32613:6;32569:72;:::i;:::-;32263:385;;;;;;;:::o;32654:886::-;32915:4;32953:3;32942:9;32938:19;32930:27;;32967:71;33035:1;33024:9;33020:17;33011:6;32967:71;:::i;:::-;33048:72;33116:2;33105:9;33101:18;33092:6;33048:72;:::i;:::-;33130;33198:2;33187:9;33183:18;33174:6;33130:72;:::i;:::-;33212;33280:2;33269:9;33265:18;33256:6;33212:72;:::i;:::-;33294:73;33362:3;33351:9;33347:19;33338:6;33294:73;:::i;:::-;33377;33445:3;33434:9;33430:19;33421:6;33377:73;:::i;:::-;33460;33528:3;33517:9;33513:19;33504:6;33460:73;:::i;:::-;32920:620;;;;;;;;;;:::o;33546:99::-;33598:6;33632:5;33626:12;33616:22;;33605:40;;;:::o;33651:169::-;33735:11;33769:6;33764:3;33757:19;33809:4;33804:3;33800:14;33785:29;;33747:73;;;;:::o;33826:148::-;33928:11;33965:3;33950:18;;33940:34;;;;:::o;33980:305::-;34020:3;34039:20;34057:1;34039:20;:::i;:::-;34034:25;;34073:20;34091:1;34073:20;:::i;:::-;34068:25;;34227:1;34159:66;34155:74;34152:1;34149:81;34146:2;;;34233:18;;:::i;:::-;34146:2;34277:1;34274;34270:9;34263:16;;34024:261;;;;:::o;34291:185::-;34331:1;34348:20;34366:1;34348:20;:::i;:::-;34343:25;;34382:20;34400:1;34382:20;:::i;:::-;34377:25;;34421:1;34411:2;;34426:18;;:::i;:::-;34411:2;34468:1;34465;34461:9;34456:14;;34333:143;;;;:::o;34482:348::-;34522:7;34545:20;34563:1;34545:20;:::i;:::-;34540:25;;34579:20;34597:1;34579:20;:::i;:::-;34574:25;;34767:1;34699:66;34695:74;34692:1;34689:81;34684:1;34677:9;34670:17;34666:105;34663:2;;;34774:18;;:::i;:::-;34663:2;34822:1;34819;34815:9;34804:20;;34530:300;;;;:::o;34836:191::-;34876:4;34896:20;34914:1;34896:20;:::i;:::-;34891:25;;34930:20;34948:1;34930:20;:::i;:::-;34925:25;;34969:1;34966;34963:8;34960:2;;;34974:18;;:::i;:::-;34960:2;35019:1;35016;35012:9;35004:17;;34881:146;;;;:::o;35033:96::-;35070:7;35099:24;35117:5;35099:24;:::i;:::-;35088:35;;35078:51;;;:::o;35135:90::-;35169:7;35212:5;35205:13;35198:21;35187:32;;35177:48;;;:::o;35231:77::-;35268:7;35297:5;35286:16;;35276:32;;;:::o;35314:149::-;35350:7;35390:66;35383:5;35379:78;35368:89;;35358:105;;;:::o;35469:110::-;35520:7;35549:24;35567:5;35549:24;:::i;:::-;35538:35;;35528:51;;;:::o;35585:114::-;35640:7;35669:24;35687:5;35669:24;:::i;:::-;35658:35;;35648:51;;;:::o;35705:126::-;35742:7;35782:42;35775:5;35771:54;35760:65;;35750:81;;;:::o;35837:77::-;35874:7;35903:5;35892:16;;35882:32;;;:::o;35920:154::-;35984:9;36017:51;36062:5;36017:51;:::i;:::-;36004:64;;35994:80;;;:::o;36080:127::-;36144:9;36177:24;36195:5;36177:24;:::i;:::-;36164:37;;36154:53;;;:::o;36213:162::-;36281:9;36314:55;36363:5;36314:55;:::i;:::-;36301:68;;36291:84;;;:::o;36381:131::-;36449:9;36482:24;36500:5;36482:24;:::i;:::-;36469:37;;36459:53;;;:::o;36518:168::-;36589:9;36622:58;36674:5;36622:58;:::i;:::-;36609:71;;36599:87;;;:::o;36692:134::-;36763:9;36796:24;36814:5;36796:24;:::i;:::-;36783:37;;36773:53;;;:::o;36832:162::-;36900:9;36933:55;36982:5;36933:55;:::i;:::-;36920:68;;36910:84;;;:::o;37000:131::-;37068:9;37101:24;37119:5;37101:24;:::i;:::-;37088:37;;37078:53;;;:::o;37137:307::-;37205:1;37215:113;37229:6;37226:1;37223:13;37215:113;;;37314:1;37309:3;37305:11;37299:18;37295:1;37290:3;37286:11;37279:39;37251:2;37248:1;37244:10;37239:15;;37215:113;;;37346:6;37343:1;37340:13;37337:2;;;37426:1;37417:6;37412:3;37408:16;37401:27;37337:2;37186:258;;;;:::o;37450:171::-;37489:3;37512:24;37530:5;37512:24;:::i;:::-;37503:33;;37558:4;37551:5;37548:15;37545:2;;;37566:18;;:::i;:::-;37545:2;37613:1;37606:5;37602:13;37595:20;;37493:128;;;:::o;37627:233::-;37666:3;37689:24;37707:5;37689:24;:::i;:::-;37680:33;;37735:66;37728:5;37725:77;37722:2;;;37805:18;;:::i;:::-;37722:2;37852:1;37845:5;37841:13;37834:20;;37670:190;;;:::o;37866:180::-;37914:77;37911:1;37904:88;38011:4;38008:1;38001:15;38035:4;38032:1;38025:15;38052:180;38100:77;38097:1;38090:88;38197:4;38194:1;38187:15;38221:4;38218:1;38211:15;38238:102;38279:6;38330:2;38326:7;38321:2;38314:5;38310:14;38306:28;38296:38;;38286:54;;;:::o;38346:182::-;38486:34;38482:1;38474:6;38470:14;38463:58;38452:76;:::o;38534:180::-;38674:32;38670:1;38662:6;38658:14;38651:56;38640:74;:::o;38720:166::-;38860:18;38856:1;38848:6;38844:14;38837:42;38826:60;:::o;38892:169::-;39032:21;39028:1;39020:6;39016:14;39009:45;38998:63;:::o;39067:165::-;39207:17;39203:1;39195:6;39191:14;39184:41;39173:59;:::o;39238:176::-;39378:28;39374:1;39366:6;39362:14;39355:52;39344:70;:::o;39420:173::-;39560:25;39556:1;39548:6;39544:14;39537:49;39526:67;:::o;39599:177::-;39739:29;39735:1;39727:6;39723:14;39716:53;39705:71;:::o;39782:171::-;39922:23;39918:1;39910:6;39906:14;39899:47;39888:65;:::o;39959:169::-;40099:21;40095:1;40087:6;40083:14;40076:45;40065:63;:::o;40134:168::-;40274:20;40270:1;40262:6;40258:14;40251:44;40240:62;:::o;40308:173::-;40448:25;40444:1;40436:6;40432:14;40425:49;40414:67;:::o;40487:167::-;40627:19;40623:1;40615:6;40611:14;40604:43;40593:61;:::o;40660:165::-;40800:17;40796:1;40788:6;40784:14;40777:41;40766:59;:::o;40831:181::-;40971:33;40967:1;40959:6;40955:14;40948:57;40937:75;:::o;41018:167::-;41158:19;41154:1;41146:6;41142:14;41135:43;41124:61;:::o;41191:234::-;41331:34;41327:1;41319:6;41315:14;41308:58;41400:17;41395:2;41387:6;41383:15;41376:42;41297:128;:::o;41431:179::-;41571:31;41567:1;41559:6;41555:14;41548:55;41537:73;:::o;41616:176::-;41756:28;41752:1;41744:6;41740:14;41733:52;41722:70;:::o;41798:182::-;41938:34;41934:1;41926:6;41922:14;41915:58;41904:76;:::o;41986:122::-;42059:24;42077:5;42059:24;:::i;:::-;42052:5;42049:35;42039:2;;42098:1;42095;42088:12;42039:2;42029:79;:::o;42114:116::-;42184:21;42199:5;42184:21;:::i;:::-;42177:5;42174:32;42164:2;;42220:1;42217;42210:12;42164:2;42154:76;:::o;42236:122::-;42309:24;42327:5;42309:24;:::i;:::-;42302:5;42299:35;42289:2;;42348:1;42345;42338:12;42289:2;42279:79;:::o;42364:120::-;42436:23;42453:5;42436:23;:::i;:::-;42429:5;42426:34;42416:2;;42474:1;42471;42464:12;42416:2;42406:78;:::o;42490:150::-;42577:38;42609:5;42577:38;:::i;:::-;42570:5;42567:49;42557:2;;42630:1;42627;42620:12;42557:2;42547:93;:::o;42646:158::-;42737:42;42773:5;42737:42;:::i;:::-;42730:5;42727:53;42717:2;;42794:1;42791;42784:12;42717:2;42707:97;:::o;42810:122::-;42883:24;42901:5;42883:24;:::i;:::-;42876:5;42873:35;42863:2;;42922:1;42919;42912:12;42863:2;42853:79;:::o

Swarm Source

ipfs://37d01d0ac65008ac4bd7f298774574a35ee18243723d5bcb755acfb27b24132e
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.