Code for 0x5d43…446b (ROG)
Since block 13617422
Verified contract
- {{
- "language": "Solidity",
- "sources": {
- "contracts/ROG.sol": {
- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.8.0;\n\nimport \"./erc20/ERC20Lockable.sol\";\nimport \"./erc20/ERC20Burnable.sol\";\nimport \"./erc20/ERC20Mintable.sol\";\nimport \"./library/Pausable.sol\";\nimport \"./library/Freezable.sol\";\n\ncontract ROG is ERC20Lockable, ERC20Burnable, ERC20Mintable, Freezable {\n string private constant _name = \"ROGIN.AI\";\n string private constant _symbol = \"ROG\";\n uint8 private constant _decimals = 18;\n uint256 private constant _initial_supply = 2_000_000_000;\n\n constructor() Ownable() {\n _cap = 3_000_000_000 * (10**uint256(_decimals));\n _mint(msg.sender, _initial_supply * (10**uint256(_decimals)));\n }\n\n function transfer(address to, uint256 amount)\n external\n override\n whenNotFrozen(msg.sender)\n whenNotPaused\n checkLock(msg.sender, amount)\n returns (bool success)\n {\n require(\n to != address(0),\n \"ROG/transfer : Should not send to zero address\"\n );\n _transfer(msg.sender, to, amount);\n success = true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 amount\n )\n external\n override\n whenNotFrozen(from)\n whenNotPaused\n checkLock(from, amount)\n returns (bool success)\n {\n require(\n to != address(0),\n \"ROG/transferFrom : Should not send to zero address\"\n );\n _transfer(from, to, amount);\n _approve(from, msg.sender, _allowances[from][msg.sender] - amount);\n success = true;\n }\n\n function approve(address spender, uint256 amount)\n external\n override\n returns (bool success)\n {\n require(\n spender != address(0),\n \"ROG/approve : Should not approve zero address\"\n );\n _approve(msg.sender, spender, amount);\n success = true;\n }\n\n function name() external pure override returns (string memory tokenName) {\n tokenName = _name;\n }\n\n function symbol()\n external\n pure\n override\n returns (string memory tokenSymbol)\n {\n tokenSymbol = _symbol;\n }\n\n function decimals() external pure override returns (uint8 tokenDecimals) {\n tokenDecimals = _decimals;\n }\n}\n"
- },
- "contracts/erc20/ERC20Lockable.sol": {
- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.8.0;\n\nimport \"./ERC20.sol\";\nimport \"../library/Ownable.sol\";\n\nabstract contract ERC20Lockable is ERC20, Ownable {\n struct LockInfo {\n uint256 amount;\n uint256 due;\n }\n\n mapping(address => LockInfo[]) internal _locks;\n mapping(address => uint256) internal _totalLocked;\n\n event Lock(address indexed from, uint256 amount, uint256 due);\n event Unlock(address indexed from, uint256 amount);\n\n modifier checkLock(address from, uint256 amount) {\n require(\n _balances[from] >= _totalLocked[from] + amount,\n \"ERC20Lockable/Cannot send more than unlocked amount\"\n );\n _;\n }\n\n function _lock(\n address from,\n uint256 amount,\n uint256 due\n ) internal returns (bool success) {\n require(\n due > block.timestamp,\n \"ERC20Lockable/lock : Cannot set due to past\"\n );\n require(\n _balances[from] >= amount + _totalLocked[from],\n \"ERC20Lockable/lock : locked total should be smaller than balance\"\n );\n _totalLocked[from] = _totalLocked[from] + amount;\n _locks[from].push(LockInfo(amount, due));\n emit Lock(from, amount, due);\n success = true;\n }\n\n function _unlock(address from, uint256 index)\n internal\n returns (bool success)\n {\n LockInfo storage lock = _locks[from][index];\n _totalLocked[from] = _totalLocked[from] - lock.amount;\n emit Unlock(from, lock.amount);\n _locks[from][index] = _locks[from][_locks[from].length - 1];\n _locks[from].pop();\n success = true;\n }\n\n function unlock(address from, uint256 idx) external returns (bool success) {\n require(\n _locks[from][idx].due < block.timestamp,\n \"ERC20Lockable/unlock: cannot unlock before due\"\n );\n _unlock(from, idx);\n }\n\n function unlockAll(address from) external returns (bool success) {\n for (uint256 i = 0; i < _locks[from].length; ) {\n i++;\n if (_locks[from][i - 1].due < block.timestamp) {\n if (_unlock(from, i - 1)) {\n i--;\n }\n }\n }\n success = true;\n }\n\n function releaseLock(address from)\n external\n onlyOwner\n returns (bool success)\n {\n for (uint256 i = 0; i < _locks[from].length; ) {\n i++;\n if (_unlock(from, i - 1)) {\n i--;\n }\n }\n success = true;\n }\n\n function transferWithLockUp(\n address recipient,\n uint256 amount,\n uint256 due\n ) external onlyOwner returns (bool success) {\n require(\n recipient != address(0),\n \"ERC20Lockable/transferWithLockUp : Cannot send to zero address\"\n );\n _transfer(msg.sender, recipient, amount);\n _lock(recipient, amount, due);\n success = true;\n }\n\n function lockInfo(address locked, uint256 index)\n external\n view\n returns (uint256 amount, uint256 due)\n {\n LockInfo memory lock = _locks[locked][index];\n amount = lock.amount;\n due = lock.due;\n }\n\n function totalLocked(address locked)\n external\n view\n returns (uint256 amount, uint256 length)\n {\n amount = _totalLocked[locked];\n length = _locks[locked].length;\n }\n}\n"
- },
- "contracts/erc20/ERC20Burnable.sol": {
- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.8.0;\n\nimport \"./ERC20.sol\";\nimport \"../library/Pausable.sol\";\n\nabstract contract ERC20Burnable is ERC20, Pausable {\n event Burn(address indexed burned, uint256 amount);\n\n function burn(uint256 amount)\n external\n whenNotPaused\n returns (bool success)\n {\n success = _burn(msg.sender, amount);\n emit Burn(msg.sender, amount);\n success = true;\n }\n\n function burnFrom(address burned, uint256 amount)\n external\n whenNotPaused\n returns (bool success)\n {\n _burn(burned, amount);\n emit Burn(burned, amount);\n success = _approve(\n burned,\n msg.sender,\n _allowances[burned][msg.sender] - amount\n );\n }\n}\n"
- },
- "contracts/erc20/ERC20Mintable.sol": {
- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.8.0;\n\nimport \"./ERC20.sol\";\nimport \"../library/Pausable.sol\";\n\nabstract contract ERC20Mintable is ERC20, Pausable {\n event Mint(address indexed receiver, uint256 amount);\n event MintFinished();\n uint256 internal _cap;\n bool internal _mintingFinished;\n\n ///@notice mint token\n ///@dev only owner can call this function\n function mint(address receiver, uint256 amount)\n external\n onlyOwner\n whenNotPaused\n returns (bool success)\n {\n require(\n receiver != address(0),\n \"ERC20Mintable/mint : Should not mint to zero address\"\n );\n require(\n _totalSupply + amount <= _cap,\n \"ERC20Mintable/mint : Cannot mint over cap\"\n );\n require(\n !_mintingFinished,\n \"ERC20Mintable/mint : Cannot mint after finished\"\n );\n _mint(receiver, amount);\n emit Mint(receiver, amount);\n success = true;\n }\n\n ///@notice finish minting, cannot mint after calling this function\n ///@dev only owner can call this function\n function finishMint() external onlyOwner returns (bool success) {\n require(\n !_mintingFinished,\n \"ERC20Mintable/finishMinting : Already finished\"\n );\n _mintingFinished = true;\n emit MintFinished();\n return true;\n }\n\n function cap() external view returns (uint256) {\n return _cap;\n }\n\n function isFinished() external view returns (bool finished) {\n finished = _mintingFinished;\n }\n}\n"
- },
- "contracts/library/Pausable.sol": {
- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.8.0;\n\nimport \"./Ownable.sol\";\n\ncontract Pausable is Ownable {\n bool internal _paused;\n\n event Paused();\n event Unpaused();\n\n modifier whenPaused() {\n require(_paused, \"Paused : This function can only be called when paused\");\n _;\n }\n\n modifier whenNotPaused() {\n require(!_paused, \"Paused : This function can only be called when not paused\");\n _;\n }\n\n function pause() external onlyOwner whenNotPaused returns (bool success) {\n _paused = true;\n emit Paused();\n success = true;\n }\n\n function unPause() external onlyOwner whenPaused returns (bool success) {\n _paused = false;\n emit Unpaused();\n success = true;\n }\n\n function paused() external view returns (bool) {\n return _paused;\n }\n}\n"
- },
- "contracts/library/Freezable.sol": {
- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.8.0;\n\nimport \"./Ownable.sol\";\n\ncontract Freezable is Ownable {\n mapping(address => bool) private _frozen;\n\n event Freeze(address indexed target);\n event Unfreeze(address indexed target);\n\n modifier whenNotFrozen(address target) {\n require(!_frozen[target], \"Freezable : target is frozen\");\n _;\n }\n\n function freeze(address target) external onlyOwner returns (bool success) {\n _frozen[target] = true;\n emit Freeze(target);\n success = true;\n }\n\n function unFreeze(address target)\n external\n onlyOwner\n returns (bool success)\n {\n _frozen[target] = false;\n emit Unfreeze(target);\n success = true;\n }\n\n function isFrozen(address target)\n external\n view\n returns (bool frozen)\n {\n return _frozen[target];\n }\n}\n"
- },
- "contracts/erc20/ERC20.sol": {
- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.8.0;\n\nabstract contract ERC20 {\n uint256 internal _totalSupply;\n mapping(address => uint256) internal _balances;\n mapping(address => mapping(address => uint256)) internal _allowances;\n\n event Transfer(address indexed from, address indexed to, uint256 amount);\n event Approval(\n address indexed owner,\n address indexed spender,\n uint256 amount\n );\n\n /*\n * Internal Functions for ERC20 standard logics\n */\n\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal returns (bool success) {\n _balances[from] = _balances[from] - amount;\n _balances[to] = _balances[to] + amount;\n emit Transfer(from, to, amount);\n success = true;\n }\n\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal returns (bool success) {\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n success = true;\n }\n\n function _mint(address recipient, uint256 amount)\n internal\n returns (bool success)\n {\n _totalSupply = _totalSupply + amount;\n _balances[recipient] = _balances[recipient] + amount;\n emit Transfer(address(0), recipient, amount);\n success = true;\n }\n\n function _burn(address burned, uint256 amount)\n internal\n returns (bool success)\n {\n _balances[burned] = _balances[burned] - amount;\n _totalSupply = _totalSupply - amount;\n emit Transfer(burned, address(0), amount);\n success = true;\n }\n\n /*\n * public view functions to view common data\n */\n\n function totalSupply() external view returns (uint256 total) {\n total = _totalSupply;\n }\n\n function balanceOf(address owner) external view returns (uint256 balance) {\n balance = _balances[owner];\n }\n\n function allowance(address owner, address spender)\n external\n view\n returns (uint256 remaining)\n {\n remaining = _allowances[owner][spender];\n }\n\n /*\n * External view Function Interface to implement on final contract\n */\n function name() external view virtual returns (string memory tokenName);\n\n function symbol() external view virtual returns (string memory tokenSymbol);\n\n function decimals() external view virtual returns (uint8 tokenDecimals);\n\n /*\n * External Function Interface to implement on final contract\n */\n function transfer(address to, uint256 amount)\n external\n virtual\n returns (bool success);\n\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external virtual returns (bool success);\n\n function approve(address spender, uint256 amount)\n external\n virtual\n returns (bool success);\n}\n"
- },
- "contracts/library/Ownable.sol": {
- "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.8.0;\n\nabstract contract Ownable {\n address internal _owner;\n\n event OwnershipTransferred(\n address indexed currentOwner,\n address indexed newOwner\n );\n\n constructor() {\n _owner = msg.sender;\n emit OwnershipTransferred(address(0), msg.sender);\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == _owner,\n \"Ownable : Function called by unauthorized user.\"\n );\n _;\n }\n\n function owner() external view returns (address ownerAddress) {\n ownerAddress = _owner;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n returns (bool success)\n {\n require(newOwner != address(0), \"Ownable/transferOwnership : cannot transfer ownership to zero address\");\n success = _transferOwnership(newOwner);\n }\n\n function renounceOwnership() external onlyOwner returns (bool success) {\n success = _transferOwnership(address(0));\n }\n\n function _transferOwnership(address newOwner) internal returns (bool success) {\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n success = true;\n }\n}\n"
- }
- },
- "settings": {
- "optimizer": {
- "enabled": false,
- "runs": 200
- },
- "outputSelection": {
- "*": {
- "*": [
- "evm.bytecode",
- "evm.deployedBytecode",
- "devdoc",
- "userdoc",
- "metadata",
- "abi"
- ]
- }
- },
- "libraries": {}
- }
- }}
Contract sourced from Etherscan. Solidity version v0.8.0+commit.c7dfd78e
.
Panoramix decompilation
# Palkeoramix decompiler. const name = 'ROGIN.AI', 0 const decimals = 18 const symbol = 'ROG', 0 def storage: totalSupply is uint256 at storage 0 balanceOf is mapping of uint256 at storage 1 allowance is mapping of uint256 at storage 2 owner is address at storage 3 lockInfo is array of struct at storage 4 stor5 is mapping of uint256 at storage 5 stor6 is uint8 at storage 6 cap is uint256 at storage 7 isFinished is uint8 at storage 8 stor9 is mapping of uint8 at storage 9 def totalSupply() payable: return totalSupply def cap() payable: return cap def paused() payable: return bool(stor6) def balanceOf(address account) payable: require calldata.size - 4 >=′ 32 require account == account return balanceOf[address(account)] def isFinished() payable: return bool(isFinished) def owner() payable: return owner def lockInfo(address locked, uint256 index) payable: require calldata.size - 4 >=′ 64 require locked == locked require index == index if index >= lockInfo[address(locked)].field_0: revert with Panic(50) # If you access an array, bytesN or an array slice at an out-of-bounds or negative index (i.e. x[i] where i >= x.length or i < 0). return lockInfo[address(locked)][index].field_0, lockInfo[address(locked)][index].field_256 def allowance(address owner, address spender) payable: require calldata.size - 4 >=′ 64 require owner == owner require spender == spender return allowance[address(owner)][address(spender)] def isFrozen(address _target) payable: require calldata.size - 4 >=′ 32 require _target == _target return bool(stor9[address(_target)]) # # Regular functions # def _fallback(?) payable: # default function revert def unlockAll(address from) payable: require calldata.size - 4 >=′ 32 require from == from ... # Decompilation aborted, sorry: ("decompilation didn't finish",) def totalLocked(address locked) payable: require calldata.size - 4 >=′ 32 require locked == locked return stor5[address(locked)], lockInfo[address(locked)].field_0 def renounceOwnership() payable: if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' log OwnershipTransferred( address previousOwner=owner, address newOwner=0) owner = 0 return 1 def releaseLock(address from) payable: require calldata.size - 4 >=′ 32 require from == from if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' ... # Decompilation aborted, sorry: ("decompilation didn't finish",) def finishMint() payable: if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' if isFinished: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Mintable/finishMinting : Already finished' isFinished = 1 log MintFinished() return 1 def pause() payable: if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' if stor6: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Paused : This function can only be called when not paused' stor6 = 1 log Paused() return 1 def unPause() payable: if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' if not stor6: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Paused : This function can only be called when paused' stor6 = 0 log Unpaused() return 1 def unFreeze(address target) payable: require calldata.size - 4 >=′ 32 require target == target if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' stor9[address(target)] = 0 log Unfreeze(address holder=target) return 1 def freeze(address _target) payable: require calldata.size - 4 >=′ 32 require _target == _target if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' stor9[address(_target)] = 1 log Freeze(address holder=_target) return 1 def approve(address spender, uint256 amount) payable: require calldata.size - 4 >=′ 64 require spender == spender require amount == amount if not spender: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ROG/approve : Should not approve zero address' allowance[caller][address(spender)] = amount log Approval( address owner=amount, address spender=caller, uint256 value=spender) return 1 def transferOwnership(address newOwner) payable: require calldata.size - 4 >=′ 32 require newOwner == newOwner if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' if not newOwner: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable/transferOwnership : cannot transfer ownership to zero address' log OwnershipTransferred( address previousOwner=owner, address newOwner=newOwner) owner = newOwner return 1 def burn(uint256 _value) payable: require calldata.size - 4 >=′ 32 require _value == _value if stor6: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Paused : This function can only be called when not paused' if balanceOf[caller] < _value: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. balanceOf[caller] -= _value if totalSupply < _value: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. totalSupply -= _value log Transfer( address from=_value, address to=caller, uint256 value=0) log Burn( address from=_value, uint256 value=caller) return 1 def burnFrom(address _from, uint256 _value) payable: require calldata.size - 4 >=′ 64 require _from == _from require _value == _value if stor6: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Paused : This function can only be called when not paused' if balanceOf[address(_from)] < _value: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. balanceOf[address(_from)] -= _value if totalSupply < _value: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. totalSupply -= _value log Transfer( address from=_value, address to=_from, uint256 value=0) log Burn( address from=_value, uint256 value=_from) if allowance[address(_from)][caller] < _value: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. allowance[address(_from)][caller] -= _value log Approval( address owner=(allowance[address(_from)][caller] - _value), address spender=_from, uint256 value=caller) return 1 def transfer(address recipient, uint256 amount) payable: require calldata.size - 4 >=′ 64 require recipient == recipient require amount == amount if stor9[caller]: revert with 0, 'Freezable : target is frozen' if stor6: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Paused : This function can only be called when not paused' if stor5[caller] > -amount - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. if balanceOf[caller] < stor5[caller] + amount: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Lockable/Cannot send more than unlocked amount' if not recipient: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ROG/transfer : Should not send to zero address' if balanceOf[caller] < amount: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. balanceOf[caller] -= amount if balanceOf[address(recipient)] > -amount - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. balanceOf[address(recipient)] += amount log Transfer( address from=amount, address to=caller, uint256 value=recipient) return 1 def mint(address _to, uint256 _amount) payable: require calldata.size - 4 >=′ 64 require _to == _to require _amount == _amount if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' if stor6: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Paused : This function can only be called when not paused' if not _to: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Mintable/mint : Should not mint to zero address' if totalSupply > -_amount - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. if totalSupply + _amount > cap: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Mintable/mint : Cannot mint over cap' if isFinished: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Mintable/mint : Cannot mint after finished' if totalSupply > -_amount - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. totalSupply += _amount if balanceOf[address(_to)] > -_amount - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. balanceOf[address(_to)] += _amount log Transfer( address from=_amount, address to=0, uint256 value=_to) log Mint( address to=_amount, uint256 amount=_to) return 1 def transferFrom(address sender, address recipient, uint256 amount) payable: require calldata.size - 4 >=′ 96 require sender == sender require recipient == recipient require amount == amount if stor9[address(sender)]: revert with 0, 'Freezable : target is frozen' if stor6: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Paused : This function can only be called when not paused' if stor5[address(sender)] > -amount - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. if balanceOf[address(sender)] < stor5[address(sender)] + amount: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Lockable/Cannot send more than unlocked amount' if not recipient: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ROG/transferFrom : Should not send to zero address' if balanceOf[address(sender)] < amount: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. balanceOf[address(sender)] -= amount if balanceOf[address(recipient)] > -amount - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. balanceOf[address(recipient)] += amount log Transfer( address from=amount, address to=sender, uint256 value=recipient) if allowance[address(sender)][caller] < amount: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. allowance[address(sender)][caller] -= amount log Approval( address owner=(allowance[address(sender)][caller] - amount), address spender=sender, uint256 value=caller) return 1 def transferWithLockUp(address recipient, uint256 amount, uint256 due) payable: require calldata.size - 4 >=′ 96 require recipient == recipient require amount == amount require due == due if owner != caller: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'Ownable : Function called by unauthorized user.' if not recipient: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Lockable/transferWithLockUp : Cannot send to zero address' if balanceOf[caller] < amount: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. balanceOf[caller] -= amount if balanceOf[address(recipient)] > -amount - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. balanceOf[address(recipient)] += amount log Transfer( address from=amount, address to=caller, uint256 value=recipient) if due <= block.timestamp: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Lockable/lock : Cannot set due to past' if amount > -stor5[address(recipient)] - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. if balanceOf[address(recipient)] < amount + stor5[address(recipient)]: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Lockable/lock : locked total should be smaller than balance' if stor5[address(recipient)] > -amount - 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. stor5[address(recipient)] += amount lockInfo[address(recipient)].field_0++ lockInfo[address(recipient)][lockInfo[address(recipient)].field_0].field_0 = amount lockInfo[address(recipient)][lockInfo[address(recipient)].field_0].field_256 = due log Lock( address holder=amount, uint256 value=due, uint256 releaseTime=recipient) return 1 def unlock(address _holder, uint256 i) payable: require calldata.size - 4 >=′ 64 require _holder == _holder require i == i if i >= lockInfo[address(_holder)].field_0: revert with Panic(50) # If you access an array, bytesN or an array slice at an out-of-bounds or negative index (i.e. x[i] where i >= x.length or i < 0). if lockInfo[address(_holder)][i].field_256 >= block.timestamp: revert with 0x8c379a000000000000000000000000000000000000000000000000000000000, 'ERC20Lockable/unlock: cannot unlock before due' if i >= lockInfo[address(_holder)].field_0: revert with Panic(50) # If you access an array, bytesN or an array slice at an out-of-bounds or negative index (i.e. x[i] where i >= x.length or i < 0). if stor5[address(_holder)] < lockInfo[address(_holder)][i].field_0: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. stor5[address(_holder)] -= lockInfo[address(_holder)][i].field_0 log Unlock( address holder=lockInfo[address(_holder)][i].field_0, uint256 value=_holder) if lockInfo[address(_holder)].field_0 < 1: revert with Panic(17) # If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block. if lockInfo[address(_holder)].field_0 - 1 >= lockInfo[address(_holder)].field_0: revert with Panic(50) # If you access an array, bytesN or an array slice at an out-of-bounds or negative index (i.e. x[i] where i >= x.length or i < 0). if i >= lockInfo[address(_holder)].field_0: revert with Panic(50) # If you access an array, bytesN or an array slice at an out-of-bounds or negative index (i.e. x[i] where i >= x.length or i < 0). lockInfo[address(_holder)][i].field_0 = lockInfo[address(_holder)][lockInfo[address(_holder)].field_0 - 1].field_0 lockInfo[address(_holder)][i].field_256 = lockInfo[address(_holder)][lockInfo[address(_holder)].field_0 - 1].field_256 if not lockInfo[address(_holder)].field_0: revert with Panic(49) # If you call .pop() on an empty array. lockInfo[address(_holder)][lockInfo[address(_holder)].field_0 - 1].field_0 = 0 lockInfo[address(_holder)][lockInfo[address(_holder)].field_0 - 1].field_256 = 0 lockInfo[address(_holder)].field_0-- return 0
Decompilation generated by Panoramix.
Raw bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806383cfab4211610104578063c4f3a853116100a2578063e4cc18be11610071578063e4cc18be1461060d578063e58398361461062b578063f2fde38b1461065b578063f7b188a51461068b576101da565b8063c4f3a8531461054c578063d1c469161461057c578063d8fb9337146105ac578063dd62ed3e146105dd576101da565b80638da5cb5b116100de5780638da5cb5b146104af57806395d89b41146104cd578063a9059cbb146104eb578063b2520a7c1461051b576101da565b806383cfab42146104315780638456cb59146104615780638d1fdf2f1461047f576101da565b806340c10f191161017c578063715018a61161014b578063715018a61461039557806379cc6790146103b35780637b352962146103e35780637eee288d14610401576101da565b806340c10f19146102e757806342966c68146103175780635c975abb1461034757806370a0823114610365576101da565b806323b872dd116101b857806323b872dd1461024b578063313ce5671461027b578063355274ea1461029957806338b82092146102b7576101da565b806306fdde03146101df578063095ea7b3146101fd57806318160ddd1461022d575b600080fd5b6101e76106a9565b6040516101f49190613479565b60405180910390f35b61021760048036038101906102129190612c54565b6106e6565b604051610224919061345e565b60405180910390f35b61023561076d565b60405161024291906136bb565b60405180910390f35b61026560048036038101906102609190612c05565b610776565b604051610272919061345e565b60405180910390f35b610283610a41565b60405161029091906136ff565b60405180910390f35b6102a1610a4a565b6040516102ae91906136bb565b60405180910390f35b6102d160048036038101906102cc9190612c90565b610a54565b6040516102de919061345e565b60405180910390f35b61030160048036038101906102fc9190612c54565b610b79565b60405161030e919061345e565b60405180910390f35b610331600480360381019061032c9190612cdf565b610dd0565b60405161033e919061345e565b60405180910390f35b61034f610e85565b60405161035c919061345e565b60405180910390f35b61037f600480360381019061037a9190612ba0565b610e9c565b60405161038c91906136bb565b60405180910390f35b61039d610ee5565b6040516103aa919061345e565b60405180910390f35b6103cd60048036038101906103c89190612c54565b610f86565b6040516103da919061345e565b60405180910390f35b6103eb6110cb565b6040516103f8919061345e565b60405180910390f35b61041b60048036038101906104169190612c54565b6110e2565b604051610428919061345e565b60405180910390f35b61044b60048036038101906104469190612ba0565b6111bf565b604051610458919061345e565b60405180910390f35b6104696112f5565b604051610476919061345e565b60405180910390f35b61049960048036038101906104949190612ba0565b611425565b6040516104a6919061345e565b60405180910390f35b6104b761155b565b6040516104c49190613443565b60405180910390f35b6104d5611585565b6040516104e29190613479565b60405180910390f35b61050560048036038101906105009190612c54565b6115c2565b604051610512919061345e565b60405180910390f35b61053560048036038101906105309190612c54565b6117f9565b6040516105439291906136d6565b60405180910390f35b61056660048036038101906105619190612ba0565b6118ba565b604051610573919061345e565b60405180910390f35b61059660048036038101906105919190612ba0565b6119f0565b6040516105a3919061345e565b60405180910390f35b6105c660048036038101906105c19190612ba0565b611b16565b6040516105d49291906136d6565b60405180910390f35b6105f760048036038101906105f29190612bc9565b611ba5565b60405161060491906136bb565b60405180910390f35b610615611c2c565b604051610622919061345e565b60405180910390f35b61064560048036038101906106409190612ba0565b611d5c565b604051610652919061345e565b60405180910390f35b61067560048036038101906106709190612ba0565b611db2565b604051610682919061345e565b60405180910390f35b610693611ec4565b6040516106a0919061345e565b60405180910390f35b60606040518060400160405280600881526020017f524f47494e2e4149000000000000000000000000000000000000000000000000815250905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074e9061363b565b60405180910390fd5b610762338484611ff3565b506001905092915050565b60008054905090565b600083600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fd9061365b565b60405180910390fd5b600660009054906101000a900460ff1615610856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084d9061355b565b60405180910390fd5b848380600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546108a39190613736565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091b9061361b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b9061359b565b60405180910390fd5b61099f8787876120e6565b50610a32873387600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a2d919061378c565b611ff3565b50600193505050509392505050565b60006012905090565b6000600754905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add906135db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d9061349b565b60405180910390fd5b610b613385856120e6565b50610b6d848484612274565b50600190509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c02906135db565b60405180910390fd5b600660009054906101000a900460ff1615610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c529061355b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc29061353b565b60405180910390fd5b60075482600054610cdc9190613736565b1115610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d14906135fb565b60405180910390fd5b600860009054906101000a900460ff1615610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d649061357b565b60405180910390fd5b610d778383612500565b508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688583604051610dbe91906136bb565b60405180910390a26001905092915050565b6000600660009054906101000a900460ff1615610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e199061355b565b60405180910390fd5b610e2c3383612614565b90503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca583604051610e7491906136bb565b60405180910390a260019050919050565b6000600660009054906101000a900460ff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e906135db565b60405180910390fd5b610f816000612728565b905090565b6000600660009054906101000a900460ff1615610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf9061355b565b60405180910390fd5b610fe28383612614565b508273ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161102991906136bb565b60405180910390a26110c3833384600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110be919061378c565b611ff3565b905092915050565b6000600860009054906101000a900460ff16905090565b600042600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061115c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154106111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a59061351b565b60405180910390fd5b6111b883836127f0565b5092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611248906135db565b60405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fca5069937e68fd197927055037f59d7c90bf75ac104e6e375539ef480c3ad6ee60405160405180910390a260019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e906135db565b60405180910390fd5b600660009054906101000a900460ff16156113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce9061355b565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a16001905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae906135db565b60405180910390fd5b6001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167faf85b60d26151edd11443b704d424da6c43d0468f2235ebae3d1904dbc32304960405160405180910390a260019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600381526020017f524f470000000000000000000000000000000000000000000000000000000000815250905090565b600033600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061365b565b60405180910390fd5b600660009054906101000a900460ff16156116a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116999061355b565b60405180910390fd5b338380600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ef9190613736565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611770576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117679061361b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d7906135bb565b60405180910390fd5b6117eb3387876120e6565b506001935050505092915050565b6000806000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611875577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505090508060000151925080602001519150509250929050565b600080600090505b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156119e657808061191790613872565b91505042600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600183611967919061378c565b8154811061199e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001015410156119e1576119cc836001836119c7919061378c565b6127f0565b156119e05780806119dc90613848565b9150505b5b6118c2565b5060019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a79906135db565b60405180910390fd5b60005b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611b0c578080611ada90613872565b915050611af383600183611aee919061378c565b6127f0565b15611b07578080611b0390613848565b9150505b611a85565b5060019050919050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050915091565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb5906135db565b60405180910390fd5b600860009054906101000a900460ff1615611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d05906134bb565b60405180910390fd5b6001600860006101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b906135db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab9061369b565b60405180910390fd5b611ebd82612728565b9050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d906135db565b60405180910390fd5b600660009054906101000a900460ff16611fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9c9061367b565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a16001905090565b600081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516120d391906136bb565b60405180910390a3600190509392505050565b600081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612133919061378c565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121c19190613736565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161226191906136bb565b60405180910390a3600190509392505050565b60004282116122b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122af906134fb565b60405180910390fd5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836123039190613736565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237b906134db565b60405180910390fd5b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123cf9190613736565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405280858152602001848152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508373ffffffffffffffffffffffffffffffffffffffff167f49eaf4942f1237055eb4cfa5f31c9dfe50d5b4ade01e021f7de8be2fbbde557b84846040516124ed9291906136d6565b60405180910390a2600190509392505050565b6000816000546125109190613736565b60008190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125619190613736565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161260291906136bb565b60405180910390a36001905092915050565b600081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612661919061378c565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000546126b2919061378c565b600081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161271691906136bb565b60405180910390a36001905092915050565b60008173ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a381600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b600080600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061286a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128c9919061378c565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f6381d9813cabeb57471b5a7e05078e64845ccdb563146a6911d536f24ce960f1826000015460405161295691906136bb565b60405180910390a2600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506129ec919061378c565b81548110612a23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110612aa8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016000820154816000015560018201548160010155905050600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480612b42577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055600191505092915050565b600081359050612b85816138fb565b92915050565b600081359050612b9a81613912565b92915050565b600060208284031215612bb257600080fd5b6000612bc084828501612b76565b91505092915050565b60008060408385031215612bdc57600080fd5b6000612bea85828601612b76565b9250506020612bfb85828601612b76565b9150509250929050565b600080600060608486031215612c1a57600080fd5b6000612c2886828701612b76565b9350506020612c3986828701612b76565b9250506040612c4a86828701612b8b565b9150509250925092565b60008060408385031215612c6757600080fd5b6000612c7585828601612b76565b9250506020612c8685828601612b8b565b9150509250929050565b600080600060608486031215612ca557600080fd5b6000612cb386828701612b76565b9350506020612cc486828701612b8b565b9250506040612cd586828701612b8b565b9150509250925092565b600060208284031215612cf157600080fd5b6000612cff84828501612b8b565b91505092915050565b612d11816137c0565b82525050565b612d20816137d2565b82525050565b6000612d318261371a565b612d3b8185613725565b9350612d4b818560208601613815565b612d54816138ea565b840191505092915050565b6000612d6c603e83613725565b91507f45524332304c6f636b61626c652f7472616e73666572576974684c6f636b557060008301527f203a2043616e6e6f742073656e6420746f207a65726f206164647265737300006020830152604082019050919050565b6000612dd2602e83613725565b91507f45524332304d696e7461626c652f66696e6973684d696e74696e67203a20416c60008301527f72656164792066696e69736865640000000000000000000000000000000000006020830152604082019050919050565b6000612e38604083613725565b91507f45524332304c6f636b61626c652f6c6f636b203a206c6f636b656420746f746160008301527f6c2073686f756c6420626520736d616c6c6572207468616e2062616c616e63656020830152604082019050919050565b6000612e9e602b83613725565b91507f45524332304c6f636b61626c652f6c6f636b203a2043616e6e6f74207365742060008301527f64756520746f20706173740000000000000000000000000000000000000000006020830152604082019050919050565b6000612f04602e83613725565b91507f45524332304c6f636b61626c652f756e6c6f636b3a2063616e6e6f7420756e6c60008301527f6f636b206265666f7265206475650000000000000000000000000000000000006020830152604082019050919050565b6000612f6a603483613725565b91507f45524332304d696e7461626c652f6d696e74203a2053686f756c64206e6f742060008301527f6d696e7420746f207a65726f20616464726573730000000000000000000000006020830152604082019050919050565b6000612fd0603983613725565b91507f506175736564203a20546869732066756e6374696f6e2063616e206f6e6c792060008301527f62652063616c6c6564207768656e206e6f7420706175736564000000000000006020830152604082019050919050565b6000613036602f83613725565b91507f45524332304d696e7461626c652f6d696e74203a2043616e6e6f74206d696e7460008301527f2061667465722066696e697368656400000000000000000000000000000000006020830152604082019050919050565b600061309c603283613725565b91507f524f472f7472616e7366657246726f6d203a2053686f756c64206e6f7420736560008301527f6e6420746f207a65726f206164647265737300000000000000000000000000006020830152604082019050919050565b6000613102602e83613725565b91507f524f472f7472616e73666572203a2053686f756c64206e6f742073656e64207460008301527f6f207a65726f20616464726573730000000000000000000000000000000000006020830152604082019050919050565b6000613168602f83613725565b91507f4f776e61626c65203a2046756e6374696f6e2063616c6c656420627920756e6160008301527f7574686f72697a656420757365722e00000000000000000000000000000000006020830152604082019050919050565b60006131ce602983613725565b91507f45524332304d696e7461626c652f6d696e74203a2043616e6e6f74206d696e7460008301527f206f7665722063617000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613234603383613725565b91507f45524332304c6f636b61626c652f43616e6e6f742073656e64206d6f7265207460008301527f68616e20756e6c6f636b656420616d6f756e74000000000000000000000000006020830152604082019050919050565b600061329a602d83613725565b91507f524f472f617070726f7665203a2053686f756c64206e6f7420617070726f766560008301527f207a65726f2061646472657373000000000000000000000000000000000000006020830152604082019050919050565b6000613300601c83613725565b91507f467265657a61626c65203a207461726765742069732066726f7a656e000000006000830152602082019050919050565b6000613340603583613725565b91507f506175736564203a20546869732066756e6374696f6e2063616e206f6e6c792060008301527f62652063616c6c6564207768656e2070617573656400000000000000000000006020830152604082019050919050565b60006133a6604583613725565b91507f4f776e61626c652f7472616e736665724f776e657273686970203a2063616e6e60008301527f6f74207472616e73666572206f776e65727368697020746f207a65726f20616460208301527f64726573730000000000000000000000000000000000000000000000000000006040830152606082019050919050565b61342e816137fe565b82525050565b61343d81613808565b82525050565b60006020820190506134586000830184612d08565b92915050565b60006020820190506134736000830184612d17565b92915050565b600060208201905081810360008301526134938184612d26565b905092915050565b600060208201905081810360008301526134b481612d5f565b9050919050565b600060208201905081810360008301526134d481612dc5565b9050919050565b600060208201905081810360008301526134f481612e2b565b9050919050565b6000602082019050818103600083015261351481612e91565b9050919050565b6000602082019050818103600083015261353481612ef7565b9050919050565b6000602082019050818103600083015261355481612f5d565b9050919050565b6000602082019050818103600083015261357481612fc3565b9050919050565b6000602082019050818103600083015261359481613029565b9050919050565b600060208201905081810360008301526135b48161308f565b9050919050565b600060208201905081810360008301526135d4816130f5565b9050919050565b600060208201905081810360008301526135f48161315b565b9050919050565b60006020820190508181036000830152613614816131c1565b9050919050565b6000602082019050818103600083015261363481613227565b9050919050565b600060208201905081810360008301526136548161328d565b9050919050565b60006020820190508181036000830152613674816132f3565b9050919050565b6000602082019050818103600083015261369481613333565b9050919050565b600060208201905081810360008301526136b481613399565b9050919050565b60006020820190506136d06000830184613425565b92915050565b60006040820190506136eb6000830185613425565b6136f86020830184613425565b9392505050565b60006020820190506137146000830184613434565b92915050565b600081519050919050565b600082825260208201905092915050565b6000613741826137fe565b915061374c836137fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613781576137806138bb565b5b828201905092915050565b6000613797826137fe565b91506137a2836137fe565b9250828210156137b5576137b46138bb565b5b828203905092915050565b60006137cb826137de565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613833578082015181840152602081019050613818565b83811115613842576000848401525b50505050565b6000613853826137fe565b91506000821415613867576138666138bb565b5b600182039050919050565b600061387d826137fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138b0576138af6138bb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000601f19601f8301169050919050565b613904816137c0565b811461390f57600080fd5b50565b61391b816137fe565b811461392657600080fd5b5056fea2646970667358221220a1559d1d50eb0cc79ebebf14d15f13645e1014f780b80101cec13641dd1a48c364736f6c63430008000033