Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- GovPOE
- Optimization enabled
- false
- Compiler version
- v0.8.7+commit.e28d00a7
- EVM Version
- default
- Verified at
- 2022-06-20T00:41:39.029192Z
Constructor Arguments
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001250726f6f66206f66204578697374656e6365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046b504f4500000000000000000000000000000000000000000000000000000000
Arg [0] (string) : Proof of Existence
Arg [1] (string) : kPOE
Contract source code
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract POE{ mapping (address => uint256) private _balances; uint256 private _totalSupply; string private _name; string private _symbol; event Transfer(address, address, uint); /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_){ _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() external view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() external view virtual returns (uint8) { return 0; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); require(balanceOf(account) == 0, "User already holds a PoE token"); _beforeTokenTransfer(address(0), account, 1); _totalSupply += 1; _balances[account] += 1; emit Transfer(address(0), account, 1); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } /** * @title PoExtended * @author Carson Case [carsonpcase@gmail.com] * @notice PoExtended is a POE token with owner delegated minters and a merkle claim system */ abstract contract PoExtended is POE, Ownable{ using MerkleProof for bytes32[]; /// @dev the merkle root which CAN be updated address public merkleRoot; mapping(address => bool) approved_minters; constructor(string memory name_, string memory symbol_) POE(name_,symbol_){} /// @dev some functions only callable by approved minters modifier onlyMinter(){ require(approved_minters[msg.sender], "must be approved by owner to call this function"); _; } // Begin merkle root functions... /// @dev function for owner to update merkle root function updateMerkleRoot(address _new) external onlyMinter{ merkleRoot = _new; } /// @dev claim function. Any user can claim (and mint) with a verified merkle proof function claim(bytes32[] memory proof) external{ bytes32 root = bytes20(merkleRoot) << 12; bytes32 leaf = bytes20(msg.sender) << 12; require(proof.verify(root,leaf), "Address not eligible for claim"); _mint(msg.sender); } /// @dev only owner can add minters function addMinter(address _minter) external onlyOwner{ require(approved_minters[_minter] != true, "Minter is already approved"); approved_minters[_minter] = true; } /// @dev owner can remove them too function removeMinter(address _minter) external onlyOwner{ require(approved_minters[_minter] != false, "Minter is already not-approved"); approved_minters[_minter] = false; } /// @dev A minter can forefit their minting status (useful for contracts) function forefitMinterRole()external{ require(approved_minters[msg.sender] == true, "msg.sender must be an approved minter"); approved_minters[msg.sender] = false; } /** * @dev Mints 1 POE token to the given address. */ function mint(address account) external onlyMinter returns (bool) { _mint(account); return true; } /** * @dev Burns 1 POE token from the given address. */ function burn(address account) external onlyOwner returns (bool) { _burn(account, balanceOf(account)); return true; } /** * @dev Batch mint POE tokens to multiple addresses. */ function mintMany(address[] memory accounts) external onlyMinter returns (bool) { for (uint256 i = 0; i < accounts.length; i++) { _mint(accounts[i]); } return true; } /** * @dev Batch burn POE tokens from multiple addresses. */ function burnMany(address[] memory accounts) external onlyOwner returns (bool) { for (uint256 i = 0; i < accounts.length; i++) { _burn(accounts[i], balanceOf(accounts[i])); } return true; } } contract GovPOE is PoExtended{ /// @notice A record of each accounts delegate mapping (address => address) public delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint96 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Construct a new Gov token */ constructor(string memory name_, string memory symbol_) PoExtended(name_,symbol_) {} /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) public { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public { bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this))); bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "POE::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "POE::delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "POE::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint96) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) public view returns (uint96) { require(blockNumber < block.number, "POE::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = delegates[delegator]; uint96 delegatorBalance = uint96(balanceOf(delegator)); delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { uint32 srcRepNum = numCheckpoints[srcRep]; uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint96 srcRepNew = sub96(srcRepOld, amount, "POE::_moveVotes: vote amount underflows"); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { uint32 dstRepNum = numCheckpoints[dstRep]; uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint96 dstRepNew = add96(dstRepOld, amount, "POE::_moveVotes: vote amount overflows"); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal { uint32 blockNumber = safe32(block.number, "POE::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function safe96(uint n, string memory errorMessage) internal pure returns (uint96) { require(n < 2**96, errorMessage); return uint96(n); } function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) { uint96 c = a + b; require(c >= a, errorMessage); return c; } function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) { require(b <= a, errorMessage); return a - b; } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"}]},{"type":"event","name":"DelegateChanged","inputs":[{"type":"address","name":"delegator","internalType":"address","indexed":true},{"type":"address","name":"fromDelegate","internalType":"address","indexed":true},{"type":"address","name":"toDelegate","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"DelegateVotesChanged","inputs":[{"type":"address","name":"delegate","internalType":"address","indexed":true},{"type":"uint256","name":"previousBalance","internalType":"uint256","indexed":false},{"type":"uint256","name":"newBalance","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"","internalType":"address","indexed":false},{"type":"address","name":"","internalType":"address","indexed":false},{"type":"uint256","name":"","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DELEGATION_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addMinter","inputs":[{"type":"address","name":"_minter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burn","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burnMany","inputs":[{"type":"address[]","name":"accounts","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"fromBlock","internalType":"uint32"},{"type":"uint96","name":"votes","internalType":"uint96"}],"name":"checkpoints","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint32","name":"","internalType":"uint32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[{"type":"bytes32[]","name":"proof","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delegate","inputs":[{"type":"address","name":"delegatee","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delegateBySig","inputs":[{"type":"address","name":"delegatee","internalType":"address"},{"type":"uint256","name":"nonce","internalType":"uint256"},{"type":"uint256","name":"expiry","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"delegates","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"forefitMinterRole","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint96","name":"","internalType":"uint96"}],"name":"getCurrentVotes","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint96","name":"","internalType":"uint96"}],"name":"getPriorVotes","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"blockNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"merkleRoot","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mint","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mintMany","inputs":[{"type":"address[]","name":"accounts","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"numCheckpoints","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeMinter","inputs":[{"type":"address","name":"_minter","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMerkleRoot","inputs":[{"type":"address","name":"_new","internalType":"address"}]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b506040516200419a3803806200419a833981810160405281019062000037919062000295565b8181818181600290805190602001906200005392919062000167565b5080600390805190602001906200006c92919062000167565b5050506200008f620000836200009960201b60201c565b620000a160201b60201c565b505050506200049e565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200017590620003af565b90600052602060002090601f016020900481019282620001995760008555620001e5565b82601f10620001b457805160ff1916838001178555620001e5565b82800160010185558215620001e5579182015b82811115620001e4578251825591602001919060010190620001c7565b5b509050620001f49190620001f8565b5090565b5b8082111562000213576000816000905550600101620001f9565b5090565b60006200022e620002288462000343565b6200031a565b9050828152602081018484840111156200024d576200024c6200047e565b5b6200025a84828562000379565b509392505050565b600082601f8301126200027a576200027962000479565b5b81516200028c84826020860162000217565b91505092915050565b60008060408385031215620002af57620002ae62000488565b5b600083015167ffffffffffffffff811115620002d057620002cf62000483565b5b620002de8582860162000262565b925050602083015167ffffffffffffffff81111562000302576200030162000483565b5b620003108582860162000262565b9150509250929050565b60006200032662000339565b9050620003348282620003e5565b919050565b6000604051905090565b600067ffffffffffffffff8211156200036157620003606200044a565b5b6200036c826200048d565b9050602081019050919050565b60005b83811015620003995780820151818401526020810190506200037c565b83811115620003a9576000848401525b50505050565b60006002820490506001821680620003c857607f821691505b60208210811415620003df57620003de6200041b565b5b50919050565b620003f0826200048d565b810181811067ffffffffffffffff821117156200041257620004116200044a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b613cec80620004ae6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80637ecebe00116100f9578063b4b5ea5711610097578063e7a324dc11610071578063e7a324dc1461051b578063eaca5a7614610539578063f1127ed814610555578063f2fde38b14610586576101c4565b8063b4b5ea571461049f578063ba982d54146104cf578063c3cda520146104ff576101c4565b80638da5cb5b116100d35780638da5cb5b1461042b57806395d89b4114610449578063983b2d5614610467578063b391c50814610483576101c4565b80637ecebe00146103c157806387b8fcce146103f157806389afcb44146103fb576101c4565b8063587cde1e116101665780636fcfff45116101405780636fcfff451461032757806370a0823114610357578063715018a614610387578063782d6fe114610391576101c4565b8063587cde1e146102ab5780635c19a95c146102db5780636a627842146102f7576101c4565b80632eb4a7ab116101a25780632eb4a7ab146102235780633092afd514610241578063313ce5671461025d578063397ada211461027b576101c4565b806306fdde03146101c957806318160ddd146101e757806320606b7014610205575b600080fd5b6101d16105a2565b6040516101de9190613036565b60405180910390f35b6101ef610634565b6040516101fc9190613238565b60405180910390f35b61020d61063e565b60405161021a9190612f4c565b60405180910390f35b61022b610662565b6040516102389190612ea8565b60405180910390f35b61025b60048036038101906102569190612972565b610688565b005b6102656107f3565b6040516102729190613297565b60405180910390f35b61029560048036038101906102909190612aac565b6107f8565b6040516102a29190612f31565b60405180910390f35b6102c560048036038101906102c09190612972565b6108d2565b6040516102d29190612ea8565b60405180910390f35b6102f560048036038101906102f09190612972565b610905565b005b610311600480360381019061030c9190612972565b610912565b60405161031e9190612f31565b60405180910390f35b610341600480360381019061033c9190612972565b6109b2565b60405161034e9190613253565b60405180910390f35b610371600480360381019061036c9190612972565b6109d5565b60405161037e9190613238565b60405180910390f35b61038f610a1d565b005b6103ab60048036038101906103a6919061299f565b610aa5565b6040516103b891906132b2565b60405180910390f35b6103db60048036038101906103d69190612972565b610ee0565b6040516103e89190613238565b60405180910390f35b6103f9610ef8565b005b61041560048036038101906104109190612972565b610fe5565b6040516104229190612f31565b60405180910390f35b61043361107e565b6040516104409190612ea8565b60405180910390f35b6104516110a8565b60405161045e9190613036565b60405180910390f35b610481600480360381019061047c9190612972565b61113a565b005b61049d60048036038101906104989190612af5565b6112a5565b005b6104b960048036038101906104b49190612972565b61137d565b6040516104c691906132b2565b60405180910390f35b6104e960048036038101906104e49190612aac565b611474565b6040516104f69190612f31565b60405180910390f35b610519600480360381019061051491906129df565b611561565b005b6105236117f6565b6040516105309190612f4c565b60405180910390f35b610553600480360381019061054e9190612972565b61181a565b005b61056f600480360381019061056a9190612a6c565b6118ea565b60405161057d92919061326e565b60405180910390f35b6105a0600480360381019061059b9190612972565b611943565b005b6060600280546105b190613617565b80601f01602080910402602001604051908101604052809291908181526020018280546105dd90613617565b801561062a5780601f106105ff5761010080835404028352916020019161062a565b820191906000526020600020905b81548152906001019060200180831161060d57829003601f168201915b5050505050905090565b6000600154905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610690611a3b565b73ffffffffffffffffffffffffffffffffffffffff166106ae61107e565b73ffffffffffffffffffffffffffffffffffffffff1614610704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fb90613178565b60405180910390fd5b60001515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078f906130f8565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600090565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087d906131b8565b60405180910390fd5b60005b82518110156108c8576108b58382815181106108a8576108a761375a565b5b6020026020010151611a43565b80806108c09061367a565b915050610889565b5060019050919050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61090f3382611bba565b50565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610997906131b8565b60405180910390fd5b6109a982611a43565b60019050919050565b60096020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a25611a3b565b73ffffffffffffffffffffffffffffffffffffffff16610a4361107e565b73ffffffffffffffffffffffffffffffffffffffff1614610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9090613178565b60405180910390fd5b610aa36000611d2b565b565b6000438210610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613138565b60405180910390fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610b56576000915050610eda565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610ba591906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610c6a57600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610c2c91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff16915050610eda565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610ceb576000915050610eda565b600080600183610cfb91906134d1565b90505b8163ffffffff168163ffffffff161115610e5c57600060028383610d2291906134d1565b610d2c919061346c565b82610d3791906134d1565b90506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905086816000015163ffffffff161415610e2b57806020015195505050505050610eda565b86816000015163ffffffff161015610e4557819350610e55565b600182610e5291906134d1565b92505b5050610cfe565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff1693505050505b92915050565b600a6020528060005260406000206000915090505481565b60011515600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290613118565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000610fef611a3b565b73ffffffffffffffffffffffffffffffffffffffff1661100d61107e565b73ffffffffffffffffffffffffffffffffffffffff1614611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105a90613178565b60405180910390fd5b61107582611070846109d5565b611df1565b60019050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110b790613617565b80601f01602080910402602001604051908101604052809291908181526020018280546110e390613617565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b611142611a3b565b73ffffffffffffffffffffffffffffffffffffffff1661116061107e565b73ffffffffffffffffffffffffffffffffffffffff16146111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90613178565b60405180910390fd5b60011515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190613158565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600c600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660601b6bffffffffffffffffffffffff1916901b6bffffffffffffffffffffffff191690506000600c3360601b6bffffffffffffffffffffffff1916901b6bffffffffffffffffffffffff19169050611330828285611f9b9092919063ffffffff16565b61136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611366906131f8565b60405180910390fd5b61137833611a43565b505050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116113e757600061146c565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018361143591906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b915050919050565b600061147e611a3b565b73ffffffffffffffffffffffffffffffffffffffff1661149c61107e565b73ffffffffffffffffffffffffffffffffffffffff16146114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e990613178565b60405180910390fd5b60005b8251811015611557576115448382815181106115145761151361375a565b5b602002602001015161153f8584815181106115325761153161375a565b5b60200260200101516109d5565b611df1565b808061154f9061367a565b9150506114f5565b5060019050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86661158c6105a2565b8051906020012061159b612051565b306040516020016115af9493929190612fac565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016116009493929190612f67565b6040516020818303038152906040528051906020012090506000828260405160200161162d929190612e71565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161166a9493929190612ff1565b6020604051602081039080840390855afa15801561168c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff906130b8565b60405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906117589061367a565b91905055891461179d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611794906130d8565b60405180910390fd5b874211156117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d7906131d8565b60405180910390fd5b6117ea818b611bba565b50505050505050505050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d906131b8565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6008602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060000160049054906101000a90046bffffffffffffffffffffffff16905082565b61194b611a3b565b73ffffffffffffffffffffffffffffffffffffffff1661196961107e565b73ffffffffffffffffffffffffffffffffffffffff16146119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613178565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690613098565b60405180910390fd5b611a3881611d2b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90613218565b60405180910390fd5b6000611abe826109d5565b14611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613078565b60405180910390fd5b611b0b600082600161205e565b6001806000828254611b1d919061339a565b9250508190555060016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b73919061339a565b925050819055507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000826001604051611baf93929190612ec3565b60405180910390a150565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611c29846109d5565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611d25828483612063565b50505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890613198565b60405180910390fd5b611e6d8260008361205e565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea90613058565b60405180910390fd5b8181611eff919061349d565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160016000828254611f53919061349d565b925050819055507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83600084604051611f8e93929190612efa565b60405180910390a1505050565b60008082905060005b8551811015612043576000868281518110611fc257611fc161375a565b5b60200260200101519050808311612003578281604051602001611fe6929190612e45565b60405160208183030381529060405280519060200120925061202f565b8083604051602001612016929190612e45565b6040516020818303038152906040528051906020012092505b50808061203b9061367a565b915050611fa4565b508381149150509392505050565b6000804690508091505090565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156120ad57506000816bffffffffffffffffffffffff16115b1561236b57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461220e576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116121505760006121d5565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461219e91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b905060006121fc8285604051806060016040528060278152602001613c5d60279139612370565b905061220a868484846123ea565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461236a576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116122ac576000612331565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846122fa91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b905060006123588285604051806060016040528060268152602001613c37602691396126f8565b9050612366858484846123ea565b5050505b5b505050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff16111582906123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cb9190613036565b60405180910390fd5b5082846123e19190613505565b90509392505050565b600061240e43604051806060016040528060338152602001613c8460339139612777565b905060008463ffffffff161180156124ac57508063ffffffff16600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018761247691906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156125505781600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018761250091906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160046101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506126a1565b60405180604001604052808263ffffffff168152602001836bffffffffffffffffffffffff16815250600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555090505060018461264391906133f0565b600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516126e99291906132cd565b60405180910390a25050505050565b6000808385612707919061342a565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff161015839061276b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127629190613036565b60405180910390fd5b50809150509392505050565b6000640100000000831082906127c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ba9190613036565b60405180910390fd5b5082905092915050565b60006127e06127db8461331b565b6132f6565b90508083825260208201905082856020860282011115612803576128026137bd565b5b60005b85811015612833578161281988826128ad565b845260208401935060208301925050600181019050612806565b5050509392505050565b600061285061284b84613347565b6132f6565b90508083825260208201905082856020860282011115612873576128726137bd565b5b60005b858110156128a35781612889888261291e565b845260208401935060208301925050600181019050612876565b5050509392505050565b6000813590506128bc81613bc3565b92915050565b600082601f8301126128d7576128d66137b8565b5b81356128e78482602086016127cd565b91505092915050565b600082601f830112612905576129046137b8565b5b813561291584826020860161283d565b91505092915050565b60008135905061292d81613bda565b92915050565b60008135905061294281613bf1565b92915050565b60008135905061295781613c08565b92915050565b60008135905061296c81613c1f565b92915050565b600060208284031215612988576129876137c7565b5b6000612996848285016128ad565b91505092915050565b600080604083850312156129b6576129b56137c7565b5b60006129c4858286016128ad565b92505060206129d585828601612933565b9150509250929050565b60008060008060008060c087890312156129fc576129fb6137c7565b5b6000612a0a89828a016128ad565b9650506020612a1b89828a01612933565b9550506040612a2c89828a01612933565b9450506060612a3d89828a0161295d565b9350506080612a4e89828a0161291e565b92505060a0612a5f89828a0161291e565b9150509295509295509295565b60008060408385031215612a8357612a826137c7565b5b6000612a91858286016128ad565b9250506020612aa285828601612948565b9150509250929050565b600060208284031215612ac257612ac16137c7565b5b600082013567ffffffffffffffff811115612ae057612adf6137c2565b5b612aec848285016128c2565b91505092915050565b600060208284031215612b0b57612b0a6137c7565b5b600082013567ffffffffffffffff811115612b2957612b286137c2565b5b612b35848285016128f0565b91505092915050565b612b4781613539565b82525050565b612b568161354b565b82525050565b612b6581613557565b82525050565b612b7c612b7782613557565b6136c3565b82525050565b612b8b816135c0565b82525050565b6000612b9c82613373565b612ba6818561337e565b9350612bb68185602086016135e4565b612bbf816137cc565b840191505092915050565b6000612bd760228361337e565b9150612be2826137dd565b604082019050919050565b6000612bfa601e8361337e565b9150612c058261382c565b602082019050919050565b6000612c1d60268361337e565b9150612c2882613855565b604082019050919050565b6000612c4060028361338f565b9150612c4b826138a4565b600282019050919050565b6000612c6360258361337e565b9150612c6e826138cd565b604082019050919050565b6000612c8660218361337e565b9150612c918261391c565b604082019050919050565b6000612ca9601e8361337e565b9150612cb48261396b565b602082019050919050565b6000612ccc60258361337e565b9150612cd782613994565b604082019050919050565b6000612cef60268361337e565b9150612cfa826139e3565b604082019050919050565b6000612d12601a8361337e565b9150612d1d82613a32565b602082019050919050565b6000612d3560208361337e565b9150612d4082613a5b565b602082019050919050565b6000612d5860218361337e565b9150612d6382613a84565b604082019050919050565b6000612d7b602f8361337e565b9150612d8682613ad3565b604082019050919050565b6000612d9e60258361337e565b9150612da982613b22565b604082019050919050565b6000612dc1601e8361337e565b9150612dcc82613b71565b602082019050919050565b6000612de4601f8361337e565b9150612def82613b9a565b602082019050919050565b612e0381613581565b82525050565b612e128161358b565b82525050565b612e218161359b565b82525050565b612e30816135d2565b82525050565b612e3f816135a8565b82525050565b6000612e518285612b6b565b602082019150612e618284612b6b565b6020820191508190509392505050565b6000612e7c82612c33565b9150612e888285612b6b565b602082019150612e988284612b6b565b6020820191508190509392505050565b6000602082019050612ebd6000830184612b3e565b92915050565b6000606082019050612ed86000830186612b3e565b612ee56020830185612b3e565b612ef26040830184612b82565b949350505050565b6000606082019050612f0f6000830186612b3e565b612f1c6020830185612b3e565b612f296040830184612dfa565b949350505050565b6000602082019050612f466000830184612b4d565b92915050565b6000602082019050612f616000830184612b5c565b92915050565b6000608082019050612f7c6000830187612b5c565b612f896020830186612b3e565b612f966040830185612dfa565b612fa36060830184612dfa565b95945050505050565b6000608082019050612fc16000830187612b5c565b612fce6020830186612b5c565b612fdb6040830185612dfa565b612fe86060830184612b3e565b95945050505050565b60006080820190506130066000830187612b5c565b6130136020830186612e18565b6130206040830185612b5c565b61302d6060830184612b5c565b95945050505050565b600060208201905081810360008301526130508184612b91565b905092915050565b6000602082019050818103600083015261307181612bca565b9050919050565b6000602082019050818103600083015261309181612bed565b9050919050565b600060208201905081810360008301526130b181612c10565b9050919050565b600060208201905081810360008301526130d181612c56565b9050919050565b600060208201905081810360008301526130f181612c79565b9050919050565b6000602082019050818103600083015261311181612c9c565b9050919050565b6000602082019050818103600083015261313181612cbf565b9050919050565b6000602082019050818103600083015261315181612ce2565b9050919050565b6000602082019050818103600083015261317181612d05565b9050919050565b6000602082019050818103600083015261319181612d28565b9050919050565b600060208201905081810360008301526131b181612d4b565b9050919050565b600060208201905081810360008301526131d181612d6e565b9050919050565b600060208201905081810360008301526131f181612d91565b9050919050565b6000602082019050818103600083015261321181612db4565b9050919050565b6000602082019050818103600083015261323181612dd7565b9050919050565b600060208201905061324d6000830184612dfa565b92915050565b60006020820190506132686000830184612e09565b92915050565b60006040820190506132836000830185612e09565b6132906020830184612e36565b9392505050565b60006020820190506132ac6000830184612e18565b92915050565b60006020820190506132c76000830184612e36565b92915050565b60006040820190506132e26000830185612e27565b6132ef6020830184612e27565b9392505050565b6000613300613311565b905061330c8282613649565b919050565b6000604051905090565b600067ffffffffffffffff82111561333657613335613789565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561336257613361613789565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006133a582613581565b91506133b083613581565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133e5576133e46136cd565b5b828201905092915050565b60006133fb8261358b565b91506134068361358b565b92508263ffffffff0382111561341f5761341e6136cd565b5b828201905092915050565b6000613435826135a8565b9150613440836135a8565b9250826bffffffffffffffffffffffff03821115613461576134606136cd565b5b828201905092915050565b60006134778261358b565b91506134828361358b565b925082613492576134916136fc565b5b828204905092915050565b60006134a882613581565b91506134b383613581565b9250828210156134c6576134c56136cd565b5b828203905092915050565b60006134dc8261358b565b91506134e78361358b565b9250828210156134fa576134f96136cd565b5b828203905092915050565b6000613510826135a8565b915061351b836135a8565b92508282101561352e5761352d6136cd565b5b828203905092915050565b600061354482613561565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60006135cb82613581565b9050919050565b60006135dd826135a8565b9050919050565b60005b838110156136025780820151818401526020810190506135e7565b83811115613611576000848401525b50505050565b6000600282049050600182168061362f57607f821691505b602082108114156136435761364261372b565b5b50919050565b613652826137cc565b810181811067ffffffffffffffff8211171561367157613670613789565b5b80604052505050565b600061368582613581565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136b8576136b76136cd565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f5573657220616c726561647920686f6c6473206120506f4520746f6b656e0000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f504f453a3a64656c656761746542795369673a20696e76616c6964207369676e60008201527f6174757265000000000000000000000000000000000000000000000000000000602082015250565b7f504f453a3a64656c656761746542795369673a20696e76616c6964206e6f6e6360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74657220697320616c7265616479206e6f742d617070726f7665640000600082015250565b7f6d73672e73656e646572206d75737420626520616e20617070726f766564206d60008201527f696e746572000000000000000000000000000000000000000000000000000000602082015250565b7f504f453a3a6765745072696f72566f7465733a206e6f7420796574206465746560008201527f726d696e65640000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74657220697320616c726561647920617070726f766564000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f6d75737420626520617070726f766564206279206f776e657220746f2063616c60008201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b7f504f453a3a64656c656761746542795369673a207369676e617475726520657860008201527f7069726564000000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206e6f7420656c696769626c6520666f7220636c61696d0000600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613bcc81613539565b8114613bd757600080fd5b50565b613be381613557565b8114613bee57600080fd5b50565b613bfa81613581565b8114613c0557600080fd5b50565b613c118161358b565b8114613c1c57600080fd5b50565b613c288161359b565b8114613c3357600080fd5b5056fe504f453a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f7773504f453a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773504f453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212203a385192fed2fabf9b5614f5ea1f795c2abd03cee8961473d583b5aa8c1d90e964736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001250726f6f66206f66204578697374656e6365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046b504f4500000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80637ecebe00116100f9578063b4b5ea5711610097578063e7a324dc11610071578063e7a324dc1461051b578063eaca5a7614610539578063f1127ed814610555578063f2fde38b14610586576101c4565b8063b4b5ea571461049f578063ba982d54146104cf578063c3cda520146104ff576101c4565b80638da5cb5b116100d35780638da5cb5b1461042b57806395d89b4114610449578063983b2d5614610467578063b391c50814610483576101c4565b80637ecebe00146103c157806387b8fcce146103f157806389afcb44146103fb576101c4565b8063587cde1e116101665780636fcfff45116101405780636fcfff451461032757806370a0823114610357578063715018a614610387578063782d6fe114610391576101c4565b8063587cde1e146102ab5780635c19a95c146102db5780636a627842146102f7576101c4565b80632eb4a7ab116101a25780632eb4a7ab146102235780633092afd514610241578063313ce5671461025d578063397ada211461027b576101c4565b806306fdde03146101c957806318160ddd146101e757806320606b7014610205575b600080fd5b6101d16105a2565b6040516101de9190613036565b60405180910390f35b6101ef610634565b6040516101fc9190613238565b60405180910390f35b61020d61063e565b60405161021a9190612f4c565b60405180910390f35b61022b610662565b6040516102389190612ea8565b60405180910390f35b61025b60048036038101906102569190612972565b610688565b005b6102656107f3565b6040516102729190613297565b60405180910390f35b61029560048036038101906102909190612aac565b6107f8565b6040516102a29190612f31565b60405180910390f35b6102c560048036038101906102c09190612972565b6108d2565b6040516102d29190612ea8565b60405180910390f35b6102f560048036038101906102f09190612972565b610905565b005b610311600480360381019061030c9190612972565b610912565b60405161031e9190612f31565b60405180910390f35b610341600480360381019061033c9190612972565b6109b2565b60405161034e9190613253565b60405180910390f35b610371600480360381019061036c9190612972565b6109d5565b60405161037e9190613238565b60405180910390f35b61038f610a1d565b005b6103ab60048036038101906103a6919061299f565b610aa5565b6040516103b891906132b2565b60405180910390f35b6103db60048036038101906103d69190612972565b610ee0565b6040516103e89190613238565b60405180910390f35b6103f9610ef8565b005b61041560048036038101906104109190612972565b610fe5565b6040516104229190612f31565b60405180910390f35b61043361107e565b6040516104409190612ea8565b60405180910390f35b6104516110a8565b60405161045e9190613036565b60405180910390f35b610481600480360381019061047c9190612972565b61113a565b005b61049d60048036038101906104989190612af5565b6112a5565b005b6104b960048036038101906104b49190612972565b61137d565b6040516104c691906132b2565b60405180910390f35b6104e960048036038101906104e49190612aac565b611474565b6040516104f69190612f31565b60405180910390f35b610519600480360381019061051491906129df565b611561565b005b6105236117f6565b6040516105309190612f4c565b60405180910390f35b610553600480360381019061054e9190612972565b61181a565b005b61056f600480360381019061056a9190612a6c565b6118ea565b60405161057d92919061326e565b60405180910390f35b6105a0600480360381019061059b9190612972565b611943565b005b6060600280546105b190613617565b80601f01602080910402602001604051908101604052809291908181526020018280546105dd90613617565b801561062a5780601f106105ff5761010080835404028352916020019161062a565b820191906000526020600020905b81548152906001019060200180831161060d57829003601f168201915b5050505050905090565b6000600154905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610690611a3b565b73ffffffffffffffffffffffffffffffffffffffff166106ae61107e565b73ffffffffffffffffffffffffffffffffffffffff1614610704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fb90613178565b60405180910390fd5b60001515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078f906130f8565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600090565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087d906131b8565b60405180910390fd5b60005b82518110156108c8576108b58382815181106108a8576108a761375a565b5b6020026020010151611a43565b80806108c09061367a565b915050610889565b5060019050919050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61090f3382611bba565b50565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610997906131b8565b60405180910390fd5b6109a982611a43565b60019050919050565b60096020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a25611a3b565b73ffffffffffffffffffffffffffffffffffffffff16610a4361107e565b73ffffffffffffffffffffffffffffffffffffffff1614610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9090613178565b60405180910390fd5b610aa36000611d2b565b565b6000438210610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613138565b60405180910390fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610b56576000915050610eda565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610ba591906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610c6a57600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610c2c91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff16915050610eda565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610ceb576000915050610eda565b600080600183610cfb91906134d1565b90505b8163ffffffff168163ffffffff161115610e5c57600060028383610d2291906134d1565b610d2c919061346c565b82610d3791906134d1565b90506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905086816000015163ffffffff161415610e2b57806020015195505050505050610eda565b86816000015163ffffffff161015610e4557819350610e55565b600182610e5291906134d1565b92505b5050610cfe565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff1693505050505b92915050565b600a6020528060005260406000206000915090505481565b60011515600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290613118565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000610fef611a3b565b73ffffffffffffffffffffffffffffffffffffffff1661100d61107e565b73ffffffffffffffffffffffffffffffffffffffff1614611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105a90613178565b60405180910390fd5b61107582611070846109d5565b611df1565b60019050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110b790613617565b80601f01602080910402602001604051908101604052809291908181526020018280546110e390613617565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b611142611a3b565b73ffffffffffffffffffffffffffffffffffffffff1661116061107e565b73ffffffffffffffffffffffffffffffffffffffff16146111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90613178565b60405180910390fd5b60011515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190613158565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600c600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660601b6bffffffffffffffffffffffff1916901b6bffffffffffffffffffffffff191690506000600c3360601b6bffffffffffffffffffffffff1916901b6bffffffffffffffffffffffff19169050611330828285611f9b9092919063ffffffff16565b61136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611366906131f8565b60405180910390fd5b61137833611a43565b505050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116113e757600061146c565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018361143591906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b915050919050565b600061147e611a3b565b73ffffffffffffffffffffffffffffffffffffffff1661149c61107e565b73ffffffffffffffffffffffffffffffffffffffff16146114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e990613178565b60405180910390fd5b60005b8251811015611557576115448382815181106115145761151361375a565b5b602002602001015161153f8584815181106115325761153161375a565b5b60200260200101516109d5565b611df1565b808061154f9061367a565b9150506114f5565b5060019050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86661158c6105a2565b8051906020012061159b612051565b306040516020016115af9493929190612fac565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016116009493929190612f67565b6040516020818303038152906040528051906020012090506000828260405160200161162d929190612e71565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161166a9493929190612ff1565b6020604051602081039080840390855afa15801561168c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff906130b8565b60405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906117589061367a565b91905055891461179d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611794906130d8565b60405180910390fd5b874211156117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d7906131d8565b60405180910390fd5b6117ea818b611bba565b50505050505050505050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d906131b8565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6008602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060000160049054906101000a90046bffffffffffffffffffffffff16905082565b61194b611a3b565b73ffffffffffffffffffffffffffffffffffffffff1661196961107e565b73ffffffffffffffffffffffffffffffffffffffff16146119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613178565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690613098565b60405180910390fd5b611a3881611d2b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90613218565b60405180910390fd5b6000611abe826109d5565b14611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613078565b60405180910390fd5b611b0b600082600161205e565b6001806000828254611b1d919061339a565b9250508190555060016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b73919061339a565b925050819055507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000826001604051611baf93929190612ec3565b60405180910390a150565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611c29846109d5565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611d25828483612063565b50505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890613198565b60405180910390fd5b611e6d8260008361205e565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea90613058565b60405180910390fd5b8181611eff919061349d565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160016000828254611f53919061349d565b925050819055507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83600084604051611f8e93929190612efa565b60405180910390a1505050565b60008082905060005b8551811015612043576000868281518110611fc257611fc161375a565b5b60200260200101519050808311612003578281604051602001611fe6929190612e45565b60405160208183030381529060405280519060200120925061202f565b8083604051602001612016929190612e45565b6040516020818303038152906040528051906020012092505b50808061203b9061367a565b915050611fa4565b508381149150509392505050565b6000804690508091505090565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156120ad57506000816bffffffffffffffffffffffff16115b1561236b57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461220e576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116121505760006121d5565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461219e91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b905060006121fc8285604051806060016040528060278152602001613c5d60279139612370565b905061220a868484846123ea565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461236a576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116122ac576000612331565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846122fa91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b905060006123588285604051806060016040528060268152602001613c37602691396126f8565b9050612366858484846123ea565b5050505b5b505050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff16111582906123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cb9190613036565b60405180910390fd5b5082846123e19190613505565b90509392505050565b600061240e43604051806060016040528060338152602001613c8460339139612777565b905060008463ffffffff161180156124ac57508063ffffffff16600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018761247691906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156125505781600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018761250091906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160046101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506126a1565b60405180604001604052808263ffffffff168152602001836bffffffffffffffffffffffff16815250600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555090505060018461264391906133f0565b600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516126e99291906132cd565b60405180910390a25050505050565b6000808385612707919061342a565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff161015839061276b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127629190613036565b60405180910390fd5b50809150509392505050565b6000640100000000831082906127c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ba9190613036565b60405180910390fd5b5082905092915050565b60006127e06127db8461331b565b6132f6565b90508083825260208201905082856020860282011115612803576128026137bd565b5b60005b85811015612833578161281988826128ad565b845260208401935060208301925050600181019050612806565b5050509392505050565b600061285061284b84613347565b6132f6565b90508083825260208201905082856020860282011115612873576128726137bd565b5b60005b858110156128a35781612889888261291e565b845260208401935060208301925050600181019050612876565b5050509392505050565b6000813590506128bc81613bc3565b92915050565b600082601f8301126128d7576128d66137b8565b5b81356128e78482602086016127cd565b91505092915050565b600082601f830112612905576129046137b8565b5b813561291584826020860161283d565b91505092915050565b60008135905061292d81613bda565b92915050565b60008135905061294281613bf1565b92915050565b60008135905061295781613c08565b92915050565b60008135905061296c81613c1f565b92915050565b600060208284031215612988576129876137c7565b5b6000612996848285016128ad565b91505092915050565b600080604083850312156129b6576129b56137c7565b5b60006129c4858286016128ad565b92505060206129d585828601612933565b9150509250929050565b60008060008060008060c087890312156129fc576129fb6137c7565b5b6000612a0a89828a016128ad565b9650506020612a1b89828a01612933565b9550506040612a2c89828a01612933565b9450506060612a3d89828a0161295d565b9350506080612a4e89828a0161291e565b92505060a0612a5f89828a0161291e565b9150509295509295509295565b60008060408385031215612a8357612a826137c7565b5b6000612a91858286016128ad565b9250506020612aa285828601612948565b9150509250929050565b600060208284031215612ac257612ac16137c7565b5b600082013567ffffffffffffffff811115612ae057612adf6137c2565b5b612aec848285016128c2565b91505092915050565b600060208284031215612b0b57612b0a6137c7565b5b600082013567ffffffffffffffff811115612b2957612b286137c2565b5b612b35848285016128f0565b91505092915050565b612b4781613539565b82525050565b612b568161354b565b82525050565b612b6581613557565b82525050565b612b7c612b7782613557565b6136c3565b82525050565b612b8b816135c0565b82525050565b6000612b9c82613373565b612ba6818561337e565b9350612bb68185602086016135e4565b612bbf816137cc565b840191505092915050565b6000612bd760228361337e565b9150612be2826137dd565b604082019050919050565b6000612bfa601e8361337e565b9150612c058261382c565b602082019050919050565b6000612c1d60268361337e565b9150612c2882613855565b604082019050919050565b6000612c4060028361338f565b9150612c4b826138a4565b600282019050919050565b6000612c6360258361337e565b9150612c6e826138cd565b604082019050919050565b6000612c8660218361337e565b9150612c918261391c565b604082019050919050565b6000612ca9601e8361337e565b9150612cb48261396b565b602082019050919050565b6000612ccc60258361337e565b9150612cd782613994565b604082019050919050565b6000612cef60268361337e565b9150612cfa826139e3565b604082019050919050565b6000612d12601a8361337e565b9150612d1d82613a32565b602082019050919050565b6000612d3560208361337e565b9150612d4082613a5b565b602082019050919050565b6000612d5860218361337e565b9150612d6382613a84565b604082019050919050565b6000612d7b602f8361337e565b9150612d8682613ad3565b604082019050919050565b6000612d9e60258361337e565b9150612da982613b22565b604082019050919050565b6000612dc1601e8361337e565b9150612dcc82613b71565b602082019050919050565b6000612de4601f8361337e565b9150612def82613b9a565b602082019050919050565b612e0381613581565b82525050565b612e128161358b565b82525050565b612e218161359b565b82525050565b612e30816135d2565b82525050565b612e3f816135a8565b82525050565b6000612e518285612b6b565b602082019150612e618284612b6b565b6020820191508190509392505050565b6000612e7c82612c33565b9150612e888285612b6b565b602082019150612e988284612b6b565b6020820191508190509392505050565b6000602082019050612ebd6000830184612b3e565b92915050565b6000606082019050612ed86000830186612b3e565b612ee56020830185612b3e565b612ef26040830184612b82565b949350505050565b6000606082019050612f0f6000830186612b3e565b612f1c6020830185612b3e565b612f296040830184612dfa565b949350505050565b6000602082019050612f466000830184612b4d565b92915050565b6000602082019050612f616000830184612b5c565b92915050565b6000608082019050612f7c6000830187612b5c565b612f896020830186612b3e565b612f966040830185612dfa565b612fa36060830184612dfa565b95945050505050565b6000608082019050612fc16000830187612b5c565b612fce6020830186612b5c565b612fdb6040830185612dfa565b612fe86060830184612b3e565b95945050505050565b60006080820190506130066000830187612b5c565b6130136020830186612e18565b6130206040830185612b5c565b61302d6060830184612b5c565b95945050505050565b600060208201905081810360008301526130508184612b91565b905092915050565b6000602082019050818103600083015261307181612bca565b9050919050565b6000602082019050818103600083015261309181612bed565b9050919050565b600060208201905081810360008301526130b181612c10565b9050919050565b600060208201905081810360008301526130d181612c56565b9050919050565b600060208201905081810360008301526130f181612c79565b9050919050565b6000602082019050818103600083015261311181612c9c565b9050919050565b6000602082019050818103600083015261313181612cbf565b9050919050565b6000602082019050818103600083015261315181612ce2565b9050919050565b6000602082019050818103600083015261317181612d05565b9050919050565b6000602082019050818103600083015261319181612d28565b9050919050565b600060208201905081810360008301526131b181612d4b565b9050919050565b600060208201905081810360008301526131d181612d6e565b9050919050565b600060208201905081810360008301526131f181612d91565b9050919050565b6000602082019050818103600083015261321181612db4565b9050919050565b6000602082019050818103600083015261323181612dd7565b9050919050565b600060208201905061324d6000830184612dfa565b92915050565b60006020820190506132686000830184612e09565b92915050565b60006040820190506132836000830185612e09565b6132906020830184612e36565b9392505050565b60006020820190506132ac6000830184612e18565b92915050565b60006020820190506132c76000830184612e36565b92915050565b60006040820190506132e26000830185612e27565b6132ef6020830184612e27565b9392505050565b6000613300613311565b905061330c8282613649565b919050565b6000604051905090565b600067ffffffffffffffff82111561333657613335613789565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561336257613361613789565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006133a582613581565b91506133b083613581565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133e5576133e46136cd565b5b828201905092915050565b60006133fb8261358b565b91506134068361358b565b92508263ffffffff0382111561341f5761341e6136cd565b5b828201905092915050565b6000613435826135a8565b9150613440836135a8565b9250826bffffffffffffffffffffffff03821115613461576134606136cd565b5b828201905092915050565b60006134778261358b565b91506134828361358b565b925082613492576134916136fc565b5b828204905092915050565b60006134a882613581565b91506134b383613581565b9250828210156134c6576134c56136cd565b5b828203905092915050565b60006134dc8261358b565b91506134e78361358b565b9250828210156134fa576134f96136cd565b5b828203905092915050565b6000613510826135a8565b915061351b836135a8565b92508282101561352e5761352d6136cd565b5b828203905092915050565b600061354482613561565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60006135cb82613581565b9050919050565b60006135dd826135a8565b9050919050565b60005b838110156136025780820151818401526020810190506135e7565b83811115613611576000848401525b50505050565b6000600282049050600182168061362f57607f821691505b602082108114156136435761364261372b565b5b50919050565b613652826137cc565b810181811067ffffffffffffffff8211171561367157613670613789565b5b80604052505050565b600061368582613581565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136b8576136b76136cd565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f5573657220616c726561647920686f6c6473206120506f4520746f6b656e0000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f504f453a3a64656c656761746542795369673a20696e76616c6964207369676e60008201527f6174757265000000000000000000000000000000000000000000000000000000602082015250565b7f504f453a3a64656c656761746542795369673a20696e76616c6964206e6f6e6360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74657220697320616c7265616479206e6f742d617070726f7665640000600082015250565b7f6d73672e73656e646572206d75737420626520616e20617070726f766564206d60008201527f696e746572000000000000000000000000000000000000000000000000000000602082015250565b7f504f453a3a6765745072696f72566f7465733a206e6f7420796574206465746560008201527f726d696e65640000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74657220697320616c726561647920617070726f766564000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f6d75737420626520617070726f766564206279206f776e657220746f2063616c60008201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b7f504f453a3a64656c656761746542795369673a207369676e617475726520657860008201527f7069726564000000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206e6f7420656c696769626c6520666f7220636c61696d0000600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613bcc81613539565b8114613bd757600080fd5b50565b613be381613557565b8114613bee57600080fd5b50565b613bfa81613581565b8114613c0557600080fd5b50565b613c118161358b565b8114613c1c57600080fd5b50565b613c288161359b565b8114613c3357600080fd5b5056fe504f453a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f7773504f453a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773504f453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212203a385192fed2fabf9b5614f5ea1f795c2abd03cee8961473d583b5aa8c1d90e964736f6c63430008070033