Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- Dark
- Optimization enabled
- true
- Compiler version
- v0.8.24+commit.e11b9ed9
- Optimization runs
- 200
- EVM Version
- paris
- Verified at
- 2024-12-20T16:26:37.003620Z
Constructor Arguments
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000008717cd5a7250aed3473f92e97d933d2972c747fd00000000000000000000000000000000000000000000000000000000000000044461726b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044441524b00000000000000000000000000000000000000000000000000000000
Arg [0] (string) : Dark
Arg [1] (string) : DARK
Arg [2] (address) : 0x8717cd5a7250aed3473f92e97d933d2972c747fd
src/ERA2/Dark.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import {ERC20} from "@solmate/src/tokens/ERC20.sol";
import {IJourneyPhaseManager} from "@interfaces/IJourneyPhaseManager.sol";
/// @title Dark Token Contract
/// @notice Implementation of the ERC20 Dark token with a capped supply and controlled minting
/// @dev Extends the ERC20 standard
contract Dark is ERC20 {
/// @notice Maximum token supply set to 1 million tokens
uint256 public constant MAX_SUPPLY = 1_000_000 ether;
/// @notice Address authorized to mint new tokens, initially set to the deploying address
address public claimsContract;
mapping(address => bool) public allowlist;
mapping(address => address) public holders;
address internal constant SENTINEL_HOLDERS = address(0x1);
uint256 public holderCount;
address public trustedEntity;
IJourneyPhaseManager public journeyPhaseManager;
bool public raptureOccurred = false;
event AllowlistAdded(address indexed account);
event AllowlistRemoved(address indexed account);
event TrustedEntityUpdated(address indexed previousEntity, address indexed newEntity);
event RaptureOccurred();
event AddedHolder(address indexed holder);
event JourneyPhaseManagerSet(IJourneyPhaseManager indexed journeyPhaseManager);
/// @dev Custom errors
error OvershotSupplyLimit();
error Unauthorized();
error NotYetReachedSupplyLimit();
error AlreadyAllowlisted(address account);
error NotTrustedEntity(address caller);
error TrustedEntityCannotBeEmpty();
error AllowlistedAddressCannotBeZero();
error AlreadyRaptured();
error CannotRaptureBeforeAlert();
error EmptyTrustedEntity();
error EmptyName();
error EmptySymbol();
modifier onlyTrustedEntity() {
if (msg.sender != trustedEntity) {
revert NotTrustedEntity(msg.sender);
}
_;
}
/// @notice Initializes the contract, setting the initial claims contract and token details
/// @param _name The name of the token
/// @param _symbol The symbol of the token
/// @param _trustedEntity The address of the trusted entity
constructor(string memory _name, string memory _symbol, address _trustedEntity) ERC20(_name, _symbol, 18) {
if (bytes(_name).length == 0) revert EmptyName();
if (bytes(_symbol).length == 0) revert EmptySymbol();
if (_trustedEntity == address(0)) {
revert EmptyTrustedEntity();
}
// (Dark, DARK, 18)
claimsContract = msg.sender; // DarkClaims contract
holders[SENTINEL_HOLDERS] = SENTINEL_HOLDERS;
trustedEntity = _trustedEntity;
emit TrustedEntityUpdated(address(0), msg.sender);
}
/// @dev Internal function to safely mint new tokens, ensuring the max supply isn't exceeded
/// @param to The address that will receive the minted tokens
/// @param amount The number of tokens to mint
function _safeMint(address to, uint256 amount) internal {
if (!raptureOccurred) _addHolder(to);
_mint(to, amount);
if (totalSupply > MAX_SUPPLY) revert OvershotSupplyLimit();
}
/// @notice Mints new tokens to a specified address, callable only by the claimsContract
/// @dev Calls the internal _safeMint function for minting
/// @param to The address to mint the tokens to
/// @param amount The amount of tokens to mint
function mint(address to, uint256 amount) public {
if (msg.sender != claimsContract) revert Unauthorized();
_safeMint(to, amount);
}
/// @notice Sets the JourneyPhaseManager contract address
/// @dev Callable only by the trusted entity
/// @param _journeyPhaseManager The address of the JourneyPhaseManager contract
function setJourneyPhaseManager(IJourneyPhaseManager _journeyPhaseManager) public onlyTrustedEntity {
journeyPhaseManager = _journeyPhaseManager;
emit JourneyPhaseManagerSet(_journeyPhaseManager);
}
/// @notice Ends the minting process by setting the claimsContract to the zero address
/// @dev Callable only by the claimsContract
function endMinting() public {
if (msg.sender != claimsContract) revert Unauthorized();
if (totalSupply != MAX_SUPPLY) revert NotYetReachedSupplyLimit();
claimsContract = address(0);
}
/// @notice Updates the trusted entity address
/// @param newTrustedEntity The new address to set as the trusted entity
function updateTrustedEntity(address newTrustedEntity) external onlyTrustedEntity {
if (newTrustedEntity == address(0)) revert TrustedEntityCannotBeEmpty();
emit TrustedEntityUpdated(trustedEntity, newTrustedEntity);
trustedEntity = newTrustedEntity;
}
/// @notice Adds an address to the allowlist
/// @param account The address to add
function addToAllowlist(address account) external onlyTrustedEntity {
if (allowlist[account]) {
revert AlreadyAllowlisted(account);
}
if (account == address(0)) revert AllowlistedAddressCannotBeZero();
allowlist[account] = true;
emit AllowlistAdded(account);
}
/// @notice Removes an address from the allowlist
/// @param account The address to remove
function removeFromAllowlist(address account) external onlyTrustedEntity {
allowlist[account] = false;
emit AllowlistRemoved(account);
}
/// @notice Triggers the rapture
function triggerRapture() external {
// rapture after JourneyPhaseManager activates it
if (!journeyPhaseManager.isRaptureAlertActive()) {
revert CannotRaptureBeforeAlert();
}
if (raptureOccurred) revert AlreadyRaptured();
uint256 newTotalSupply = 0;
address currentHolder = holders[SENTINEL_HOLDERS];
while (currentHolder != SENTINEL_HOLDERS) {
if (allowlist[currentHolder]) {
newTotalSupply += balanceOf[currentHolder]; // Sum whitelisted holders' balances
}
currentHolder = holders[currentHolder];
}
currentHolder = holders[SENTINEL_HOLDERS];
while (currentHolder != SENTINEL_HOLDERS) {
uint256 balance = balanceOf[currentHolder];
// only burn tokens from non whitelisted holders
if (balance > 0 && !allowlist[currentHolder]) {
balanceOf[currentHolder] = 0;
// not updating the total supply because the whole total supply will be updated in the end
emit Transfer(currentHolder, address(0), balance);
}
currentHolder = holders[currentHolder];
}
totalSupply = newTotalSupply;
raptureOccurred = true;
emit RaptureOccurred();
}
/// @dev Overrides the transfer function
/// @param to The address to transfer to
/// @param amount The amount to transfer
function transfer(address to, uint256 amount) public virtual override returns (bool) {
if (!raptureOccurred) _addHolder(to);
return super.transfer(to, amount);
}
/// @dev Overrides the transferFrom function
/// @param from The address to transfer from
/// @param to The address to transfer to
/// @param amount The amount to transfer
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
if (!raptureOccurred) _addHolder(to);
return super.transferFrom(from, to, amount);
}
/// @dev Adds a new holder to the holders
/// @param holder The address of the new holder
function _addHolder(address holder) internal {
// holder address cannot be null, the sentinel.
if (holder == address(0) || holder == SENTINEL_HOLDERS) return;
// No duplicate owners allowed.
if (holders[holder] != address(0)) return;
holders[holder] = holders[SENTINEL_HOLDERS];
holders[SENTINEL_HOLDERS] = holder;
holderCount++;
emit AddedHolder(holder);
}
/// @notice Checks if an address is a holder
/// @param holder The address to check
function isHolder(address holder) public view returns (bool) {
return !(holder == SENTINEL_HOLDERS || holders[holder] == address(0));
}
}
/
pragma solidity 0.8.24;
interface IJourneyPhaseManager {
function isRaptureAlertActive() external view returns (bool);
}
/ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
uint8 public immutable decimals;
/*//////////////////////////////////////////////////////////////
ERC20 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/*//////////////////////////////////////////////////////////////
EIP-2612 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
/*//////////////////////////////////////////////////////////////
ERC20 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
/*//////////////////////////////////////////////////////////////
EIP-2612 LOGIC
//////////////////////////////////////////////////////////////*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
// Unchecked because the only math done is incrementing
// the owner's nonce which cannot realistically overflow.
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
// Cannot underflow because a user's balance
// will never be larger than the total supply.
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}
Compiler Settings
{"remappings":[":@chainlink/=lib/chainlink/",":@era1/=src/ERA1/",":@era2/=src/ERA2/",":@era3/=src/ERA3/",":@erc721a-upgradeable/contracts/=lib/ERC721A-Upgradeable/contracts/",":@erc721a/contracts/=lib/ERC721A/contracts/",":@interfaces/=src/interfaces/",":@mocks/=src/mocks/",":@murky/=lib/murky/",":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",":@safe/smart-wallet/=lib/safe-smart-account/",":@solady/=lib/solady/",":@solmate/=lib/solmate/",":@uniswap/v2-periphery/=lib/v2-periphery/",":ERC721A-Upgradeable/=lib/ERC721A-Upgradeable/contracts/",":ERC721A/=lib/ERC721A/contracts/",":chainlink/=lib/chainlink/",":ds-test/=lib/forge-std/lib/ds-test/src/",":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",":erc721a/=lib/erc721a/contracts/",":forge-std/=lib/forge-std/src/",":murky/=lib/murky/",":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",":openzeppelin-contracts/=lib/openzeppelin-contracts/",":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/",":safe-smart-account/=lib/safe-smart-account/",":solady/=lib/solady/",":solmate/=lib/solmate/src/",":v2-periphery/=lib/v2-periphery/contracts/"],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"paris","compilationTarget":{"src/ERA2/Dark.sol":"Dark"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_symbol","internalType":"string"},{"type":"address","name":"_trustedEntity","internalType":"address"}]},{"type":"error","name":"AllowlistedAddressCannotBeZero","inputs":[]},{"type":"error","name":"AlreadyAllowlisted","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"error","name":"AlreadyRaptured","inputs":[]},{"type":"error","name":"CannotRaptureBeforeAlert","inputs":[]},{"type":"error","name":"EmptyName","inputs":[]},{"type":"error","name":"EmptySymbol","inputs":[]},{"type":"error","name":"EmptyTrustedEntity","inputs":[]},{"type":"error","name":"NotTrustedEntity","inputs":[{"type":"address","name":"caller","internalType":"address"}]},{"type":"error","name":"NotYetReachedSupplyLimit","inputs":[]},{"type":"error","name":"OvershotSupplyLimit","inputs":[]},{"type":"error","name":"TrustedEntityCannotBeEmpty","inputs":[]},{"type":"error","name":"Unauthorized","inputs":[]},{"type":"event","name":"AddedHolder","inputs":[{"type":"address","name":"holder","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"AllowlistAdded","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"AllowlistRemoved","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"JourneyPhaseManagerSet","inputs":[{"type":"address","name":"journeyPhaseManager","internalType":"contract IJourneyPhaseManager","indexed":true}],"anonymous":false},{"type":"event","name":"RaptureOccurred","inputs":[],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TrustedEntityUpdated","inputs":[{"type":"address","name":"previousEntity","internalType":"address","indexed":true},{"type":"address","name":"newEntity","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_SUPPLY","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addToAllowlist","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowlist","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"claimsContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"endMinting","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"holderCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"holders","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isHolder","inputs":[{"type":"address","name":"holder","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IJourneyPhaseManager"}],"name":"journeyPhaseManager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"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":"nonpayable","outputs":[],"name":"permit","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","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":"bool","name":"","internalType":"bool"}],"name":"raptureOccurred","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeFromAllowlist","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setJourneyPhaseManager","inputs":[{"type":"address","name":"_journeyPhaseManager","internalType":"contract IJourneyPhaseManager"}]},{"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":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"triggerRapture","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"trustedEntity","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateTrustedEntity","inputs":[{"type":"address","name":"newTrustedEntity","internalType":"address"}]}]
Contract Creation Code
0x60e0604052600b805460ff60a01b191690553480156200001e57600080fd5b5060405162001aa638038062001aa68339810160408190526200004191620002e4565b82826012600062000053848262000402565b50600162000062838262000402565b5060ff81166080524660a0526200007862000180565b60c052505083516000039050620000a257604051632ef1310560e01b815260040160405180910390fd5b8151600003620000c557604051630cc613fb60e11b815260040160405180910390fd5b6001600160a01b038116620000ed576040516301d7ffdf60e01b815260040160405180910390fd5b60068054336001600160a01b031991821681179092556001600081815260086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f80548416909217909155600a80549092166001600160a01b038516179091556040517f0f83c400767f8368a825982fc904ac8051109f873c46b41732dee39156e1cf46908290a35050506200054c565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620001b49190620004ce565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024457600080fd5b81516001600160401b03808211156200026157620002616200021c565b604051601f8301601f19908116603f011681019082821181831017156200028c576200028c6200021c565b8160405283815260209250866020858801011115620002aa57600080fd5b600091505b83821015620002ce5785820183015181830184015290820190620002af565b6000602085830101528094505050505092915050565b600080600060608486031215620002fa57600080fd5b83516001600160401b03808211156200031257600080fd5b620003208783880162000232565b945060208601519150808211156200033757600080fd5b50620003468682870162000232565b604086015190935090506001600160a01b03811681146200036657600080fd5b809150509250925092565b600181811c908216806200038657607f821691505b602082108103620003a757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003fd576000816000526020600020601f850160051c81016020861015620003d85750805b601f850160051c820191505b81811015620003f957828155600101620003e4565b5050505b505050565b81516001600160401b038111156200041e576200041e6200021c565b62000436816200042f845462000371565b84620003ad565b602080601f8311600181146200046e5760008415620004555750858301515b600019600386901b1c1916600185901b178555620003f9565b600085815260208120601f198616915b828110156200049f578886015182559484019460019091019084016200047e565b5085821015620004be5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354620004de8162000371565b60018281168015620004f957600181146200050f5762000540565b60ff198416875282151583028701945062000540565b8760005260208060002060005b85811015620005375781548a8201529084019082016200051c565b50505082870194505b50929695505050505050565b60805160a05160c05161152a6200057c600039600061098f0152600061095a015260006102c6015261152a6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80635da93d7e116100f9578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e14610404578063df9a49ab1461042f578063ef70aebf14610442578063f8e86ece1461044a57600080fd5b8063a9059cbb146103cb578063d4d7b19a146103de578063d505accf146103f157600080fd5b80637ecebe00116100d35780637ecebe001461036d5780637fcb09721461038d57806395d89b41146103a0578063a7cd52cb146103a857600080fd5b80635da93d7e1461032657806368d1a7db1461033957806370a082311461034d57600080fd5b806318a5bbdc11610166578063313ce56711610140578063313ce567146102c157806332cb6b0c146102fa5780633644e5151461030b57806340c10f191461031357600080fd5b806318a5bbdc1461027c5780631aab9a9f146102a557806323b872dd146102ae57600080fd5b8063095ea7b3116101a2578063095ea7b3146102045780630a7ee767146102275780630e64f5c81461025257806318160ddd1461026557600080fd5b8063024ce0cf146101c957806302fefbf8146101de57806306fdde03146101e6575b600080fd5b6101dc6101d73660046111f9565b61045d565b005b6101dc610512565b6101ee6107b4565b6040516101fb9190611216565b60405180910390f35b610217610212366004611265565b610842565b60405190151581526020016101fb565b600b5461023a906001600160a01b031681565b6040516001600160a01b0390911681526020016101fb565b6101dc6102603660046111f9565b6108af565b61026e60025481565b6040519081526020016101fb565b61023a61028a3660046111f9565b6008602052600090815260409020546001600160a01b031681565b61026e60095481565b6102176102bc366004611291565b610926565b6102e87f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101fb565b61026e69d3c21bcecceda100000081565b61026e610956565b6101dc610321366004611265565b6109b1565b6101dc6103343660046111f9565b6109e9565b600b5461021790600160a01b900460ff1681565b61026e61035b3660046111f9565b60036020526000908152604090205481565b61026e61037b3660046111f9565b60056020526000908152604090205481565b60065461023a906001600160a01b031681565b6101ee610a5f565b6102176103b63660046111f9565b60076020526000908152604090205460ff1681565b6102176103d9366004611265565b610a6c565b6102176103ec3660046111f9565b610a9a565b6101dc6103ff3660046112d2565b610ad3565b61026e610412366004611349565b600460209081526000928352604080842090915290825290205481565b600a5461023a906001600160a01b031681565b6101dc610d17565b6101dc6104583660046111f9565b610d7f565b600a546001600160a01b0316331461048f5760405163128e7f4160e01b81523360048201526024015b60405180910390fd5b6001600160a01b0381166104b657604051637cef072b60e01b815260040160405180910390fd5b600a546040516001600160a01b038084169216907f0f83c400767f8368a825982fc904ac8051109f873c46b41732dee39156e1cf4690600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600b60009054906101000a90046001600160a01b03166001600160a01b0316633d3324d16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610565573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105899190611382565b6105a6576040516368506a9d60e01b815260040160405180910390fd5b600b54600160a01b900460ff16156105d157604051634c4eedb960e11b815260040160405180910390fd5b6001600090815260086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f546001600160a01b03165b6001600160a01b038116600114610681576001600160a01b03811660009081526007602052604090205460ff1615610661576001600160a01b03811660009081526003602052604090205461065e90836113ba565b91505b6001600160a01b0390811660009081526008602052604090205416610609565b50600160005260086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f546001600160a01b03165b6001600160a01b03811660011461076f576001600160a01b038116600090815260036020526040902054801580159061070a57506001600160a01b03821660009081526007602052604090205460ff16155b1561074e576001600160a01b0382166000818152600360209081526040808320839055518481529192916000805160206114d5833981519152910160405180910390a35b506001600160a01b03908116600090815260086020526040902054166106b8565b6002829055600b805460ff60a01b1916600160a01b1790556040517f2b667de6578446bef56ae94121dd7d266011077a4927d2d74a52bd46fc13e84490600090a15050565b600080546107c1906113cd565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed906113cd565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061089d9086815260200190565b60405180910390a35060015b92915050565b600a546001600160a01b031633146108dc5760405163128e7f4160e01b8152336004820152602401610486565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517f103efaa51c73aa147daa8c21e3e90c4e8dc267c279510483783638f02644be3390600090a250565b600b54600090600160a01b900460ff166109435761094383610e64565b61094e848484610f57565b949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461098c57610987611037565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b031633146109db576040516282b42960e81b815260040160405180910390fd5b6109e582826110d1565b5050565b600a546001600160a01b03163314610a165760405163128e7f4160e01b8152336004820152602401610486565b6001600160a01b038116600081815260076020526040808220805460ff19169055517f458680f79aa9de0ae06344287a3bd8ec6179faa05252e9af81ae734d6b4dc6ba9190a250565b600180546107c1906113cd565b600b54600090600160a01b900460ff16610a8957610a8983610e64565b610a938383611122565b9392505050565b60006001600160a01b03821660011480610acc57506001600160a01b0382811660009081526008602052604090205416155b1592915050565b42841015610b235760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610486565b60006001610b2f610956565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610c3b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610c715750876001600160a01b0316816001600160a01b0316145b610cae5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610486565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6006546001600160a01b03163314610d41576040516282b42960e81b815260040160405180910390fd5b69d3c21bcecceda100000060025414610d6d576040516307a6d1dd60e11b815260040160405180910390fd5b600680546001600160a01b0319169055565b600a546001600160a01b03163314610dac5760405163128e7f4160e01b8152336004820152602401610486565b6001600160a01b03811660009081526007602052604090205460ff1615610df157604051633ef99be560e01b81526001600160a01b0382166004820152602401610486565b6001600160a01b038116610e18576040516317e05c2b60e01b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f28f54e0b69489ad5fd27625e6fcff58faff5da96f8a077d08bb09af25bb41d549190a250565b6001600160a01b0381161580610e8357506001600160a01b0381166001145b15610e8b5750565b6001600160a01b038181166000908152600860205260409020541615610eae5750565b60086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f80546001600160a01b038381166000818152604081208054939094166001600160a01b031993841617909355600183528354909116179091556009805491610f1b83611407565b90915550506040516001600160a01b038216907f64706ace8701df5bd070a4bebf17d164c79457579cfdbd3a6876bf531723fc3c90600090a250565b6001600160a01b03831660009081526004602090815260408083203384529091528120546000198114610fb357610f8e8382611420565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b03851660009081526003602052604081208054859290610fdb908490611420565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716906000805160206114d5833981519152906110249087815260200190565b60405180910390a3506001949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516110699190611433565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600b54600160a01b900460ff166110eb576110eb82610e64565b6110f58282611188565b69d3c21bcecceda100000060025411156109e55760405163041c0c2360e31b815260040160405180910390fd5b33600090815260036020526040812080548391908390611143908490611420565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133906000805160206114d58339815191529061089d9086815260200190565b806002600082825461119a91906113ba565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481526000805160206114d5833981519152910160405180910390a35050565b6001600160a01b03811681146111f657600080fd5b50565b60006020828403121561120b57600080fd5b8135610a93816111e1565b60006020808352835180602085015260005b8181101561124457858101830151858201604001528201611228565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561127857600080fd5b8235611283816111e1565b946020939093013593505050565b6000806000606084860312156112a657600080fd5b83356112b1816111e1565b925060208401356112c1816111e1565b929592945050506040919091013590565b600080600080600080600060e0888a0312156112ed57600080fd5b87356112f8816111e1565b96506020880135611308816111e1565b95506040880135945060608801359350608088013560ff8116811461132c57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561135c57600080fd5b8235611367816111e1565b91506020830135611377816111e1565b809150509250929050565b60006020828403121561139457600080fd5b81518015158114610a9357600080fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156108a9576108a96113a4565b600181811c908216806113e157607f821691505b60208210810361140157634e487b7160e01b600052602260045260246000fd5b50919050565b600060018201611419576114196113a4565b5060010190565b818103818111156108a9576108a96113a4565b60008083548160018260011c9150600183168061145157607f831692505b6020808410820361147057634e487b7160e01b86526022600452602486fd5b8180156114845760018114611499576114c6565b60ff19861689528415158502890196506114c6565b60008a81526020902060005b868110156114be5781548b8201529085019083016114a5565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c752b4559374174c4757acaed4c0763df9e08d7b67c27800e9fa621c64c6999c64736f6c63430008180033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000008717cd5a7250aed3473f92e97d933d2972c747fd00000000000000000000000000000000000000000000000000000000000000044461726b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044441524b00000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80635da93d7e116100f9578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e14610404578063df9a49ab1461042f578063ef70aebf14610442578063f8e86ece1461044a57600080fd5b8063a9059cbb146103cb578063d4d7b19a146103de578063d505accf146103f157600080fd5b80637ecebe00116100d35780637ecebe001461036d5780637fcb09721461038d57806395d89b41146103a0578063a7cd52cb146103a857600080fd5b80635da93d7e1461032657806368d1a7db1461033957806370a082311461034d57600080fd5b806318a5bbdc11610166578063313ce56711610140578063313ce567146102c157806332cb6b0c146102fa5780633644e5151461030b57806340c10f191461031357600080fd5b806318a5bbdc1461027c5780631aab9a9f146102a557806323b872dd146102ae57600080fd5b8063095ea7b3116101a2578063095ea7b3146102045780630a7ee767146102275780630e64f5c81461025257806318160ddd1461026557600080fd5b8063024ce0cf146101c957806302fefbf8146101de57806306fdde03146101e6575b600080fd5b6101dc6101d73660046111f9565b61045d565b005b6101dc610512565b6101ee6107b4565b6040516101fb9190611216565b60405180910390f35b610217610212366004611265565b610842565b60405190151581526020016101fb565b600b5461023a906001600160a01b031681565b6040516001600160a01b0390911681526020016101fb565b6101dc6102603660046111f9565b6108af565b61026e60025481565b6040519081526020016101fb565b61023a61028a3660046111f9565b6008602052600090815260409020546001600160a01b031681565b61026e60095481565b6102176102bc366004611291565b610926565b6102e87f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016101fb565b61026e69d3c21bcecceda100000081565b61026e610956565b6101dc610321366004611265565b6109b1565b6101dc6103343660046111f9565b6109e9565b600b5461021790600160a01b900460ff1681565b61026e61035b3660046111f9565b60036020526000908152604090205481565b61026e61037b3660046111f9565b60056020526000908152604090205481565b60065461023a906001600160a01b031681565b6101ee610a5f565b6102176103b63660046111f9565b60076020526000908152604090205460ff1681565b6102176103d9366004611265565b610a6c565b6102176103ec3660046111f9565b610a9a565b6101dc6103ff3660046112d2565b610ad3565b61026e610412366004611349565b600460209081526000928352604080842090915290825290205481565b600a5461023a906001600160a01b031681565b6101dc610d17565b6101dc6104583660046111f9565b610d7f565b600a546001600160a01b0316331461048f5760405163128e7f4160e01b81523360048201526024015b60405180910390fd5b6001600160a01b0381166104b657604051637cef072b60e01b815260040160405180910390fd5b600a546040516001600160a01b038084169216907f0f83c400767f8368a825982fc904ac8051109f873c46b41732dee39156e1cf4690600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600b60009054906101000a90046001600160a01b03166001600160a01b0316633d3324d16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610565573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105899190611382565b6105a6576040516368506a9d60e01b815260040160405180910390fd5b600b54600160a01b900460ff16156105d157604051634c4eedb960e11b815260040160405180910390fd5b6001600090815260086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f546001600160a01b03165b6001600160a01b038116600114610681576001600160a01b03811660009081526007602052604090205460ff1615610661576001600160a01b03811660009081526003602052604090205461065e90836113ba565b91505b6001600160a01b0390811660009081526008602052604090205416610609565b50600160005260086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f546001600160a01b03165b6001600160a01b03811660011461076f576001600160a01b038116600090815260036020526040902054801580159061070a57506001600160a01b03821660009081526007602052604090205460ff16155b1561074e576001600160a01b0382166000818152600360209081526040808320839055518481529192916000805160206114d5833981519152910160405180910390a35b506001600160a01b03908116600090815260086020526040902054166106b8565b6002829055600b805460ff60a01b1916600160a01b1790556040517f2b667de6578446bef56ae94121dd7d266011077a4927d2d74a52bd46fc13e84490600090a15050565b600080546107c1906113cd565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed906113cd565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061089d9086815260200190565b60405180910390a35060015b92915050565b600a546001600160a01b031633146108dc5760405163128e7f4160e01b8152336004820152602401610486565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517f103efaa51c73aa147daa8c21e3e90c4e8dc267c279510483783638f02644be3390600090a250565b600b54600090600160a01b900460ff166109435761094383610e64565b61094e848484610f57565b949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000171461461098c57610987611037565b905090565b507fa2c7b90f6f061bfb3f32c3c6647b483dc1e9c3c83553f0c5f0fe23fbc1e6e34090565b6006546001600160a01b031633146109db576040516282b42960e81b815260040160405180910390fd5b6109e582826110d1565b5050565b600a546001600160a01b03163314610a165760405163128e7f4160e01b8152336004820152602401610486565b6001600160a01b038116600081815260076020526040808220805460ff19169055517f458680f79aa9de0ae06344287a3bd8ec6179faa05252e9af81ae734d6b4dc6ba9190a250565b600180546107c1906113cd565b600b54600090600160a01b900460ff16610a8957610a8983610e64565b610a938383611122565b9392505050565b60006001600160a01b03821660011480610acc57506001600160a01b0382811660009081526008602052604090205416155b1592915050565b42841015610b235760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610486565b60006001610b2f610956565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610c3b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610c715750876001600160a01b0316816001600160a01b0316145b610cae5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610486565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6006546001600160a01b03163314610d41576040516282b42960e81b815260040160405180910390fd5b69d3c21bcecceda100000060025414610d6d576040516307a6d1dd60e11b815260040160405180910390fd5b600680546001600160a01b0319169055565b600a546001600160a01b03163314610dac5760405163128e7f4160e01b8152336004820152602401610486565b6001600160a01b03811660009081526007602052604090205460ff1615610df157604051633ef99be560e01b81526001600160a01b0382166004820152602401610486565b6001600160a01b038116610e18576040516317e05c2b60e01b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f28f54e0b69489ad5fd27625e6fcff58faff5da96f8a077d08bb09af25bb41d549190a250565b6001600160a01b0381161580610e8357506001600160a01b0381166001145b15610e8b5750565b6001600160a01b038181166000908152600860205260409020541615610eae5750565b60086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f80546001600160a01b038381166000818152604081208054939094166001600160a01b031993841617909355600183528354909116179091556009805491610f1b83611407565b90915550506040516001600160a01b038216907f64706ace8701df5bd070a4bebf17d164c79457579cfdbd3a6876bf531723fc3c90600090a250565b6001600160a01b03831660009081526004602090815260408083203384529091528120546000198114610fb357610f8e8382611420565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b03851660009081526003602052604081208054859290610fdb908490611420565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716906000805160206114d5833981519152906110249087815260200190565b60405180910390a3506001949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516110699190611433565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600b54600160a01b900460ff166110eb576110eb82610e64565b6110f58282611188565b69d3c21bcecceda100000060025411156109e55760405163041c0c2360e31b815260040160405180910390fd5b33600090815260036020526040812080548391908390611143908490611420565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133906000805160206114d58339815191529061089d9086815260200190565b806002600082825461119a91906113ba565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481526000805160206114d5833981519152910160405180910390a35050565b6001600160a01b03811681146111f657600080fd5b50565b60006020828403121561120b57600080fd5b8135610a93816111e1565b60006020808352835180602085015260005b8181101561124457858101830151858201604001528201611228565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561127857600080fd5b8235611283816111e1565b946020939093013593505050565b6000806000606084860312156112a657600080fd5b83356112b1816111e1565b925060208401356112c1816111e1565b929592945050506040919091013590565b600080600080600080600060e0888a0312156112ed57600080fd5b87356112f8816111e1565b96506020880135611308816111e1565b95506040880135945060608801359350608088013560ff8116811461132c57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561135c57600080fd5b8235611367816111e1565b91506020830135611377816111e1565b809150509250929050565b60006020828403121561139457600080fd5b81518015158114610a9357600080fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156108a9576108a96113a4565b600181811c908216806113e157607f821691505b60208210810361140157634e487b7160e01b600052602260045260246000fd5b50919050565b600060018201611419576114196113a4565b5060010190565b818103818111156108a9576108a96113a4565b60008083548160018260011c9150600183168061145157607f831692505b6020808410820361147057634e487b7160e01b86526022600452602486fd5b8180156114845760018114611499576114c6565b60ff19861689528415158502890196506114c6565b60008a81526020902060005b868110156114be5781548b8201529085019083016114a5565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c752b4559374174c4757acaed4c0763df9e08d7b67c27800e9fa621c64c6999c64736f6c63430008180033