Source Code
Latest 25 from a total of 111 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve Issue | 409417133 | 43 days ago | IN | 0 ETH | 0.0000013 | ||||
| Approve Issue | 409416668 | 43 days ago | IN | 0 ETH | 0.00000065 | ||||
| Approve Issue | 409415809 | 43 days ago | IN | 0 ETH | 0.00000077 | ||||
| Request Issue | 409415269 | 43 days ago | IN | 0 ETH | 0.00000191 | ||||
| Approve Issue | 398372868 | 75 days ago | IN | 0 ETH | 0.00000131 | ||||
| Approve Issue | 398372425 | 75 days ago | IN | 0 ETH | 0.00000065 | ||||
| Approve Issue | 398371984 | 75 days ago | IN | 0 ETH | 0.00000076 | ||||
| Request Issue | 398371311 | 75 days ago | IN | 0 ETH | 0.00000192 | ||||
| Approve Issue | 391065474 | 96 days ago | IN | 0 ETH | 0.00000131 | ||||
| Approve Issue | 391065056 | 96 days ago | IN | 0 ETH | 0.00000066 | ||||
| Approve Issue | 391064463 | 96 days ago | IN | 0 ETH | 0.00000066 | ||||
| Request Issue | 391063780 | 96 days ago | IN | 0 ETH | 0.00000192 | ||||
| Approve Issue | 383135608 | 119 days ago | IN | 0 ETH | 0.00000168 | ||||
| Approve Issue | 383134725 | 119 days ago | IN | 0 ETH | 0.0000008 | ||||
| Approve Issue | 383134282 | 119 days ago | IN | 0 ETH | 0.00000084 | ||||
| Request Issue | 383133609 | 119 days ago | IN | 0 ETH | 0.00000302 | ||||
| Approve Issue | 378344044 | 133 days ago | IN | 0 ETH | 0.00000132 | ||||
| Approve Issue | 378341047 | 133 days ago | IN | 0 ETH | 0.00000066 | ||||
| Approve Issue | 378340288 | 133 days ago | IN | 0 ETH | 0.00000067 | ||||
| Request Issue | 378338887 | 133 days ago | IN | 0 ETH | 0.00000193 | ||||
| Approve Issue | 344792524 | 230 days ago | IN | 0 ETH | 0.00000136 | ||||
| Approve Issue | 344792071 | 230 days ago | IN | 0 ETH | 0.0000007 | ||||
| Approve Issue | 344791566 | 230 days ago | IN | 0 ETH | 0.0000007 | ||||
| Request Issue | 344790669 | 230 days ago | IN | 0 ETH | 0.00000199 | ||||
| Approve Issue | 344739980 | 230 days ago | IN | 0 ETH | 0.00000133 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MultisigManager
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.26;
import "./ManagedToken.sol";
/**
* @title A multi-signature contract for token management
* @notice Enables multiple users to manage a token contract.
* List of contract owners is set on initialization.
* All actions should be approved by majority (N / 2 + 1) of owners.
* List of owners can be changed with approval of the same majority of current owners.
* There must always be at least 3 owner accounts.
* @notice This contract supports fixed set of actions that can be performed on managed token contracts
* (or the management contract itself).
* Such actions include change of token ownership token supply regulation, token blacklist management, etc.
* For each supported action, there are two methods.
* First method named `request*` enables any owner account to suggest an action to perform.
* Such methods create a "request" in this management contract and return it's unique identifier.
* The second method named `approve*` then should be called by other owner(s) to approve the operation.
* The action is executed immediately, as part of the `approve*` method when the last approval happens.
*/
contract MultisigManager {
// region voting accounts management internal
/**
* @dev Minimal number of voting accounts.
* Attempts to initialize the contract with a number of voting accounts less than this one or to change
* list of voting accounts to such size will be reverted.
*/
uint public constant MIN_VOTING_ACCOUNTS = 3;
/**
* @dev Time interval during which a request may be approved.
* If a request is not completed after `REQUEST_APPROVAL_DEADLINE_SECONDS` seconds after creation,
* it can no longer be approved (and thus cannot be executed).
*/
uint public constant REQUEST_APPROVAL_DEADLINE_SECONDS = 2 days;
mapping(address => bool) public isVotingAccount;
/**
* @dev Number of active voting accounts.
* List and number of voting accounts can be changed (see `requestVotersListChange`, `approveVotersListChange`)
* but their number never goes below `MIN_VOTING_ACCOUNTS`.
*/
uint public votingAccountsNumber;
/**
* @dev Version of voting accounts list.
* This number is increased every time the owners list changes.
* It is used to prevent requests initiated with different owners list from being approved after the list is
* changed - that's easier than checking which of the users who previously approved the request have been removed.
*/
uint private votingAccountsListGeneration;
/**
* @notice Emitted when an `address` is added to the owners list
*/
event VoterAdded(address);
/**
* @notice Emitted when `address` is removed from owners list
*/
event VoterRemoved(address);
/**
* @dev Add an address to the list of owners.
* Does nothing if the address is already an owner.
*/
function _addVotingAccount(address addr) private {
require(
addr != address(0),
"cannot add zero address to voting accounts list"
);
if (!isVotingAccount[addr]) {
assert(votingAccountsNumber < type(uint).max);
isVotingAccount[addr] = true;
votingAccountsNumber += 1;
emit VoterAdded(addr);
}
}
/**
* @dev Remove an address from the list of owners.
* Does nothing if the address is not an owner.
*/
function _removeVotingAccount(address addr) private {
if (isVotingAccount[addr]) {
require(
votingAccountsNumber - 1 >= MIN_VOTING_ACCOUNTS,
"not enough voting accounts will remain"
);
isVotingAccount[addr] = false;
votingAccountsNumber -= 1;
emit VoterRemoved(addr);
}
}
// endregion
// region generic request handling
struct Request {
mapping(address => bool) approvedBy;
uint approvals;
bool completed;
/** @dev `votingAccountsListGeneration` at moment of this request creation */
uint generation;
/**
* @dev a timestamp (in seconds since UNIX epoch, like `block.timestamp`)
* after which the request can no longer be approved
*/
uint deadline;
}
mapping(bytes32 => Request) private requests;
uint private requestCount = 0;
/**
* @dev Emitted when a request gets executed after getting enough approvals
*/
event RequestCompleted(bytes32 indexed reqId);
/**
* @dev Create a request and approve it from the sender of current transaction.
* @dev The returned request identifier is a pseudo-random number based on request index and previous block hash.
* That makes request ids unpredictable enough to make it difficult enough to create (accidentally or maliciously)
* a confirmation transaction before the request is created.
* @return reqId identifier of the created request; it can be used later to call `_approveRequest`
*/
function _makeRequest() private votingAccountOnly returns (bytes32 reqId) {
reqId = keccak256(
abi.encode(requestCount++, blockhash(block.number - 1))
);
assert(requests[reqId].approvals == 0); // Check for request id collision
requests[reqId].approvedBy[msg.sender] = true;
requests[reqId].approvals = 1;
requests[reqId].generation = votingAccountsListGeneration;
requests[reqId].deadline =
block.timestamp +
REQUEST_APPROVAL_DEADLINE_SECONDS;
}
/**
* @dev Approve given request by the sender of current transaction.
* @return approved `true` iff the approval is successful and is the last approval necessary to execute the request;
* the caller is expected to execute the request immediately in such case.
*/
function _approveRequest(
bytes32 reqId
) private votingAccountOnly returns (bool approved) {
Request storage req = requests[reqId];
require(req.approvals > 0, "invalid request id");
require(!req.completed, "request already completed");
require(
req.generation == votingAccountsListGeneration,
"request invalidated after voters list change"
);
require(block.timestamp <= req.deadline, "request is outdated");
require(
!req.approvedBy[msg.sender],
"already approved by this account"
);
req.approvedBy[msg.sender] = true;
req.approvals += 1;
if (req.approvals >= getMinApprovals()) {
approved = true;
req.completed = true;
emit RequestCompleted(reqId);
}
}
/**
* @notice Returns the number of approvals necessary to execute a request.
* The number is based on current owners list size.
*/
function getMinApprovals() public view returns (uint approvals) {
approvals = (votingAccountsNumber >> 1) + 1;
}
modifier whenTokenAddressValid(ManagedToken token) {
require(address(token) != address(0), "token address cannot be zero");
_;
}
modifier votingAccountOnly() {
require(isVotingAccount[msg.sender], "not a voting account");
_;
}
// endregion
// region constructor
/**
* @param votingAccounts initial list of voting accounts/owners.
* Should contain at least `MIN_VOTING_ACCOUNTS` distinct addresses.
*/
constructor(address[] memory votingAccounts) {
for (uint i = 0; i < votingAccounts.length; ++i) {
_addVotingAccount(votingAccounts[i]);
}
require(
votingAccountsNumber >= MIN_VOTING_ACCOUNTS,
"not enough voting accounts"
);
votingAccountsListGeneration = 1;
}
// endregion
// region owner change
struct OwnerChangeRequest {
ManagedToken token;
address newOwner;
}
mapping(bytes32 => OwnerChangeRequest) private ownerChangeRequests;
/**
* @notice Emitted when token owner change requested
* @param reqId request id
* @param by address that sent the request
* @param token token contract address
* @param newOwner new owner address
*/
event OwnerChangeRequested(
bytes32 reqId,
address by,
address token,
address newOwner
);
/**
* @notice Create a request to change owner of `token` to `newOwner`.
* @notice Emits `OwnerChangeRequested` event with request id and parameters.
* @return reqId the identifier of the request that can later be used with `approveOwnerChange`
*/
function requestOwnerChange(
ManagedToken token,
address newOwner
) external whenTokenAddressValid(token) returns (bytes32 reqId) {
reqId = _makeRequest();
ownerChangeRequests[reqId].token = token;
ownerChangeRequests[reqId].newOwner = newOwner;
emit OwnerChangeRequested(reqId, msg.sender, address(token), newOwner);
}
/**
* @notice Approve an owner change request
* @param reqId request id generated by `requestOwnerChange`
*/
function approveOwnerChange(bytes32 reqId) external {
require(
ownerChangeRequests[reqId].newOwner != address(0),
"invalid owner change request id"
);
if (_approveRequest(reqId)) {
ownerChangeRequests[reqId].token.transferOwnership(
ownerChangeRequests[reqId].newOwner
);
}
}
// endregion
// region voters change
struct VotersChangeRequest {
address[] addVoters;
address[] removeVoters;
}
mapping(bytes32 => VotersChangeRequest) private votersChangeRequests;
/**
* @notice Emitted when owners list change is requested
* @param reqId request id
* @param by address that sent the request
* @param add addresses to add to owners list
* @param remove addresses to remove from owners list
*/
event VotersListChangeRequested(
bytes32 reqId,
address by,
address[] add,
address[] remove
);
/**
* @notice Create a request to change list of owners.
* @notice Emits `VotersListChangeRequested` with request id and parameters.
* @dev When request executes, first `addVoters` will be added to the list then `removeVoters` will be removed.
* So, `removeVoters` has "higher priority" than `addVoters` and if certain address is contained in both of them
* then it will not be a voter after request execution.
* @param addVoters addresses to add to the list
* @param removeVoters addresses to remove from the list
* @return reqId the identifier of the request that can later be used with `approveVotersListChange`
*/
function requestVotersListChange(
address[] calldata addVoters,
address[] calldata removeVoters
) external returns (bytes32 reqId) {
require(
addVoters.length > 0 || removeVoters.length > 0,
"should either add or remove some accounts"
);
reqId = _makeRequest();
votersChangeRequests[reqId].addVoters = addVoters;
votersChangeRequests[reqId].removeVoters = removeVoters;
emit VotersListChangeRequested(
reqId,
msg.sender,
addVoters,
removeVoters
);
}
/**
* @notice Approve owners list change request
* @param reqId request id generated by `requestVotersListChange`
*/
function approveVotersListChange(bytes32 reqId) external {
address[] storage addVoters = votersChangeRequests[reqId].addVoters;
address[] storage removeVoters = votersChangeRequests[reqId]
.removeVoters;
require(
addVoters.length > 0 || removeVoters.length > 0,
"invalid voters list change request"
);
if (_approveRequest(reqId)) {
for (uint i = 0; i < addVoters.length; ++i) {
_addVotingAccount(addVoters[i]);
}
for (uint i = 0; i < removeVoters.length; ++i) {
_removeVotingAccount(removeVoters[i]);
}
}
votingAccountsListGeneration += 1;
}
// endregion
// region pause
mapping(bytes32 => ManagedToken) private pauseRequests;
/**
* @notice Emitted when token pause is requested
* @param reqId request id
* @param by address that sent the request
* @param token token contract address
*/
event PauseRequested(bytes32 reqId, address by, address token);
/**
* @notice Request token pause.
* @notice Emits `PauseRequested` with request id and parameters
* @param token the token to pause
* @return reqId the identifier of the request that can later be used with `approveTokenPause`
*/
function requestTokenPause(
ManagedToken token
) external whenTokenAddressValid(token) returns (bytes32 reqId) {
reqId = _makeRequest();
pauseRequests[reqId] = token;
emit PauseRequested(reqId, msg.sender, address(token));
}
/**
* @notice Approve token pause request
* @param reqId request id generated by `requestTokenPause`
*/
function approveTokenPause(bytes32 reqId) external {
require(
address(pauseRequests[reqId]) != address(0),
"invalid pause request id"
);
if (_approveRequest(reqId)) {
pauseRequests[reqId].pause();
}
}
// endregion
// region unpause
mapping(bytes32 => ManagedToken) private unpauseRequests;
/**
* @notice Emitted when token unpause is requested
* @param reqId request id
* @param by address that sent the request
* @param token token contract address
*/
event UnpauseRequested(bytes32 reqId, address by, address token);
/**
* @notice Request token unpause.
* @notice Emits `UnpauseRequested` with request id and parameters
* @param token the token to unpause
* @return reqId the identifier of the request that can later be used with `approveTokenUnpause`
*/
function requestTokenUnpause(
ManagedToken token
) external whenTokenAddressValid(token) returns (bytes32 reqId) {
reqId = _makeRequest();
unpauseRequests[reqId] = token;
emit UnpauseRequested(reqId, msg.sender, address(token));
}
/**
* @notice Approve token unpause request
* @param reqId request id generated by `requestTokenUnpause`
*/
function approveTokenUnpause(bytes32 reqId) external {
require(
address(unpauseRequests[reqId]) != address(0),
"invalid unpause request id"
);
if (_approveRequest(reqId)) {
unpauseRequests[reqId].unpause();
}
}
// endregion
// region blacklist address
struct BlacklistRequest {
ManagedToken token;
address account;
}
mapping(bytes32 => BlacklistRequest) private blacklistRequests;
/**
* @notice Emitted when blacklisting is requested
* @param reqId request id
* @param by address that sent the request
* @param token token contract address
* @param account the account to add to blacklist
*/
event BlacklistRequested(
bytes32 reqId,
address by,
address token,
address account
);
/**
* @notice Request blacklisting an account.
* @notice Emits `BlacklistRequested` with request id and parameters
* @param token the token to blacklist account in
* @param account address to blacklist
* @return reqId the identifier of the request that can later be used with `approveBlacklist`
*/
function requestBlacklist(
ManagedToken token,
address account
) external whenTokenAddressValid(token) returns (bytes32 reqId) {
reqId = _makeRequest();
blacklistRequests[reqId].token = token;
blacklistRequests[reqId].account = account;
emit BlacklistRequested(reqId, msg.sender, address(token), account);
}
/**
* @notice Approve account blacklisting request
* @param reqId request id generated by `requestBlacklist`
*/
function approveBlacklist(bytes32 reqId) external {
require(
address(blacklistRequests[reqId].token) != address(0),
"invalid blacklist request id"
);
if (_approveRequest(reqId)) {
blacklistRequests[reqId].token.addBlackList(
blacklistRequests[reqId].account
);
}
}
// endregion
// region unblacklist address
mapping(bytes32 => BlacklistRequest) private unblacklistRequests;
/**
* @notice Emitted when un-blacklisting is requested
* @param reqId request id
* @param by address that sent the request
* @param token token contract address
* @param account the account to remove from blacklist
*/
event UnblacklistRequested(
bytes32 reqId,
address by,
address token,
address account
);
/**
* @notice Request un-blacklisting an account.
* @notice Emits `UnblacklistRequested` with request id and parameters
* @param token the token to un-blacklist account in
* @param account address to un-blacklist
* @return reqId the identifier of the request that can later be used with `approveUnblacklist`
*/
function requestUnblacklist(
ManagedToken token,
address account
) external whenTokenAddressValid(token) returns (bytes32 reqId) {
reqId = _makeRequest();
unblacklistRequests[reqId].token = token;
unblacklistRequests[reqId].account = account;
emit UnblacklistRequested(reqId, msg.sender, address(token), account);
}
/**
* @notice Approve account un-blacklisting request
* @param reqId request id generated by `requestUnblacklist`
*/
function approveUnblacklist(bytes32 reqId) external {
require(
address(unblacklistRequests[reqId].token) != address(0),
"invalid unblacklist request id"
);
if (_approveRequest(reqId)) {
unblacklistRequests[reqId].token.removeBlackList(
unblacklistRequests[reqId].account
);
}
}
// endregion
// region destroy black funds
mapping(bytes32 => BlacklistRequest) private blackFundsDestroyRequests;
/**
* @notice Emitted when destruction of tokens owned by a blacklisted account is requested
* @param reqId request id
* @param by address that sent the request
* @param token token contract address
* @param account the account to remove tokens from
*/
event BlackFundsDestructionRequested(
bytes32 reqId,
address by,
address token,
address account
);
/**
* @notice Request burning of tokens owned by a blacklisted address.
* @notice Emits `BlackFundsDestructionRequested` with request id and parameters
* @param token token contract
* @param account the blacklisted address whose tokens should be burned
* @return reqId the identifier of the request that can later be used with `approveBlackFundsDestruction`
*/
function requestBlackFundsDestruction(
ManagedToken token,
address account
) external whenTokenAddressValid(token) returns (bytes32 reqId) {
reqId = _makeRequest();
blackFundsDestroyRequests[reqId].token = token;
blackFundsDestroyRequests[reqId].account = account;
emit BlackFundsDestructionRequested(
reqId,
msg.sender,
address(token),
account
);
}
/**
* @notice Approve request for burning tokens owned by a blacklisted account.
* @param reqId request id generated by `requestBlackFundsDestruction`
*/
function approveBlackFundsDestruction(bytes32 reqId) external {
require(
address(blackFundsDestroyRequests[reqId].token) != address(0),
"invalid funds destruction request id"
);
if (_approveRequest(reqId)) {
blackFundsDestroyRequests[reqId].token.destroyBlackFunds(
blackFundsDestroyRequests[reqId].account
);
}
}
// endregion
// region deprecate
struct DeprecationRequest {
ManagedToken token;
address upgradedToken;
}
mapping(bytes32 => DeprecationRequest) private deprecationRequests;
/**
* @notice Emitted when token contract deprecation is requested
* @param reqId request id
* @param by address that sent the request
* @param token token contract address
* @param upgraded address of upgraded token implementation
*/
event DeprecationRequested(
bytes32 reqId,
address by,
address token,
address upgraded
);
/**
* @notice Request deprecation of token contract.
* @notice Emits `DeprecationRequested` with request id and parameters
* @param token token contract
* @param upgraded new implementation contract
* @return reqId the identifier of the request that can later be used with `approveDeprecation`
*/
function requestDeprecation(
ManagedToken token,
address upgraded
) external whenTokenAddressValid(token) returns (bytes32 reqId) {
require(upgraded != address(0), "cannot upgrade to zero address");
reqId = _makeRequest();
deprecationRequests[reqId].token = token;
deprecationRequests[reqId].upgradedToken = upgraded;
emit DeprecationRequested(reqId, msg.sender, address(token), upgraded);
}
/**
* @notice Approve request for deprecation of token contract
* @param reqId request id generated by `requestDeprecation`
*/
function approveDeprecation(bytes32 reqId) external {
require(
address(deprecationRequests[reqId].token) != address(0),
"invalid deprecation request id"
);
if (_approveRequest(reqId)) {
deprecationRequests[reqId].token.deprecate(
deprecationRequests[reqId].upgradedToken
);
}
}
// endregion
// region issue
struct TokenIssueRequest {
ManagedToken token;
address to;
uint amount;
}
mapping(bytes32 => TokenIssueRequest) private issueRequests;
/**
* @notice Emitted when token issue is requested
* @param reqId request id
* @param by address that sent the request
* @param token token contract address
* @param amount amount of tokens to create
* @param to address to send token to
*/
event IssueRequested(
bytes32 reqId,
address by,
address token,
uint amount,
address to
);
/**
* @notice Request issue (mint, emission) of new tokens.
* @notice Emits `IssueRequested` with request id and parameters
* @param token token contract
* @param amount number of tokens to create
* @param to address to send tokens to
* @return reqId the identifier of the request that can later be used with `approveIssue`
*/
function requestIssue(
ManagedToken token,
uint amount,
address to
) external whenTokenAddressValid(token) returns (bytes32 reqId) {
require(amount > 0, "cannot issue 0 tokens");
reqId = _makeRequest();
issueRequests[reqId].token = token;
issueRequests[reqId].to = to;
issueRequests[reqId].amount = amount;
emit IssueRequested(reqId, msg.sender, address(token), amount, to);
}
/**
* @notice Approve request for tokens emission
* @param reqId request id generated by `requestIssue`
*/
function approveIssue(bytes32 reqId) external {
require(
address(issueRequests[reqId].token) != address(0),
"invalid issue request id"
);
if (_approveRequest(reqId)) {
issueRequests[reqId].token.issue(
issueRequests[reqId].amount,
issueRequests[reqId].to
);
}
}
// endregion
// region redeem
struct RedeemRequest {
ManagedToken token;
uint amount;
}
mapping(bytes32 => RedeemRequest) private redeemRequests;
/**
* @notice Emitted when token destruction
* @param reqId request id
* @param by address that sent the request
* @param token token contract address
* @param amount amount of tokens to burn
*/
event RedeemRequested(
bytes32 reqId,
address by,
address token,
uint amount
);
/**
* @notice Request redeeming (burning) tokens.
* @notice Tokens should be first transferred to token's owner address - this contract.
* @notice Emits `RedeemRequested` with request id and parameters
* @param token token contract
* @param amount number of tokens to burn
* @return reqId the identifier of the request that can later be used with `approveRedeem`
*/
function requestRedeem(
ManagedToken token,
uint amount
) external whenTokenAddressValid(token) returns (bytes32 reqId) {
require(amount > 0, "cannot redeem 0 tokens");
reqId = _makeRequest();
redeemRequests[reqId].token = token;
redeemRequests[reqId].amount = amount;
emit RedeemRequested(reqId, msg.sender, address(token), amount);
}
/**
* @notice Approve request for tokens destruction
* @param reqId request id generated by `requestRedeem`
*/
function approveRedeem(bytes32 reqId) external {
require(
address(redeemRequests[reqId].token) != address(0),
"invalid redeem request id"
);
if (_approveRequest(reqId)) {
redeemRequests[reqId].token.redeem(redeemRequests[reqId].amount);
}
}
// endregion
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.26;
interface ERC165 {
/**
* @notice Query if a contract implements an interface
* @param interfaceID The interface identifier, as specified in ERC-165
* @dev Interface identification is specified in ERC-165.
* @return `true` if the contract implements `interfaceID` and
* `interfaceID` is not 0xffffffff, `false` otherwise
*/
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
/**
* @title ERC-173 Contract Ownership Standard
* @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0
*/
interface ERC173 is ERC165 {
/**
* @dev This emits when ownership of a contract changes.
*/
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @notice Get the address of the owner
* @return The address of the owner.
*/
function owner() external view returns (address);
/**
* @notice Set the address of the new owner of the contract
* @dev Set _newOwner to address(0) to renounce any ownership.
* @param _newOwner The address of the new owner of the contract
*/
function transferOwnership(address _newOwner) external;
}
/**
* @title Interface for a contract that may have some of it's operations be paused
*/
interface IPausable {
/**
* @notice Pause operations of this contract
* @dev This method must fail if called by unauthorized user
*/
function pause() external;
/**
* @notice Resume paused operations of this contract
* @dev This method must fail if called by unauthorized user
*/
function unpause() external;
/**
* @notice Emitted when the contract gets paused
*/
event Pause();
/**
* @notice Emitted when the contract gets unpaused
*/
event Unpause();
}
/**
* @title Interface for token contracts with blacklist management functionality
*/
interface IBlackList {
/**
* @notice Add given address to blacklist.
* @param _evilUser the address to add to blacklist
*/
function addBlackList(address _evilUser) external;
/**
* @notice Remove given address from blacklist.
* @param _clearedUser the address to remove from blacklist
*/
function removeBlackList(address _clearedUser) external;
/**
* @dev Destroy tokens owned by a blacklisted account.
* @param _blackListedUser the blacklisted address
*/
function destroyBlackFunds(address _blackListedUser) external;
/**
* Emitted when tokens owned by a blacklisted address are destroyed.
* @param _blackListedUser the blacklisted account
* @param _balance amount of tokens previously owned by the account
*/
event DestroyedBlackFunds(address _blackListedUser, uint _balance);
/**
* Emitted when an address is added to the blacklist
* @param _user the address added to the blacklist
*/
event AddedBlackList(address _user);
/**
* Emitted when an address is removed from blacklist
* @param _user the address removed from the blacklist
*/
event RemovedBlackList(address _user);
}
interface IDeprecatable {
/**
* @notice Mark this contract as deprecated and start delegating some operations to a different contract
* @param _upgradedAddress address of new contract to delegate calls to
*/
function deprecate(address _upgradedAddress) external;
}
/**
* @title Methods for token supply management (token emission and destruction)
*/
interface ISupply {
/**
* @notice Create new tokens and send them to given address
* @param amount Number of tokens to be issued
* @param to Address to send tokens to
*/
function issue(uint amount, address to) external;
/**
* @notice Redeem (burn) tokens.
* The tokens are withdrawn from the owner address.
* The balance must be enough to cover the redeem or the call will fail.
* @param amount Number of tokens to be redeemed
*/
function redeem(uint amount) external;
/** Emitted when new token are issued */
event Issue(uint amount, address to);
/** Emitted when tokens are redeemed */
event Redeem(uint amount);
}
/**
* @title Interface for token contracts manageable by `MultisigManager` contract.
*/
interface ManagedToken is
ERC173,
IPausable,
IBlackList,
IDeprecatable,
ISupply
{}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address[]","name":"votingAccounts","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"BlackFundsDestructionRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"BlacklistRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"upgraded","type":"address"}],"name":"DeprecationRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"IssueRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChangeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"PauseRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RedeemRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"RequestCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"UnblacklistRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UnpauseRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"VoterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"VoterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address[]","name":"add","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"remove","type":"address[]"}],"name":"VotersListChangeRequested","type":"event"},{"inputs":[],"name":"MIN_VOTING_ACCOUNTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUEST_APPROVAL_DEADLINE_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveBlackFundsDestruction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveDeprecation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveIssue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveOwnerChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveTokenPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveTokenUnpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveUnblacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveVotersListChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMinApprovals","outputs":[{"internalType":"uint256","name":"approvals","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isVotingAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"requestBlackFundsDestruction","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"requestBlacklist","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"upgraded","type":"address"}],"name":"requestDeprecation","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"requestIssue","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"requestOwnerChange","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"requestRedeem","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"}],"name":"requestTokenPause","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"}],"name":"requestTokenUnpause","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"requestUnblacklist","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addVoters","type":"address[]"},{"internalType":"address[]","name":"removeVoters","type":"address[]"}],"name":"requestVotersListChange","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingAccountsNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600060045534801561001557600080fd5b506040516143f83803806143f883398181016040528101906100379190610433565b60005b81518110156100775761006c8282815181106100595761005861047c565b5b60200260200101516100cc60201b60201c565b80600101905061003a565b50600360015410156100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b590610508565b60405180910390fd5b600160028190555050610680565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361013b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101329061059a565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610265577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600154106101bd576101bc6105ba565b5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018060008282546102269190610622565b925050819055507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b88160405161025c9190610665565b60405180910390a15b50565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102ca82610281565b810181811067ffffffffffffffff821117156102e9576102e8610292565b5b80604052505050565b60006102fc610268565b905061030882826102c1565b919050565b600067ffffffffffffffff82111561032857610327610292565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103698261033e565b9050919050565b6103798161035e565b811461038457600080fd5b50565b60008151905061039681610370565b92915050565b60006103af6103aa8461030d565b6102f2565b905080838252602082019050602084028301858111156103d2576103d1610339565b5b835b818110156103fb57806103e78882610387565b8452602084019350506020810190506103d4565b5050509392505050565b600082601f83011261041a5761041961027c565b5b815161042a84826020860161039c565b91505092915050565b60006020828403121561044957610448610272565b5b600082015167ffffffffffffffff81111561046757610466610277565b5b61047384828501610405565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b7f6e6f7420656e6f75676820766f74696e67206163636f756e7473000000000000600082015250565b60006104f2601a836104ab565b91506104fd826104bc565b602082019050919050565b60006020820190508181036000830152610521816104e5565b9050919050565b7f63616e6e6f7420616464207a65726f206164647265737320746f20766f74696e60008201527f67206163636f756e7473206c6973740000000000000000000000000000000000602082015250565b6000610584602f836104ab565b915061058f82610528565b604082019050919050565b600060208201905081810360008301526105b381610577565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061062d826105e9565b9150610638836105e9565b92508282019050808211156106505761064f6105f3565b5b92915050565b61065f8161035e565b82525050565b600060208201905061067a6000830184610656565b92915050565b613d698061068f6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80635caad4d1116100de578063ad28e8dd11610097578063e4dcc59311610071578063e4dcc59314610480578063ead691121461049c578063f75eafe1146104cc578063faa179e7146104e857610173565b8063ad28e8dd14610416578063c8e52fe214610434578063d5e063e41461045057610173565b80635caad4d11461031e57806365b89f9f1461033a57806375e71b741461036a57806377d69a171461039a57806378e93a8f146103ca5780639587eab5146103fa57610173565b80633c9321d8116101305780633c9321d81461023857806349f6a718146102685780634ba3f988146102985780634d3e2490146102c857806350539aa8146102e6578063538dafa31461030257610173565b80630252ec29146101785780630e7af6611461019457806314106703146101b05780631453921a146101e057806316a3f412146101fe57806330e148471461021a575b600080fd5b610192600480360381019061018d9190612b07565b610518565b005b6101ae60048036038101906101a99190612b07565b6106be565b005b6101ca60048036038101906101c59190612ba4565b61084c565b6040516101d79190612be0565b60405180910390f35b6101e861095b565b6040516101f59190612c14565b60405180910390f35b61021860048036038101906102139190612b07565b610961565b005b610222610aef565b60405161022f9190612c14565b60405180910390f35b610252600480360381019061024d9190612c5b565b610af4565b60405161025f9190612be0565b60405180910390f35b610282600480360381019061027d9190612d00565b610c5e565b60405161028f9190612be0565b60405180910390f35b6102b260048036038101906102ad9190612dad565b610d52565b6040516102bf9190612be0565b60405180910390f35b6102d0610f1d565b6040516102dd9190612c14565b60405180910390f35b61030060048036038101906102fb9190612b07565b610f36565b005b61031c60048036038101906103179190612b07565b6110a4565b005b61033860048036038101906103339190612b07565b61121e565b005b610354600480360381019061034f9190612e00565b6113ac565b6040516103619190612be0565b60405180910390f35b610384600480360381019061037f9190612c5b565b61151f565b6040516103919190612be0565b60405180910390f35b6103b460048036038101906103af9190612c5b565b6116f8565b6040516103c19190612be0565b60405180910390f35b6103e460048036038101906103df9190612e40565b611862565b6040516103f19190612e88565b60405180910390f35b610414600480360381019061040f9190612b07565b611882565b005b61041e611a10565b60405161042b9190612c14565b60405180910390f35b61044e60048036038101906104499190612b07565b611a17565b005b61046a60048036038101906104659190612c5b565b611b5e565b6040516104779190612be0565b60405180910390f35b61049a60048036038101906104959190612b07565b611cc8565b005b6104b660048036038101906104b19190612c5b565b611e0f565b6040516104c39190612be0565b60405180910390f35b6104e660048036038101906104e19190612b07565b611f79565b005b61050260048036038101906104fd9190612ba4565b612107565b60405161050f9190612be0565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490612f00565b60405180910390fd5b6105c681612216565b156106bb57600d600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b696a6ad600d600084815260200190815260200160002060020154600d600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610688929190612f2f565b600060405180830381600087803b1580156106a257600080fd5b505af11580156106b6573d6000803e3d6000fd5b505050505b50565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075a90612fa4565b60405180910390fd5b61076c81612216565b15610849576005600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6005600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016108169190612fc4565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b505050505b50565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b59061302b565b60405180910390fd5b6108c661254e565b9150826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3b82dbef2f3ed22abde3e986b105d003e3018422e845e144f870ec1e2ab168b182338560405161094d9392919061304b565b60405180910390a150919050565b60015481565b600073ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd906130f4565b60405180910390fd5b610a0f81612216565b15610aec57600b600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3bdc228600b600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610ab99190612fc4565b600060405180830381600087803b158015610ad357600080fd5b505af1158015610ae7573d6000803e3d6000fd5b505050505b50565b600381565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d9061302b565b60405180910390fd5b610b6e61254e565b915083600b600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600b600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f60aa1c40755ff9e9c57769818cb4e2db7032740713505c57d1f9e606c87f5b1d82338686604051610c4f9493929190613114565b60405180910390a15092915050565b600080858590501180610c745750600083839050115b610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa906131cb565b60405180910390fd5b610cbb61254e565b90508484600660008481526020019081526020016000206000019190610ce2929190612a0a565b508282600660008481526020019081526020016000206001019190610d08929190612a0a565b507f77b5e439ba5737d6518b5fa282a81ec318be946c14026c3f96ed576101482414813387878787604051610d42969594939291906132ae565b60405180910390a1949350505050565b600083600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9061302b565b60405180910390fd5b60008411610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90613351565b60405180910390fd5b610e0f61254e565b915084600d600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600d600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600d6000848152602001908152602001600020600201819055507fbbb3cd25643b48b0f39f5ed23f1b95edc1d3bbafed645cff4c2aa4f8c534592f8233878787604051610f0d959493929190613371565b60405180910390a1509392505050565b6000600180600154901c610f3191906133f3565b905090565b600073ffffffffffffffffffffffffffffffffffffffff16600e600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290613473565b60405180910390fd5b610fe481612216565b156110a157600e600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75600e6000848152602001908152602001600020600101546040518263ffffffff1660e01b815260040161106e9190612c14565b600060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050505b50565b600060066000838152602001908152602001600020600001905060006006600084815260200190815260200160002060010190506000828054905011806110ef575060008180549050115b61112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613505565b60405180910390fd5b61113783612216565b156111ff5760005b828054905081101561119c5761119183828154811061116157611160613525565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612721565b80600101905061113f565b5060005b81805490508110156111fd576111f28282815481106111c2576111c1613525565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166128bd565b8060010190506111a0565b505b60016002600082825461121291906133f3565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906135a0565b60405180910390fd5b6112cc81612216565b156113a957600c600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630753c30c600c600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016113769190612fc4565b600060405180830381600087803b15801561139057600080fd5b505af11580156113a4573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361141e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114159061302b565b60405180910390fd5b60008311611461576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114589061360c565b60405180910390fd5b61146961254e565b915083600e600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e6000848152602001908152602001600020600101819055507faa7dc873a7d37b94883eae5b185beafe0223de340014bc7a1690496363d5bb2882338686604051611510949392919061362c565b60405180910390a15092915050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115889061302b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f7906136bd565b60405180910390fd5b61160861254e565b915083600c600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3ae19498c83643a3c3cd3c51fd961cdbc50cad7a99d87ae56f6f56395b84a257823386866040516116e99493929190613114565b60405180910390a15092915050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117619061302b565b60405180910390fd5b61177261254e565b915083600a600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600a600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f32f105be765c08b0dd3a11fb243a1d1c3187adf79ce4e70077b563774f53313b823386866040516118539493929190613114565b60405180910390a15092915050565b60006020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff166009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613729565b60405180910390fd5b61193081612216565b15611a0d576009600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ecb93c06009600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016119da9190612fc4565b600060405180830381600087803b1580156119f457600080fd5b505af1158015611a08573d6000803e3d6000fd5b505050505b50565b6202a30081565b600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090613795565b60405180910390fd5b611ac281612216565b15611b5b576007600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b4257600080fd5b505af1158015611b56573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc79061302b565b60405180910390fd5b611bd861254e565b9150836009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826009600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f45468c34c3195dc2fe142866e4d01c6d8f21410db90ebd9132aef6cee5cc81dd82338686604051611cb99493929190613114565b60405180910390a15092915050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190613801565b60405180910390fd5b611d7381612216565b15611e0c576008600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e789061302b565b60405180910390fd5b611e8961254e565b9150836005600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826005600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9ac22cbcacf108dcf9ace6c53af2261f39a349b724ad16201a0f342c93e4046582338686604051611f6a9493929190613114565b60405180910390a15092915050565b600073ffffffffffffffffffffffffffffffffffffffff16600a600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361201e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120159061386d565b60405180910390fd5b61202781612216565b1561210457600a600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4997dc5600a600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016120d19190612fc4565b600060405180830381600087803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b505050505b50565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121709061302b565b60405180910390fd5b61218161254e565b9150826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fdd4758c2ebea7c3004ca2af3322f3878f26109bded4f13b532832b871a1f86618233856040516122089392919061304b565b60405180910390a150919050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906138d9565b60405180910390fd5b60006003600084815260200190815260200160002090506000816001015411612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f890613945565b60405180910390fd5b8060020160009054906101000a900460ff1615612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a906139b1565b60405180910390fd5b60025481600301541461239b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239290613a43565b60405180910390fd5b80600401544211156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990613aaf565b60405180910390fd5b8060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246890613b1b565b60405180910390fd5b60018160000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018160010160008282546124e091906133f3565b925050819055506124ef610f1d565b816001015410612548576001915060018160020160006101000a81548160ff021916908315150217905550827f03442af529c92a1449dcf9997323ccb9f819ab9b1e29ac10b82e45e809ecf11b60405160405180910390a25b50919050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d2906138d9565b60405180910390fd5b600460008154809291906125ee90613b3b565b919050556001436125ff9190613b83565b40604051602001612611929190613bb7565b60405160208183030381529060405280519060200120905060006003600083815260200190815260200160002060010154146126505761264f613be0565b5b60016003600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360008381526020019081526020016000206001018190555060025460036000838152602001908152602001600020600301819055506202a3004261270491906133f3565b600360008381526020019081526020016000206004018190555090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790613c81565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001541061281257612811613be0565b5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600180600082825461287b91906133f3565b925050819055507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b8816040516128b19190612fc4565b60405180910390a15b50565b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a075760036001805461291e9190613b83565b101561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690613d13565b60405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018060008282546129c89190613b83565b925050819055507fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d644816040516129fe9190612fc4565b60405180910390a15b50565b828054828255906000526020600020908101928215612a99579160200282015b82811115612a9857823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612a2a565b5b509050612aa69190612aaa565b5090565b5b80821115612ac3576000816000905550600101612aab565b5090565b600080fd5b600080fd5b6000819050919050565b612ae481612ad1565b8114612aef57600080fd5b50565b600081359050612b0181612adb565b92915050565b600060208284031215612b1d57612b1c612ac7565b5b6000612b2b84828501612af2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b5f82612b34565b9050919050565b6000612b7182612b54565b9050919050565b612b8181612b66565b8114612b8c57600080fd5b50565b600081359050612b9e81612b78565b92915050565b600060208284031215612bba57612bb9612ac7565b5b6000612bc884828501612b8f565b91505092915050565b612bda81612ad1565b82525050565b6000602082019050612bf56000830184612bd1565b92915050565b6000819050919050565b612c0e81612bfb565b82525050565b6000602082019050612c296000830184612c05565b92915050565b612c3881612b54565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b60008060408385031215612c7257612c71612ac7565b5b6000612c8085828601612b8f565b9250506020612c9185828601612c46565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612cc057612cbf612c9b565b5b8235905067ffffffffffffffff811115612cdd57612cdc612ca0565b5b602083019150836020820283011115612cf957612cf8612ca5565b5b9250929050565b60008060008060408587031215612d1a57612d19612ac7565b5b600085013567ffffffffffffffff811115612d3857612d37612acc565b5b612d4487828801612caa565b9450945050602085013567ffffffffffffffff811115612d6757612d66612acc565b5b612d7387828801612caa565b925092505092959194509250565b612d8a81612bfb565b8114612d9557600080fd5b50565b600081359050612da781612d81565b92915050565b600080600060608486031215612dc657612dc5612ac7565b5b6000612dd486828701612b8f565b9350506020612de586828701612d98565b9250506040612df686828701612c46565b9150509250925092565b60008060408385031215612e1757612e16612ac7565b5b6000612e2585828601612b8f565b9250506020612e3685828601612d98565b9150509250929050565b600060208284031215612e5657612e55612ac7565b5b6000612e6484828501612c46565b91505092915050565b60008115159050919050565b612e8281612e6d565b82525050565b6000602082019050612e9d6000830184612e79565b92915050565b600082825260208201905092915050565b7f696e76616c696420697373756520726571756573742069640000000000000000600082015250565b6000612eea601883612ea3565b9150612ef582612eb4565b602082019050919050565b60006020820190508181036000830152612f1981612edd565b9050919050565b612f2981612b54565b82525050565b6000604082019050612f446000830185612c05565b612f516020830184612f20565b9392505050565b7f696e76616c6964206f776e6572206368616e6765207265717565737420696400600082015250565b6000612f8e601f83612ea3565b9150612f9982612f58565b602082019050919050565b60006020820190508181036000830152612fbd81612f81565b9050919050565b6000602082019050612fd96000830184612f20565b92915050565b7f746f6b656e20616464726573732063616e6e6f74206265207a65726f00000000600082015250565b6000613015601c83612ea3565b915061302082612fdf565b602082019050919050565b6000602082019050818103600083015261304481613008565b9050919050565b60006060820190506130606000830186612bd1565b61306d6020830185612f20565b61307a6040830184612f20565b949350505050565b7f696e76616c69642066756e6473206465737472756374696f6e2072657175657360008201527f7420696400000000000000000000000000000000000000000000000000000000602082015250565b60006130de602483612ea3565b91506130e982613082565b604082019050919050565b6000602082019050818103600083015261310d816130d1565b9050919050565b60006080820190506131296000830187612bd1565b6131366020830186612f20565b6131436040830185612f20565b6131506060830184612f20565b95945050505050565b7f73686f756c642065697468657220616464206f722072656d6f766520736f6d6560008201527f206163636f756e74730000000000000000000000000000000000000000000000602082015250565b60006131b5602983612ea3565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b600082825260208201905092915050565b6000819050919050565b61320f81612b54565b82525050565b60006132218383613206565b60208301905092915050565b600061323c6020840184612c46565b905092915050565b6000602082019050919050565b600061325d83856131eb565b9350613268826131fc565b8060005b858110156132a15761327e828461322d565b6132888882613215565b975061329383613244565b92505060018101905061326c565b5085925050509392505050565b60006080820190506132c36000830189612bd1565b6132d06020830188612f20565b81810360408301526132e3818688613251565b905081810360608301526132f8818486613251565b9050979650505050505050565b7f63616e6e6f74206973737565203020746f6b656e730000000000000000000000600082015250565b600061333b601583612ea3565b915061334682613305565b602082019050919050565b6000602082019050818103600083015261336a8161332e565b9050919050565b600060a0820190506133866000830188612bd1565b6133936020830187612f20565b6133a06040830186612f20565b6133ad6060830185612c05565b6133ba6080830184612f20565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133fe82612bfb565b915061340983612bfb565b9250828201905080821115613421576134206133c4565b5b92915050565b7f696e76616c69642072656465656d207265717565737420696400000000000000600082015250565b600061345d601983612ea3565b915061346882613427565b602082019050919050565b6000602082019050818103600083015261348c81613450565b9050919050565b7f696e76616c696420766f74657273206c697374206368616e676520726571756560008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ef602283612ea3565b91506134fa82613493565b604082019050919050565b6000602082019050818103600083015261351e816134e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696e76616c6964206465707265636174696f6e20726571756573742069640000600082015250565b600061358a601e83612ea3565b915061359582613554565b602082019050919050565b600060208201905081810360008301526135b98161357d565b9050919050565b7f63616e6e6f742072656465656d203020746f6b656e7300000000000000000000600082015250565b60006135f6601683612ea3565b9150613601826135c0565b602082019050919050565b60006020820190508181036000830152613625816135e9565b9050919050565b60006080820190506136416000830187612bd1565b61364e6020830186612f20565b61365b6040830185612f20565b6136686060830184612c05565b95945050505050565b7f63616e6e6f74207570677261646520746f207a65726f20616464726573730000600082015250565b60006136a7601e83612ea3565b91506136b282613671565b602082019050919050565b600060208201905081810360008301526136d68161369a565b9050919050565b7f696e76616c696420626c61636b6c697374207265717565737420696400000000600082015250565b6000613713601c83612ea3565b915061371e826136dd565b602082019050919050565b6000602082019050818103600083015261374281613706565b9050919050565b7f696e76616c696420706175736520726571756573742069640000000000000000600082015250565b600061377f601883612ea3565b915061378a82613749565b602082019050919050565b600060208201905081810360008301526137ae81613772565b9050919050565b7f696e76616c696420756e70617573652072657175657374206964000000000000600082015250565b60006137eb601a83612ea3565b91506137f6826137b5565b602082019050919050565b6000602082019050818103600083015261381a816137de565b9050919050565b7f696e76616c696420756e626c61636b6c69737420726571756573742069640000600082015250565b6000613857601e83612ea3565b915061386282613821565b602082019050919050565b600060208201905081810360008301526138868161384a565b9050919050565b7f6e6f74206120766f74696e67206163636f756e74000000000000000000000000600082015250565b60006138c3601483612ea3565b91506138ce8261388d565b602082019050919050565b600060208201905081810360008301526138f2816138b6565b9050919050565b7f696e76616c696420726571756573742069640000000000000000000000000000600082015250565b600061392f601283612ea3565b915061393a826138f9565b602082019050919050565b6000602082019050818103600083015261395e81613922565b9050919050565b7f7265717565737420616c726561647920636f6d706c6574656400000000000000600082015250565b600061399b601983612ea3565b91506139a682613965565b602082019050919050565b600060208201905081810360008301526139ca8161398e565b9050919050565b7f7265717565737420696e76616c69646174656420616674657220766f7465727360008201527f206c697374206368616e67650000000000000000000000000000000000000000602082015250565b6000613a2d602c83612ea3565b9150613a38826139d1565b604082019050919050565b60006020820190508181036000830152613a5c81613a20565b9050919050565b7f72657175657374206973206f7574646174656400000000000000000000000000600082015250565b6000613a99601383612ea3565b9150613aa482613a63565b602082019050919050565b60006020820190508181036000830152613ac881613a8c565b9050919050565b7f616c726561647920617070726f7665642062792074686973206163636f756e74600082015250565b6000613b05602083612ea3565b9150613b1082613acf565b602082019050919050565b60006020820190508181036000830152613b3481613af8565b9050919050565b6000613b4682612bfb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b7857613b776133c4565b5b600182019050919050565b6000613b8e82612bfb565b9150613b9983612bfb565b9250828203905081811115613bb157613bb06133c4565b5b92915050565b6000604082019050613bcc6000830185612c05565b613bd96020830184612bd1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f63616e6e6f7420616464207a65726f206164647265737320746f20766f74696e60008201527f67206163636f756e7473206c6973740000000000000000000000000000000000602082015250565b6000613c6b602f83612ea3565b9150613c7682613c0f565b604082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f6e6f7420656e6f75676820766f74696e67206163636f756e74732077696c6c2060008201527f72656d61696e0000000000000000000000000000000000000000000000000000602082015250565b6000613cfd602683612ea3565b9150613d0882613ca1565b604082019050919050565b60006020820190508181036000830152613d2c81613cf0565b905091905056fea2646970667358221220cc52973225e45397eeaaef16354125b0e5bea0b336c2a67508be38094068b07064736f6c634300081a0033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000060000000000000000000000004c2f6ad396ff2d1d105d0f6261743caec85aa564000000000000000000000000aa93b852f5a54ddb130ff5c79f8a838c492bf46e0000000000000000000000008798c87519e09a736efef4793e07d441f1fd7c21000000000000000000000000c0d19d3984d67e1d7de09d1d66e9cbd6bf2a9a920000000000000000000000001008554cf8b02ca890fb49540677a402955cb560000000000000000000000000334fe515c45851ff90a5313a6540e81954d91a11
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c80635caad4d1116100de578063ad28e8dd11610097578063e4dcc59311610071578063e4dcc59314610480578063ead691121461049c578063f75eafe1146104cc578063faa179e7146104e857610173565b8063ad28e8dd14610416578063c8e52fe214610434578063d5e063e41461045057610173565b80635caad4d11461031e57806365b89f9f1461033a57806375e71b741461036a57806377d69a171461039a57806378e93a8f146103ca5780639587eab5146103fa57610173565b80633c9321d8116101305780633c9321d81461023857806349f6a718146102685780634ba3f988146102985780634d3e2490146102c857806350539aa8146102e6578063538dafa31461030257610173565b80630252ec29146101785780630e7af6611461019457806314106703146101b05780631453921a146101e057806316a3f412146101fe57806330e148471461021a575b600080fd5b610192600480360381019061018d9190612b07565b610518565b005b6101ae60048036038101906101a99190612b07565b6106be565b005b6101ca60048036038101906101c59190612ba4565b61084c565b6040516101d79190612be0565b60405180910390f35b6101e861095b565b6040516101f59190612c14565b60405180910390f35b61021860048036038101906102139190612b07565b610961565b005b610222610aef565b60405161022f9190612c14565b60405180910390f35b610252600480360381019061024d9190612c5b565b610af4565b60405161025f9190612be0565b60405180910390f35b610282600480360381019061027d9190612d00565b610c5e565b60405161028f9190612be0565b60405180910390f35b6102b260048036038101906102ad9190612dad565b610d52565b6040516102bf9190612be0565b60405180910390f35b6102d0610f1d565b6040516102dd9190612c14565b60405180910390f35b61030060048036038101906102fb9190612b07565b610f36565b005b61031c60048036038101906103179190612b07565b6110a4565b005b61033860048036038101906103339190612b07565b61121e565b005b610354600480360381019061034f9190612e00565b6113ac565b6040516103619190612be0565b60405180910390f35b610384600480360381019061037f9190612c5b565b61151f565b6040516103919190612be0565b60405180910390f35b6103b460048036038101906103af9190612c5b565b6116f8565b6040516103c19190612be0565b60405180910390f35b6103e460048036038101906103df9190612e40565b611862565b6040516103f19190612e88565b60405180910390f35b610414600480360381019061040f9190612b07565b611882565b005b61041e611a10565b60405161042b9190612c14565b60405180910390f35b61044e60048036038101906104499190612b07565b611a17565b005b61046a60048036038101906104659190612c5b565b611b5e565b6040516104779190612be0565b60405180910390f35b61049a60048036038101906104959190612b07565b611cc8565b005b6104b660048036038101906104b19190612c5b565b611e0f565b6040516104c39190612be0565b60405180910390f35b6104e660048036038101906104e19190612b07565b611f79565b005b61050260048036038101906104fd9190612ba4565b612107565b60405161050f9190612be0565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490612f00565b60405180910390fd5b6105c681612216565b156106bb57600d600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b696a6ad600d600084815260200190815260200160002060020154600d600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610688929190612f2f565b600060405180830381600087803b1580156106a257600080fd5b505af11580156106b6573d6000803e3d6000fd5b505050505b50565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075a90612fa4565b60405180910390fd5b61076c81612216565b15610849576005600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6005600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016108169190612fc4565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b505050505b50565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b59061302b565b60405180910390fd5b6108c661254e565b9150826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3b82dbef2f3ed22abde3e986b105d003e3018422e845e144f870ec1e2ab168b182338560405161094d9392919061304b565b60405180910390a150919050565b60015481565b600073ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd906130f4565b60405180910390fd5b610a0f81612216565b15610aec57600b600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3bdc228600b600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610ab99190612fc4565b600060405180830381600087803b158015610ad357600080fd5b505af1158015610ae7573d6000803e3d6000fd5b505050505b50565b600381565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d9061302b565b60405180910390fd5b610b6e61254e565b915083600b600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600b600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f60aa1c40755ff9e9c57769818cb4e2db7032740713505c57d1f9e606c87f5b1d82338686604051610c4f9493929190613114565b60405180910390a15092915050565b600080858590501180610c745750600083839050115b610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa906131cb565b60405180910390fd5b610cbb61254e565b90508484600660008481526020019081526020016000206000019190610ce2929190612a0a565b508282600660008481526020019081526020016000206001019190610d08929190612a0a565b507f77b5e439ba5737d6518b5fa282a81ec318be946c14026c3f96ed576101482414813387878787604051610d42969594939291906132ae565b60405180910390a1949350505050565b600083600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9061302b565b60405180910390fd5b60008411610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90613351565b60405180910390fd5b610e0f61254e565b915084600d600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600d600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600d6000848152602001908152602001600020600201819055507fbbb3cd25643b48b0f39f5ed23f1b95edc1d3bbafed645cff4c2aa4f8c534592f8233878787604051610f0d959493929190613371565b60405180910390a1509392505050565b6000600180600154901c610f3191906133f3565b905090565b600073ffffffffffffffffffffffffffffffffffffffff16600e600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290613473565b60405180910390fd5b610fe481612216565b156110a157600e600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75600e6000848152602001908152602001600020600101546040518263ffffffff1660e01b815260040161106e9190612c14565b600060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050505b50565b600060066000838152602001908152602001600020600001905060006006600084815260200190815260200160002060010190506000828054905011806110ef575060008180549050115b61112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613505565b60405180910390fd5b61113783612216565b156111ff5760005b828054905081101561119c5761119183828154811061116157611160613525565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612721565b80600101905061113f565b5060005b81805490508110156111fd576111f28282815481106111c2576111c1613525565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166128bd565b8060010190506111a0565b505b60016002600082825461121291906133f3565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906135a0565b60405180910390fd5b6112cc81612216565b156113a957600c600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630753c30c600c600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016113769190612fc4565b600060405180830381600087803b15801561139057600080fd5b505af11580156113a4573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361141e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114159061302b565b60405180910390fd5b60008311611461576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114589061360c565b60405180910390fd5b61146961254e565b915083600e600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e6000848152602001908152602001600020600101819055507faa7dc873a7d37b94883eae5b185beafe0223de340014bc7a1690496363d5bb2882338686604051611510949392919061362c565b60405180910390a15092915050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115889061302b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f7906136bd565b60405180910390fd5b61160861254e565b915083600c600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3ae19498c83643a3c3cd3c51fd961cdbc50cad7a99d87ae56f6f56395b84a257823386866040516116e99493929190613114565b60405180910390a15092915050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117619061302b565b60405180910390fd5b61177261254e565b915083600a600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600a600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f32f105be765c08b0dd3a11fb243a1d1c3187adf79ce4e70077b563774f53313b823386866040516118539493929190613114565b60405180910390a15092915050565b60006020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff166009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613729565b60405180910390fd5b61193081612216565b15611a0d576009600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ecb93c06009600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016119da9190612fc4565b600060405180830381600087803b1580156119f457600080fd5b505af1158015611a08573d6000803e3d6000fd5b505050505b50565b6202a30081565b600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090613795565b60405180910390fd5b611ac281612216565b15611b5b576007600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b4257600080fd5b505af1158015611b56573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc79061302b565b60405180910390fd5b611bd861254e565b9150836009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826009600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f45468c34c3195dc2fe142866e4d01c6d8f21410db90ebd9132aef6cee5cc81dd82338686604051611cb99493929190613114565b60405180910390a15092915050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190613801565b60405180910390fd5b611d7381612216565b15611e0c576008600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e789061302b565b60405180910390fd5b611e8961254e565b9150836005600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826005600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9ac22cbcacf108dcf9ace6c53af2261f39a349b724ad16201a0f342c93e4046582338686604051611f6a9493929190613114565b60405180910390a15092915050565b600073ffffffffffffffffffffffffffffffffffffffff16600a600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361201e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120159061386d565b60405180910390fd5b61202781612216565b1561210457600a600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4997dc5600a600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016120d19190612fc4565b600060405180830381600087803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b505050505b50565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121709061302b565b60405180910390fd5b61218161254e565b9150826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fdd4758c2ebea7c3004ca2af3322f3878f26109bded4f13b532832b871a1f86618233856040516122089392919061304b565b60405180910390a150919050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906138d9565b60405180910390fd5b60006003600084815260200190815260200160002090506000816001015411612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f890613945565b60405180910390fd5b8060020160009054906101000a900460ff1615612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a906139b1565b60405180910390fd5b60025481600301541461239b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239290613a43565b60405180910390fd5b80600401544211156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990613aaf565b60405180910390fd5b8060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246890613b1b565b60405180910390fd5b60018160000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018160010160008282546124e091906133f3565b925050819055506124ef610f1d565b816001015410612548576001915060018160020160006101000a81548160ff021916908315150217905550827f03442af529c92a1449dcf9997323ccb9f819ab9b1e29ac10b82e45e809ecf11b60405160405180910390a25b50919050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d2906138d9565b60405180910390fd5b600460008154809291906125ee90613b3b565b919050556001436125ff9190613b83565b40604051602001612611929190613bb7565b60405160208183030381529060405280519060200120905060006003600083815260200190815260200160002060010154146126505761264f613be0565b5b60016003600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360008381526020019081526020016000206001018190555060025460036000838152602001908152602001600020600301819055506202a3004261270491906133f3565b600360008381526020019081526020016000206004018190555090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790613c81565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001541061281257612811613be0565b5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600180600082825461287b91906133f3565b925050819055507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b8816040516128b19190612fc4565b60405180910390a15b50565b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a075760036001805461291e9190613b83565b101561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690613d13565b60405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018060008282546129c89190613b83565b925050819055507fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d644816040516129fe9190612fc4565b60405180910390a15b50565b828054828255906000526020600020908101928215612a99579160200282015b82811115612a9857823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612a2a565b5b509050612aa69190612aaa565b5090565b5b80821115612ac3576000816000905550600101612aab565b5090565b600080fd5b600080fd5b6000819050919050565b612ae481612ad1565b8114612aef57600080fd5b50565b600081359050612b0181612adb565b92915050565b600060208284031215612b1d57612b1c612ac7565b5b6000612b2b84828501612af2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b5f82612b34565b9050919050565b6000612b7182612b54565b9050919050565b612b8181612b66565b8114612b8c57600080fd5b50565b600081359050612b9e81612b78565b92915050565b600060208284031215612bba57612bb9612ac7565b5b6000612bc884828501612b8f565b91505092915050565b612bda81612ad1565b82525050565b6000602082019050612bf56000830184612bd1565b92915050565b6000819050919050565b612c0e81612bfb565b82525050565b6000602082019050612c296000830184612c05565b92915050565b612c3881612b54565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b60008060408385031215612c7257612c71612ac7565b5b6000612c8085828601612b8f565b9250506020612c9185828601612c46565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612cc057612cbf612c9b565b5b8235905067ffffffffffffffff811115612cdd57612cdc612ca0565b5b602083019150836020820283011115612cf957612cf8612ca5565b5b9250929050565b60008060008060408587031215612d1a57612d19612ac7565b5b600085013567ffffffffffffffff811115612d3857612d37612acc565b5b612d4487828801612caa565b9450945050602085013567ffffffffffffffff811115612d6757612d66612acc565b5b612d7387828801612caa565b925092505092959194509250565b612d8a81612bfb565b8114612d9557600080fd5b50565b600081359050612da781612d81565b92915050565b600080600060608486031215612dc657612dc5612ac7565b5b6000612dd486828701612b8f565b9350506020612de586828701612d98565b9250506040612df686828701612c46565b9150509250925092565b60008060408385031215612e1757612e16612ac7565b5b6000612e2585828601612b8f565b9250506020612e3685828601612d98565b9150509250929050565b600060208284031215612e5657612e55612ac7565b5b6000612e6484828501612c46565b91505092915050565b60008115159050919050565b612e8281612e6d565b82525050565b6000602082019050612e9d6000830184612e79565b92915050565b600082825260208201905092915050565b7f696e76616c696420697373756520726571756573742069640000000000000000600082015250565b6000612eea601883612ea3565b9150612ef582612eb4565b602082019050919050565b60006020820190508181036000830152612f1981612edd565b9050919050565b612f2981612b54565b82525050565b6000604082019050612f446000830185612c05565b612f516020830184612f20565b9392505050565b7f696e76616c6964206f776e6572206368616e6765207265717565737420696400600082015250565b6000612f8e601f83612ea3565b9150612f9982612f58565b602082019050919050565b60006020820190508181036000830152612fbd81612f81565b9050919050565b6000602082019050612fd96000830184612f20565b92915050565b7f746f6b656e20616464726573732063616e6e6f74206265207a65726f00000000600082015250565b6000613015601c83612ea3565b915061302082612fdf565b602082019050919050565b6000602082019050818103600083015261304481613008565b9050919050565b60006060820190506130606000830186612bd1565b61306d6020830185612f20565b61307a6040830184612f20565b949350505050565b7f696e76616c69642066756e6473206465737472756374696f6e2072657175657360008201527f7420696400000000000000000000000000000000000000000000000000000000602082015250565b60006130de602483612ea3565b91506130e982613082565b604082019050919050565b6000602082019050818103600083015261310d816130d1565b9050919050565b60006080820190506131296000830187612bd1565b6131366020830186612f20565b6131436040830185612f20565b6131506060830184612f20565b95945050505050565b7f73686f756c642065697468657220616464206f722072656d6f766520736f6d6560008201527f206163636f756e74730000000000000000000000000000000000000000000000602082015250565b60006131b5602983612ea3565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b600082825260208201905092915050565b6000819050919050565b61320f81612b54565b82525050565b60006132218383613206565b60208301905092915050565b600061323c6020840184612c46565b905092915050565b6000602082019050919050565b600061325d83856131eb565b9350613268826131fc565b8060005b858110156132a15761327e828461322d565b6132888882613215565b975061329383613244565b92505060018101905061326c565b5085925050509392505050565b60006080820190506132c36000830189612bd1565b6132d06020830188612f20565b81810360408301526132e3818688613251565b905081810360608301526132f8818486613251565b9050979650505050505050565b7f63616e6e6f74206973737565203020746f6b656e730000000000000000000000600082015250565b600061333b601583612ea3565b915061334682613305565b602082019050919050565b6000602082019050818103600083015261336a8161332e565b9050919050565b600060a0820190506133866000830188612bd1565b6133936020830187612f20565b6133a06040830186612f20565b6133ad6060830185612c05565b6133ba6080830184612f20565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133fe82612bfb565b915061340983612bfb565b9250828201905080821115613421576134206133c4565b5b92915050565b7f696e76616c69642072656465656d207265717565737420696400000000000000600082015250565b600061345d601983612ea3565b915061346882613427565b602082019050919050565b6000602082019050818103600083015261348c81613450565b9050919050565b7f696e76616c696420766f74657273206c697374206368616e676520726571756560008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ef602283612ea3565b91506134fa82613493565b604082019050919050565b6000602082019050818103600083015261351e816134e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696e76616c6964206465707265636174696f6e20726571756573742069640000600082015250565b600061358a601e83612ea3565b915061359582613554565b602082019050919050565b600060208201905081810360008301526135b98161357d565b9050919050565b7f63616e6e6f742072656465656d203020746f6b656e7300000000000000000000600082015250565b60006135f6601683612ea3565b9150613601826135c0565b602082019050919050565b60006020820190508181036000830152613625816135e9565b9050919050565b60006080820190506136416000830187612bd1565b61364e6020830186612f20565b61365b6040830185612f20565b6136686060830184612c05565b95945050505050565b7f63616e6e6f74207570677261646520746f207a65726f20616464726573730000600082015250565b60006136a7601e83612ea3565b91506136b282613671565b602082019050919050565b600060208201905081810360008301526136d68161369a565b9050919050565b7f696e76616c696420626c61636b6c697374207265717565737420696400000000600082015250565b6000613713601c83612ea3565b915061371e826136dd565b602082019050919050565b6000602082019050818103600083015261374281613706565b9050919050565b7f696e76616c696420706175736520726571756573742069640000000000000000600082015250565b600061377f601883612ea3565b915061378a82613749565b602082019050919050565b600060208201905081810360008301526137ae81613772565b9050919050565b7f696e76616c696420756e70617573652072657175657374206964000000000000600082015250565b60006137eb601a83612ea3565b91506137f6826137b5565b602082019050919050565b6000602082019050818103600083015261381a816137de565b9050919050565b7f696e76616c696420756e626c61636b6c69737420726571756573742069640000600082015250565b6000613857601e83612ea3565b915061386282613821565b602082019050919050565b600060208201905081810360008301526138868161384a565b9050919050565b7f6e6f74206120766f74696e67206163636f756e74000000000000000000000000600082015250565b60006138c3601483612ea3565b91506138ce8261388d565b602082019050919050565b600060208201905081810360008301526138f2816138b6565b9050919050565b7f696e76616c696420726571756573742069640000000000000000000000000000600082015250565b600061392f601283612ea3565b915061393a826138f9565b602082019050919050565b6000602082019050818103600083015261395e81613922565b9050919050565b7f7265717565737420616c726561647920636f6d706c6574656400000000000000600082015250565b600061399b601983612ea3565b91506139a682613965565b602082019050919050565b600060208201905081810360008301526139ca8161398e565b9050919050565b7f7265717565737420696e76616c69646174656420616674657220766f7465727360008201527f206c697374206368616e67650000000000000000000000000000000000000000602082015250565b6000613a2d602c83612ea3565b9150613a38826139d1565b604082019050919050565b60006020820190508181036000830152613a5c81613a20565b9050919050565b7f72657175657374206973206f7574646174656400000000000000000000000000600082015250565b6000613a99601383612ea3565b9150613aa482613a63565b602082019050919050565b60006020820190508181036000830152613ac881613a8c565b9050919050565b7f616c726561647920617070726f7665642062792074686973206163636f756e74600082015250565b6000613b05602083612ea3565b9150613b1082613acf565b602082019050919050565b60006020820190508181036000830152613b3481613af8565b9050919050565b6000613b4682612bfb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b7857613b776133c4565b5b600182019050919050565b6000613b8e82612bfb565b9150613b9983612bfb565b9250828203905081811115613bb157613bb06133c4565b5b92915050565b6000604082019050613bcc6000830185612c05565b613bd96020830184612bd1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f63616e6e6f7420616464207a65726f206164647265737320746f20766f74696e60008201527f67206163636f756e7473206c6973740000000000000000000000000000000000602082015250565b6000613c6b602f83612ea3565b9150613c7682613c0f565b604082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f6e6f7420656e6f75676820766f74696e67206163636f756e74732077696c6c2060008201527f72656d61696e0000000000000000000000000000000000000000000000000000602082015250565b6000613cfd602683612ea3565b9150613d0882613ca1565b604082019050919050565b60006020820190508181036000830152613d2c81613cf0565b905091905056fea2646970667358221220cc52973225e45397eeaaef16354125b0e5bea0b336c2a67508be38094068b07064736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000060000000000000000000000004c2f6ad396ff2d1d105d0f6261743caec85aa564000000000000000000000000aa93b852f5a54ddb130ff5c79f8a838c492bf46e0000000000000000000000008798c87519e09a736efef4793e07d441f1fd7c21000000000000000000000000c0d19d3984d67e1d7de09d1d66e9cbd6bf2a9a920000000000000000000000001008554cf8b02ca890fb49540677a402955cb560000000000000000000000000334fe515c45851ff90a5313a6540e81954d91a11
-----Decoded View---------------
Arg [0] : votingAccounts (address[]): 0x4C2F6ad396FF2d1d105D0f6261743cAec85Aa564,0xAA93B852F5A54ddb130FF5c79f8A838c492Bf46E,0x8798c87519e09a736EFef4793E07D441f1fD7c21,0xc0D19D3984D67E1d7DE09D1D66E9Cbd6Bf2A9A92,0x1008554cf8b02ca890fB49540677a402955CB560,0x334fe515c45851Ff90a5313a6540E81954d91a11
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [2] : 0000000000000000000000004c2f6ad396ff2d1d105d0f6261743caec85aa564
Arg [3] : 000000000000000000000000aa93b852f5a54ddb130ff5c79f8a838c492bf46e
Arg [4] : 0000000000000000000000008798c87519e09a736efef4793e07d441f1fd7c21
Arg [5] : 000000000000000000000000c0d19d3984d67e1d7de09d1d66e9cbd6bf2a9a92
Arg [6] : 0000000000000000000000001008554cf8b02ca890fb49540677a402955cb560
Arg [7] : 000000000000000000000000334fe515c45851ff90a5313a6540e81954d91a11
Deployed Bytecode Sourcemap
1185:25099:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24094:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9287:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13040:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2168:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20156:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1499:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19516:461;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10954:602;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23505:457;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6953:124;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25952:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11698:720;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22126:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25416:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21518:456;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17669:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1872:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16448:365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1802:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13433:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15948:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14747:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8778:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18182:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14344:270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24094:378;24218:1;24171:49;;24179:13;:20;24193:5;24179:20;;;;;;;;;;;:26;;;;;;;;;;;;24171:49;;;24150:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;24285:22;24301:5;24285:15;:22::i;:::-;24281:185;;;24323:13;:20;24337:5;24323:20;;;;;;;;;;;:26;;;;;;;;;;;;:32;;;24373:13;:20;24387:5;24373:20;;;;;;;;;;;:27;;;24418:13;:20;24432:5;24418:20;;;;;;;;;;;:23;;;;;;;;;;;;24323:132;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24281:185;24094:378;:::o;9287:376::-;9417:1;9370:49;;:19;:26;9390:5;9370:26;;;;;;;;;;;:35;;;;;;;;;;;;:49;;;9349:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;9491:22;9507:5;9491:15;:22::i;:::-;9487:170;;;9529:19;:26;9549:5;9529:26;;;;;;;;;;;:32;;;;;;;;;;;;:50;;;9597:19;:26;9617:5;9597:26;;;;;;;;;;;:35;;;;;;;;;;;;9529:117;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9487:170;9287:376;:::o;13040:264::-;13148:13;13132:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;13181:14:::1;:12;:14::i;:::-;13173:22;;13228:5;13205:13;:20;13219:5;13205:20;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;13248:49;13263:5;13270:10;13290:5;13248:49;;;;;;;;:::i;:::-;;;;;;;;13040:264:::0;;;;:::o;2168:32::-;;;;:::o;20156:414::-;20308:1;20249:61;;20257:25;:32;20283:5;20257:32;;;;;;;;;;;:38;;;;;;;;;;;;20249:61;;;20228:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;20387:22;20403:5;20387:15;:22::i;:::-;20383:181;;;20425:25;:32;20451:5;20425:32;;;;;;;;;;;:38;;;;;;;;;;;;:56;;;20499:25;:32;20525:5;20499:32;;;;;;;;;;;:40;;;;;;;;;;;;20425:128;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20383:181;20156:414;:::o;1499:44::-;1542:1;1499:44;:::o;19516:461::-;19660:13;19644:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;19693:14:::1;:12;:14::i;:::-;19685:22;;19758:5;19717:25;:32;19743:5;19717:32;;;;;;;;;;;:38;;;:46;;;;;;;;;;;;;;;;;;19816:7;19773:25;:32;19799:5;19773:32;;;;;;;;;;;:40;;;:50;;;;;;;;;;;;;;;;;;19838:132;19882:5;19901:10;19933:5;19953:7;19838:132;;;;;;;;;:::i;:::-;;;;;;;;19516:461:::0;;;;;:::o;10954:602::-;11090:13;11155:1;11136:9;;:16;;:20;:47;;;;11182:1;11160:12;;:19;;:23;11136:47;11115:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;11269:14;:12;:14::i;:::-;11261:22;;11333:9;;11293:20;:27;11314:5;11293:27;;;;;;;;;;;:37;;:49;;;;;;;:::i;:::-;;11395:12;;11352:20;:27;11373:5;11352:27;;;;;;;;;;;:40;;:55;;;;;;;:::i;:::-;;11422:127;11461:5;11480:10;11504:9;;11527:12;;11422:127;;;;;;;;;;;:::i;:::-;;;;;;;;10954:602;;;;;;:::o;23505:457::-;23649:13;23633:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23691:1:::1;23682:6;:10;23674:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;23737:14;:12;:14::i;:::-;23729:22;;23790:5;23761:13;:20;23775:5;23761:20;;;;;;;;;;;:26;;;:34;;;;;;;;;;;;;;;;;;23831:2;23805:13;:20;23819:5;23805:20;;;;;;;;;;;:23;;;:28;;;;;;;;;;;;;;;;;;23873:6;23843:13;:20;23857:5;23843:20;;;;;;;;;;;:27;;:36;;;;23894:61;23909:5;23916:10;23936:5;23944:6;23952:2;23894:61;;;;;;;;;;:::i;:::-;;;;;;;;23505:457:::0;;;;;;:::o;6953:124::-;7001:14;7069:1;7064;7040:20;;:25;;7039:31;;;;:::i;:::-;7027:43;;6953:124;:::o;25952:313::-;26078:1;26030:50;;26038:14;:21;26053:5;26038:21;;;;;;;;;;;:27;;;;;;;;;;;;26030:50;;;26009:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;26146:22;26162:5;26146:15;:22::i;:::-;26142:117;;;26184:14;:21;26199:5;26184:21;;;;;;;;;;;:27;;;;;;;;;;;;:34;;;26219:14;:21;26234:5;26219:21;;;;;;;;;;;:28;;;26184:64;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26142:117;25952:313;:::o;11698:720::-;11765:27;11795:20;:27;11816:5;11795:27;;;;;;;;;;;:37;;11765:67;;11842:30;11875:20;:27;11896:5;11875:27;;;;;;;;;;;:53;;11842:86;;11978:1;11959:9;:16;;;;:20;:47;;;;12005:1;11983:12;:19;;;;:23;11959:47;11938:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;12081:22;12097:5;12081:15;:22::i;:::-;12077:291;;;12124:6;12119:108;12140:9;:16;;;;12136:1;:20;12119:108;;;12181:31;12199:9;12209:1;12199:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12181:17;:31::i;:::-;12158:3;;;;;12119:108;;;;12246:6;12241:117;12262:12;:19;;;;12258:1;:23;12241:117;;;12306:37;12327:12;12340:1;12327:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12306:20;:37::i;:::-;12283:3;;;;;12241:117;;;;12077:291;12410:1;12378:28;;:33;;;;;;;:::i;:::-;;;;;;;;11755:663;;11698:720;:::o;22126:378::-;22262:1;22209:55;;22217:19;:26;22237:5;22217:26;;;;;;;;;;;:32;;;;;;;;;;;;22209:55;;;22188:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;22335:22;22351:5;22335:15;:22::i;:::-;22331:167;;;22373:19;:26;22393:5;22373:26;;;;;;;;;;;:32;;;;;;;;;;;;:42;;;22433:19;:26;22453:5;22433:26;;;;;;;;;;;:40;;;;;;;;;;;;22373:114;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22331:167;22126:378;:::o;25416:400::-;25541:13;25525:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;25583:1:::1;25574:6;:10;25566:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;25630:14;:12;:14::i;:::-;25622:22;;25684:5;25654:14;:21;25669:5;25654:21;;;;;;;;;;;:27;;;:35;;;;;;;;;;;;;;;;;;25730:6;25699:14;:21;25714:5;25699:21;;;;;;;;;;;:28;;:37;;;;25751:58;25767:5;25774:10;25794:5;25802:6;25751:58;;;;;;;;;:::i;:::-;;;;;;;;25416:400:::0;;;;;:::o;21518:456::-;21653:13;21637:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;21706:1:::1;21686:22;;:8;:22;;::::0;21678:65:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21762:14;:12;:14::i;:::-;21754:22;;21821:5;21786:19;:26;21806:5;21786:26;;;;;;;;;;;:32;;;:40;;;;;;;;;;;;;;;;;;21879:8;21836:19;:26;21856:5;21836:26;;;;;;;;;;;:40;;;:51;;;;;;;;;;;;;;;;;;21902:65;21923:5;21930:10;21950:5;21958:8;21902:65;;;;;;;;;:::i;:::-;;;;;;;;21518:456:::0;;;;;:::o;17669:371::-;17803:13;17787:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;17836:14:::1;:12;:14::i;:::-;17828:22;;17895:5;17860:19;:26;17880:5;17860:26;;;;;;;;;;;:32;;;:40;;;;;;;;;;;;;;;;;;17947:7;17910:19;:26;17930:5;17910:26;;;;;;;;;;;:34;;;:44;;;;;;;;;;;;;;;;;;17969:64;17990:5;17997:10;18017:5;18025:7;17969:64;;;;;;;;;:::i;:::-;;;;;;;;17669:371:::0;;;;;:::o;1872:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;16448:365::-;16580:1;16529:53;;16537:17;:24;16555:5;16537:24;;;;;;;;;;;:30;;;;;;;;;;;;16529:53;;;16508:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;16651:22;16667:5;16651:15;:22::i;:::-;16647:160;;;16689:17;:24;16707:5;16689:24;;;;;;;;;;;:30;;;;;;;;;;;;:43;;;16750:17;:24;16768:5;16750:24;;;;;;;;;;;:32;;;;;;;;;;;;16689:107;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16647:160;16448:365;:::o;1802:63::-;1859:6;1802:63;:::o;13433:273::-;13556:1;13515:43;;13523:13;:20;13537:5;13523:20;;;;;;;;;;;;;;;;;;;;;13515:43;;;13494:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;13623:22;13639:5;13623:15;:22::i;:::-;13619:81;;;13661:13;:20;13675:5;13661:20;;;;;;;;;;;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13619:81;13433:273;:::o;15948:363::-;16080:13;16064:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;16113:14:::1;:12;:14::i;:::-;16105:22;;16170:5;16137:17;:24;16155:5;16137:24;;;;;;;;;;;:30;;;:38;;;;;;;;;;;;;;;;;;16220:7;16185:17;:24;16203:5;16185:24;;;;;;;;;;;:32;;;:42;;;;;;;;;;;;;;;;;;16242:62;16261:5;16268:10;16288:5;16296:7;16242:62;;;;;;;;;:::i;:::-;;;;;;;;15948:363:::0;;;;;:::o;14747:283::-;14874:1;14831:45;;14839:15;:22;14855:5;14839:22;;;;;;;;;;;;;;;;;;;;;14831:45;;;14810:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;14943:22;14959:5;14943:15;:22::i;:::-;14939:85;;;14981:15;:22;14997:5;14981:22;;;;;;;;;;;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14939:85;14747:283;:::o;8778:375::-;8913:13;8897:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;8946:14:::1;:12;:14::i;:::-;8938:22;;9005:5;8970:19;:26;8990:5;8970:26;;;;;;;;;;;:32;;;:40;;;;;;;;;;;;;;;;;;9058:8;9020:19;:26;9040:5;9020:26;;;;;;;;;;;:35;;;:46;;;;;;;;;;;;;;;;;;9081:65;9102:5;9109:10;9129:5;9137:8;9081:65;;;;;;;;;:::i;:::-;;;;;;;;8778:375:::0;;;;;:::o;18182:378::-;18318:1;18265:55;;18273:19;:26;18293:5;18273:26;;;;;;;;;;;:32;;;;;;;;;;;;18265:55;;;18244:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;18391:22;18407:5;18391:15;:22::i;:::-;18387:167;;;18429:19;:26;18449:5;18429:26;;;;;;;;;;;:32;;;;;;;;;;;;:48;;;18495:19;:26;18515:5;18495:26;;;;;;;;;;;:34;;;;;;;;;;;;18429:114;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18387:167;18182:378;:::o;14344:270::-;14454:13;14438:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;14487:14:::1;:12;:14::i;:::-;14479:22;;14536:5;14511:15;:22;14527:5;14511:22;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;14556:51;14573:5;14580:10;14600:5;14556:51;;;;;;;;:::i;:::-;;;;;;;;14344:270:::0;;;;:::o;5943:853::-;6032:13;7284:15;:27;7300:10;7284:27;;;;;;;;;;;;;;;;;;;;;;;;;7276:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;6057:19:::1;6079:8;:15;6088:5;6079:15;;;;;;;;;;;6057:37;;6129:1;6113:3;:13;;;:17;6105:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;6172:3;:13;;;;;;;;;;;;6171:14;6163:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;6264:28;;6246:3;:14;;;:46;6225:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;6399:3;:12;;;6380:15;:31;;6372:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6467:3;:14;;:26;6482:10;6467:26;;;;;;;;;;;;;;;;;;;;;;;;;6466:27;6445:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;6591:4;6562:3;:14;;:26;6577:10;6562:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;6622:1;6605:3;:13;;;:18;;;;;;;:::i;:::-;;;;;;;;6655:17;:15;:17::i;:::-;6638:3;:13;;;:34;6634:156;;6699:4;6688:15;;6733:4;6717:3;:13;;;:20;;;;;;;;;;;;;;;;;;6773:5;6756:23;;;;;;;;;;6634:156;6047:749;5943:853:::0;;;:::o;5107:542::-;5166:13;7284:15;:27;7300:10;7284:27;;;;;;;;;;;;;;;;;;;;;;;;;7276:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5233:12:::1;;:14;;;;;;;;;:::i;:::-;;;;;5274:1;5259:12;:16;;;;:::i;:::-;5249:27;5222:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5199:88;;;;;;5191:96;;5333:1;5304:8;:15;5313:5;5304:15;;;;;;;;;;;:25;;;:30;5297:38;;;;:::i;:::-;;5420:4;5379:8;:15;5388:5;5379:15;;;;;;;;;;;:26;;:38;5406:10;5379:38;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;5462:1;5434:8;:15;5443:5;5434:15;;;;;;;;;;;:25;;:29;;;;5502:28;;5473:8;:15;5482:5;5473:15;;;;;;;;;;;:26;;:57;;;;1859:6;5579:15;:63;;;;:::i;:::-;5540:8;:15;5549:5;5540:15;;;;;;;;;;;:24;;:102;;;;5107:542:::0;:::o;2970:402::-;3066:1;3050:18;;:4;:18;;;3029:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;3157:15;:21;3173:4;3157:21;;;;;;;;;;;;;;;;;;;;;;;;;3152:214;;3224:14;3201:20;;:37;3194:45;;;;:::i;:::-;;3277:4;3253:15;:21;3269:4;3253:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;3319:1;3295:20;;:25;;;;;;;:::i;:::-;;;;;;;;3339:16;3350:4;3339:16;;;;;;:::i;:::-;;;;;;;;3152:214;2970:402;:::o;3501:383::-;3567:15;:21;3583:4;3567:21;;;;;;;;;;;;;;;;;;;;;;;;;3563:315;;;1542:1;3652;3629:20;;:24;;;;:::i;:::-;:47;;3604:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;3786:5;3762:15;:21;3778:4;3762:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;3829:1;3805:20;;:25;;;;;;;:::i;:::-;;;;;;;;3849:18;3862:4;3849:18;;;;;;:::i;:::-;;;;;;;;3563:315;3501:383;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;88:117:2:-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:126::-;1062:7;1102:42;1095:5;1091:54;1080:65;;1025:126;;;:::o;1157:96::-;1194:7;1223:24;1241:5;1223:24;:::i;:::-;1212:35;;1157:96;;;:::o;1259:116::-;1316:7;1345:24;1363:5;1345:24;:::i;:::-;1334:35;;1259:116;;;:::o;1381:162::-;1474:44;1512:5;1474:44;:::i;:::-;1467:5;1464:55;1454:83;;1533:1;1530;1523:12;1454:83;1381:162;:::o;1549:179::-;1615:5;1653:6;1640:20;1631:29;;1669:53;1716:5;1669:53;:::i;:::-;1549:179;;;;:::o;1734:369::-;1813:6;1862:2;1850:9;1841:7;1837:23;1833:32;1830:119;;;1868:79;;:::i;:::-;1830:119;1988:1;2013:73;2078:7;2069:6;2058:9;2054:22;2013:73;:::i;:::-;2003:83;;1959:137;1734:369;;;;:::o;2109:118::-;2196:24;2214:5;2196:24;:::i;:::-;2191:3;2184:37;2109:118;;:::o;2233:222::-;2326:4;2364:2;2353:9;2349:18;2341:26;;2377:71;2445:1;2434:9;2430:17;2421:6;2377:71;:::i;:::-;2233:222;;;;:::o;2461:77::-;2498:7;2527:5;2516:16;;2461:77;;;:::o;2544:118::-;2631:24;2649:5;2631:24;:::i;:::-;2626:3;2619:37;2544:118;;:::o;2668:222::-;2761:4;2799:2;2788:9;2784:18;2776:26;;2812:71;2880:1;2869:9;2865:17;2856:6;2812:71;:::i;:::-;2668:222;;;;:::o;2896:122::-;2969:24;2987:5;2969:24;:::i;:::-;2962:5;2959:35;2949:63;;3008:1;3005;2998:12;2949:63;2896:122;:::o;3024:139::-;3070:5;3108:6;3095:20;3086:29;;3124:33;3151:5;3124:33;:::i;:::-;3024:139;;;;:::o;3169:514::-;3257:6;3265;3314:2;3302:9;3293:7;3289:23;3285:32;3282:119;;;3320:79;;:::i;:::-;3282:119;3440:1;3465:73;3530:7;3521:6;3510:9;3506:22;3465:73;:::i;:::-;3455:83;;3411:137;3587:2;3613:53;3658:7;3649:6;3638:9;3634:22;3613:53;:::i;:::-;3603:63;;3558:118;3169:514;;;;;:::o;3689:117::-;3798:1;3795;3788:12;3812:117;3921:1;3918;3911:12;3935:117;4044:1;4041;4034:12;4075:568;4148:8;4158:6;4208:3;4201:4;4193:6;4189:17;4185:27;4175:122;;4216:79;;:::i;:::-;4175:122;4329:6;4316:20;4306:30;;4359:18;4351:6;4348:30;4345:117;;;4381:79;;:::i;:::-;4345:117;4495:4;4487:6;4483:17;4471:29;;4549:3;4541:4;4533:6;4529:17;4519:8;4515:32;4512:41;4509:128;;;4556:79;;:::i;:::-;4509:128;4075:568;;;;;:::o;4649:934::-;4771:6;4779;4787;4795;4844:2;4832:9;4823:7;4819:23;4815:32;4812:119;;;4850:79;;:::i;:::-;4812:119;4998:1;4987:9;4983:17;4970:31;5028:18;5020:6;5017:30;5014:117;;;5050:79;;:::i;:::-;5014:117;5163:80;5235:7;5226:6;5215:9;5211:22;5163:80;:::i;:::-;5145:98;;;;4941:312;5320:2;5309:9;5305:18;5292:32;5351:18;5343:6;5340:30;5337:117;;;5373:79;;:::i;:::-;5337:117;5486:80;5558:7;5549:6;5538:9;5534:22;5486:80;:::i;:::-;5468:98;;;;5263:313;4649:934;;;;;;;:::o;5589:122::-;5662:24;5680:5;5662:24;:::i;:::-;5655:5;5652:35;5642:63;;5701:1;5698;5691:12;5642:63;5589:122;:::o;5717:139::-;5763:5;5801:6;5788:20;5779:29;;5817:33;5844:5;5817:33;:::i;:::-;5717:139;;;;:::o;5862:659::-;5959:6;5967;5975;6024:2;6012:9;6003:7;5999:23;5995:32;5992:119;;;6030:79;;:::i;:::-;5992:119;6150:1;6175:73;6240:7;6231:6;6220:9;6216:22;6175:73;:::i;:::-;6165:83;;6121:137;6297:2;6323:53;6368:7;6359:6;6348:9;6344:22;6323:53;:::i;:::-;6313:63;;6268:118;6425:2;6451:53;6496:7;6487:6;6476:9;6472:22;6451:53;:::i;:::-;6441:63;;6396:118;5862:659;;;;;:::o;6527:514::-;6615:6;6623;6672:2;6660:9;6651:7;6647:23;6643:32;6640:119;;;6678:79;;:::i;:::-;6640:119;6798:1;6823:73;6888:7;6879:6;6868:9;6864:22;6823:73;:::i;:::-;6813:83;;6769:137;6945:2;6971:53;7016:7;7007:6;6996:9;6992:22;6971:53;:::i;:::-;6961:63;;6916:118;6527:514;;;;;:::o;7047:329::-;7106:6;7155:2;7143:9;7134:7;7130:23;7126:32;7123:119;;;7161:79;;:::i;:::-;7123:119;7281:1;7306:53;7351:7;7342:6;7331:9;7327:22;7306:53;:::i;:::-;7296:63;;7252:117;7047:329;;;;:::o;7382:90::-;7416:7;7459:5;7452:13;7445:21;7434:32;;7382:90;;;:::o;7478:109::-;7559:21;7574:5;7559:21;:::i;:::-;7554:3;7547:34;7478:109;;:::o;7593:210::-;7680:4;7718:2;7707:9;7703:18;7695:26;;7731:65;7793:1;7782:9;7778:17;7769:6;7731:65;:::i;:::-;7593:210;;;;:::o;7809:169::-;7893:11;7927:6;7922:3;7915:19;7967:4;7962:3;7958:14;7943:29;;7809:169;;;;:::o;7984:174::-;8124:26;8120:1;8112:6;8108:14;8101:50;7984:174;:::o;8164:366::-;8306:3;8327:67;8391:2;8386:3;8327:67;:::i;:::-;8320:74;;8403:93;8492:3;8403:93;:::i;:::-;8521:2;8516:3;8512:12;8505:19;;8164:366;;;:::o;8536:419::-;8702:4;8740:2;8729:9;8725:18;8717:26;;8789:9;8783:4;8779:20;8775:1;8764:9;8760:17;8753:47;8817:131;8943:4;8817:131;:::i;:::-;8809:139;;8536:419;;;:::o;8961:118::-;9048:24;9066:5;9048:24;:::i;:::-;9043:3;9036:37;8961:118;;:::o;9085:332::-;9206:4;9244:2;9233:9;9229:18;9221:26;;9257:71;9325:1;9314:9;9310:17;9301:6;9257:71;:::i;:::-;9338:72;9406:2;9395:9;9391:18;9382:6;9338:72;:::i;:::-;9085:332;;;;;:::o;9423:181::-;9563:33;9559:1;9551:6;9547:14;9540:57;9423:181;:::o;9610:366::-;9752:3;9773:67;9837:2;9832:3;9773:67;:::i;:::-;9766:74;;9849:93;9938:3;9849:93;:::i;:::-;9967:2;9962:3;9958:12;9951:19;;9610:366;;;:::o;9982:419::-;10148:4;10186:2;10175:9;10171:18;10163:26;;10235:9;10229:4;10225:20;10221:1;10210:9;10206:17;10199:47;10263:131;10389:4;10263:131;:::i;:::-;10255:139;;9982:419;;;:::o;10407:222::-;10500:4;10538:2;10527:9;10523:18;10515:26;;10551:71;10619:1;10608:9;10604:17;10595:6;10551:71;:::i;:::-;10407:222;;;;:::o;10635:178::-;10775:30;10771:1;10763:6;10759:14;10752:54;10635:178;:::o;10819:366::-;10961:3;10982:67;11046:2;11041:3;10982:67;:::i;:::-;10975:74;;11058:93;11147:3;11058:93;:::i;:::-;11176:2;11171:3;11167:12;11160:19;;10819:366;;;:::o;11191:419::-;11357:4;11395:2;11384:9;11380:18;11372:26;;11444:9;11438:4;11434:20;11430:1;11419:9;11415:17;11408:47;11472:131;11598:4;11472:131;:::i;:::-;11464:139;;11191:419;;;:::o;11616:442::-;11765:4;11803:2;11792:9;11788:18;11780:26;;11816:71;11884:1;11873:9;11869:17;11860:6;11816:71;:::i;:::-;11897:72;11965:2;11954:9;11950:18;11941:6;11897:72;:::i;:::-;11979;12047:2;12036:9;12032:18;12023:6;11979:72;:::i;:::-;11616:442;;;;;;:::o;12064:223::-;12204:34;12200:1;12192:6;12188:14;12181:58;12273:6;12268:2;12260:6;12256:15;12249:31;12064:223;:::o;12293:366::-;12435:3;12456:67;12520:2;12515:3;12456:67;:::i;:::-;12449:74;;12532:93;12621:3;12532:93;:::i;:::-;12650:2;12645:3;12641:12;12634:19;;12293:366;;;:::o;12665:419::-;12831:4;12869:2;12858:9;12854:18;12846:26;;12918:9;12912:4;12908:20;12904:1;12893:9;12889:17;12882:47;12946:131;13072:4;12946:131;:::i;:::-;12938:139;;12665:419;;;:::o;13090:553::-;13267:4;13305:3;13294:9;13290:19;13282:27;;13319:71;13387:1;13376:9;13372:17;13363:6;13319:71;:::i;:::-;13400:72;13468:2;13457:9;13453:18;13444:6;13400:72;:::i;:::-;13482;13550:2;13539:9;13535:18;13526:6;13482:72;:::i;:::-;13564;13632:2;13621:9;13617:18;13608:6;13564:72;:::i;:::-;13090:553;;;;;;;:::o;13649:228::-;13789:34;13785:1;13777:6;13773:14;13766:58;13858:11;13853:2;13845:6;13841:15;13834:36;13649:228;:::o;13883:366::-;14025:3;14046:67;14110:2;14105:3;14046:67;:::i;:::-;14039:74;;14122:93;14211:3;14122:93;:::i;:::-;14240:2;14235:3;14231:12;14224:19;;13883:366;;;:::o;14255:419::-;14421:4;14459:2;14448:9;14444:18;14436:26;;14508:9;14502:4;14498:20;14494:1;14483:9;14479:17;14472:47;14536:131;14662:4;14536:131;:::i;:::-;14528:139;;14255:419;;;:::o;14680:184::-;14779:11;14813:6;14808:3;14801:19;14853:4;14848:3;14844:14;14829:29;;14680:184;;;;:::o;14870:102::-;14939:4;14962:3;14954:11;;14870:102;;;:::o;14978:108::-;15055:24;15073:5;15055:24;:::i;:::-;15050:3;15043:37;14978:108;;:::o;15092:179::-;15161:10;15182:46;15224:3;15216:6;15182:46;:::i;:::-;15260:4;15255:3;15251:14;15237:28;;15092:179;;;;:::o;15277:122::-;15329:5;15354:39;15389:2;15384:3;15380:12;15375:3;15354:39;:::i;:::-;15345:48;;15277:122;;;;:::o;15405:115::-;15477:4;15509;15504:3;15500:14;15492:22;;15405:115;;;:::o;15556:699::-;15685:3;15708:86;15787:6;15782:3;15708:86;:::i;:::-;15701:93;;15818:58;15870:5;15818:58;:::i;:::-;15899:7;15930:1;15915:315;15940:6;15937:1;15934:13;15915:315;;;16010:42;16045:6;16036:7;16010:42;:::i;:::-;16072:63;16131:3;16116:13;16072:63;:::i;:::-;16065:70;;16158:62;16213:6;16158:62;:::i;:::-;16148:72;;15975:255;15962:1;15959;15955:9;15950:14;;15915:315;;;15919:14;16246:3;16239:10;;15690:565;;15556:699;;;;;:::o;16261:895::-;16558:4;16596:3;16585:9;16581:19;16573:27;;16610:71;16678:1;16667:9;16663:17;16654:6;16610:71;:::i;:::-;16691:72;16759:2;16748:9;16744:18;16735:6;16691:72;:::i;:::-;16810:9;16804:4;16800:20;16795:2;16784:9;16780:18;16773:48;16838:118;16951:4;16942:6;16934;16838:118;:::i;:::-;16830:126;;17003:9;16997:4;16993:20;16988:2;16977:9;16973:18;16966:48;17031:118;17144:4;17135:6;17127;17031:118;:::i;:::-;17023:126;;16261:895;;;;;;;;;:::o;17162:171::-;17302:23;17298:1;17290:6;17286:14;17279:47;17162:171;:::o;17339:366::-;17481:3;17502:67;17566:2;17561:3;17502:67;:::i;:::-;17495:74;;17578:93;17667:3;17578:93;:::i;:::-;17696:2;17691:3;17687:12;17680:19;;17339:366;;;:::o;17711:419::-;17877:4;17915:2;17904:9;17900:18;17892:26;;17964:9;17958:4;17954:20;17950:1;17939:9;17935:17;17928:47;17992:131;18118:4;17992:131;:::i;:::-;17984:139;;17711:419;;;:::o;18136:664::-;18341:4;18379:3;18368:9;18364:19;18356:27;;18393:71;18461:1;18450:9;18446:17;18437:6;18393:71;:::i;:::-;18474:72;18542:2;18531:9;18527:18;18518:6;18474:72;:::i;:::-;18556;18624:2;18613:9;18609:18;18600:6;18556:72;:::i;:::-;18638;18706:2;18695:9;18691:18;18682:6;18638:72;:::i;:::-;18720:73;18788:3;18777:9;18773:19;18764:6;18720:73;:::i;:::-;18136:664;;;;;;;;:::o;18806:180::-;18854:77;18851:1;18844:88;18951:4;18948:1;18941:15;18975:4;18972:1;18965:15;18992:191;19032:3;19051:20;19069:1;19051:20;:::i;:::-;19046:25;;19085:20;19103:1;19085:20;:::i;:::-;19080:25;;19128:1;19125;19121:9;19114:16;;19149:3;19146:1;19143:10;19140:36;;;19156:18;;:::i;:::-;19140:36;18992:191;;;;:::o;19189:175::-;19329:27;19325:1;19317:6;19313:14;19306:51;19189:175;:::o;19370:366::-;19512:3;19533:67;19597:2;19592:3;19533:67;:::i;:::-;19526:74;;19609:93;19698:3;19609:93;:::i;:::-;19727:2;19722:3;19718:12;19711:19;;19370:366;;;:::o;19742:419::-;19908:4;19946:2;19935:9;19931:18;19923:26;;19995:9;19989:4;19985:20;19981:1;19970:9;19966:17;19959:47;20023:131;20149:4;20023:131;:::i;:::-;20015:139;;19742:419;;;:::o;20167:221::-;20307:34;20303:1;20295:6;20291:14;20284:58;20376:4;20371:2;20363:6;20359:15;20352:29;20167:221;:::o;20394:366::-;20536:3;20557:67;20621:2;20616:3;20557:67;:::i;:::-;20550:74;;20633:93;20722:3;20633:93;:::i;:::-;20751:2;20746:3;20742:12;20735:19;;20394:366;;;:::o;20766:419::-;20932:4;20970:2;20959:9;20955:18;20947:26;;21019:9;21013:4;21009:20;21005:1;20994:9;20990:17;20983:47;21047:131;21173:4;21047:131;:::i;:::-;21039:139;;20766:419;;;:::o;21191:180::-;21239:77;21236:1;21229:88;21336:4;21333:1;21326:15;21360:4;21357:1;21350:15;21377:180;21517:32;21513:1;21505:6;21501:14;21494:56;21377:180;:::o;21563:366::-;21705:3;21726:67;21790:2;21785:3;21726:67;:::i;:::-;21719:74;;21802:93;21891:3;21802:93;:::i;:::-;21920:2;21915:3;21911:12;21904:19;;21563:366;;;:::o;21935:419::-;22101:4;22139:2;22128:9;22124:18;22116:26;;22188:9;22182:4;22178:20;22174:1;22163:9;22159:17;22152:47;22216:131;22342:4;22216:131;:::i;:::-;22208:139;;21935:419;;;:::o;22360:172::-;22500:24;22496:1;22488:6;22484:14;22477:48;22360:172;:::o;22538:366::-;22680:3;22701:67;22765:2;22760:3;22701:67;:::i;:::-;22694:74;;22777:93;22866:3;22777:93;:::i;:::-;22895:2;22890:3;22886:12;22879:19;;22538:366;;;:::o;22910:419::-;23076:4;23114:2;23103:9;23099:18;23091:26;;23163:9;23157:4;23153:20;23149:1;23138:9;23134:17;23127:47;23191:131;23317:4;23191:131;:::i;:::-;23183:139;;22910:419;;;:::o;23335:553::-;23512:4;23550:3;23539:9;23535:19;23527:27;;23564:71;23632:1;23621:9;23617:17;23608:6;23564:71;:::i;:::-;23645:72;23713:2;23702:9;23698:18;23689:6;23645:72;:::i;:::-;23727;23795:2;23784:9;23780:18;23771:6;23727:72;:::i;:::-;23809;23877:2;23866:9;23862:18;23853:6;23809:72;:::i;:::-;23335:553;;;;;;;:::o;23894:180::-;24034:32;24030:1;24022:6;24018:14;24011:56;23894:180;:::o;24080:366::-;24222:3;24243:67;24307:2;24302:3;24243:67;:::i;:::-;24236:74;;24319:93;24408:3;24319:93;:::i;:::-;24437:2;24432:3;24428:12;24421:19;;24080:366;;;:::o;24452:419::-;24618:4;24656:2;24645:9;24641:18;24633:26;;24705:9;24699:4;24695:20;24691:1;24680:9;24676:17;24669:47;24733:131;24859:4;24733:131;:::i;:::-;24725:139;;24452:419;;;:::o;24877:178::-;25017:30;25013:1;25005:6;25001:14;24994:54;24877:178;:::o;25061:366::-;25203:3;25224:67;25288:2;25283:3;25224:67;:::i;:::-;25217:74;;25300:93;25389:3;25300:93;:::i;:::-;25418:2;25413:3;25409:12;25402:19;;25061:366;;;:::o;25433:419::-;25599:4;25637:2;25626:9;25622:18;25614:26;;25686:9;25680:4;25676:20;25672:1;25661:9;25657:17;25650:47;25714:131;25840:4;25714:131;:::i;:::-;25706:139;;25433:419;;;:::o;25858:174::-;25998:26;25994:1;25986:6;25982:14;25975:50;25858:174;:::o;26038:366::-;26180:3;26201:67;26265:2;26260:3;26201:67;:::i;:::-;26194:74;;26277:93;26366:3;26277:93;:::i;:::-;26395:2;26390:3;26386:12;26379:19;;26038:366;;;:::o;26410:419::-;26576:4;26614:2;26603:9;26599:18;26591:26;;26663:9;26657:4;26653:20;26649:1;26638:9;26634:17;26627:47;26691:131;26817:4;26691:131;:::i;:::-;26683:139;;26410:419;;;:::o;26835:176::-;26975:28;26971:1;26963:6;26959:14;26952:52;26835:176;:::o;27017:366::-;27159:3;27180:67;27244:2;27239:3;27180:67;:::i;:::-;27173:74;;27256:93;27345:3;27256:93;:::i;:::-;27374:2;27369:3;27365:12;27358:19;;27017:366;;;:::o;27389:419::-;27555:4;27593:2;27582:9;27578:18;27570:26;;27642:9;27636:4;27632:20;27628:1;27617:9;27613:17;27606:47;27670:131;27796:4;27670:131;:::i;:::-;27662:139;;27389:419;;;:::o;27814:180::-;27954:32;27950:1;27942:6;27938:14;27931:56;27814:180;:::o;28000:366::-;28142:3;28163:67;28227:2;28222:3;28163:67;:::i;:::-;28156:74;;28239:93;28328:3;28239:93;:::i;:::-;28357:2;28352:3;28348:12;28341:19;;28000:366;;;:::o;28372:419::-;28538:4;28576:2;28565:9;28561:18;28553:26;;28625:9;28619:4;28615:20;28611:1;28600:9;28596:17;28589:47;28653:131;28779:4;28653:131;:::i;:::-;28645:139;;28372:419;;;:::o;28797:170::-;28937:22;28933:1;28925:6;28921:14;28914:46;28797:170;:::o;28973:366::-;29115:3;29136:67;29200:2;29195:3;29136:67;:::i;:::-;29129:74;;29212:93;29301:3;29212:93;:::i;:::-;29330:2;29325:3;29321:12;29314:19;;28973:366;;;:::o;29345:419::-;29511:4;29549:2;29538:9;29534:18;29526:26;;29598:9;29592:4;29588:20;29584:1;29573:9;29569:17;29562:47;29626:131;29752:4;29626:131;:::i;:::-;29618:139;;29345:419;;;:::o;29770:168::-;29910:20;29906:1;29898:6;29894:14;29887:44;29770:168;:::o;29944:366::-;30086:3;30107:67;30171:2;30166:3;30107:67;:::i;:::-;30100:74;;30183:93;30272:3;30183:93;:::i;:::-;30301:2;30296:3;30292:12;30285:19;;29944:366;;;:::o;30316:419::-;30482:4;30520:2;30509:9;30505:18;30497:26;;30569:9;30563:4;30559:20;30555:1;30544:9;30540:17;30533:47;30597:131;30723:4;30597:131;:::i;:::-;30589:139;;30316:419;;;:::o;30741:175::-;30881:27;30877:1;30869:6;30865:14;30858:51;30741:175;:::o;30922:366::-;31064:3;31085:67;31149:2;31144:3;31085:67;:::i;:::-;31078:74;;31161:93;31250:3;31161:93;:::i;:::-;31279:2;31274:3;31270:12;31263:19;;30922:366;;;:::o;31294:419::-;31460:4;31498:2;31487:9;31483:18;31475:26;;31547:9;31541:4;31537:20;31533:1;31522:9;31518:17;31511:47;31575:131;31701:4;31575:131;:::i;:::-;31567:139;;31294:419;;;:::o;31719:231::-;31859:34;31855:1;31847:6;31843:14;31836:58;31928:14;31923:2;31915:6;31911:15;31904:39;31719:231;:::o;31956:366::-;32098:3;32119:67;32183:2;32178:3;32119:67;:::i;:::-;32112:74;;32195:93;32284:3;32195:93;:::i;:::-;32313:2;32308:3;32304:12;32297:19;;31956:366;;;:::o;32328:419::-;32494:4;32532:2;32521:9;32517:18;32509:26;;32581:9;32575:4;32571:20;32567:1;32556:9;32552:17;32545:47;32609:131;32735:4;32609:131;:::i;:::-;32601:139;;32328:419;;;:::o;32753:169::-;32893:21;32889:1;32881:6;32877:14;32870:45;32753:169;:::o;32928:366::-;33070:3;33091:67;33155:2;33150:3;33091:67;:::i;:::-;33084:74;;33167:93;33256:3;33167:93;:::i;:::-;33285:2;33280:3;33276:12;33269:19;;32928:366;;;:::o;33300:419::-;33466:4;33504:2;33493:9;33489:18;33481:26;;33553:9;33547:4;33543:20;33539:1;33528:9;33524:17;33517:47;33581:131;33707:4;33581:131;:::i;:::-;33573:139;;33300:419;;;:::o;33725:182::-;33865:34;33861:1;33853:6;33849:14;33842:58;33725:182;:::o;33913:366::-;34055:3;34076:67;34140:2;34135:3;34076:67;:::i;:::-;34069:74;;34152:93;34241:3;34152:93;:::i;:::-;34270:2;34265:3;34261:12;34254:19;;33913:366;;;:::o;34285:419::-;34451:4;34489:2;34478:9;34474:18;34466:26;;34538:9;34532:4;34528:20;34524:1;34513:9;34509:17;34502:47;34566:131;34692:4;34566:131;:::i;:::-;34558:139;;34285:419;;;:::o;34710:233::-;34749:3;34772:24;34790:5;34772:24;:::i;:::-;34763:33;;34818:66;34811:5;34808:77;34805:103;;34888:18;;:::i;:::-;34805:103;34935:1;34928:5;34924:13;34917:20;;34710:233;;;:::o;34949:194::-;34989:4;35009:20;35027:1;35009:20;:::i;:::-;35004:25;;35043:20;35061:1;35043:20;:::i;:::-;35038:25;;35087:1;35084;35080:9;35072:17;;35111:1;35105:4;35102:11;35099:37;;;35116:18;;:::i;:::-;35099:37;34949:194;;;;:::o;35149:332::-;35270:4;35308:2;35297:9;35293:18;35285:26;;35321:71;35389:1;35378:9;35374:17;35365:6;35321:71;:::i;:::-;35402:72;35470:2;35459:9;35455:18;35446:6;35402:72;:::i;:::-;35149:332;;;;;:::o;35487:180::-;35535:77;35532:1;35525:88;35632:4;35629:1;35622:15;35656:4;35653:1;35646:15;35673:234;35813:34;35809:1;35801:6;35797:14;35790:58;35882:17;35877:2;35869:6;35865:15;35858:42;35673:234;:::o;35913:366::-;36055:3;36076:67;36140:2;36135:3;36076:67;:::i;:::-;36069:74;;36152:93;36241:3;36152:93;:::i;:::-;36270:2;36265:3;36261:12;36254:19;;35913:366;;;:::o;36285:419::-;36451:4;36489:2;36478:9;36474:18;36466:26;;36538:9;36532:4;36528:20;36524:1;36513:9;36509:17;36502:47;36566:131;36692:4;36566:131;:::i;:::-;36558:139;;36285:419;;;:::o;36710:225::-;36850:34;36846:1;36838:6;36834:14;36827:58;36919:8;36914:2;36906:6;36902:15;36895:33;36710:225;:::o;36941:366::-;37083:3;37104:67;37168:2;37163:3;37104:67;:::i;:::-;37097:74;;37180:93;37269:3;37180:93;:::i;:::-;37298:2;37293:3;37289:12;37282:19;;36941:366;;;:::o;37313:419::-;37479:4;37517:2;37506:9;37502:18;37494:26;;37566:9;37560:4;37556:20;37552:1;37541:9;37537:17;37530:47;37594:131;37720:4;37594:131;:::i;:::-;37586:139;;37313:419;;;:::o
Swarm Source
ipfs://cc52973225e45397eeaaef16354125b0e5bea0b336c2a67508be38094068b070
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.