Transactions
Token Transfers
Internal Transactions
Coin Balance History
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- TwoBearsBalances
- Optimization enabled
- false
- Compiler version
- v0.8.16+commit.07a7930e
- EVM Version
- default
- Verified at
- 2024-09-26T15:34:54.672848Z
Contract source code
// All rights reserved. // SPDX-License-Identifier: No License (None) pragma solidity ^0.8.16; interface IContractOrders { function createOrder(address _owner, address _token_in, uint _value_in, address _token_out, uint _value_out, uint8 _order_type, uint _price, uint _order_position, uint _dex_fee, uint _dex_num_exec_ord) external returns (uint256); } interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } interface IWCLO { function deposit() external payable; function withdraw(uint wad) external; } contract TwoBearsBalances { struct Tokens { uint256 minValue; // 32 байта - минимальное количество токена, доступное для торговли (ограничивает создание пылевых ордеров) uint8 standart; // 1 байта - стандарт токена uint8 decimal; // 1 байт - количество десятичных знаков uint16 priority; // 2 байта - приоритет токена для определения ценообразования (цена - отношение к токену с максимальным приоритетом) bytes8 symb; // 8 байт - аббревиатура токена address next; // 20 байт - адрес следующего токена (последний токен указывает на нулевой адрес) } uint256 commission = 4 * 1e17; // комиссионный процент взымаемый с каждого выполняемого ордера (оплачивается получаемым токеном, в процессе исполнения ордера) uint256 numExecutedOrders = 75; // максимальное количество ордеров которое можно выполнить за 1 транзакцию mapping(address => Tokens) private tokens; // Односвязный список всех токенов на бирже address public owner = 0xeBE894814554c8382EA6a24CcDdf1527407A24f6; // Владелец //address public owner2 = 0xCA110B82bE575DfD1829191Cc38F7a4ab7D808bc; // второй владелец address public constant contractOrders = 0x4119DB2B24Cb80FE47C057085c21fCa391d01C1a; // Контракт с книгами ордеров address public constant contractCommission = 0x728973D3Dd87CC2De387AF507e84011333E22A2d; // Контракт куда поступают комиссии //address public constant contractBots = 0x7777265DC7FD2a15A7f2E8d8Ad87b3DAec677777; // Контракт ботов address private constant firstToken = 0xF5AD6F6EDeC824C7fD54A66d241a227F6503aD3a; // первый адрес в списке токенов это WCLO address private endToken = firstToken; // всегда указывает на последний токен в списке токенов modifier onlyOwner() { require(msg.sender == owner, "Only owner can call this"); _; } modifier onlyContractOrders() { require(msg.sender == contractOrders, "Only contract orders can call"); _; } constructor() { tokens[firstToken] = Tokens(1000 * 1e18, 223, 18, 50000, "WCLO", address(0x00)); IERC20(firstToken).approve(address(this), uint(int(-1))); //Даем разрешение нашему контракту тратить токен на своем балансе через TransferFrom } // Функции обработки поступающих средств (создание ордеров) receive() external payable { // принимаем нативную монету только от контракта, который ее оборачивал require(msg.sender == firstToken); } function createOrderNative(address _token_out, uint _value_out, uint _order_position) external payable { // создаем ордер через нативную монету IWCLO(firstToken).deposit{value: msg.value}(); // оборачиваем нативную монету от пользователя createOrderUser(msg.sender, firstToken, msg.value, _token_out, _value_out, _order_position); } function createOrderERC20(address _token_in, uint _value_in, address _token_out, uint _value_out, uint _order_position) external { //require(tokens[_token_in].standart > 0); // токен должен присутствовать в списке токенов IERC20(_token_in).transferFrom(msg.sender, address(this), _value_in); // контракт принимает входящий токен от пользователя createOrderUser(msg.sender, _token_in, _value_in, _token_out, _value_out, _order_position); } function tokenReceived(address _from, uint _value, bytes memory _data) public returns (bytes4) { // новый ERC223 //require(tokens[msg.sender].standart == 223); // токен должен присутствовать в списке токенов (address _token_out, uint _value_out, uint _order_position) = abi.decode(_data, (address, uint, uint)); createOrderUser(_from, msg.sender, _value, _token_out, _value_out, _order_position); return this.tokenReceived.selector; // возвращаем селектор этой функции } function createOrderUser(address _owner, address _token_in, uint _value_in, address _token_out, uint _value_out, uint _order_position) private returns (uint256){ // создание ордера от имени пользователя require((tokens[_token_in].standart > 0) && (tokens[_token_out].standart > 0)); // токены должны присутствовать в списке токенов require((_value_in > 0) && (_value_out > 0)); // количество входящего и получаемого токена должно быть больше 0 require(_token_in != _token_out); // токены не должны быть одинаковыми if(tokens[_token_in].priority < tokens[_token_out].priority){ // делаем проверку что ордера не пылевые - соответствуют минимальному значению по токену с максимальным приоритетом require(_value_out >= tokens[_token_out].minValue); } else{ require(_value_in >= tokens[_token_in].minValue); } (uint8 _order_type, uint256 _price) = getTypeAndPriceOrder(_token_in, _value_in, _token_out, _value_out); // Определяем тип ордера и его цену require(_price > 0); // запрещено ордеру иметь нулевую цену uint _id = IContractOrders(contractOrders).createOrder(_owner, _token_in, _value_in, _token_out, _value_out, _order_type, _price, _order_position, commission, numExecutedOrders); return _id; } function withdraw(address _token, address _owner, uint _value) external onlyContractOrders // Выплата токена указанному владельцу { uint256 _size; assembly { _size := extcodesize(_owner) } // проверяем является ли адрес получателя контрактом if(_size > 0){ // если получатель это контракт, то выплачиваем токенами (нативная монета не разворачивается) IERC20(_token).transferFrom(address(this), _owner, _value); } else{ // пользователи (EOA) ордеров нативную монету получают в развернутом виде if(_token == firstToken){ // вывод нативного CLO IWCLO(_token).withdraw(_value); payable(_owner).transfer(_value); } else{ // вывод токена IERC20(_token).transferFrom(address(this), _owner, _value); } } } function withdrawFee(address _token, uint _value) external onlyContractOrders // Выплата комиссии за исполнение ордера { //IERC20(_token).approve(address(this), _value); //Даем разрешение нашему контракту тратить токен на своем балансе через TransferFrom IERC20(_token).transferFrom(address(this), contractCommission, _value); } // ФУНКЦИИ ВЛАДЕЛЬЦА function setFeesExchange(uint256 _newCommission) external onlyOwner // установить новый процент биржи { commission = _newCommission; } function setNumExecutedOrders(uint256 _numExecutedOrders) external onlyOwner // установить максимальное количество исполняемых ордеров в пределах 1 транзакции { numExecutedOrders = _numExecutedOrders; } function approveToken(address _token) external onlyOwner // Дать безлимитное разрешение нашему контракту тратить токен на своем балансе через TransferFrom { require(tokens[_token].standart > 0); IERC20(_token).approve(address(this), uint(int(-1))); // Даем разрешение нашему контракту тратить токен на своем балансе через TransferFrom } function addToken(address _newToken, uint8 _standart, uint16 _priority, uint256 _minValue) external onlyOwner // Добавление нового токена на dex { require(tokens[_newToken].standart == 0, "err: token exists"); // токен должен отсутствовать в списке токенов bytes8 _newSymb; string memory str = IERC20(_newToken).symbol(); assembly { _newSymb := mload(add(str, 32)) } tokens[_newToken] = Tokens(_minValue, _standart, IERC20(_newToken).decimals(), _priority, _newSymb, address(0x00)); tokens[endToken].next = _newToken; // связываем последний токен с новым токеном endToken = _newToken; // новый токен становится последним IERC20(_newToken).approve(address(this), uint(int(-1))); //Даем разрешение нашему контракту тратить токен на своем балансе через TransferFrom } function changeTokenMinValue(address _token, uint256 _minValue) external onlyOwner // Изменить минимальное количество токена, доступное для торговли { require(tokens[_token].standart > 0); // токен должен присутствовать в списке токенов tokens[_token].minValue = _minValue; } function delToken(address _delToken, address _prevToken) external onlyOwner // Делистинг токена { // _delToken - удаляемый токен, _prevToken - токен в списке перед удаляемым токеном require((_delToken != address(0)) && (_delToken != firstToken)); // Удаляемый токен не может быть нулевым адресом и WCLO require(tokens[_prevToken].next == _delToken); // предыдущий токен в списке должен указывать на удаляемый токен require(IERC20(_delToken).balanceOf(address(this)) == 0); // контракт не должен иметь баланс в удаляемом токене if(_delToken == endToken) endToken = _prevToken; // если удаляется последний токен в списке tokens[_prevToken].next = tokens[_delToken].next; // исключаем удаляемый токен из списка delete tokens[_delToken]; // чистим память, данная операция поощрается EVM и будет возвращено часть газа } function getTokensInfo(address _startToken, uint _elem) public view returns (Tokens[] memory) // Возвращаем _elem токенов на бирже от указанного адреса { Tokens[] memory result = new Tokens[](_elem); _startToken = tokens[_startToken].standart > 0 ? _startToken : firstToken; // определяем стартовую позицию address _nextToken; for(uint i; i < _elem; i++){ _nextToken = tokens[_startToken].next; result[i] = Tokens(tokens[_startToken].minValue, tokens[_startToken].standart, tokens[_startToken].decimal, tokens[_startToken].priority, tokens[_startToken].symb, tokens[_startToken].next); if(_nextToken == address(0x00)){ break; // достигли конца списка } else { _startToken = _nextToken; } } return (result); // возвращаем массив с инфой по токенам } function getTokenMinValue(address _token) public view returns (uint256) // вернуть минимальное количество токена, доступное для торговли { return (tokens[_token].minValue); } function getTokenPriority(address _token) public view returns (uint256) // вернуть приоритет токена { return (tokens[_token].priority); } function getBalancesByTokens(address[] calldata _tokens, address _owner) public view returns (uint [] memory) // вернуть баланс всех токенов из массива и в конец массива добавить баланс нативной монеты { uint[] memory result = new uint[](_tokens.length + 1); // Добавочный элемент для хранения баланса нативной монеты for(uint i; i < _tokens.length; i++){ result[i] = IERC20(_tokens[i]).balanceOf(_owner); } result[_tokens.length] = _owner.balance; // получаем баланс адреса в нативной монете return (result); } function getFeesAndNumExecOrd() public view returns (uint256, uint256) // вернуть процент биржи и максимальное количество исполняемых ордеров за 1 транзакцию { return (commission, numExecutedOrders); } function getTypeAndPriceOrder(address _token_in, uint _value_in, address _token_out, uint _value_out) public view returns (uint8, uint256) // вернуть тип ордера и цену ордера { uint8 _order_type = tokens[_token_in].priority < tokens[_token_out].priority ? 1 : 2; // тип ордера (1 - продажа, 2 - покупка) uint256 res = _order_type == 1 ? _value_out * (10**tokens[_token_in].decimal) / _value_in : _value_in * (10**tokens[_token_out].decimal) / _value_out; // расчет цены ордера return (_order_type, res); } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addToken","inputs":[{"type":"address","name":"_newToken","internalType":"address"},{"type":"uint8","name":"_standart","internalType":"uint8"},{"type":"uint16","name":"_priority","internalType":"uint16"},{"type":"uint256","name":"_minValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approveToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTokenMinValue","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_minValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractCommission","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractOrders","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createOrderERC20","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_out","internalType":"uint256"},{"type":"uint256","name":"_order_position","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"createOrderNative","inputs":[{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_out","internalType":"uint256"},{"type":"uint256","name":"_order_position","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delToken","inputs":[{"type":"address","name":"_delToken","internalType":"address"},{"type":"address","name":"_prevToken","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getBalancesByTokens","inputs":[{"type":"address[]","name":"_tokens","internalType":"address[]"},{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getFeesAndNumExecOrd","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTokenMinValue","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTokenPriority","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct TwoBearsBalances.Tokens[]","components":[{"type":"uint256","name":"minValue","internalType":"uint256"},{"type":"uint8","name":"standart","internalType":"uint8"},{"type":"uint8","name":"decimal","internalType":"uint8"},{"type":"uint16","name":"priority","internalType":"uint16"},{"type":"bytes8","name":"symb","internalType":"bytes8"},{"type":"address","name":"next","internalType":"address"}]}],"name":"getTokensInfo","inputs":[{"type":"address","name":"_startToken","internalType":"address"},{"type":"uint256","name":"_elem","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTypeAndPriceOrder","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_out","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeesExchange","inputs":[{"type":"uint256","name":"_newCommission","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNumExecutedOrders","inputs":[{"type":"uint256","name":"_numExecutedOrders","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"tokenReceived","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_owner","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawFee","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x608060405267058d15e176280000600055604b60015573ebe894814554c8382ea6a24ccddf1527407a24f6600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f5ad6f6edec824c7fd54a66d241a227f6503ad3a600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000cc57600080fd5b506040518060c00160405280683635c9adc5dea00000815260200160df60ff168152602001601260ff16815260200161c35061ffff1681526020017f57434c4f0000000000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff168152506002600073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548161ffff021916908361ffff16021790555060808201518160010160046101000a81548167ffffffffffffffff021916908360c01c021790555060a082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040162000308929190620003b5565b6020604051808303816000875af115801562000328573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034e919062000424565b5062000456565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003828262000355565b9050919050565b620003948162000375565b82525050565b6000819050919050565b620003af816200039a565b82525050565b6000604082019050620003cc600083018562000389565b620003db6020830184620003a4565b9392505050565b600080fd5b60008115159050919050565b620003fe81620003e7565b81146200040a57600080fd5b50565b6000815190506200041e81620003f3565b92915050565b6000602082840312156200043d576200043c620003e2565b5b60006200044d848285016200040d565b91505092915050565b61362580620004666000396000f3fe6080604052600436106101235760003560e01c80638943ec02116100a0578063d9caed1211610064578063d9caed121461042d578063e06b440014610456578063f3f9d41a14610481578063f41a710d146104be578063fd9be522146104fb57610176565b80638943ec02146103575780638a6cea2c146103945780638b43f445146103bd5780638da5cb5b146103d9578063bfdf0bd71461040457610176565b80632709275e116100e75780632709275e14610270578063508784051461029b57806366555804146102c757806380b2edd81461030557806381e1c10b1461032e57610176565b80631a180bb61461017b5780631f2bff68146101a457806323c5036b146101e157806324bd3e8f1461020a57806326c28edf1461023357610176565b366101765773f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461017457600080fd5b005b600080fd5b34801561018757600080fd5b506101a2600480360381019061019d91906124ae565b610524565b005b3480156101b057600080fd5b506101cb60048036038101906101c691906124ae565b61065e565b6040516101d891906126aa565b60405180910390f35b3480156101ed57600080fd5b50610208600480360381019061020391906126cc565b610a5f565b005b34801561021657600080fd5b50610231600480360381019061022c9190612747565b610af6565b005b34801561023f57600080fd5b5061025a600480360381019061025591906127d9565b610b90565b60405161026791906128e8565b60405180910390f35b34801561027c57600080fd5b50610285610d15565b6040516102929190612919565b60405180910390f35b3480156102a757600080fd5b506102b0610d2d565b6040516102be929190612943565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e9919061296c565b610d3e565b6040516102fc9291906129e2565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190612a0b565b610f08565b005b34801561033a57600080fd5b5061035560048036038101906103509190612a38565b611099565b005b34801561036357600080fd5b5061037e60048036038101906103799190612bb9565b611516565b60405161038b9190612c63565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190612747565b611559565b005b6103d760048036038101906103d29190612c7e565b6115f3565b005b3480156103e557600080fd5b506103ee611690565b6040516103fb9190612919565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190612d29565b6116b6565b005b34801561043957600080fd5b50610454600480360381019061044f9190612d90565b611bdd565b005b34801561046257600080fd5b5061046b611e7b565b6040516104789190612919565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612a0b565b611e93565b6040516104b59190612de3565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e09190612a0b565b611ef1565b6040516104f29190612de3565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d91906124ae565b611f3d565b005b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ab90612e5b565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161161061357600080fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505050565b606060008267ffffffffffffffff81111561067c5761067b612a8e565b5b6040519080825280602002602001820160405280156106b557816020015b6106a2612395565b81526020019060019003908161069a5790505b5090506000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161161072c5773f5ad6f6edec824c7fd54a66d241a227f6503ad3a61072e565b835b93506000805b84811015610a5357600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506040518060c00160405280600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff1660ff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508382815181106109fd576109fc612e7b565b5b6020026020010181905250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315610a53578195508080610a4b90612ed9565b915050610734565b50819250505092915050565b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401610a9c93929190612f21565b6020604051808303816000875af1158015610abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adf9190612f90565b50610aee338686868686612058565b505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90612e5b565b60405180910390fd5b8060018190555050565b60606000600185859050610ba49190612fbd565b67ffffffffffffffff811115610bbd57610bbc612a8e565b5b604051908082528060200260200182016040528015610beb5781602001602082028036833780820191505090505b50905060005b85859050811015610ccf57858582818110610c0f57610c0e612e7b565b5b9050602002016020810190610c249190612a0b565b73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610c5c9190612919565b602060405180830381865afa158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9d9190613006565b828281518110610cb057610caf612e7b565b5b6020026020010181815250508080610cc790612ed9565b915050610bf1565b508273ffffffffffffffffffffffffffffffffffffffff1631818686905081518110610cfe57610cfd612e7b565b5b602002602001018181525050809150509392505050565b73728973d3dd87cc2de387af507e84011333e22a2d81565b600080600054600154915091509091565b6000806000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff1610610df9576002610dfc565b60015b9050600060018260ff1614610e825784600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a610e689190613166565b88610e7391906131b1565b610e7d919061323a565b610ef5565b86600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a610edf9190613166565b86610eea91906131b1565b610ef4919061323a565b5b9050818193509350505094509492505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f90612e5b565b60405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff1611610ff757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161105292919061326b565b6020604051808303816000875af1158015611071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110959190612f90565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112090612e5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156111a6575073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6111af57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461124957600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112849190612919565b602060405180830381865afa1580156112a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c59190613006565b146112cf57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113665780600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690556001820160016101000a81549060ff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549067ffffffffffffffff021916905560018201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b6000806000808480602001905181019061153091906132d2565b925092509250611544873388868686612058565b50638943ec0260e01b93505050509392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e090612e5b565b60405180910390fd5b8060008190555050565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561164f57600080fd5b505af1158015611663573d6000803e3d6000fd5b505050505061168a3373f5ad6f6edec824c7fd54a66d241a227f6503ad3a34868686612058565b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612e5b565b60405180910390fd5b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290613371565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611829573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611852919061345c565b9050602081015191506040518060c001604052808481526020018660ff1681526020018773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e491906134ba565b60ff1681526020018561ffff1681526020018377ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548161ffff021916908361ffff16021790555060808201518160010160046101000a81548167ffffffffffffffff021916908360c01c021790555060a082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508560026000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611b9192919061326b565b6020604051808303816000875af1158015611bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd49190612f90565b50505050505050565b734119db2b24cb80fe47c057085c21fca391d01c1a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690613533565b60405180910390fd5b6000823b90506000811115611cf4578373ffffffffffffffffffffffffffffffffffffffff166323b872dd3085856040518463ffffffff1660e01b8152600401611cab93929190612f21565b6020604051808303816000875af1158015611cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cee9190612f90565b50611e75565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611df2578373ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b8152600401611d749190612de3565b600060405180830381600087803b158015611d8e57600080fd5b505af1158015611da2573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611dec573d6000803e3d6000fd5b50611e74565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3085856040518463ffffffff1660e01b8152600401611e2f93929190612f21565b6020604051808303816000875af1158015611e4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e729190612f90565b505b5b50505050565b734119db2b24cb80fe47c057085c21fca391d01c1a81565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff169050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b734119db2b24cb80fe47c057085c21fca391d01c1a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690613533565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3073728973d3dd87cc2de387af507e84011333e22a2d846040518463ffffffff1660e01b815260040161201093929190612f21565b6020604051808303816000875af115801561202f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120539190612f90565b505050565b600080600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff1611801561210d57506000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16115b61211657600080fd5b6000851180156121265750600083115b61212f57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff160361216757600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16101561226b57600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483101561226657600080fd5b6122bb565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548510156122ba57600080fd5b5b6000806122ca88888888610d3e565b91509150600081116122db57600080fd5b6000734119db2b24cb80fe47c057085c21fca391d01c1a73ffffffffffffffffffffffffffffffffffffffff166347402bea8b8b8b8b8b89898d6000546001546040518b63ffffffff1660e01b81526004016123409a99989796959493929190613553565b6020604051808303816000875af115801561235f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123839190613006565b90508093505050509695505050505050565b6040518060c0016040528060008152602001600060ff168152602001600060ff168152602001600061ffff168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124458261241a565b9050919050565b6124558161243a565b811461246057600080fd5b50565b6000813590506124728161244c565b92915050565b6000819050919050565b61248b81612478565b811461249657600080fd5b50565b6000813590506124a881612482565b92915050565b600080604083850312156124c5576124c4612410565b5b60006124d385828601612463565b92505060206124e485828601612499565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61252381612478565b82525050565b600060ff82169050919050565b61253f81612529565b82525050565b600061ffff82169050919050565b61255c81612545565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b61259781612562565b82525050565b6125a68161243a565b82525050565b60c0820160008201516125c2600085018261251a565b5060208201516125d56020850182612536565b5060408201516125e86040850182612536565b5060608201516125fb6060850182612553565b50608082015161260e608085018261258e565b5060a082015161262160a085018261259d565b50505050565b600061263383836125ac565b60c08301905092915050565b6000602082019050919050565b6000612657826124ee565b61266181856124f9565b935061266c8361250a565b8060005b8381101561269d5781516126848882612627565b975061268f8361263f565b925050600181019050612670565b5085935050505092915050565b600060208201905081810360008301526126c4818461264c565b905092915050565b600080600080600060a086880312156126e8576126e7612410565b5b60006126f688828901612463565b955050602061270788828901612499565b945050604061271888828901612463565b935050606061272988828901612499565b925050608061273a88828901612499565b9150509295509295909350565b60006020828403121561275d5761275c612410565b5b600061276b84828501612499565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261279957612798612774565b5b8235905067ffffffffffffffff8111156127b6576127b5612779565b5b6020830191508360208202830111156127d2576127d161277e565b5b9250929050565b6000806000604084860312156127f2576127f1612410565b5b600084013567ffffffffffffffff8111156128105761280f612415565b5b61281c86828701612783565b9350935050602061282f86828701612463565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612871838361251a565b60208301905092915050565b6000602082019050919050565b600061289582612839565b61289f8185612844565b93506128aa83612855565b8060005b838110156128db5781516128c28882612865565b97506128cd8361287d565b9250506001810190506128ae565b5085935050505092915050565b60006020820190508181036000830152612902818461288a565b905092915050565b6129138161243a565b82525050565b600060208201905061292e600083018461290a565b92915050565b61293d81612478565b82525050565b60006040820190506129586000830185612934565b6129656020830184612934565b9392505050565b6000806000806080858703121561298657612985612410565b5b600061299487828801612463565b94505060206129a587828801612499565b93505060406129b687828801612463565b92505060606129c787828801612499565b91505092959194509250565b6129dc81612529565b82525050565b60006040820190506129f760008301856129d3565b612a046020830184612934565b9392505050565b600060208284031215612a2157612a20612410565b5b6000612a2f84828501612463565b91505092915050565b60008060408385031215612a4f57612a4e612410565b5b6000612a5d85828601612463565b9250506020612a6e85828601612463565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ac682612a7d565b810181811067ffffffffffffffff82111715612ae557612ae4612a8e565b5b80604052505050565b6000612af8612406565b9050612b048282612abd565b919050565b600067ffffffffffffffff821115612b2457612b23612a8e565b5b612b2d82612a7d565b9050602081019050919050565b82818337600083830152505050565b6000612b5c612b5784612b09565b612aee565b905082815260208101848484011115612b7857612b77612a78565b5b612b83848285612b3a565b509392505050565b600082601f830112612ba057612b9f612774565b5b8135612bb0848260208601612b49565b91505092915050565b600080600060608486031215612bd257612bd1612410565b5b6000612be086828701612463565b9350506020612bf186828701612499565b925050604084013567ffffffffffffffff811115612c1257612c11612415565b5b612c1e86828701612b8b565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c5d81612c28565b82525050565b6000602082019050612c786000830184612c54565b92915050565b600080600060608486031215612c9757612c96612410565b5b6000612ca586828701612463565b9350506020612cb686828701612499565b9250506040612cc786828701612499565b9150509250925092565b612cda81612529565b8114612ce557600080fd5b50565b600081359050612cf781612cd1565b92915050565b612d0681612545565b8114612d1157600080fd5b50565b600081359050612d2381612cfd565b92915050565b60008060008060808587031215612d4357612d42612410565b5b6000612d5187828801612463565b9450506020612d6287828801612ce8565b9350506040612d7387828801612d14565b9250506060612d8487828801612499565b91505092959194509250565b600080600060608486031215612da957612da8612410565b5b6000612db786828701612463565b9350506020612dc886828701612463565b9250506040612dd986828701612499565b9150509250925092565b6000602082019050612df86000830184612934565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869730000000000000000600082015250565b6000612e45601883612dfe565b9150612e5082612e0f565b602082019050919050565b60006020820190508181036000830152612e7481612e38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ee482612478565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f1657612f15612eaa565b5b600182019050919050565b6000606082019050612f36600083018661290a565b612f43602083018561290a565b612f506040830184612934565b949350505050565b60008115159050919050565b612f6d81612f58565b8114612f7857600080fd5b50565b600081519050612f8a81612f64565b92915050565b600060208284031215612fa657612fa5612410565b5b6000612fb484828501612f7b565b91505092915050565b6000612fc882612478565b9150612fd383612478565b9250828201905080821115612feb57612fea612eaa565b5b92915050565b60008151905061300081612482565b92915050565b60006020828403121561301c5761301b612410565b5b600061302a84828501612ff1565b91505092915050565b60008160011c9050919050565b6000808291508390505b600185111561308a5780860481111561306657613065612eaa565b5b60018516156130755780820291505b808102905061308385613033565b945061304a565b94509492505050565b6000826130a3576001905061315f565b816130b1576000905061315f565b81600181146130c757600281146130d157613100565b600191505061315f565b60ff8411156130e3576130e2612eaa565b5b8360020a9150848211156130fa576130f9612eaa565b5b5061315f565b5060208310610133831016604e8410600b84101617156131355782820a9050838111156131305761312f612eaa565b5b61315f565b6131428484846001613040565b9250905081840481111561315957613158612eaa565b5b81810290505b9392505050565b600061317182612478565b915061317c83612529565b92506131a97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613093565b905092915050565b60006131bc82612478565b91506131c783612478565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613200576131ff612eaa565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061324582612478565b915061325083612478565b9250826132605761325f61320b565b5b828204905092915050565b6000604082019050613280600083018561290a565b61328d6020830184612934565b9392505050565b600061329f8261241a565b9050919050565b6132af81613294565b81146132ba57600080fd5b50565b6000815190506132cc816132a6565b92915050565b6000806000606084860312156132eb576132ea612410565b5b60006132f9868287016132bd565b935050602061330a86828701612ff1565b925050604061331b86828701612ff1565b9150509250925092565b7f6572723a20746f6b656e20657869737473000000000000000000000000000000600082015250565b600061335b601183612dfe565b915061336682613325565b602082019050919050565b6000602082019050818103600083015261338a8161334e565b9050919050565b600067ffffffffffffffff8211156133ac576133ab612a8e565b5b6133b582612a7d565b9050602081019050919050565b60005b838110156133e05780820151818401526020810190506133c5565b60008484015250505050565b60006133ff6133fa84613391565b612aee565b90508281526020810184848401111561341b5761341a612a78565b5b6134268482856133c2565b509392505050565b600082601f83011261344357613442612774565b5b81516134538482602086016133ec565b91505092915050565b60006020828403121561347257613471612410565b5b600082015167ffffffffffffffff8111156134905761348f612415565b5b61349c8482850161342e565b91505092915050565b6000815190506134b481612cd1565b92915050565b6000602082840312156134d0576134cf612410565b5b60006134de848285016134a5565b91505092915050565b7f4f6e6c7920636f6e7472616374206f72646572732063616e2063616c6c000000600082015250565b600061351d601d83612dfe565b9150613528826134e7565b602082019050919050565b6000602082019050818103600083015261354c81613510565b9050919050565b600061014082019050613569600083018d61290a565b613576602083018c61290a565b613583604083018b612934565b613590606083018a61290a565b61359d6080830189612934565b6135aa60a08301886129d3565b6135b760c0830187612934565b6135c460e0830186612934565b6135d2610100830185612934565b6135e0610120830184612934565b9b9a505050505050505050505056fea2646970667358221220e4a3fa75a6d3ac487e25c826dde99555196baeb7aeeda21d3295639bc006ba8c64736f6c63430008100033
Deployed ByteCode
0x6080604052600436106101235760003560e01c80638943ec02116100a0578063d9caed1211610064578063d9caed121461042d578063e06b440014610456578063f3f9d41a14610481578063f41a710d146104be578063fd9be522146104fb57610176565b80638943ec02146103575780638a6cea2c146103945780638b43f445146103bd5780638da5cb5b146103d9578063bfdf0bd71461040457610176565b80632709275e116100e75780632709275e14610270578063508784051461029b57806366555804146102c757806380b2edd81461030557806381e1c10b1461032e57610176565b80631a180bb61461017b5780631f2bff68146101a457806323c5036b146101e157806324bd3e8f1461020a57806326c28edf1461023357610176565b366101765773f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461017457600080fd5b005b600080fd5b34801561018757600080fd5b506101a2600480360381019061019d91906124ae565b610524565b005b3480156101b057600080fd5b506101cb60048036038101906101c691906124ae565b61065e565b6040516101d891906126aa565b60405180910390f35b3480156101ed57600080fd5b50610208600480360381019061020391906126cc565b610a5f565b005b34801561021657600080fd5b50610231600480360381019061022c9190612747565b610af6565b005b34801561023f57600080fd5b5061025a600480360381019061025591906127d9565b610b90565b60405161026791906128e8565b60405180910390f35b34801561027c57600080fd5b50610285610d15565b6040516102929190612919565b60405180910390f35b3480156102a757600080fd5b506102b0610d2d565b6040516102be929190612943565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e9919061296c565b610d3e565b6040516102fc9291906129e2565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190612a0b565b610f08565b005b34801561033a57600080fd5b5061035560048036038101906103509190612a38565b611099565b005b34801561036357600080fd5b5061037e60048036038101906103799190612bb9565b611516565b60405161038b9190612c63565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190612747565b611559565b005b6103d760048036038101906103d29190612c7e565b6115f3565b005b3480156103e557600080fd5b506103ee611690565b6040516103fb9190612919565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190612d29565b6116b6565b005b34801561043957600080fd5b50610454600480360381019061044f9190612d90565b611bdd565b005b34801561046257600080fd5b5061046b611e7b565b6040516104789190612919565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612a0b565b611e93565b6040516104b59190612de3565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e09190612a0b565b611ef1565b6040516104f29190612de3565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d91906124ae565b611f3d565b005b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ab90612e5b565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161161061357600080fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505050565b606060008267ffffffffffffffff81111561067c5761067b612a8e565b5b6040519080825280602002602001820160405280156106b557816020015b6106a2612395565b81526020019060019003908161069a5790505b5090506000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161161072c5773f5ad6f6edec824c7fd54a66d241a227f6503ad3a61072e565b835b93506000805b84811015610a5357600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506040518060c00160405280600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff1660ff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508382815181106109fd576109fc612e7b565b5b6020026020010181905250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315610a53578195508080610a4b90612ed9565b915050610734565b50819250505092915050565b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401610a9c93929190612f21565b6020604051808303816000875af1158015610abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adf9190612f90565b50610aee338686868686612058565b505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90612e5b565b60405180910390fd5b8060018190555050565b60606000600185859050610ba49190612fbd565b67ffffffffffffffff811115610bbd57610bbc612a8e565b5b604051908082528060200260200182016040528015610beb5781602001602082028036833780820191505090505b50905060005b85859050811015610ccf57858582818110610c0f57610c0e612e7b565b5b9050602002016020810190610c249190612a0b565b73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610c5c9190612919565b602060405180830381865afa158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9d9190613006565b828281518110610cb057610caf612e7b565b5b6020026020010181815250508080610cc790612ed9565b915050610bf1565b508273ffffffffffffffffffffffffffffffffffffffff1631818686905081518110610cfe57610cfd612e7b565b5b602002602001018181525050809150509392505050565b73728973d3dd87cc2de387af507e84011333e22a2d81565b600080600054600154915091509091565b6000806000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff1610610df9576002610dfc565b60015b9050600060018260ff1614610e825784600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a610e689190613166565b88610e7391906131b1565b610e7d919061323a565b610ef5565b86600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a610edf9190613166565b86610eea91906131b1565b610ef4919061323a565b5b9050818193509350505094509492505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f90612e5b565b60405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff1611610ff757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161105292919061326b565b6020604051808303816000875af1158015611071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110959190612f90565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112090612e5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156111a6575073f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6111af57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461124957600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112849190612919565b602060405180830381865afa1580156112a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c59190613006565b146112cf57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113665780600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690556001820160016101000a81549060ff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549067ffffffffffffffff021916905560018201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b6000806000808480602001905181019061153091906132d2565b925092509250611544873388868686612058565b50638943ec0260e01b93505050509392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e090612e5b565b60405180910390fd5b8060008190555050565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561164f57600080fd5b505af1158015611663573d6000803e3d6000fd5b505050505061168a3373f5ad6f6edec824c7fd54a66d241a227f6503ad3a34868686612058565b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612e5b565b60405180910390fd5b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290613371565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611829573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611852919061345c565b9050602081015191506040518060c001604052808481526020018660ff1681526020018773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e491906134ba565b60ff1681526020018561ffff1681526020018377ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548161ffff021916908361ffff16021790555060808201518160010160046101000a81548167ffffffffffffffff021916908360c01c021790555060a082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508560026000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611b9192919061326b565b6020604051808303816000875af1158015611bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd49190612f90565b50505050505050565b734119db2b24cb80fe47c057085c21fca391d01c1a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690613533565b60405180910390fd5b6000823b90506000811115611cf4578373ffffffffffffffffffffffffffffffffffffffff166323b872dd3085856040518463ffffffff1660e01b8152600401611cab93929190612f21565b6020604051808303816000875af1158015611cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cee9190612f90565b50611e75565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611df2578373ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b8152600401611d749190612de3565b600060405180830381600087803b158015611d8e57600080fd5b505af1158015611da2573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611dec573d6000803e3d6000fd5b50611e74565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3085856040518463ffffffff1660e01b8152600401611e2f93929190612f21565b6020604051808303816000875af1158015611e4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e729190612f90565b505b5b50505050565b734119db2b24cb80fe47c057085c21fca391d01c1a81565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff169050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b734119db2b24cb80fe47c057085c21fca391d01c1a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690613533565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3073728973d3dd87cc2de387af507e84011333e22a2d846040518463ffffffff1660e01b815260040161201093929190612f21565b6020604051808303816000875af115801561202f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120539190612f90565b505050565b600080600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff1611801561210d57506000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16115b61211657600080fd5b6000851180156121265750600083115b61212f57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff160361216757600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16101561226b57600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483101561226657600080fd5b6122bb565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548510156122ba57600080fd5b5b6000806122ca88888888610d3e565b91509150600081116122db57600080fd5b6000734119db2b24cb80fe47c057085c21fca391d01c1a73ffffffffffffffffffffffffffffffffffffffff166347402bea8b8b8b8b8b89898d6000546001546040518b63ffffffff1660e01b81526004016123409a99989796959493929190613553565b6020604051808303816000875af115801561235f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123839190613006565b90508093505050509695505050505050565b6040518060c0016040528060008152602001600060ff168152602001600060ff168152602001600061ffff168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124458261241a565b9050919050565b6124558161243a565b811461246057600080fd5b50565b6000813590506124728161244c565b92915050565b6000819050919050565b61248b81612478565b811461249657600080fd5b50565b6000813590506124a881612482565b92915050565b600080604083850312156124c5576124c4612410565b5b60006124d385828601612463565b92505060206124e485828601612499565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61252381612478565b82525050565b600060ff82169050919050565b61253f81612529565b82525050565b600061ffff82169050919050565b61255c81612545565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b61259781612562565b82525050565b6125a68161243a565b82525050565b60c0820160008201516125c2600085018261251a565b5060208201516125d56020850182612536565b5060408201516125e86040850182612536565b5060608201516125fb6060850182612553565b50608082015161260e608085018261258e565b5060a082015161262160a085018261259d565b50505050565b600061263383836125ac565b60c08301905092915050565b6000602082019050919050565b6000612657826124ee565b61266181856124f9565b935061266c8361250a565b8060005b8381101561269d5781516126848882612627565b975061268f8361263f565b925050600181019050612670565b5085935050505092915050565b600060208201905081810360008301526126c4818461264c565b905092915050565b600080600080600060a086880312156126e8576126e7612410565b5b60006126f688828901612463565b955050602061270788828901612499565b945050604061271888828901612463565b935050606061272988828901612499565b925050608061273a88828901612499565b9150509295509295909350565b60006020828403121561275d5761275c612410565b5b600061276b84828501612499565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261279957612798612774565b5b8235905067ffffffffffffffff8111156127b6576127b5612779565b5b6020830191508360208202830111156127d2576127d161277e565b5b9250929050565b6000806000604084860312156127f2576127f1612410565b5b600084013567ffffffffffffffff8111156128105761280f612415565b5b61281c86828701612783565b9350935050602061282f86828701612463565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612871838361251a565b60208301905092915050565b6000602082019050919050565b600061289582612839565b61289f8185612844565b93506128aa83612855565b8060005b838110156128db5781516128c28882612865565b97506128cd8361287d565b9250506001810190506128ae565b5085935050505092915050565b60006020820190508181036000830152612902818461288a565b905092915050565b6129138161243a565b82525050565b600060208201905061292e600083018461290a565b92915050565b61293d81612478565b82525050565b60006040820190506129586000830185612934565b6129656020830184612934565b9392505050565b6000806000806080858703121561298657612985612410565b5b600061299487828801612463565b94505060206129a587828801612499565b93505060406129b687828801612463565b92505060606129c787828801612499565b91505092959194509250565b6129dc81612529565b82525050565b60006040820190506129f760008301856129d3565b612a046020830184612934565b9392505050565b600060208284031215612a2157612a20612410565b5b6000612a2f84828501612463565b91505092915050565b60008060408385031215612a4f57612a4e612410565b5b6000612a5d85828601612463565b9250506020612a6e85828601612463565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ac682612a7d565b810181811067ffffffffffffffff82111715612ae557612ae4612a8e565b5b80604052505050565b6000612af8612406565b9050612b048282612abd565b919050565b600067ffffffffffffffff821115612b2457612b23612a8e565b5b612b2d82612a7d565b9050602081019050919050565b82818337600083830152505050565b6000612b5c612b5784612b09565b612aee565b905082815260208101848484011115612b7857612b77612a78565b5b612b83848285612b3a565b509392505050565b600082601f830112612ba057612b9f612774565b5b8135612bb0848260208601612b49565b91505092915050565b600080600060608486031215612bd257612bd1612410565b5b6000612be086828701612463565b9350506020612bf186828701612499565b925050604084013567ffffffffffffffff811115612c1257612c11612415565b5b612c1e86828701612b8b565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c5d81612c28565b82525050565b6000602082019050612c786000830184612c54565b92915050565b600080600060608486031215612c9757612c96612410565b5b6000612ca586828701612463565b9350506020612cb686828701612499565b9250506040612cc786828701612499565b9150509250925092565b612cda81612529565b8114612ce557600080fd5b50565b600081359050612cf781612cd1565b92915050565b612d0681612545565b8114612d1157600080fd5b50565b600081359050612d2381612cfd565b92915050565b60008060008060808587031215612d4357612d42612410565b5b6000612d5187828801612463565b9450506020612d6287828801612ce8565b9350506040612d7387828801612d14565b9250506060612d8487828801612499565b91505092959194509250565b600080600060608486031215612da957612da8612410565b5b6000612db786828701612463565b9350506020612dc886828701612463565b9250506040612dd986828701612499565b9150509250925092565b6000602082019050612df86000830184612934565b92915050565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869730000000000000000600082015250565b6000612e45601883612dfe565b9150612e5082612e0f565b602082019050919050565b60006020820190508181036000830152612e7481612e38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ee482612478565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f1657612f15612eaa565b5b600182019050919050565b6000606082019050612f36600083018661290a565b612f43602083018561290a565b612f506040830184612934565b949350505050565b60008115159050919050565b612f6d81612f58565b8114612f7857600080fd5b50565b600081519050612f8a81612f64565b92915050565b600060208284031215612fa657612fa5612410565b5b6000612fb484828501612f7b565b91505092915050565b6000612fc882612478565b9150612fd383612478565b9250828201905080821115612feb57612fea612eaa565b5b92915050565b60008151905061300081612482565b92915050565b60006020828403121561301c5761301b612410565b5b600061302a84828501612ff1565b91505092915050565b60008160011c9050919050565b6000808291508390505b600185111561308a5780860481111561306657613065612eaa565b5b60018516156130755780820291505b808102905061308385613033565b945061304a565b94509492505050565b6000826130a3576001905061315f565b816130b1576000905061315f565b81600181146130c757600281146130d157613100565b600191505061315f565b60ff8411156130e3576130e2612eaa565b5b8360020a9150848211156130fa576130f9612eaa565b5b5061315f565b5060208310610133831016604e8410600b84101617156131355782820a9050838111156131305761312f612eaa565b5b61315f565b6131428484846001613040565b9250905081840481111561315957613158612eaa565b5b81810290505b9392505050565b600061317182612478565b915061317c83612529565b92506131a97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613093565b905092915050565b60006131bc82612478565b91506131c783612478565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613200576131ff612eaa565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061324582612478565b915061325083612478565b9250826132605761325f61320b565b5b828204905092915050565b6000604082019050613280600083018561290a565b61328d6020830184612934565b9392505050565b600061329f8261241a565b9050919050565b6132af81613294565b81146132ba57600080fd5b50565b6000815190506132cc816132a6565b92915050565b6000806000606084860312156132eb576132ea612410565b5b60006132f9868287016132bd565b935050602061330a86828701612ff1565b925050604061331b86828701612ff1565b9150509250925092565b7f6572723a20746f6b656e20657869737473000000000000000000000000000000600082015250565b600061335b601183612dfe565b915061336682613325565b602082019050919050565b6000602082019050818103600083015261338a8161334e565b9050919050565b600067ffffffffffffffff8211156133ac576133ab612a8e565b5b6133b582612a7d565b9050602081019050919050565b60005b838110156133e05780820151818401526020810190506133c5565b60008484015250505050565b60006133ff6133fa84613391565b612aee565b90508281526020810184848401111561341b5761341a612a78565b5b6134268482856133c2565b509392505050565b600082601f83011261344357613442612774565b5b81516134538482602086016133ec565b91505092915050565b60006020828403121561347257613471612410565b5b600082015167ffffffffffffffff8111156134905761348f612415565b5b61349c8482850161342e565b91505092915050565b6000815190506134b481612cd1565b92915050565b6000602082840312156134d0576134cf612410565b5b60006134de848285016134a5565b91505092915050565b7f4f6e6c7920636f6e7472616374206f72646572732063616e2063616c6c000000600082015250565b600061351d601d83612dfe565b9150613528826134e7565b602082019050919050565b6000602082019050818103600083015261354c81613510565b9050919050565b600061014082019050613569600083018d61290a565b613576602083018c61290a565b613583604083018b612934565b613590606083018a61290a565b61359d6080830189612934565b6135aa60a08301886129d3565b6135b760c0830187612934565b6135c460e0830186612934565b6135d2610100830185612934565b6135e0610120830184612934565b9b9a505050505050505050505056fea2646970667358221220e4a3fa75a6d3ac487e25c826dde99555196baeb7aeeda21d3295639bc006ba8c64736f6c63430008100033