Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- CoreTeamDAO
- Optimization enabled
- false
- Compiler version
- v0.8.19+commit.7dd6d404
- EVM Version
- default
- Verified at
- 2024-09-26T15:25:19.897142Z
Contract source code
// SPDX-License-Identifier: No License (None) pragma solidity 0.8.19; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable { address internal _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. *//* constructor () { _owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } */ /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface ISoyPair { function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); } interface IERC20 { function balanceOf(address owner) external view returns (uint); function transfer(address to, uint value) external; } contract CoreTeamDAO is Ownable { ISoyPair constant public CLO_BUSDT = ISoyPair(0xB852AD87329986EaC6e991954fe329231D1E4De1); // reserve0 - BUSDT, reserve1 - WCLO struct Employee { uint256 startTimestamp; // timestamp from which start periods uint256 lastClaimed; // timestamp when CLO was claimed last time uint256 salary; // salary in BUSDT (without decimals) uint256 quarterlyPercent; // percent of salary paid quarterly uint256 yearlyPercent; // percent of salary paid yearly uint256 quarterlyPending; // Amount of CLO that is pending for quarterly payout uint256 yearlyPending; // Amount of CLO that is pending for yearly payout uint256 unpaid; // Amount of CLO that was not paid due to insufficient contract balance bool isStopped; // stop payouts } mapping (address => Employee) public employees; address[] public employeesList; // list of employees uint256 public salaryPeriod = 30 days; // salary period in seconds uint256 public quarterlyPeriod = 91 days; // period in seconds for quarterly payment uint256 public yearlyPeriod = 365 days; // period in seconds for yearly payment bool public isPaused; event SetSalary(address employee, uint256 salary, uint256 quarterlyPercent, uint256 yearlyPercent, uint256 startTimestamp); event Claim(uint256 amount, uint256 pendingAmount); event Rescue(address token, uint256 amount); function initialize(address _newOwner) external { require(_owner == address(0)); _owner = _newOwner; emit OwnershipTransferred(address(0), _newOwner); } receive() external payable {} // Set salary in BUSDT without decimals. if "startTimestamp" == 0, then startTimestamp will not be updated function setSalary(address employee, uint256 salary, uint256 quarterlyPercent, uint256 yearlyPercent, uint256 startTimestamp) external onlyOwner { require(quarterlyPercent + yearlyPercent < 100, "Sum of percents must be less 100"); if (!isPaused && !employees[employee].isStopped) _claim(employee); // claim unlocked salary and bonus to employee address if(employees[employee].lastClaimed == 0) { // new employee employeesList.push(employee); } if (startTimestamp > 0) { employees[employee].startTimestamp = startTimestamp; employees[employee].lastClaimed = startTimestamp; } employees[employee].salary = salary; employees[employee].quarterlyPercent = quarterlyPercent; employees[employee].yearlyPercent = yearlyPercent; emit SetSalary(employee, salary, quarterlyPercent, yearlyPercent, startTimestamp); } // pause/unpause contract function setPause(bool pause) external onlyOwner { isPaused = pause; } // stop employee payment function setStop(address employee, bool stopped) external onlyOwner { employees[employee].isStopped = stopped; } // claim unlocked salary and bonus to employee address function claim() external { require(tx.origin == msg.sender, "Call from contract disallowed"); // protection from flash-loan price manipulation require(!isPaused, "Payout paused"); require(!employees[msg.sender].isStopped, "Payment is stopped by owner"); _claim(msg.sender); } function _claim(address employee) internal { (uint256 unlockedAmount, uint256 quarterlyPending, uint256 yearlyPending) = getUnlockedAmount(employee); if (unlockedAmount != 0) { uint256 balance = address(this).balance; if (unlockedAmount > balance) { employees[employee].unpaid = unlockedAmount - balance; unlockedAmount = balance; } else { employees[employee].unpaid = 0; } employees[employee].lastClaimed = block.timestamp; employees[employee].quarterlyPending = quarterlyPending; employees[employee].yearlyPending = yearlyPending; safeTransferCLO(employee, unlockedAmount); emit Claim(unlockedAmount, employees[employee].unpaid); } } // return unlocked amount of CLO function getUnlockedAmount(address employee) public view returns(uint256 unlockedAmount, uint256 quarterlyPending, uint256 yearlyPending) { Employee memory e = employees[employee]; uint256 salaryCLO; // calculate CLO amount for salary based on CLO_BUSDT pool { (uint112 reserveBUSDT, uint112 reserveCLO,) = CLO_BUSDT.getReserves(); salaryCLO = e.salary * 1e18 * reserveCLO / reserveBUSDT; // convert salary from BUSDT to CLO and add 18 decimals } uint256 paidPeriods = (e.lastClaimed - e.startTimestamp) / salaryPeriod; uint256 passedPeriods = (block.timestamp - e.startTimestamp) / salaryPeriod; uint256 unpaidPeriods = passedPeriods - paidPeriods; unlockedAmount = salaryCLO * unpaidPeriods * (100 - e.quarterlyPercent - e.yearlyPercent) / 100; // unlocked salary e.quarterlyPending += (salaryCLO * unpaidPeriods * e.quarterlyPercent / 100); // add part of salary to quarterlyPending e.yearlyPending += (salaryCLO * unpaidPeriods * e.yearlyPercent / 100); // add part of salary to yearlyPending // calculate amount for quarterly part uint256 periodEnd = e.startTimestamp + (((block.timestamp - e.startTimestamp) / quarterlyPeriod ) * quarterlyPeriod); // timestamp when last quarterly period ended if (periodEnd > e.lastClaimed && periodEnd <= block.timestamp ) { // quarterly period ends unpaidPeriods = passedPeriods - ((periodEnd - e.startTimestamp) / salaryPeriod); // number of months excluded from quarterly payment quarterlyPending = (salaryCLO * unpaidPeriods * e.quarterlyPercent / 100); unlockedAmount += e.quarterlyPending - quarterlyPending; } else { quarterlyPending = e.quarterlyPending; } // calculate amount for yearly part periodEnd = e.startTimestamp + (((block.timestamp - e.startTimestamp) / yearlyPeriod ) * yearlyPeriod); // timestamp when last yearly period ended if (periodEnd > e.lastClaimed && periodEnd <= block.timestamp ) { // yearly period ends unpaidPeriods = passedPeriods - ((periodEnd - e.startTimestamp) / salaryPeriod); // number of months excluded from yearly payment yearlyPending = (salaryCLO * unpaidPeriods * e.yearlyPercent / 100); unlockedAmount += e.yearlyPending - yearlyPending; } else { yearlyPending = e.yearlyPending; } unlockedAmount += e.unpaid; // if contract has debt } // return allocated amount of CLO function getAllocatedAmount() external view returns(int256 allocated) { uint256 len = employeesList.length; allocated = int256(address(this).balance); for (uint i = 0; i < len; i++) { if (!employees[employeesList[i]].isStopped) { // don't count employees with stopped payouts (uint256 unclaimed,,) = getUnlockedAmount(employeesList[i]); allocated = allocated - int256(unclaimed); } } } function getEmployeesList() external view returns(address[] memory) { return employeesList; } function rescueTokens(address _token) onlyOwner external { uint256 amount; if (_token == address(0)) { amount = address(this).balance; safeTransferCLO(msg.sender, amount); } else { amount = IERC20(_token).balanceOf(address(this)); safeTransfer(_token, msg.sender, amount); } emit Rescue(_token, amount); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferCLO(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: CLO_TRANSFER_FAILED'); } }
Contract ABI
[{"type":"event","name":"Claim","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"pendingAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Rescue","inputs":[{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetSalary","inputs":[{"type":"address","name":"employee","internalType":"address","indexed":false},{"type":"uint256","name":"salary","internalType":"uint256","indexed":false},{"type":"uint256","name":"quarterlyPercent","internalType":"uint256","indexed":false},{"type":"uint256","name":"yearlyPercent","internalType":"uint256","indexed":false},{"type":"uint256","name":"startTimestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ISoyPair"}],"name":"CLO_BUSDT","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"startTimestamp","internalType":"uint256"},{"type":"uint256","name":"lastClaimed","internalType":"uint256"},{"type":"uint256","name":"salary","internalType":"uint256"},{"type":"uint256","name":"quarterlyPercent","internalType":"uint256"},{"type":"uint256","name":"yearlyPercent","internalType":"uint256"},{"type":"uint256","name":"quarterlyPending","internalType":"uint256"},{"type":"uint256","name":"yearlyPending","internalType":"uint256"},{"type":"uint256","name":"unpaid","internalType":"uint256"},{"type":"bool","name":"isStopped","internalType":"bool"}],"name":"employees","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"employeesList","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"int256","name":"allocated","internalType":"int256"}],"name":"getAllocatedAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getEmployeesList","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"unlockedAmount","internalType":"uint256"},{"type":"uint256","name":"quarterlyPending","internalType":"uint256"},{"type":"uint256","name":"yearlyPending","internalType":"uint256"}],"name":"getUnlockedAmount","inputs":[{"type":"address","name":"employee","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isPaused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quarterlyPeriod","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueTokens","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"salaryPeriod","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPause","inputs":[{"type":"bool","name":"pause","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSalary","inputs":[{"type":"address","name":"employee","internalType":"address"},{"type":"uint256","name":"salary","internalType":"uint256"},{"type":"uint256","name":"quarterlyPercent","internalType":"uint256"},{"type":"uint256","name":"yearlyPercent","internalType":"uint256"},{"type":"uint256","name":"startTimestamp","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setStop","inputs":[{"type":"address","name":"employee","internalType":"address"},{"type":"bool","name":"stopped","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"yearlyPeriod","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x608060405262278d006003556277f8806004556301e1338060055534801561002657600080fd5b5061290d806100366000396000f3fe6080604052600436106101175760003560e01c8063957138a4116100a0578063d067894711610064578063d067894714610373578063f2fde38b146103b8578063f79bc635146103e1578063fb6195af1461040c578063fe3f3f02146104375761011e565b8063957138a4146102a2578063b1670d5c146102cb578063b187bd26146102f6578063bedb86fb14610321578063c4d66de81461034a5761011e565b8063427de6c1116100e7578063427de6c1146101f35780634e71d92d1461021e578063715018a6146102355780638da5cb5b1461024c5780638e5ac800146102775761011e565b8062ae3bf8146101235780631fc9d53c1461014c5780632c310a1214610177578063420d4a02146101b45761011e565b3661011e57005b600080fd5b34801561012f57600080fd5b5061014a60048036038101906101459190611bf2565b610460565b005b34801561015857600080fd5b506101616105e1565b60405161016e9190611c38565b60405180910390f35b34801561018357600080fd5b5061019e60048036038101906101999190611c7f565b6105e7565b6040516101ab9190611cbb565b60405180910390f35b3480156101c057600080fd5b506101db60048036038101906101d69190611bf2565b610626565b6040516101ea93929190611cd6565b60405180910390f35b3480156101ff57600080fd5b50610208610a9c565b6040516102159190611d6c565b60405180910390f35b34801561022a57600080fd5b50610233610ab4565b005b34801561024157600080fd5b5061024a610c0d565b005b34801561025857600080fd5b50610261610d40565b60405161026e9190611cbb565b60405180910390f35b34801561028357600080fd5b5061028c610d69565b6040516102999190611c38565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190611dbf565b610d6f565b005b3480156102d757600080fd5b506102e0610e42565b6040516102ed9190611ebd565b60405180910390f35b34801561030257600080fd5b5061030b610ed0565b6040516103189190611eee565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190611f09565b610ee3565b005b34801561035657600080fd5b50610371600480360381019061036c9190611bf2565b610f75565b005b34801561037f57600080fd5b5061039a60048036038101906103959190611bf2565b61106c565b6040516103af99989796959493929190611f36565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190611bf2565b6110c7565b005b3480156103ed57600080fd5b506103f6611268565b6040516104039190611c38565b60405180910390f35b34801561041857600080fd5b5061042161126e565b60405161042e9190611fdc565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190611ff7565b61138e565b005b3373ffffffffffffffffffffffffffffffffffffffff1661047f610d40565b73ffffffffffffffffffffffffffffffffffffffff16146104d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cc906120cf565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361051c57479050610517338261172b565b6105a4565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105559190611cbb565b602060405180830381865afa158015610572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105969190612104565b90506105a382338361182b565b5b7f542fa6bfee3b4746210fbdd1d83f9e49b65adde3639f8d8f165dd18347938af282826040516105d5929190612131565b60405180910390a15050565b60055481565b600281815481106105f757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050600080600073b852ad87329986eac6e991954fe329231d1e4de173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076c91906121dc565b5091509150816dffffffffffffffffffffffffffff16816dffffffffffffffffffffffffffff16670de0b6b3a764000086604001516107ab919061225e565b6107b5919061225e565b6107bf91906122cf565b925050506000600354836000015184602001516107dc9190612300565b6107e691906122cf565b905060006003548460000151426107fd9190612300565b61080791906122cf565b9050600082826108179190612300565b905060648560800151866060015160646108319190612300565b61083b9190612300565b8286610847919061225e565b610851919061225e565b61085b91906122cf565b9750606485606001518286610870919061225e565b61087a919061225e565b61088491906122cf565b8560a0018181516108959190612334565b915081815250506064856080015182866108af919061225e565b6108b9919061225e565b6108c391906122cf565b8560c0018181516108d49190612334565b9150818152505060006004546004548760000151426108f39190612300565b6108fd91906122cf565b610907919061225e565b86600001516109169190612334565b905085602001518111801561092b5750428111155b156109a5576003548660000151826109439190612300565b61094d91906122cf565b836109589190612300565b915060648660600151838761096d919061225e565b610977919061225e565b61098191906122cf565b9750878660a001516109939190612300565b8961099e9190612334565b98506109ad565b8560a0015197505b6005546005548760000151426109c39190612300565b6109cd91906122cf565b6109d7919061225e565b86600001516109e69190612334565b90508560200151811180156109fb5750428111155b15610a7557600354866000015182610a139190612300565b610a1d91906122cf565b83610a289190612300565b9150606486608001518387610a3d919061225e565b610a47919061225e565b610a5191906122cf565b9650868660c00151610a639190612300565b89610a6e9190612334565b9850610a7d565b8560c0015196505b8560e0015189610a8d9190612334565b98505050505050509193909250565b73b852ad87329986eac6e991954fe329231d1e4de181565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b19906123b4565b60405180910390fd5b600660009054906101000a900460ff1615610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990612420565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160009054906101000a900460ff1615610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf99061248c565b60405180910390fd5b610c0b33611961565b565b3373ffffffffffffffffffffffffffffffffffffffff16610c2c610d40565b73ffffffffffffffffffffffffffffffffffffffff1614610c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c79906120cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045481565b3373ffffffffffffffffffffffffffffffffffffffff16610d8e610d40565b73ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb906120cf565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160006101000a81548160ff0219169083151502179055505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610ec657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610e7c575b5050505050905090565b600660009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16610f02610d40565b73ffffffffffffffffffffffffffffffffffffffff1614610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f906120cf565b60405180910390fd5b80600660006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fce57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60016020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080160009054906101000a900460ff16905089565b3373ffffffffffffffffffffffffffffffffffffffff166110e6610d40565b73ffffffffffffffffffffffffffffffffffffffff161461113c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611133906120cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a29061251e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60035481565b600080600280549050905047915060005b8181101561138957600160006002838154811061129f5761129e61253e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160009054906101000a900460ff16611376576000611362600283815481106113325761133161253e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610626565b505090508084611372919061256d565b9350505b8080611381906125b0565b91505061127f565b505090565b3373ffffffffffffffffffffffffffffffffffffffff166113ad610d40565b73ffffffffffffffffffffffffffffffffffffffff1614611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa906120cf565b60405180910390fd5b606482846114119190612334565b10611451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144890612644565b60405180910390fd5b600660009054906101000a900460ff161580156114bb5750600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160009054906101000a900460ff16155b156114ca576114c985611961565b5b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015403611578576002859080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60008111156116105780600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b83600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555081600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055507fca5d5e0f1ad92f22bec637b03c50ccb972e35e8577fbd2e5b1f9ae1f0b1822bc858585858560405161171c959493929190612664565b60405180910390a15050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156117605761175f6126b7565b5b6040519080825280601f01601f1916602001820160405280156117925781602001600182028036833780820191505090505b506040516117a09190612757565b60006040518083038185875af1925050503d80600081146117dd576040519150601f19603f3d011682016040523d82523d6000602084013e6117e2565b606091505b5050905080611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d906127e0565b60405180910390fd5b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161185d929190612131565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516118ab9190612757565b6000604051808303816000865af19150503d80600081146118e8576040519150601f19603f3d011682016040523d82523d6000602084013e6118ed565b606091505b509150915081801561191b575060008151148061191a5750808060200190518101906119199190612815565b5b5b61195a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119519061288e565b60405180910390fd5b5050505050565b600080600061196f84610626565b92509250925060008314611b89576000479050808411156119e45780846119969190612300565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070181905550809350611a2d565b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600701819055505b42600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005018190555081600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060181905550611b0c858561172b565b7f022e3d29644ead4083349ca84d24bcac368b2461819b70f5921fea15de4dec4d84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070154604051611b7f9291906128ae565b60405180910390a1505b50505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611bbf82611b94565b9050919050565b611bcf81611bb4565b8114611bda57600080fd5b50565b600081359050611bec81611bc6565b92915050565b600060208284031215611c0857611c07611b8f565b5b6000611c1684828501611bdd565b91505092915050565b6000819050919050565b611c3281611c1f565b82525050565b6000602082019050611c4d6000830184611c29565b92915050565b611c5c81611c1f565b8114611c6757600080fd5b50565b600081359050611c7981611c53565b92915050565b600060208284031215611c9557611c94611b8f565b5b6000611ca384828501611c6a565b91505092915050565b611cb581611bb4565b82525050565b6000602082019050611cd06000830184611cac565b92915050565b6000606082019050611ceb6000830186611c29565b611cf86020830185611c29565b611d056040830184611c29565b949350505050565b6000819050919050565b6000611d32611d2d611d2884611b94565b611d0d565b611b94565b9050919050565b6000611d4482611d17565b9050919050565b6000611d5682611d39565b9050919050565b611d6681611d4b565b82525050565b6000602082019050611d816000830184611d5d565b92915050565b60008115159050919050565b611d9c81611d87565b8114611da757600080fd5b50565b600081359050611db981611d93565b92915050565b60008060408385031215611dd657611dd5611b8f565b5b6000611de485828601611bdd565b9250506020611df585828601611daa565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611e3481611bb4565b82525050565b6000611e468383611e2b565b60208301905092915050565b6000602082019050919050565b6000611e6a82611dff565b611e748185611e0a565b9350611e7f83611e1b565b8060005b83811015611eb0578151611e978882611e3a565b9750611ea283611e52565b925050600181019050611e83565b5085935050505092915050565b60006020820190508181036000830152611ed78184611e5f565b905092915050565b611ee881611d87565b82525050565b6000602082019050611f036000830184611edf565b92915050565b600060208284031215611f1f57611f1e611b8f565b5b6000611f2d84828501611daa565b91505092915050565b600061012082019050611f4c600083018c611c29565b611f59602083018b611c29565b611f66604083018a611c29565b611f736060830189611c29565b611f806080830188611c29565b611f8d60a0830187611c29565b611f9a60c0830186611c29565b611fa760e0830185611c29565b611fb5610100830184611edf565b9a9950505050505050505050565b6000819050919050565b611fd681611fc3565b82525050565b6000602082019050611ff16000830184611fcd565b92915050565b600080600080600060a0868803121561201357612012611b8f565b5b600061202188828901611bdd565b955050602061203288828901611c6a565b945050604061204388828901611c6a565b935050606061205488828901611c6a565b925050608061206588828901611c6a565b9150509295509295909350565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006120b9602083612072565b91506120c482612083565b602082019050919050565b600060208201905081810360008301526120e8816120ac565b9050919050565b6000815190506120fe81611c53565b92915050565b60006020828403121561211a57612119611b8f565b5b6000612128848285016120ef565b91505092915050565b60006040820190506121466000830185611cac565b6121536020830184611c29565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b61217d8161215a565b811461218857600080fd5b50565b60008151905061219a81612174565b92915050565b600063ffffffff82169050919050565b6121b9816121a0565b81146121c457600080fd5b50565b6000815190506121d6816121b0565b92915050565b6000806000606084860312156121f5576121f4611b8f565b5b60006122038682870161218b565b93505060206122148682870161218b565b9250506040612225868287016121c7565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061226982611c1f565b915061227483611c1f565b925082820261228281611c1f565b915082820484148315176122995761229861222f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006122da82611c1f565b91506122e583611c1f565b9250826122f5576122f46122a0565b5b828204905092915050565b600061230b82611c1f565b915061231683611c1f565b925082820390508181111561232e5761232d61222f565b5b92915050565b600061233f82611c1f565b915061234a83611c1f565b92508282019050808211156123625761236161222f565b5b92915050565b7f43616c6c2066726f6d20636f6e747261637420646973616c6c6f776564000000600082015250565b600061239e601d83612072565b91506123a982612368565b602082019050919050565b600060208201905081810360008301526123cd81612391565b9050919050565b7f5061796f75742070617573656400000000000000000000000000000000000000600082015250565b600061240a600d83612072565b9150612415826123d4565b602082019050919050565b60006020820190508181036000830152612439816123fd565b9050919050565b7f5061796d656e742069732073746f70706564206279206f776e65720000000000600082015250565b6000612476601b83612072565b915061248182612440565b602082019050919050565b600060208201905081810360008301526124a581612469565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612508602683612072565b9150612513826124ac565b604082019050919050565b60006020820190508181036000830152612537816124fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061257882611fc3565b915061258383611fc3565b92508282039050818112600084121682821360008512151617156125aa576125a961222f565b5b92915050565b60006125bb82611c1f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125ed576125ec61222f565b5b600182019050919050565b7f53756d206f662070657263656e7473206d757374206265206c65737320313030600082015250565b600061262e602083612072565b9150612639826125f8565b602082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b600060a0820190506126796000830188611cac565b6126866020830187611c29565b6126936040830186611c29565b6126a06060830185611c29565b6126ad6080830184611c29565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561271a5780820151818401526020810190506126ff565b60008484015250505050565b6000612731826126e6565b61273b81856126f1565b935061274b8185602086016126fc565b80840191505092915050565b60006127638284612726565b915081905092915050565b7f5472616e7366657248656c7065723a20434c4f5f5452414e534645525f46414960008201527f4c45440000000000000000000000000000000000000000000000000000000000602082015250565b60006127ca602383612072565b91506127d58261276e565b604082019050919050565b600060208201905081810360008301526127f9816127bd565b9050919050565b60008151905061280f81611d93565b92915050565b60006020828403121561282b5761282a611b8f565b5b600061283984828501612800565b91505092915050565b7f5472616e7366657248656c7065723a205452414e534645525f4641494c454400600082015250565b6000612878601f83612072565b915061288382612842565b602082019050919050565b600060208201905081810360008301526128a78161286b565b9050919050565b60006040820190506128c36000830185611c29565b6128d06020830184611c29565b939250505056fea26469706673582212207712e15dc2dfd8d4f4d7de6e5ca85f4d2747d8f334af7f9f13fed090c4135fe264736f6c63430008130033
Deployed ByteCode
0x6080604052600436106101175760003560e01c8063957138a4116100a0578063d067894711610064578063d067894714610373578063f2fde38b146103b8578063f79bc635146103e1578063fb6195af1461040c578063fe3f3f02146104375761011e565b8063957138a4146102a2578063b1670d5c146102cb578063b187bd26146102f6578063bedb86fb14610321578063c4d66de81461034a5761011e565b8063427de6c1116100e7578063427de6c1146101f35780634e71d92d1461021e578063715018a6146102355780638da5cb5b1461024c5780638e5ac800146102775761011e565b8062ae3bf8146101235780631fc9d53c1461014c5780632c310a1214610177578063420d4a02146101b45761011e565b3661011e57005b600080fd5b34801561012f57600080fd5b5061014a60048036038101906101459190611bf2565b610460565b005b34801561015857600080fd5b506101616105e1565b60405161016e9190611c38565b60405180910390f35b34801561018357600080fd5b5061019e60048036038101906101999190611c7f565b6105e7565b6040516101ab9190611cbb565b60405180910390f35b3480156101c057600080fd5b506101db60048036038101906101d69190611bf2565b610626565b6040516101ea93929190611cd6565b60405180910390f35b3480156101ff57600080fd5b50610208610a9c565b6040516102159190611d6c565b60405180910390f35b34801561022a57600080fd5b50610233610ab4565b005b34801561024157600080fd5b5061024a610c0d565b005b34801561025857600080fd5b50610261610d40565b60405161026e9190611cbb565b60405180910390f35b34801561028357600080fd5b5061028c610d69565b6040516102999190611c38565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190611dbf565b610d6f565b005b3480156102d757600080fd5b506102e0610e42565b6040516102ed9190611ebd565b60405180910390f35b34801561030257600080fd5b5061030b610ed0565b6040516103189190611eee565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190611f09565b610ee3565b005b34801561035657600080fd5b50610371600480360381019061036c9190611bf2565b610f75565b005b34801561037f57600080fd5b5061039a60048036038101906103959190611bf2565b61106c565b6040516103af99989796959493929190611f36565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190611bf2565b6110c7565b005b3480156103ed57600080fd5b506103f6611268565b6040516104039190611c38565b60405180910390f35b34801561041857600080fd5b5061042161126e565b60405161042e9190611fdc565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190611ff7565b61138e565b005b3373ffffffffffffffffffffffffffffffffffffffff1661047f610d40565b73ffffffffffffffffffffffffffffffffffffffff16146104d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cc906120cf565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361051c57479050610517338261172b565b6105a4565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105559190611cbb565b602060405180830381865afa158015610572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105969190612104565b90506105a382338361182b565b5b7f542fa6bfee3b4746210fbdd1d83f9e49b65adde3639f8d8f165dd18347938af282826040516105d5929190612131565b60405180910390a15050565b60055481565b600281815481106105f757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509050600080600073b852ad87329986eac6e991954fe329231d1e4de173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076c91906121dc565b5091509150816dffffffffffffffffffffffffffff16816dffffffffffffffffffffffffffff16670de0b6b3a764000086604001516107ab919061225e565b6107b5919061225e565b6107bf91906122cf565b925050506000600354836000015184602001516107dc9190612300565b6107e691906122cf565b905060006003548460000151426107fd9190612300565b61080791906122cf565b9050600082826108179190612300565b905060648560800151866060015160646108319190612300565b61083b9190612300565b8286610847919061225e565b610851919061225e565b61085b91906122cf565b9750606485606001518286610870919061225e565b61087a919061225e565b61088491906122cf565b8560a0018181516108959190612334565b915081815250506064856080015182866108af919061225e565b6108b9919061225e565b6108c391906122cf565b8560c0018181516108d49190612334565b9150818152505060006004546004548760000151426108f39190612300565b6108fd91906122cf565b610907919061225e565b86600001516109169190612334565b905085602001518111801561092b5750428111155b156109a5576003548660000151826109439190612300565b61094d91906122cf565b836109589190612300565b915060648660600151838761096d919061225e565b610977919061225e565b61098191906122cf565b9750878660a001516109939190612300565b8961099e9190612334565b98506109ad565b8560a0015197505b6005546005548760000151426109c39190612300565b6109cd91906122cf565b6109d7919061225e565b86600001516109e69190612334565b90508560200151811180156109fb5750428111155b15610a7557600354866000015182610a139190612300565b610a1d91906122cf565b83610a289190612300565b9150606486608001518387610a3d919061225e565b610a47919061225e565b610a5191906122cf565b9650868660c00151610a639190612300565b89610a6e9190612334565b9850610a7d565b8560c0015196505b8560e0015189610a8d9190612334565b98505050505050509193909250565b73b852ad87329986eac6e991954fe329231d1e4de181565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b19906123b4565b60405180910390fd5b600660009054906101000a900460ff1615610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990612420565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160009054906101000a900460ff1615610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf99061248c565b60405180910390fd5b610c0b33611961565b565b3373ffffffffffffffffffffffffffffffffffffffff16610c2c610d40565b73ffffffffffffffffffffffffffffffffffffffff1614610c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c79906120cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045481565b3373ffffffffffffffffffffffffffffffffffffffff16610d8e610d40565b73ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb906120cf565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160006101000a81548160ff0219169083151502179055505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610ec657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610e7c575b5050505050905090565b600660009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16610f02610d40565b73ffffffffffffffffffffffffffffffffffffffff1614610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f906120cf565b60405180910390fd5b80600660006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fce57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60016020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080160009054906101000a900460ff16905089565b3373ffffffffffffffffffffffffffffffffffffffff166110e6610d40565b73ffffffffffffffffffffffffffffffffffffffff161461113c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611133906120cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a29061251e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60035481565b600080600280549050905047915060005b8181101561138957600160006002838154811061129f5761129e61253e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160009054906101000a900460ff16611376576000611362600283815481106113325761133161253e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610626565b505090508084611372919061256d565b9350505b8080611381906125b0565b91505061127f565b505090565b3373ffffffffffffffffffffffffffffffffffffffff166113ad610d40565b73ffffffffffffffffffffffffffffffffffffffff1614611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa906120cf565b60405180910390fd5b606482846114119190612334565b10611451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144890612644565b60405180910390fd5b600660009054906101000a900460ff161580156114bb5750600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160009054906101000a900460ff16155b156114ca576114c985611961565b5b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015403611578576002859080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60008111156116105780600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b83600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555081600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055507fca5d5e0f1ad92f22bec637b03c50ccb972e35e8577fbd2e5b1f9ae1f0b1822bc858585858560405161171c959493929190612664565b60405180910390a15050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156117605761175f6126b7565b5b6040519080825280601f01601f1916602001820160405280156117925781602001600182028036833780820191505090505b506040516117a09190612757565b60006040518083038185875af1925050503d80600081146117dd576040519150601f19603f3d011682016040523d82523d6000602084013e6117e2565b606091505b5050905080611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d906127e0565b60405180910390fd5b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161185d929190612131565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516118ab9190612757565b6000604051808303816000865af19150503d80600081146118e8576040519150601f19603f3d011682016040523d82523d6000602084013e6118ed565b606091505b509150915081801561191b575060008151148061191a5750808060200190518101906119199190612815565b5b5b61195a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119519061288e565b60405180910390fd5b5050505050565b600080600061196f84610626565b92509250925060008314611b89576000479050808411156119e45780846119969190612300565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070181905550809350611a2d565b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600701819055505b42600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005018190555081600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060181905550611b0c858561172b565b7f022e3d29644ead4083349ca84d24bcac368b2461819b70f5921fea15de4dec4d84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070154604051611b7f9291906128ae565b60405180910390a1505b50505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611bbf82611b94565b9050919050565b611bcf81611bb4565b8114611bda57600080fd5b50565b600081359050611bec81611bc6565b92915050565b600060208284031215611c0857611c07611b8f565b5b6000611c1684828501611bdd565b91505092915050565b6000819050919050565b611c3281611c1f565b82525050565b6000602082019050611c4d6000830184611c29565b92915050565b611c5c81611c1f565b8114611c6757600080fd5b50565b600081359050611c7981611c53565b92915050565b600060208284031215611c9557611c94611b8f565b5b6000611ca384828501611c6a565b91505092915050565b611cb581611bb4565b82525050565b6000602082019050611cd06000830184611cac565b92915050565b6000606082019050611ceb6000830186611c29565b611cf86020830185611c29565b611d056040830184611c29565b949350505050565b6000819050919050565b6000611d32611d2d611d2884611b94565b611d0d565b611b94565b9050919050565b6000611d4482611d17565b9050919050565b6000611d5682611d39565b9050919050565b611d6681611d4b565b82525050565b6000602082019050611d816000830184611d5d565b92915050565b60008115159050919050565b611d9c81611d87565b8114611da757600080fd5b50565b600081359050611db981611d93565b92915050565b60008060408385031215611dd657611dd5611b8f565b5b6000611de485828601611bdd565b9250506020611df585828601611daa565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611e3481611bb4565b82525050565b6000611e468383611e2b565b60208301905092915050565b6000602082019050919050565b6000611e6a82611dff565b611e748185611e0a565b9350611e7f83611e1b565b8060005b83811015611eb0578151611e978882611e3a565b9750611ea283611e52565b925050600181019050611e83565b5085935050505092915050565b60006020820190508181036000830152611ed78184611e5f565b905092915050565b611ee881611d87565b82525050565b6000602082019050611f036000830184611edf565b92915050565b600060208284031215611f1f57611f1e611b8f565b5b6000611f2d84828501611daa565b91505092915050565b600061012082019050611f4c600083018c611c29565b611f59602083018b611c29565b611f66604083018a611c29565b611f736060830189611c29565b611f806080830188611c29565b611f8d60a0830187611c29565b611f9a60c0830186611c29565b611fa760e0830185611c29565b611fb5610100830184611edf565b9a9950505050505050505050565b6000819050919050565b611fd681611fc3565b82525050565b6000602082019050611ff16000830184611fcd565b92915050565b600080600080600060a0868803121561201357612012611b8f565b5b600061202188828901611bdd565b955050602061203288828901611c6a565b945050604061204388828901611c6a565b935050606061205488828901611c6a565b925050608061206588828901611c6a565b9150509295509295909350565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006120b9602083612072565b91506120c482612083565b602082019050919050565b600060208201905081810360008301526120e8816120ac565b9050919050565b6000815190506120fe81611c53565b92915050565b60006020828403121561211a57612119611b8f565b5b6000612128848285016120ef565b91505092915050565b60006040820190506121466000830185611cac565b6121536020830184611c29565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b61217d8161215a565b811461218857600080fd5b50565b60008151905061219a81612174565b92915050565b600063ffffffff82169050919050565b6121b9816121a0565b81146121c457600080fd5b50565b6000815190506121d6816121b0565b92915050565b6000806000606084860312156121f5576121f4611b8f565b5b60006122038682870161218b565b93505060206122148682870161218b565b9250506040612225868287016121c7565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061226982611c1f565b915061227483611c1f565b925082820261228281611c1f565b915082820484148315176122995761229861222f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006122da82611c1f565b91506122e583611c1f565b9250826122f5576122f46122a0565b5b828204905092915050565b600061230b82611c1f565b915061231683611c1f565b925082820390508181111561232e5761232d61222f565b5b92915050565b600061233f82611c1f565b915061234a83611c1f565b92508282019050808211156123625761236161222f565b5b92915050565b7f43616c6c2066726f6d20636f6e747261637420646973616c6c6f776564000000600082015250565b600061239e601d83612072565b91506123a982612368565b602082019050919050565b600060208201905081810360008301526123cd81612391565b9050919050565b7f5061796f75742070617573656400000000000000000000000000000000000000600082015250565b600061240a600d83612072565b9150612415826123d4565b602082019050919050565b60006020820190508181036000830152612439816123fd565b9050919050565b7f5061796d656e742069732073746f70706564206279206f776e65720000000000600082015250565b6000612476601b83612072565b915061248182612440565b602082019050919050565b600060208201905081810360008301526124a581612469565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612508602683612072565b9150612513826124ac565b604082019050919050565b60006020820190508181036000830152612537816124fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061257882611fc3565b915061258383611fc3565b92508282039050818112600084121682821360008512151617156125aa576125a961222f565b5b92915050565b60006125bb82611c1f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125ed576125ec61222f565b5b600182019050919050565b7f53756d206f662070657263656e7473206d757374206265206c65737320313030600082015250565b600061262e602083612072565b9150612639826125f8565b602082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b600060a0820190506126796000830188611cac565b6126866020830187611c29565b6126936040830186611c29565b6126a06060830185611c29565b6126ad6080830184611c29565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561271a5780820151818401526020810190506126ff565b60008484015250505050565b6000612731826126e6565b61273b81856126f1565b935061274b8185602086016126fc565b80840191505092915050565b60006127638284612726565b915081905092915050565b7f5472616e7366657248656c7065723a20434c4f5f5452414e534645525f46414960008201527f4c45440000000000000000000000000000000000000000000000000000000000602082015250565b60006127ca602383612072565b91506127d58261276e565b604082019050919050565b600060208201905081810360008301526127f9816127bd565b9050919050565b60008151905061280f81611d93565b92915050565b60006020828403121561282b5761282a611b8f565b5b600061283984828501612800565b91505092915050565b7f5472616e7366657248656c7065723a205452414e534645525f4641494c454400600082015250565b6000612878601f83612072565b915061288382612842565b602082019050919050565b600060208201905081810360008301526128a78161286b565b9050919050565b60006040820190506128c36000830185611c29565b6128d06020830184611c29565b939250505056fea26469706673582212207712e15dc2dfd8d4f4d7de6e5ca85f4d2747d8f334af7f9f13fed090c4135fe264736f6c63430008130033