Source Code
Overview
ETH Balance
0 ETH
Token Holdings
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 64 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake_tokens | 5314114 | 234 days ago | IN | 0 ETH | 0.00442844 | ||||
Stake_tokens | 3417628 | 524 days ago | IN | 0 ETH | 0.00009471 | ||||
Issue_into_tranc... | 3053627 | 580 days ago | IN | 0 ETH | 0.00012429 | ||||
Issue_into_tranc... | 3053617 | 580 days ago | IN | 0 ETH | 0.00012429 | ||||
Issue_into_tranc... | 3053616 | 580 days ago | IN | 0 ETH | 0.00007312 | ||||
Issue_into_tranc... | 3053597 | 580 days ago | IN | 0 ETH | 0.00007312 | ||||
Create_tranche | 3053588 | 580 days ago | IN | 0 ETH | 0.00007435 | ||||
Issue_into_tranc... | 3053578 | 580 days ago | IN | 0 ETH | 0.00012428 | ||||
Withdraw_from_tr... | 3047308 | 581 days ago | IN | 0 ETH | 0.00013053 | ||||
Withdraw_from_tr... | 3047306 | 581 days ago | IN | 0 ETH | 0.00015618 | ||||
Remove_stake | 3047297 | 581 days ago | IN | 0 ETH | 0.00006039 | ||||
Withdraw_from_tr... | 3047124 | 581 days ago | IN | 0 ETH | 0.00013053 | ||||
Withdraw_from_tr... | 3047121 | 581 days ago | IN | 0 ETH | 0.00013053 | ||||
Remove_stake | 3047110 | 581 days ago | IN | 0 ETH | 0.00004831 | ||||
Withdraw_from_tr... | 3041383 | 582 days ago | IN | 0 ETH | 0.00010488 | ||||
Withdraw_from_tr... | 3041370 | 582 days ago | IN | 0 ETH | 0.00013053 | ||||
Remove_stake | 3041366 | 582 days ago | IN | 0 ETH | 0.00006039 | ||||
Withdraw_from_tr... | 3041351 | 582 days ago | IN | 0 ETH | 0.00010488 | ||||
Remove_stake | 3041346 | 582 days ago | IN | 0 ETH | 0.00006039 | ||||
Withdraw_from_tr... | 3041336 | 582 days ago | IN | 0 ETH | 0.00015618 | ||||
Remove_stake | 3041319 | 582 days ago | IN | 0 ETH | 0.00006039 | ||||
Remove_stake | 3040280 | 582 days ago | IN | 0 ETH | 0.00006039 | ||||
Stake_tokens | 3014978 | 586 days ago | IN | 0 ETH | 0.00015571 | ||||
Stake_tokens | 3007769 | 587 days ago | IN | 0 ETH | 0.0001204 | ||||
Stake_tokens | 3007475 | 587 days ago | IN | 0 ETH | 0.00012038 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x6B2AfDD5...61937D5f5 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
ERC20_Vesting
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-29 */ /** *Submitted for verification at Etherscan.io on 2021-07-14 */ //SPDX-License-Identifier: MIT pragma solidity 0.8.1; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Interface contains all of the events necessary for staking Vega token */ interface IStake { event Stake_Deposited(address indexed user, uint256 amount, bytes32 indexed vega_public_key); event Stake_Removed(address indexed user, uint256 amount, bytes32 indexed vega_public_key); event Stake_Transferred(address indexed from, uint256 amount, address indexed to, bytes32 indexed vega_public_key); /// @return the address of the token that is able to be staked function staking_token() external view returns (address); /// @param target Target address to check /// @param vega_public_key Target vega public key to check /// @return the number of tokens staked for that address->vega_public_key pair function stake_balance(address target, bytes32 vega_public_key) external view returns (uint256); /// @return total tokens staked on contract function total_staked() external view returns (uint256); } /// @title ERC20 Vesting /// @author Vega Protocol /// @notice This contract manages the vesting of the Vega V2 ERC20 token contract ERC20_Vesting is IStake { event Tranche_Created(uint8 indexed tranche_id, uint256 cliff_start, uint256 duration); event Tranche_Balance_Added(address indexed user, uint8 indexed tranche_id, uint256 amount); event Tranche_Balance_Removed(address indexed user, uint8 indexed tranche_id, uint256 amount); event Issuer_Permitted(address indexed issuer, uint256 amount); event Issuer_Revoked(address indexed issuer); event Controller_Set(address indexed new_controller); /// @notice controller is similar to "owner" in other contracts address public controller; /// @notice tranche_count starts at 1 to cause tranche 0 (perma-lock) to exist as the default tranche uint8 public tranche_count = 1; /// @notice user => has been migrated mapping(address => bool) public v1_migrated; /// @notice user => user_stat struct mapping(address=> user_stat) public user_stats; /// @notice total_locked is the total amount of tokens "on" this contract that are locked into a tranche uint256 public total_locked; /// @notice v1_address is the address for Vega's v1 ERC20 token that has already been deployed address public v1_address; // mainnet = 0xD249B16f61cB9489Fe0Bb046119A48025545b58a; /// @notice v2_address is the address for Vega's v2 ERC20 token that replaces v1 address public v2_address; /// @notice accuracy_scale is the multiplier to assist in integer division uint256 constant public accuracy_scale = 100000000000; /// @notice default_tranche_id is the tranche_id for the default tranche uint8 constant public default_tranche_id = 0; /// @dev total_staked_tokens is the number of tokens staked across all users uint256 total_staked_tokens; /****ADDRESS MIGRATION**/ /// @notice new address => old address mapping(address => address) public address_migration; /*****/ /// @param token_v1_address Vega's already deployed v1 ERC20 token address /// @param token_v2_address Vega's v2 ERC20 token and the token being vested here /// @dev emits Controller_Set event constructor(address token_v1_address, address token_v2_address, address[] memory old_addresses, address[] memory new_addresses) { require(old_addresses.length == new_addresses.length, "array length mismatch"); for(uint8 map_idx = 0; map_idx < old_addresses.length; map_idx++) { /// @dev the following line prevents double-mapping attack require(!v1_migrated[old_addresses[map_idx]]); v1_migrated[old_addresses[map_idx]] = true; address_migration[new_addresses[map_idx]] = old_addresses[map_idx]; } v1_address = token_v1_address; /// @notice this initializes the total_locked with the amount of already issued v1 VEGA ERC20 tokens total_locked = IERC20(token_v1_address).totalSupply() - IERC20(token_v1_address).balanceOf(token_v1_address); v2_address = token_v2_address; controller = msg.sender; emit Controller_Set(controller); } /// @notice tranche_balance has the params necessary to track what a user is owed in a single tranche /// @param total_deposited is the total number of tokens deposited into this single tranche for a single user /// @param total_claimed is the total number of tokens in this tranche that have been withdrawn struct tranche_balance { uint256 total_deposited; uint256 total_claimed; } /// @notice user_stat is a struct that holds all the details needed to handle a single user's vesting /// @param total_in_all_tranches is the total number of tokens currently in all tranches that have been migrated to v2 /// @param lien total amount of locked tokens that have been marked for staking /// @param tranche_balances is a mapping of tranche_id => tranche_balance struct user_stat { uint256 total_in_all_tranches; uint256 lien; mapping (uint8 => tranche_balance) tranche_balances; mapping(bytes32 => uint256) stake; } /// @notice tranche is a struct that hold the details needed for calculating individual tranche vesting /// @param cliff_start is a timestamp after which vesting starts /// @param duration is the number of seconds after cliff_start until the tranche is 100% vested struct tranche { uint256 cliff_start; uint256 duration; } /// @notice tranche_id => tranche struct mapping(uint8 => tranche) public tranches; /// @notice issuer address => permitted issuance allowance mapping(address => uint256) public permitted_issuance; /// @notice this function allows the contract controller to create a tranche /// @notice tranche zero is perma-locked and already exists prior to running this function, making the first vesting tranche "tranche:1" /// @param cliff_start is a timestamp in seconds of when vesting begins for this tranche /// @param duration is the number of seconds after cliff_start that the tranche will be fully vested function create_tranche(uint256 cliff_start, uint256 duration) public only_controller { tranches[tranche_count] = tranche(cliff_start, duration); emit Tranche_Created(tranche_count, cliff_start, duration); /// @notice sol ^0.8 comes with auto-overflow protection tranche_count++; } /// @notice this function allows the conroller or permitted issuer to issue tokens from this contract itself (no tranches) into the specified tranche /// @notice tranche MUST be created /// @notice once assigned to a tranche, tokens can never be clawed back, but they can be reassigned IFF they are in tranche_id:0 /// @param user The user being issued the tokens /// @param tranche_id the id of the target tranche /// @param amount number of tokens to be issued into tranche /// @dev emits Tranche_Balance_Added event function issue_into_tranche(address user, uint8 tranche_id, uint256 amount) public controller_or_issuer { require(tranche_id < tranche_count, "tranche_id out of bounds"); if(permitted_issuance[msg.sender] > 0){ /// @dev if code gets here, they are an issuer if not they must be the controller require(permitted_issuance[msg.sender] >= amount, "not enough permitted balance"); require(user != msg.sender, "cannot issue to self"); permitted_issuance[msg.sender] -= amount; } require( IERC20(v2_address).balanceOf(address(this)) - (total_locked + amount) >= 0, "contract token balance low" ); /// @dev only runs once if(!v1_migrated[user]){ uint256 bal = v1_bal(user); user_stats[user].tranche_balances[0].total_deposited += bal; user_stats[user].total_in_all_tranches += bal; v1_migrated[user] = true; } user_stats[user].tranche_balances[tranche_id].total_deposited += amount; user_stats[user].total_in_all_tranches += amount; total_locked += amount; emit Tranche_Balance_Added(user, tranche_id, amount); } /// @notice this function allows the controller to move tokens issued into tranche zero to the target tranche /// @notice can only be moved from tranche 0 /// @param user The user being issued the tokens /// @param tranche_id the id of the target tranche /// @param amount number of tokens to be moved from tranche 0 /// @dev emits Tranche_Balance_Removed event /// @dev emits Tranche_Balance_Added event function move_into_tranche(address user, uint8 tranche_id, uint256 amount) public only_controller { require(tranche_id > 0 && tranche_id < tranche_count); /// @dev only runs once if(!v1_migrated[user]){ uint256 bal = v1_bal(user); user_stats[user].tranche_balances[default_tranche_id].total_deposited += bal; user_stats[user].total_in_all_tranches += bal; v1_migrated[user] = true; } require(user_stats[user].tranche_balances[default_tranche_id].total_deposited >= amount); user_stats[user].tranche_balances[default_tranche_id].total_deposited -= amount; user_stats[user].tranche_balances[tranche_id].total_deposited += amount; emit Tranche_Balance_Removed(user, default_tranche_id, amount); emit Tranche_Balance_Added(user, tranche_id, amount); } /// @notice this view returns the balance of the given tranche for the given user /// @notice tranche 0 balance of a non-v1_migrated user will return user's v1 token balance as they are pre-issued to the current hodlers /// @param user Target user address /// @param tranche_id target tranche /// @return balance of target tranche of user function get_tranche_balance(address user, uint8 tranche_id) public view returns(uint256) { if(tranche_id == default_tranche_id && !v1_migrated[user]){ return v1_bal(user); } else { return user_stats[user].tranche_balances[tranche_id].total_deposited - user_stats[user].tranche_balances[tranche_id].total_claimed; } } /// @notice This view returns the amount that is currently vested in a given tranche /// @notice This does NOT take into account any current lien /// @param user Target user address /// @param tranche_id Target tranche /// @return number of tokens vested in the target tranche for the target user function get_vested_for_tranche(address user, uint8 tranche_id) public view returns(uint256) { if(block.timestamp < tranches[tranche_id].cliff_start){ return 0; } else if(block.timestamp > tranches[tranche_id].cliff_start + tranches[tranche_id].duration || tranches[tranche_id].duration == 0){ return user_stats[user].tranche_balances[tranche_id].total_deposited - user_stats[user].tranche_balances[tranche_id].total_claimed; } else { return (((( accuracy_scale * (block.timestamp - tranches[tranche_id].cliff_start) ) / tranches[tranche_id].duration ) * user_stats[user].tranche_balances[tranche_id].total_deposited ) / accuracy_scale ) - user_stats[user].tranche_balances[tranche_id].total_claimed; } } /// @notice This view returns the balance remaining in Vega V1 for a given user /// @notice Once migrated, the balance will always return zero, hence "remaining" /// @param user Target user /// @return remaining v1 balance function v1_bal(address user) internal view returns(uint256) { if(!v1_migrated[user]){ if(address_migration[user] != address(0)){ return IERC20(v1_address).balanceOf(user) + IERC20(v1_address).balanceOf(address_migration[user]); } else { return IERC20(v1_address).balanceOf(user); } } else { return 0; } } /// @notice This view returns the current amount of tokens locked in all tranches /// @notice This includes remaining v1 balance /// @param user Target user /// @return the current amount of tokens for target user in all tranches function user_total_all_tranches(address user) public view returns(uint256){ return user_stats[user].total_in_all_tranches + v1_bal(user); } /// @notice This function withdraws all the currently available vested tokens from the target tranche /// @notice This will not allow a user's total tranch balance to go below the user's lien amount /// @dev Emits Tranche_Balance_Removed event if successful /// @param tranche_id Id of target tranche function withdraw_from_tranche(uint8 tranche_id) public { require(tranche_id != default_tranche_id); uint256 to_withdraw = get_vested_for_tranche(msg.sender, tranche_id); require(user_stats[msg.sender].total_in_all_tranches - to_withdraw >= user_stats[msg.sender].lien); user_stats[msg.sender].tranche_balances[tranche_id].total_claimed += to_withdraw; /// @dev Solidity ^0.8 has overflow protection, if this next line overflows, the transaction will revert user_stats[msg.sender].total_in_all_tranches -= to_withdraw; /// @dev Solidity ^0.8 has overflow protection, if this next line overflows, the transaction will revert total_locked -= to_withdraw; require(IERC20(v2_address).transfer(msg.sender, to_withdraw)); emit Tranche_Balance_Removed(msg.sender, tranche_id, to_withdraw); } /// @notice This function allows the controller to assist the target user with their withdrawal. All the currently available vested tokens FOR THE TARGET will be withdrawn TO THE TARGET ADDRESS WALLET /// @notice This function exists in case of users using custodial wallets that are incapable of running "withdraw_from_tranche" but are still ERC20 compatable /// @notice ONLY the controller can run this function and it will only be ran at the target users request /// @notice This will not allow a user's total tranch balance to go below the user's lien amount /// @notice This function does not allow the controller to access any funds from other addresses or change which address is in control of any funds /// @dev Emits Tranche_Balance_Removed event if successful /// @param tranche_id Id of target tranche /// @param target Address with balance that needs the assist function assisted_withdraw_from_tranche(uint8 tranche_id, address target) public only_controller { require(tranche_id != default_tranche_id); uint256 to_withdraw = get_vested_for_tranche(target, tranche_id); require(user_stats[target].total_in_all_tranches - to_withdraw >= user_stats[target].lien); user_stats[target].tranche_balances[tranche_id].total_claimed += to_withdraw; /// @dev Solidity ^0.8 has overflow protection, if this next line overflows, the transaction will revert user_stats[target].total_in_all_tranches -= to_withdraw; /// @dev Solidity ^0.8 has overflow protection, if this next line overflows, the transaction will revert total_locked -= to_withdraw; require(IERC20(v2_address).transfer(target, to_withdraw)); emit Tranche_Balance_Removed(target, tranche_id, to_withdraw); } /// @notice This function will put a lien on the user who runs this function /// @dev Emits Stake_Deposited event if successful /// @param amount Amount of tokens to stake /// @param vega_public_key Target Vega public key to be credited with the stake lock function stake_tokens(uint256 amount, bytes32 vega_public_key) public { require(user_stats[msg.sender].lien + amount > user_stats[msg.sender].lien); require(user_total_all_tranches(msg.sender) >= user_stats[msg.sender].lien + amount); /// @dev Solidity ^0.8 has overflow protection, if this next line overflows, the transaction will revert user_stats[msg.sender].lien += amount; user_stats[msg.sender].stake[vega_public_key] += amount; total_staked_tokens += amount; emit Stake_Deposited(msg.sender, amount, vega_public_key); } /// @notice This function will remove the lien from the user who runs this function /// @notice clears "amount" of lien /// @dev emits Stake_Removed event if successful /// @param amount Amount of tokens to remove from Staking /// @param vega_public_key Target Vega public key from which to remove stake lock function remove_stake(uint256 amount, bytes32 vega_public_key) public { /// @dev Solidity ^0.8 has overflow protection, if this next line overflows, the transaction will revert user_stats[msg.sender].stake[vega_public_key] -= amount; /// @dev Solidity ^0.8 has overflow protection, if this next line overflows, the transaction will revert user_stats[msg.sender].lien -= amount; total_staked_tokens -= amount; emit Stake_Removed(msg.sender, amount, vega_public_key); } /// @notice This function allows the controller to permit the given address to issue the given Amount /// @notice Target users MUST have a zero (0) permitted issuance balance (try revoke_issuer) /// @dev emits Issuer_Permitted event /// @param issuer Target address to be allowed to issue given amount /// @param amount Number of tokens issuer is permitted to issue function permit_issuer(address issuer, uint256 amount) public only_controller { /// @notice revoke is required first to stop a simple double allowance attack require(amount > 0, "amount must be > 0"); require(permitted_issuance[issuer] == 0, "issuer already permitted, revoke first"); require(controller != issuer, "controller cannot be permitted issuer"); permitted_issuance[issuer] = amount; emit Issuer_Permitted(issuer, amount); } /// @notice This function allows the controller to revoke issuance permission from given target /// @notice permitted_issuance must be greater than zero (0) /// @dev emits Issuer_Revoked event /// @param issuer Target address of issuer to be revoked function revoke_issuer(address issuer) public only_controller { require(permitted_issuance[issuer] != 0, "issuer already revoked"); permitted_issuance[issuer] = 0; emit Issuer_Revoked(issuer); } /// @notice This function allows the controller to assign a new controller /// @dev Emits Controller_Set event /// @param new_controller Address of the new controller function set_controller(address new_controller) public only_controller { controller = new_controller; if(permitted_issuance[new_controller] > 0){ permitted_issuance[new_controller] = 0; emit Issuer_Revoked(new_controller); } emit Controller_Set(new_controller); } /// @dev This is IStake.staking_token /// @return the address of the token that is able to be staked function staking_token() external override view returns (address) { return v2_address; } /// @dev This is IStake.stake_balance /// @param target Target address to check /// @param vega_public_key Target vega public key to check /// @return the number of tokens staked for that address->vega_public_key pair function stake_balance(address target, bytes32 vega_public_key) external override view returns (uint256) { return user_stats[target].stake[vega_public_key]; } /// @dev This is IStake.total_staked /// @return total tokens staked on contract function total_staked() external override view returns (uint256) { return total_staked_tokens; } /// @notice this modifier requires that msg.sender is the controller of this contract modifier only_controller { require( msg.sender == controller, "not controller" ); _; } /// @notice this modifier requires that msg.sender is the controller of this contract or has a permitted issuance remaining of more than zero (0) modifier controller_or_issuer { require( msg.sender == controller || permitted_issuance[msg.sender] > 0,"not controller or issuer" ); _; } } /** MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMWEMMMMMMMMMMMMMMMMMMMMMMMMMM...............MMMMMMMMMMMMM MMMMMMLOVEMMMMMMMMMMMMMMMMMMMMMM...............MMMMMMMMMMMMM MMMMMMMMMMHIXELMMMMMMMMMMMM....................MMMMMNNMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMM....................MMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMM88=........................+MMMMMMMMMM MMMMMMMMMMMMMMMMM....................MMMMM...MMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMM....................MMMMM...MMMMMMMMMMMMMMM MMMMMMMMMMMM.........................MM+..MMM....+MMMMMMMMMM MMMMMMMMMNMM...................... ..MM?..MMM.. .+MMMMMMMMMM MMMMNDDMM+........................+MM........MM..+MMMMMMMMMM MMMMZ.............................+MM....................MMM MMMMZ.............................+MM....................MMM MMMMZ.............................+MM....................DDD MMMMZ.............................+MM..ZMMMMMMMMMMMMMMMMMMMM MMMMZ.............................+MM..ZMMMMMMMMMMMMMMMMMMMM MM..............................MMZ....ZMMMMMMMMMMMMMMMMMMMM MM............................MM.......ZMMMMMMMMMMMMMMMMMMMM MM............................MM.......ZMMMMMMMMMMMMMMMMMMMM MM......................ZMMMMM.......MMMMMMMMMMMMMMMMMMMMMMM MM............... ......ZMMMMM.... ..MMMMMMMMMMMMMMMMMMMMMMM MM...............MMMMM88~.........+MM..ZMMMMMMMMMMMMMMMMMMMM MM.......$DDDDDDD.......$DDDDD..DDNMM..ZMMMMMMMMMMMMMMMMMMMM MM.......$DDDDDDD.......$DDDDD..DDNMM..ZMMMMMMMMMMMMMMMMMMMM MM.......ZMMMMMMM.......ZMMMMM..MMMMM..ZMMMMMMMMMMMMMMMMMMMM MMMMMMMMM+.......MMMMM88NMMMMM..MMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMM+.......MMMMM88NMMMMM..MMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM*/
[{"inputs":[{"internalType":"address","name":"token_v1_address","type":"address"},{"internalType":"address","name":"token_v2_address","type":"address"},{"internalType":"address[]","name":"old_addresses","type":"address[]"},{"internalType":"address[]","name":"new_addresses","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"new_controller","type":"address"}],"name":"Controller_Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"issuer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Issuer_Permitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"issuer","type":"address"}],"name":"Issuer_Revoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"vega_public_key","type":"bytes32"}],"name":"Stake_Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"vega_public_key","type":"bytes32"}],"name":"Stake_Removed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"bytes32","name":"vega_public_key","type":"bytes32"}],"name":"Stake_Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint8","name":"tranche_id","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Tranche_Balance_Added","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint8","name":"tranche_id","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Tranche_Balance_Removed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"tranche_id","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"cliff_start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"Tranche_Created","type":"event"},{"inputs":[],"name":"accuracy_scale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"address_migration","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"tranche_id","type":"uint8"},{"internalType":"address","name":"target","type":"address"}],"name":"assisted_withdraw_from_tranche","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cliff_start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"create_tranche","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"default_tranche_id","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"tranche_id","type":"uint8"}],"name":"get_tranche_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"tranche_id","type":"uint8"}],"name":"get_vested_for_tranche","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"tranche_id","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"issue_into_tranche","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"tranche_id","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"move_into_tranche","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"issuer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"permit_issuer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"permitted_issuance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"vega_public_key","type":"bytes32"}],"name":"remove_stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"issuer","type":"address"}],"name":"revoke_issuer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_controller","type":"address"}],"name":"set_controller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes32","name":"vega_public_key","type":"bytes32"}],"name":"stake_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"vega_public_key","type":"bytes32"}],"name":"stake_tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking_token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_locked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_staked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tranche_count","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"tranches","outputs":[{"internalType":"uint256","name":"cliff_start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"user_stats","outputs":[{"internalType":"uint256","name":"total_in_all_tranches","type":"uint256"},{"internalType":"uint256","name":"lien","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"user_total_all_tranches","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"v1_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"v1_migrated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"v2_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"tranche_id","type":"uint8"}],"name":"withdraw_from_tranche","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063912d66ff116100f9578063dd01ba0b11610097578063eb1cbd2711610071578063eb1cbd271461052b578063ed1cac5c14610549578063eea70b4214610567578063f77c479114610583576101c4565b8063dd01ba0b146104c2578063e2de6e6d146104de578063e96842ec146104fa576101c4565b8063a7cf676e116100d3578063a7cf676e1461043a578063a8be47e414610458578063af7568dd14610488578063bc6d385d146104a6576101c4565b8063912d66ff146103e657806391b10ffa1461040257806394a4ff3f1461041e576101c4565b80633fd60603116101665780636689109311610140578063668910931461035e5780636bb7d8561461037a5780637d89651a146103aa578063903223bf146103c8576101c4565b80633fd60603146102e1578063572dd5a9146102fd57806359e7454b1461032e576101c4565b8063277817c7116101a2578063277817c71461025957806329f7de26146102755780632dc7d74c146102a55780633c48a620146102c3576101c4565b806302e8e239146101c957806315e1a382146101f9578063274abf3414610229575b600080fd5b6101e360048036038101906101de9190612bc1565b6105a1565b6040516101f091906130b4565b60405180910390f35b610213600480360381019061020e9190612b20565b6106e4565b60405161022091906130b4565b60405180910390f35b610243600480360381019061023e9190612b49565b610743565b60405161025091906130b4565b60405180910390f35b610273600480360381019061026e9190612b85565b6107a1565b005b61028f600480360381019061028a9190612bc1565b610a19565b60405161029c91906130b4565b60405180910390f35b6102ad610ccb565b6040516102ba9190612f15565b60405180910390f35b6102cb610cf5565b6040516102d891906130b4565b60405180910390f35b6102fb60048036038101906102f69190612d3f565b610cfb565b005b61031760048036038101906103129190612d16565b61103b565b6040516103259291906130cf565b60405180910390f35b61034860048036038101906103439190612b20565b61105f565b6040516103559190612f15565b60405180910390f35b61037860048036038101906103739190612cda565b611092565b005b610394600480360381019061038f9190612b20565b6111fb565b6040516103a19190612f59565b60405180910390f35b6103b261121b565b6040516103bf9190612f15565b60405180910390f35b6103d0611241565b6040516103dd91906130b4565b60405180910390f35b61040060048036038101906103fb9190612bfd565b61124a565b005b61041c60048036038101906104179190612b20565b611684565b005b61043860048036038101906104339190612b20565b611869565b005b610442611a05565b60405161044f9190612f15565b60405180910390f35b610472600480360381019061046d9190612b20565b611a2b565b60405161047f91906130b4565b60405180910390f35b610490611a43565b60405161049d91906130b4565b60405180910390f35b6104c060048036038101906104bb9190612d16565b611a4d565b005b6104dc60048036038101906104d79190612c9e565b611cfe565b005b6104f860048036038101906104f39190612bfd565b611e2d565b005b610514600480360381019061050f9190612b20565b6124ae565b6040516105229291906130cf565b60405180910390f35b6105336124d2565b60405161054091906130f8565b60405180910390f35b6105516124e5565b60405161055e91906130f8565b60405180910390f35b610581600480360381019061057c9190612c9e565b6124ea565b005b61058b612716565b6040516105989190612f15565b60405180910390f35b60008060ff168260ff161480156106025750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610617576106108361273a565b90506106de565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008360ff1660ff16815260200190815260200160002060010154600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008460ff1660ff168152602001908152602001600020600001546106db9190613205565b90505b92915050565b60006106ef8261273a565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461073c9190613124565b9050919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301600083815260200190815260200160002054905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690613074565b60405180910390fd5b60008111610872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086990612fb4565b60405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146108f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108eb90613014565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097a90612ff4565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167fb1dde3dfc5e8df8a1ad5d278b36a91192c9106fc9ae0d1730c82455692640cd882604051610a0d91906130b4565b60405180910390a25050565b6000600860008360ff1660ff16815260200190815260200160002060000154421015610a485760009050610cc5565b600860008360ff1660ff16815260200190815260200160002060010154600860008460ff1660ff16815260200190815260200160002060000154610a8c9190613124565b421180610ab557506000600860008460ff1660ff16815260200190815260200160002060010154145b15610b8557600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008360ff1660ff16815260200190815260200160002060010154600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008460ff1660ff16815260200190815260200160002060000154610b7e9190613205565b9050610cc5565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008360ff1660ff1681526020019081526020016000206001015464174876e800600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008560ff1660ff16815260200190815260200160002060000154600860008660ff1660ff16815260200190815260200160002060010154600860008760ff1660ff1681526020019081526020016000206000015442610c8a9190613205565b64174876e800610c9a91906131ab565b610ca4919061317a565b610cae91906131ab565b610cb8919061317a565b610cc29190613205565b90505b92915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090613074565b60405180910390fd5b600060ff168260ff161415610d9d57600080fd5b6000610da98284610a19565b9050600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015481600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610e3c9190613205565b1015610e4757600080fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008560ff1660ff1681526020019081526020016000206001016000828254610eb39190613124565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610f0c9190613205565b925050819055508060036000828254610f259190613205565b92505081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610f89929190612f30565b602060405180830381600087803b158015610fa357600080fd5b505af1158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb9190612c4c565b610fe457600080fd5b8260ff168273ffffffffffffffffffffffffffffffffffffffff167f69ff77f8ae4662e6d47e9ec4c054fa45e4ed9cd4d875497ea162e3cb95ee2fd58360405161102e91906130b4565b60405180910390a3505050565b60086020528060005260406000206000915090508060000154908060010154905082565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111790613074565b60405180910390fd5b604051806040016040528083815260200182815250600860008060149054906101000a900460ff1660ff1660ff1681526020019081526020016000206000820151816000015560208201518160010155905050600060149054906101000a900460ff1660ff167fc1aade57980687511ea5382b793f5b68cf97b354aef89addfbf9c59d23f1fc7283836040516111b79291906130cf565b60405180910390a26000601481819054906101000a900460ff16809291906111de90613298565b91906101000a81548160ff021916908360ff160217905550505050565b60016020528060005260406000206000915054906101000a900460ff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b64174876e80081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90613074565b60405180910390fd5b60008260ff161180156112ff5750600060149054906101000a900460ff1660ff168260ff16105b61130857600080fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661148b5760006113648461273a565b905080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008060ff1660ff16815260200190815260200160002060000160008282546113d29190613124565b9250508190555080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461142b9190613124565b9250508190555060018060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008060ff1660ff1681526020019081526020016000206000015410156114f457600080fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008060ff1660ff16815260200190815260200160002060000160008282546115609190613205565b9250508190555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008460ff1660ff16815260200190815260200160002060000160008282546115d39190613124565b92505081905550600060ff168373ffffffffffffffffffffffffffffffffffffffff167f69ff77f8ae4662e6d47e9ec4c054fa45e4ed9cd4d875497ea162e3cb95ee2fd58360405161162591906130b4565b60405180910390a38160ff168373ffffffffffffffffffffffffffffffffffffffff167fd574b9b920ef951710b35bf90459120b667d6c810777f945e3e82996f75824c48360405161167791906130b4565b60405180910390a3505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170990613074565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611823576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167faa482319d1110d84c35ff519b80c0449540dfbdbe6ee1daf21c2483378a1bed060405160405180910390a25b8073ffffffffffffffffffffffffffffffffffffffff167f587f8c3da67289e1b7fa2679aafa43e8ef08d5d8d9adfcb67cc825264c431c1360405160405180910390a250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90613074565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561197a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197190613034565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167faa482319d1110d84c35ff519b80c0449540dfbdbe6ee1daf21c2483378a1bed060405160405180910390a250565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915090505481565b6000600654905090565b600060ff168160ff161415611a6157600080fd5b6000611a6d3383610a19565b9050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015481600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611b009190613205565b1015611b0b57600080fd5b80600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008460ff1660ff1681526020019081526020016000206001016000828254611b779190613124565b9250508190555080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611bd09190613205565b925050819055508060036000828254611be99190613205565b92505081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611c4d929190612f30565b602060405180830381600087803b158015611c6757600080fd5b505af1158015611c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9f9190612c4c565b611ca857600080fd5b8160ff163373ffffffffffffffffffffffffffffffffffffffff167f69ff77f8ae4662e6d47e9ec4c054fa45e4ed9cd4d875497ea162e3cb95ee2fd583604051611cf291906130b4565b60405180910390a35050565b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008381526020019081526020016000206000828254611d619190613205565b9250508190555081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611dba9190613205565b925050819055508160066000828254611dd39190613205565b92505081905550803373ffffffffffffffffffffffffffffffffffffffff167fa131d16963736e4c641f27a7f82f2e350b5971e555ae06ae906892bbba0a093984604051611e2191906130b4565b60405180910390a35050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ec657506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc90613054565b60405180910390fd5b600060149054906101000a900460ff1660ff168260ff1610611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390612f94565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156120ec5780600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90612f74565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90613094565b60405180910390fd5b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e49190613205565b925050819055505b6000816003546120fc9190613124565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121579190612f15565b60206040518083038186803b15801561216f57600080fd5b505afa158015612183573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a79190612c75565b6121b19190613205565b10156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990612fd4565b60405180910390fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661237257600061224e8461273a565b905080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008060ff16815260200190815260200160002060000160008282546122b99190613124565b9250508190555080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546123129190613124565b9250508190555060018060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008460ff1660ff16815260200190815260200160002060000160008282546123de9190613124565b9250508190555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546124379190613124565b9250508190555080600360008282546124509190613124565b925050819055508160ff168373ffffffffffffffffffffffffffffffffffffffff167fd574b9b920ef951710b35bf90459120b667d6c810777f945e3e82996f75824c4836040516124a191906130b4565b60405180910390a3505050565b60026020528060005260406000206000915090508060000154908060010154905082565b600060149054906101000a900460ff1681565b600081565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015482600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461257b9190613124565b1161258557600080fd5b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546125d39190613124565b6125dc336106e4565b10156125e757600080fd5b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546126399190613124565b9250508190555081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301600083815260200190815260200160002060008282546126a39190613124565b9250508190555081600660008282546126bc9190613124565b92505081905550803373ffffffffffffffffffffffffffffffffffffffff167f9e3e33edf5dcded4adabc51b1266225d00fa41516bfcad69513fa4eca69519da8460405161270a91906130b4565b60405180910390a35050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612a9857600073ffffffffffffffffffffffffffffffffffffffff16600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129e657600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016128da9190612f15565b60206040518083038186803b1580156128f257600080fd5b505afa158015612906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292a9190612c75565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016129859190612f15565b60206040518083038186803b15801561299d57600080fd5b505afa1580156129b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d59190612c75565b6129df9190613124565b9050612a9d565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401612a419190612f15565b60206040518083038186803b158015612a5957600080fd5b505afa158015612a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a919190612c75565b9050612a9d565b600090505b919050565b600081359050612ab181613506565b92915050565b600081519050612ac68161351d565b92915050565b600081359050612adb81613534565b92915050565b600081359050612af08161354b565b92915050565b600081519050612b058161354b565b92915050565b600081359050612b1a81613562565b92915050565b600060208284031215612b3257600080fd5b6000612b4084828501612aa2565b91505092915050565b60008060408385031215612b5c57600080fd5b6000612b6a85828601612aa2565b9250506020612b7b85828601612acc565b9150509250929050565b60008060408385031215612b9857600080fd5b6000612ba685828601612aa2565b9250506020612bb785828601612ae1565b9150509250929050565b60008060408385031215612bd457600080fd5b6000612be285828601612aa2565b9250506020612bf385828601612b0b565b9150509250929050565b600080600060608486031215612c1257600080fd5b6000612c2086828701612aa2565b9350506020612c3186828701612b0b565b9250506040612c4286828701612ae1565b9150509250925092565b600060208284031215612c5e57600080fd5b6000612c6c84828501612ab7565b91505092915050565b600060208284031215612c8757600080fd5b6000612c9584828501612af6565b91505092915050565b60008060408385031215612cb157600080fd5b6000612cbf85828601612ae1565b9250506020612cd085828601612acc565b9150509250929050565b60008060408385031215612ced57600080fd5b6000612cfb85828601612ae1565b9250506020612d0c85828601612ae1565b9150509250929050565b600060208284031215612d2857600080fd5b6000612d3684828501612b0b565b91505092915050565b60008060408385031215612d5257600080fd5b6000612d6085828601612b0b565b9250506020612d7185828601612aa2565b9150509250929050565b612d8481613239565b82525050565b612d938161324b565b82525050565b6000612da6601c83613113565b9150612db182613320565b602082019050919050565b6000612dc9601883613113565b9150612dd482613349565b602082019050919050565b6000612dec601283613113565b9150612df782613372565b602082019050919050565b6000612e0f601a83613113565b9150612e1a8261339b565b602082019050919050565b6000612e32602583613113565b9150612e3d826133c4565b604082019050919050565b6000612e55602683613113565b9150612e6082613413565b604082019050919050565b6000612e78601683613113565b9150612e8382613462565b602082019050919050565b6000612e9b601883613113565b9150612ea68261348b565b602082019050919050565b6000612ebe600e83613113565b9150612ec9826134b4565b602082019050919050565b6000612ee1601483613113565b9150612eec826134dd565b602082019050919050565b612f0081613281565b82525050565b612f0f8161328b565b82525050565b6000602082019050612f2a6000830184612d7b565b92915050565b6000604082019050612f456000830185612d7b565b612f526020830184612ef7565b9392505050565b6000602082019050612f6e6000830184612d8a565b92915050565b60006020820190508181036000830152612f8d81612d99565b9050919050565b60006020820190508181036000830152612fad81612dbc565b9050919050565b60006020820190508181036000830152612fcd81612ddf565b9050919050565b60006020820190508181036000830152612fed81612e02565b9050919050565b6000602082019050818103600083015261300d81612e25565b9050919050565b6000602082019050818103600083015261302d81612e48565b9050919050565b6000602082019050818103600083015261304d81612e6b565b9050919050565b6000602082019050818103600083015261306d81612e8e565b9050919050565b6000602082019050818103600083015261308d81612eb1565b9050919050565b600060208201905081810360008301526130ad81612ed4565b9050919050565b60006020820190506130c96000830184612ef7565b92915050565b60006040820190506130e46000830185612ef7565b6130f16020830184612ef7565b9392505050565b600060208201905061310d6000830184612f06565b92915050565b600082825260208201905092915050565b600061312f82613281565b915061313a83613281565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561316f5761316e6132c2565b5b828201905092915050565b600061318582613281565b915061319083613281565b9250826131a05761319f6132f1565b5b828204905092915050565b60006131b682613281565b91506131c183613281565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131fa576131f96132c2565b5b828202905092915050565b600061321082613281565b915061321b83613281565b92508282101561322e5761322d6132c2565b5b828203905092915050565b600061324482613261565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006132a38261328b565b915060ff8214156132b7576132b66132c2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f6e6f7420656e6f756768207065726d69747465642062616c616e636500000000600082015250565b7f7472616e6368655f6964206f7574206f6620626f756e64730000000000000000600082015250565b7f616d6f756e74206d757374206265203e20300000000000000000000000000000600082015250565b7f636f6e747261637420746f6b656e2062616c616e6365206c6f77000000000000600082015250565b7f636f6e74726f6c6c65722063616e6e6f74206265207065726d6974746564206960008201527f7373756572000000000000000000000000000000000000000000000000000000602082015250565b7f69737375657220616c7265616479207065726d69747465642c207265766f6b6560008201527f2066697273740000000000000000000000000000000000000000000000000000602082015250565b7f69737375657220616c7265616479207265766f6b656400000000000000000000600082015250565b7f6e6f7420636f6e74726f6c6c6572206f72206973737565720000000000000000600082015250565b7f6e6f7420636f6e74726f6c6c6572000000000000000000000000000000000000600082015250565b7f63616e6e6f7420697373756520746f2073656c66000000000000000000000000600082015250565b61350f81613239565b811461351a57600080fd5b50565b6135268161324b565b811461353157600080fd5b50565b61353d81613257565b811461354857600080fd5b50565b61355481613281565b811461355f57600080fd5b50565b61356b8161328b565b811461357657600080fd5b5056fea2646970667358221220dfb218f32c1a70950b29a1857e51c7edd8e566576947f207d16ab9bef1f0a4dc64736f6c63430008010033
Deployed Bytecode Sourcemap
3931:18721:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12473:349;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14773:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21766:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19892:467;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13140:775;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21434:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4958:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16982:851;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8300:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;5735:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8884:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4709:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5259:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5367:53;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11288:825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21021:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20627:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5088:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8408:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22025:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15240:838;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19005:500;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9734:1120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4797:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;4633:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5501:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18110:565;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4498:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12473:349;12554:7;5544:1;12573:32;;:10;:32;;;:54;;;;;12610:11;:17;12622:4;12610:17;;;;;;;;;;;;;;;;;;;;;;;;;12609:18;12573:54;12570:247;;;12644:12;12651:4;12644:6;:12::i;:::-;12637:19;;;;12570:247;12750:10;:16;12761:4;12750:16;;;;;;;;;;;;;;;:33;;:45;12784:10;12750:45;;;;;;;;;;;;;;;:59;;;12686:10;:16;12697:4;12686:16;;;;;;;;;;;;;;;:33;;:45;12720:10;12686:45;;;;;;;;;;;;;;;:61;;;:123;;;;:::i;:::-;12679:130;;12473:349;;;;;:::o;14773:148::-;14840:7;14903:12;14910:4;14903:6;:12::i;:::-;14862:10;:16;14873:4;14862:16;;;;;;;;;;;;;;;:38;;;:53;;;;:::i;:::-;14855:60;;14773:148;;;:::o;21766:166::-;21862:7;21885:10;:18;21896:6;21885:18;;;;;;;;;;;;;;;:24;;:41;21910:15;21885:41;;;;;;;;;;;;21878:48;;21766:166;;;;:::o;19892:467::-;22284:10;;;;;;;;;;22270:24;;:10;:24;;;22261:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;20077:1:::1;20068:6;:10;20060:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;20146:1;20116:18;:26;20135:6;20116:26;;;;;;;;;;;;;;;;:31;20108:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;20219:6;20205:20;;:10;::::0;::::1;;;;;;;;:20;;;;20197:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;20303:6;20274:18;:26;20293:6;20274:26;;;;;;;;;;;;;;;:35;;;;20338:6;20321:32;;;20346:6;20321:32;;;;;;:::i;:::-;;;;;;;;19892:467:::0;;:::o;13140:775::-;13224:7;13261:8;:20;13270:10;13261:20;;;;;;;;;;;;;;;:32;;;13243:15;:50;13240:670;;;13310:1;13303:8;;;;13240:670;13386:8;:20;13395:10;13386:20;;;;;;;;;;;;;;;:29;;;13351:8;:20;13360:10;13351:20;;;;;;;;;;;;;;;:32;;;:64;;;;:::i;:::-;13333:15;:82;:120;;;;13452:1;13419:8;:20;13428:10;13419:20;;;;;;;;;;;;;;;:29;;;:34;13333:120;13330:580;;;13535:10;:16;13546:4;13535:16;;;;;;;;;;;;;;;:33;;:45;13569:10;13535:45;;;;;;;;;;;;;;;:59;;;13470:10;:16;13481:4;13470:16;;;;;;;;;;;;;;;:33;;:45;13504:10;13470:45;;;;;;;;;;;;;;;:61;;;:124;;;;:::i;:::-;13463:131;;;;13330:580;13843:10;:16;13854:4;13843:16;;;;;;;;;;;;;;;:33;;:45;13877:10;13843:45;;;;;;;;;;;;;;;:59;;;5408:12;13749:10;:16;13760:4;13749:16;;;;;;;;;;;;;;;:33;;:45;13783:10;13749:45;;;;;;;;;;;;;;;:61;;;13704:8;:20;13713:10;13704:20;;;;;;;;;;;;;;;:29;;;13665:8;:20;13674:10;13665:20;;;;;;;;;;;;;;;:32;;;13647:15;:50;;;;:::i;:::-;5408:12;13629:69;;;;:::i;:::-;13627:106;;;;:::i;:::-;13626:184;;;;:::i;:::-;13625:213;;;;:::i;:::-;13624:278;;;;:::i;:::-;13617:285;;13140:775;;;;;:::o;21434:96::-;21491:7;21514:10;;;;;;;;;;;21507:17;;21434:96;:::o;4958:27::-;;;;:::o;16982:851::-;22284:10;;;;;;;;;;22270:24;;:10;:24;;;22261:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;5544:1:::1;17094:32;;:10;:32;;;;17086:41;;;::::0;::::1;;17134:19;17156:42;17179:6;17187:10;17156:22;:42::i;:::-;17134:64;;17272:10;:18;17283:6;17272:18;;;;;;;;;;;;;;;:23;;;17256:11;17213:10;:18;17224:6;17213:18;;;;;;;;;;;;;;;:40;;;:54;;;;:::i;:::-;:82;;17205:91;;;::::0;::::1;;17368:11;17303:10;:18;17314:6;17303:18;;;;;;;;;;;;;;;:35;;:47;17339:10;17303:47;;;;;;;;;;;;;;;:61;;;:76;;;;;;;:::i;:::-;;;;;;;;17540:11;17496:10;:18;17507:6;17496:18;;;;;;;;;;;;;;;:40;;;:55;;;;;;;:::i;:::-;;;;;;;;17684:11;17668:12;;:27;;;;;;;:::i;:::-;;;;;;;;17717:10;;;;;;;;;;;17710:27;;;17738:6;17746:11;17710:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17702:57;;;::::0;::::1;;17803:10;17771:56;;17795:6;17771:56;;;17815:11;17771:56;;;;;;:::i;:::-;;;;;;;;22326:1;16982:851:::0;;:::o;8300:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5735:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;8884:304::-;22284:10;;;;;;;;;;22270:24;;:10;:24;;;22261:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;9003:30:::1;;;;;;;;9011:11;9003:30;;;;9024:8;9003:30;;::::0;8977:8:::1;:23;8986:13:::0;::::1;;;;;;;;;;8977:23;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;;;;;9061:13;;;;;;;;;;;9045:53;;;9076:11;9089:8;9045:53;;;;;;;:::i;:::-;;;;;;;;9167:13;;:15;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;8884:304:::0;;:::o;4709:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;5259:25::-;;;;;;;;;;;;;:::o;5367:53::-;5408:12;5367:53;:::o;11288:825::-;22284:10;;;;;;;;;;22270:24;;:10;:24;;;22261:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;11414:1:::1;11401:10;:14;;;:44;;;;;11432:13;;;;;;;;;;;11419:26;;:10;:26;;;11401:44;11393:53;;;::::0;::::1;;11488:11;:17;11500:4;11488:17;;;;;;;;;;;;;;;;;;;;;;;;;11484:237;;11515:11;11529:12;11536:4;11529:6;:12::i;:::-;11515:26;;11623:3;11550:10;:16;11561:4;11550:16;;;;;;;;;;;;;;;:33;;:53;5544:1:::0;11550:53:::1;;;;;;;;;;;;;;;:69;;;:76;;;;;;;:::i;:::-;;;;;;;;11677:3;11635:10;:16;11646:4;11635:16;;;;;;;;;;;;;;;:38;;;:45;;;;;;;:::i;:::-;;;;;;;;11709:4;11689:11:::0;:17:::1;11701:4;11689:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;11484:237;;11808:6;11735:10;:16;11746:4;11735:16;;;;;;;;;;;;;;;:33;;:53;5544:1:::0;11735:53:::1;;;;;;;;;;;;;;;:69;;;:79;;11727:88;;;::::0;::::1;;11895:6;11822:10;:16;11833:4;11822:16;;;;;;;;;;;;;;;:33;;:53;5544:1:::0;11822:53:::1;;;;;;;;;;;;;;;:69;;;:79;;;;;;;:::i;:::-;;;;;;;;11973:6;11908:10;:16;11919:4;11908:16;;;;;;;;;;;;;;;:33;;:45;11942:10;11908:45;;;;;;;;;;;;;;;:61;;;:71;;;;;;;:::i;:::-;;;;;;;;5544:1;11991:57;;12015:4;11991:57;;;12041:6;11991:57;;;;;;:::i;:::-;;;;;;;;12088:10;12060:47;;12082:4;12060:47;;;12100:6;12060:47;;;;;;:::i;:::-;;;;;;;;11288:825:::0;;;:::o;21021:300::-;22284:10;;;;;;;;;;22270:24;;:10;:24;;;22261:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;21112:14:::1;21099:10;::::0;:27:::1;;;;;;;;;;;;;;;;;;21173:1;21136:18;:34;21155:14;21136:34;;;;;;;;;;;;;;;;:38;21133:141;;;21221:1;21184:18;:34;21203:14;21184:34;;;;;;;;;;;;;;;:38;;;;21251:14;21236:30;;;;;;;;;;;;21133:141;21300:14;21285:30;;;;;;;;;;;;21021:300:::0;:::o;20627:212::-;22284:10;;;;;;;;;;22270:24;;:10;:24;;;22261:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;20734:1:::1;20704:18;:26;20723:6;20704:26;;;;;;;;;;;;;;;;:31;;20696:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;20798:1;20769:18;:26;20788:6;20769:26;;;;;;;;;;;;;;;:30;;;;20826:6;20811:22;;;;;;;;;;;;20627:212:::0;:::o;5088:25::-;;;;;;;;;;;;;:::o;8408:53::-;;;;;;;;;;;;;;;;;:::o;22025:104::-;22081:7;22104:19;;22097:26;;22025:104;:::o;15240:838::-;5544:1;15311:32;;:10;:32;;;;15303:41;;;;;;15351:19;15373:46;15396:10;15408;15373:22;:46::i;:::-;15351:68;;15497:10;:22;15508:10;15497:22;;;;;;;;;;;;;;;:27;;;15481:11;15434:10;:22;15445:10;15434:22;;;;;;;;;;;;;;;:44;;;:58;;;;:::i;:::-;:90;;15426:99;;;;;;15601:11;15532:10;:22;15543:10;15532:22;;;;;;;;;;;;;;;:39;;:51;15572:10;15532:51;;;;;;;;;;;;;;;:65;;;:80;;;;;;;:::i;:::-;;;;;;;;15777:11;15729:10;:22;15740:10;15729:22;;;;;;;;;;;;;;;:44;;;:59;;;;;;;:::i;:::-;;;;;;;;15921:11;15905:12;;:27;;;;;;;:::i;:::-;;;;;;;;15954:10;;;;;;;;;;;15947:27;;;15975:10;15987:11;15947:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15939:61;;;;;;16048:10;16012:60;;16036:10;16012:60;;;16060:11;16012:60;;;;;;:::i;:::-;;;;;;;;15240:838;;:::o;19005:500::-;19241:6;19192:10;:22;19203:10;19192:22;;;;;;;;;;;;;;;:28;;:45;19221:15;19192:45;;;;;;;;;;;;:55;;;;;;;:::i;:::-;;;;;;;;19395:6;19364:10;:22;19375:10;19364:22;;;;;;;;;;;;;;;:27;;;:37;;;;;;;:::i;:::-;;;;;;;;19431:6;19408:19;;:29;;;;;;;:::i;:::-;;;;;;;;19483:15;19463:10;19449:50;;;19475:6;19449:50;;;;;;:::i;:::-;;;;;;;;19005:500;;:::o;9734:1120::-;22553:10;;;;;;;;;;22539:24;;:10;:24;;;:62;;;;22600:1;22567:18;:30;22586:10;22567:30;;;;;;;;;;;;;;;;:34;22539:62;22530:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;9866:13:::1;;;;;;;;;;;9853:26;;:10;:26;;;9845:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9951:1;9918:18;:30;9937:10;9918:30;;;;;;;;;;;;;;;;:34;9915:334;;;10093:6;10059:18;:30;10078:10;10059:30;;;;;;;;;;;;;;;;:40;;10051:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10157:10;10149:18;;:4;:18;;;;10141:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;10235:6;10201:18;:30;10220:10;10201:30;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;9915:334;10337:1;10326:6;10311:12;;:21;;;;:::i;:::-;10271:10;;;;;;;;;;;10264:28;;;10301:4;10264:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;;;;:::i;:::-;:74;;10255:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;10412:11;:17;10424:4;10412:17;;;;;;;;;;;;;;;;;;;;;;;;;10408:220;;10439:11;10453:12;10460:4;10453:6;:12::i;:::-;10439:26;;10530:3;10474:10;:16;10485:4;10474:16;;;;;;;;;;;;;;;:33;;:36;10508:1:::0;10474:36:::1;;;;;;;;;;;;;:52;;;:59;;;;;;;:::i;:::-;;;;;;;;10584:3;10542:10;:16;10553:4;10542:16;;;;;;;;;;;;;;;:38;;;:45;;;;;;;:::i;:::-;;;;;;;;10616:4;10596:11:::0;:17:::1;10608:4;10596:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;10408:220;;10699:6;10634:10;:16;10645:4;10634:16;;;;;;;;;;;;;;;:33;;:45;10668:10;10634:45;;;;;;;;;;;;;;;:61;;;:71;;;;;;;:::i;:::-;;;;;;;;10754:6;10712:10;:16;10723:4;10712:16;;;;;;;;;;;;;;;:38;;;:48;;;;;;;:::i;:::-;;;;;;;;10783:6;10767:12;;:22;;;;;;;:::i;:::-;;;;;;;;10829:10;10801:47;;10823:4;10801:47;;;10841:6;10801:47;;;;;;:::i;:::-;;;;;;;;9734:1120:::0;;;:::o;4797:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4633:30::-;;;;;;;;;;;;;:::o;5501:44::-;5544:1;5501:44;:::o;18110:565::-;18234:10;:22;18245:10;18234:22;;;;;;;;;;;;;;;:27;;;18225:6;18195:10;:22;18206:10;18195:22;;;;;;;;;;;;;;;:27;;;:36;;;;:::i;:::-;:66;18187:75;;;;;;18346:6;18316:10;:22;18327:10;18316:22;;;;;;;;;;;;;;;:27;;;:36;;;;:::i;:::-;18277:35;18301:10;18277:23;:35::i;:::-;:75;;18269:84;;;;;;18501:6;18470:10;:22;18481:10;18470:22;;;;;;;;;;;;;;;:27;;;:37;;;;;;;:::i;:::-;;;;;;;;18563:6;18514:10;:22;18525:10;18514:22;;;;;;;;;;;;;;;:28;;:45;18543:15;18514:45;;;;;;;;;;;;:55;;;;;;;:::i;:::-;;;;;;;;18599:6;18576:19;;:29;;;;;;;:::i;:::-;;;;;;;;18653:15;18633:10;18617:52;;;18645:6;18617:52;;;;;;:::i;:::-;;;;;;;;18110:565;;:::o;4498:25::-;;;;;;;;;;;;:::o;14156:369::-;14208:7;14228:11;:17;14240:4;14228:17;;;;;;;;;;;;;;;;;;;;;;;;;14224:296;;14293:1;14258:37;;:17;:23;14276:4;14258:23;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;14255:227;;14358:10;;;;;;;;;;;14351:28;;;14380:17;:23;14398:4;14380:23;;;;;;;;;;;;;;;;;;;;;;;;;14351:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14321:10;;;;;;;;;;;14314:28;;;14343:4;14314:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:90;;;;:::i;:::-;14307:97;;;;14255:227;14445:10;;;;;;;;;;;14438:28;;;14467:4;14438:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14431:41;;;;14224:296;14511:1;14504:8;;14156:369;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:139::-;;524:6;511:20;502:29;;540:33;567:5;540:33;:::i;:::-;492:87;;;;:::o;585:143::-;;673:6;667:13;658:22;;689:33;716:5;689:33;:::i;:::-;648:80;;;;:::o;734:135::-;;816:6;803:20;794:29;;832:31;857:5;832:31;:::i;:::-;784:85;;;;:::o;875:262::-;;983:2;971:9;962:7;958:23;954:32;951:2;;;999:1;996;989:12;951:2;1042:1;1067:53;1112:7;1103:6;1092:9;1088:22;1067:53;:::i;:::-;1057:63;;1013:117;941:196;;;;:::o;1143:407::-;;;1268:2;1256:9;1247:7;1243:23;1239:32;1236:2;;;1284:1;1281;1274:12;1236:2;1327:1;1352:53;1397:7;1388:6;1377:9;1373:22;1352:53;:::i;:::-;1342:63;;1298:117;1454:2;1480:53;1525:7;1516:6;1505:9;1501:22;1480:53;:::i;:::-;1470:63;;1425:118;1226:324;;;;;:::o;1556:407::-;;;1681:2;1669:9;1660:7;1656:23;1652:32;1649:2;;;1697:1;1694;1687:12;1649:2;1740:1;1765:53;1810:7;1801:6;1790:9;1786:22;1765:53;:::i;:::-;1755:63;;1711:117;1867:2;1893:53;1938:7;1929:6;1918:9;1914:22;1893:53;:::i;:::-;1883:63;;1838:118;1639:324;;;;;:::o;1969:403::-;;;2092:2;2080:9;2071:7;2067:23;2063:32;2060:2;;;2108:1;2105;2098:12;2060:2;2151:1;2176:53;2221:7;2212:6;2201:9;2197:22;2176:53;:::i;:::-;2166:63;;2122:117;2278:2;2304:51;2347:7;2338:6;2327:9;2323:22;2304:51;:::i;:::-;2294:61;;2249:116;2050:322;;;;;:::o;2378:548::-;;;;2518:2;2506:9;2497:7;2493:23;2489:32;2486:2;;;2534:1;2531;2524:12;2486:2;2577:1;2602:53;2647:7;2638:6;2627:9;2623:22;2602:53;:::i;:::-;2592:63;;2548:117;2704:2;2730:51;2773:7;2764:6;2753:9;2749:22;2730:51;:::i;:::-;2720:61;;2675:116;2830:2;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2801:118;2476:450;;;;;:::o;2932:278::-;;3048:2;3036:9;3027:7;3023:23;3019:32;3016:2;;;3064:1;3061;3054:12;3016:2;3107:1;3132:61;3185:7;3176:6;3165:9;3161:22;3132:61;:::i;:::-;3122:71;;3078:125;3006:204;;;;:::o;3216:284::-;;3335:2;3323:9;3314:7;3310:23;3306:32;3303:2;;;3351:1;3348;3341:12;3303:2;3394:1;3419:64;3475:7;3466:6;3455:9;3451:22;3419:64;:::i;:::-;3409:74;;3365:128;3293:207;;;;:::o;3506:407::-;;;3631:2;3619:9;3610:7;3606:23;3602:32;3599:2;;;3647:1;3644;3637:12;3599:2;3690:1;3715:53;3760:7;3751:6;3740:9;3736:22;3715:53;:::i;:::-;3705:63;;3661:117;3817:2;3843:53;3888:7;3879:6;3868:9;3864:22;3843:53;:::i;:::-;3833:63;;3788:118;3589:324;;;;;:::o;3919:407::-;;;4044:2;4032:9;4023:7;4019:23;4015:32;4012:2;;;4060:1;4057;4050:12;4012:2;4103:1;4128:53;4173:7;4164:6;4153:9;4149:22;4128:53;:::i;:::-;4118:63;;4074:117;4230:2;4256:53;4301:7;4292:6;4281:9;4277:22;4256:53;:::i;:::-;4246:63;;4201:118;4002:324;;;;;:::o;4332:258::-;;4438:2;4426:9;4417:7;4413:23;4409:32;4406:2;;;4454:1;4451;4444:12;4406:2;4497:1;4522:51;4565:7;4556:6;4545:9;4541:22;4522:51;:::i;:::-;4512:61;;4468:115;4396:194;;;;:::o;4596:403::-;;;4719:2;4707:9;4698:7;4694:23;4690:32;4687:2;;;4735:1;4732;4725:12;4687:2;4778:1;4803:51;4846:7;4837:6;4826:9;4822:22;4803:51;:::i;:::-;4793:61;;4749:115;4903:2;4929:53;4974:7;4965:6;4954:9;4950:22;4929:53;:::i;:::-;4919:63;;4874:118;4677:322;;;;;:::o;5005:118::-;5092:24;5110:5;5092:24;:::i;:::-;5087:3;5080:37;5070:53;;:::o;5129:109::-;5210:21;5225:5;5210:21;:::i;:::-;5205:3;5198:34;5188:50;;:::o;5244:366::-;;5407:67;5471:2;5466:3;5407:67;:::i;:::-;5400:74;;5483:93;5572:3;5483:93;:::i;:::-;5601:2;5596:3;5592:12;5585:19;;5390:220;;;:::o;5616:366::-;;5779:67;5843:2;5838:3;5779:67;:::i;:::-;5772:74;;5855:93;5944:3;5855:93;:::i;:::-;5973:2;5968:3;5964:12;5957:19;;5762:220;;;:::o;5988:366::-;;6151:67;6215:2;6210:3;6151:67;:::i;:::-;6144:74;;6227:93;6316:3;6227:93;:::i;:::-;6345:2;6340:3;6336:12;6329:19;;6134:220;;;:::o;6360:366::-;;6523:67;6587:2;6582:3;6523:67;:::i;:::-;6516:74;;6599:93;6688:3;6599:93;:::i;:::-;6717:2;6712:3;6708:12;6701:19;;6506:220;;;:::o;6732:366::-;;6895:67;6959:2;6954:3;6895:67;:::i;:::-;6888:74;;6971:93;7060:3;6971:93;:::i;:::-;7089:2;7084:3;7080:12;7073:19;;6878:220;;;:::o;7104:366::-;;7267:67;7331:2;7326:3;7267:67;:::i;:::-;7260:74;;7343:93;7432:3;7343:93;:::i;:::-;7461:2;7456:3;7452:12;7445:19;;7250:220;;;:::o;7476:366::-;;7639:67;7703:2;7698:3;7639:67;:::i;:::-;7632:74;;7715:93;7804:3;7715:93;:::i;:::-;7833:2;7828:3;7824:12;7817:19;;7622:220;;;:::o;7848:366::-;;8011:67;8075:2;8070:3;8011:67;:::i;:::-;8004:74;;8087:93;8176:3;8087:93;:::i;:::-;8205:2;8200:3;8196:12;8189:19;;7994:220;;;:::o;8220:366::-;;8383:67;8447:2;8442:3;8383:67;:::i;:::-;8376:74;;8459:93;8548:3;8459:93;:::i;:::-;8577:2;8572:3;8568:12;8561:19;;8366:220;;;:::o;8592:366::-;;8755:67;8819:2;8814:3;8755:67;:::i;:::-;8748:74;;8831:93;8920:3;8831:93;:::i;:::-;8949:2;8944:3;8940:12;8933:19;;8738:220;;;:::o;8964:118::-;9051:24;9069:5;9051:24;:::i;:::-;9046:3;9039:37;9029:53;;:::o;9088:112::-;9171:22;9187:5;9171:22;:::i;:::-;9166:3;9159:35;9149:51;;:::o;9206:222::-;;9337:2;9326:9;9322:18;9314:26;;9350:71;9418:1;9407:9;9403:17;9394:6;9350:71;:::i;:::-;9304:124;;;;:::o;9434:332::-;;9593:2;9582:9;9578:18;9570:26;;9606:71;9674:1;9663:9;9659:17;9650:6;9606:71;:::i;:::-;9687:72;9755:2;9744:9;9740:18;9731:6;9687:72;:::i;:::-;9560:206;;;;;:::o;9772:210::-;;9897:2;9886:9;9882:18;9874:26;;9910:65;9972:1;9961:9;9957:17;9948:6;9910:65;:::i;:::-;9864:118;;;;:::o;9988:419::-;;10192:2;10181:9;10177:18;10169:26;;10241:9;10235:4;10231:20;10227:1;10216:9;10212:17;10205:47;10269:131;10395:4;10269:131;:::i;:::-;10261:139;;10159:248;;;:::o;10413:419::-;;10617:2;10606:9;10602:18;10594:26;;10666:9;10660:4;10656:20;10652:1;10641:9;10637:17;10630:47;10694:131;10820:4;10694:131;:::i;:::-;10686:139;;10584:248;;;:::o;10838:419::-;;11042:2;11031:9;11027:18;11019:26;;11091:9;11085:4;11081:20;11077:1;11066:9;11062:17;11055:47;11119:131;11245:4;11119:131;:::i;:::-;11111:139;;11009:248;;;:::o;11263:419::-;;11467:2;11456:9;11452:18;11444:26;;11516:9;11510:4;11506:20;11502:1;11491:9;11487:17;11480:47;11544:131;11670:4;11544:131;:::i;:::-;11536:139;;11434:248;;;:::o;11688:419::-;;11892:2;11881:9;11877:18;11869:26;;11941:9;11935:4;11931:20;11927:1;11916:9;11912:17;11905:47;11969:131;12095:4;11969:131;:::i;:::-;11961:139;;11859:248;;;:::o;12113:419::-;;12317:2;12306:9;12302:18;12294:26;;12366:9;12360:4;12356:20;12352:1;12341:9;12337:17;12330:47;12394:131;12520:4;12394:131;:::i;:::-;12386:139;;12284:248;;;:::o;12538:419::-;;12742:2;12731:9;12727:18;12719:26;;12791:9;12785:4;12781:20;12777:1;12766:9;12762:17;12755:47;12819:131;12945:4;12819:131;:::i;:::-;12811:139;;12709:248;;;:::o;12963:419::-;;13167:2;13156:9;13152:18;13144:26;;13216:9;13210:4;13206:20;13202:1;13191:9;13187:17;13180:47;13244:131;13370:4;13244:131;:::i;:::-;13236:139;;13134:248;;;:::o;13388:419::-;;13592:2;13581:9;13577:18;13569:26;;13641:9;13635:4;13631:20;13627:1;13616:9;13612:17;13605:47;13669:131;13795:4;13669:131;:::i;:::-;13661:139;;13559:248;;;:::o;13813:419::-;;14017:2;14006:9;14002:18;13994:26;;14066:9;14060:4;14056:20;14052:1;14041:9;14037:17;14030:47;14094:131;14220:4;14094:131;:::i;:::-;14086:139;;13984:248;;;:::o;14238:222::-;;14369:2;14358:9;14354:18;14346:26;;14382:71;14450:1;14439:9;14435:17;14426:6;14382:71;:::i;:::-;14336:124;;;;:::o;14466:332::-;;14625:2;14614:9;14610:18;14602:26;;14638:71;14706:1;14695:9;14691:17;14682:6;14638:71;:::i;:::-;14719:72;14787:2;14776:9;14772:18;14763:6;14719:72;:::i;:::-;14592:206;;;;;:::o;14804:214::-;;14931:2;14920:9;14916:18;14908:26;;14944:67;15008:1;14997:9;14993:17;14984:6;14944:67;:::i;:::-;14898:120;;;;:::o;15024:169::-;;15142:6;15137:3;15130:19;15182:4;15177:3;15173:14;15158:29;;15120:73;;;;:::o;15199:305::-;;15258:20;15276:1;15258:20;:::i;:::-;15253:25;;15292:20;15310:1;15292:20;:::i;:::-;15287:25;;15446:1;15378:66;15374:74;15371:1;15368:81;15365:2;;;15452:18;;:::i;:::-;15365:2;15496:1;15493;15489:9;15482:16;;15243:261;;;;:::o;15510:185::-;;15567:20;15585:1;15567:20;:::i;:::-;15562:25;;15601:20;15619:1;15601:20;:::i;:::-;15596:25;;15640:1;15630:2;;15645:18;;:::i;:::-;15630:2;15687:1;15684;15680:9;15675:14;;15552:143;;;;:::o;15701:348::-;;15764:20;15782:1;15764:20;:::i;:::-;15759:25;;15798:20;15816:1;15798:20;:::i;:::-;15793:25;;15986:1;15918:66;15914:74;15911:1;15908:81;15903:1;15896:9;15889:17;15885:105;15882:2;;;15993:18;;:::i;:::-;15882:2;16041:1;16038;16034:9;16023:20;;15749:300;;;;:::o;16055:191::-;;16115:20;16133:1;16115:20;:::i;:::-;16110:25;;16149:20;16167:1;16149:20;:::i;:::-;16144:25;;16188:1;16185;16182:8;16179:2;;;16193:18;;:::i;:::-;16179:2;16238:1;16235;16231:9;16223:17;;16100:146;;;;:::o;16252:96::-;;16318:24;16336:5;16318:24;:::i;:::-;16307:35;;16297:51;;;:::o;16354:90::-;;16431:5;16424:13;16417:21;16406:32;;16396:48;;;:::o;16450:77::-;;16516:5;16505:16;;16495:32;;;:::o;16533:126::-;;16610:42;16603:5;16599:54;16588:65;;16578:81;;;:::o;16665:77::-;;16731:5;16720:16;;16710:32;;;:::o;16748:86::-;;16823:4;16816:5;16812:16;16801:27;;16791:43;;;:::o;16840:167::-;;16900:22;16916:5;16900:22;:::i;:::-;16891:31;;16944:4;16937:5;16934:15;16931:2;;;16952:18;;:::i;:::-;16931:2;16999:1;16992:5;16988:13;16981:20;;16881:126;;;:::o;17013:180::-;17061:77;17058:1;17051:88;17158:4;17155:1;17148:15;17182:4;17179:1;17172:15;17199:180;17247:77;17244:1;17237:88;17344:4;17341:1;17334:15;17368:4;17365:1;17358:15;17385:178;17525:30;17521:1;17513:6;17509:14;17502:54;17491:72;:::o;17569:174::-;17709:26;17705:1;17697:6;17693:14;17686:50;17675:68;:::o;17749:168::-;17889:20;17885:1;17877:6;17873:14;17866:44;17855:62;:::o;17923:176::-;18063:28;18059:1;18051:6;18047:14;18040:52;18029:70;:::o;18105:224::-;18245:34;18241:1;18233:6;18229:14;18222:58;18314:7;18309:2;18301:6;18297:15;18290:32;18211:118;:::o;18335:225::-;18475:34;18471:1;18463:6;18459:14;18452:58;18544:8;18539:2;18531:6;18527:15;18520:33;18441:119;:::o;18566:172::-;18706:24;18702:1;18694:6;18690:14;18683:48;18672:66;:::o;18744:174::-;18884:26;18880:1;18872:6;18868:14;18861:50;18850:68;:::o;18924:164::-;19064:16;19060:1;19052:6;19048:14;19041:40;19030:58;:::o;19094:170::-;19234:22;19230:1;19222:6;19218:14;19211:46;19200:64;:::o;19270:122::-;19343:24;19361:5;19343:24;:::i;:::-;19336:5;19333:35;19323:2;;19382:1;19379;19372:12;19323:2;19313:79;:::o;19398:116::-;19468:21;19483:5;19468:21;:::i;:::-;19461:5;19458:32;19448:2;;19504:1;19501;19494:12;19448:2;19438:76;:::o;19520:122::-;19593:24;19611:5;19593:24;:::i;:::-;19586:5;19583:35;19573:2;;19632:1;19629;19622:12;19573:2;19563:79;:::o;19648:122::-;19721:24;19739:5;19721:24;:::i;:::-;19714:5;19711:35;19701:2;;19760:1;19757;19750:12;19701:2;19691:79;:::o;19776:118::-;19847:22;19863:5;19847:22;:::i;:::-;19840:5;19837:33;19827:2;;19884:1;19881;19874:12;19827:2;19817:77;:::o
Swarm Source
ipfs://dfb218f32c1a70950b29a1857e51c7edd8e566576947f207d16ab9bef1f0a4dc
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.