Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- AstralCards
- Optimization enabled
- false
- Compiler version
- v0.8.16+commit.07a7930e
- EVM Version
- default
- Verified at
- 2025-08-22T08:44:53.536813Z
Contract source code
// SPDX-License-Identifier: GPL-3.0-only
// Author: Upaut
pragma solidity ^0.8.16;
contract AstralCards {
struct User{ // структура описывающая настройки пользователя
uint8 avatar; // индекс аватара игрока
string lang; // язык интерфейса игрока
string name; // имя игрока
}
struct Room{ // структура описывающая игровую комнату
uint256 bankRoom; // сумма всех взносов в комнату
uint256 bet; // ставка внесенная каждым игроком (переплата одним из игроков вернется к нему обратно)
uint256 fees; // комиссия (%) взымаемая с банка игровой комнаты
uint256 status; // состояние комнаты. 0 - комната не активна, 1 - оплачено первым игроком, 2 - идет игра, 3 - можно принимать ставки на игроков
address[] player1_users; // пользовательские адреса что ставят на игрока 1
uint256[] player1_bets; // пользовательские ставки что ставят на игрока 1
address[] player2_users; // пользовательские адреса что ставят на игрока 2
uint256[] player2_bets; // пользовательские ставки что ставят на игрока 2
}
struct RoomList{ // элемент двухсвязного списка содержащего все активные комнаты
uint256 room; // комната
uint256 next; // следующая комната
uint256 prev; // предыдущая комната
}
struct ActiveRoom{
uint256 room; // комната
uint256 bankRoom; // сумма всех взносов в комнату
uint256 bet; // ставка внесенная каждым игроком
uint256 status; // состояние комнаты
address player1; // адрес игрока 1
address player2; // адрес игрока 2
}
uint256 public gameRoom = 1; // номер последней созданной игровой комнаты
uint256 public amountGames; // всегда показывает количество созданных игровых комнат
uint256 public gameRoomMax = 8; // максимально возможное количество одновременно созданных игровых комнат
uint256 public minGameBet = 10 * 1e18; // минимальная игровая ставка в нативной монете
uint256 public gamerBetPool = 25 * 1e18; // (%) Процент, сколько от ставки игрока будет поставлено на его победу в пул ставок
uint256 public maxUsersPerPlayer = 30; // максимальное количество пользователей, которые могут ставить на одного игрока
uint256 public fees = 5 * 1e18; // комиссия (%) взымаемая с банка игровой комнаты
address public owner = msg.sender; // владелец должен иметь возможность настраивать минимальный размер ставки
address public oracle = msg.sender; // игровой сервер будет выступать оракулом
address public commission = msg.sender; // адрес на который будет перечисляться комиссия для дальнейшего распределения
mapping(address => User) private settings; // маппирование настроек пользователя
mapping(uint256 => Room) private rooms; // маппирование игровой комнаты
mapping(uint256 => RoomList) private roomList; // маппирование списка комнат
/*
constructor(address _oracle) {
oracle = _oracle;
}
*/
event UsedRoom(uint indexed room);
modifier onlyOwner() {
require(msg.sender == owner, "Only owner");
_;
}
modifier onlyOracle() {
require(msg.sender == oracle, "Only oracle");
_;
}
receive() external payable {
depositGame();
}
// Функция приема взноса игрока за участие
function depositGame() public payable {
require(msg.sender == tx.origin, "Only EOA"); // другие контракты не могут вызывать данную функцию
require(msg.value >= minGameBet, "low bet"); // минимальный взнос за участие
if(rooms[gameRoom].status == 0){ // комната создается игроком 1
require(amountGames < gameRoomMax, "max rooms created"); // количество созданных комнат не должно превышать установленный максимум
rooms[gameRoom].bet = msg.value;
rooms[gameRoom].status = 1;
rooms[gameRoom].player1_users.push(msg.sender);
_addRoom(gameRoom); // добавляем комнату в список созданых комнат
emit UsedRoom(gameRoom); // события использования комнаты
}
else{ // в созданную комнату вносится оплата игроком 2
require(msg.sender != rooms[gameRoom].player1_users[0], "already added"); // одинаковый адрес не может быть противником
if(msg.value > rooms[gameRoom].bet){ // если второй игрок заплатил больше первого, то вернем назад его переплату
payable(msg.sender).transfer(msg.value - rooms[gameRoom].bet);
} else if(msg.value < rooms[gameRoom].bet){ // если второй игрок заплатил меньше первого, то вернем назад переплату первому игроку
payable(rooms[gameRoom].player1_users[0]).transfer(rooms[gameRoom].bet - msg.value);
rooms[gameRoom].bet = msg.value;
}
rooms[gameRoom].bankRoom = rooms[gameRoom].bet * 2; // вносим точную сумму в банк комнаты
// разбиваем ставки игроков на игровую ставку и пул ставок на игроков
uint _pool_bet = rooms[gameRoom].bet * gamerBetPool / (100 * 1e18); // находим процент от ставки игрока, который должен уйти в пул ставок
rooms[gameRoom].bet -= _pool_bet;
rooms[gameRoom].player1_bets.push(_pool_bet);
rooms[gameRoom].player2_users.push(msg.sender);
rooms[gameRoom].player2_bets.push(_pool_bet);
rooms[gameRoom].fees = fees;
rooms[gameRoom].status = 3; // можно принимать ставки на игроков
emit UsedRoom(gameRoom); // события использования комнаты
gameRoom++; // создаем новую пустую комнату
}
}
// отмена игрового взноса, доступно только если игрок внес оплату один
function depositCancel() external {
require(msg.sender == rooms[gameRoom].player1_users[0], "not your bet"); // ставку может вернуть только тот адрес что создал комнату
require(rooms[gameRoom].status == 1); // статус комнаты должен быть 1, т.е. комната создана, но игрок 2 еще не внес оплату
payable(msg.sender).transfer(rooms[gameRoom].bet);
delete rooms[gameRoom];
_delRoom(gameRoom); // Удаляем игровую комнату из списка созданных комнат
emit UsedRoom(gameRoom); // события использования комнаты
}
// ставка на Игрока 1
function betOnPlayer1(uint256 _room) public payable {
require(msg.sender == tx.origin, "Only EOA"); // другие контракты не могут вызывать данную функцию
require(msg.value >= minGameBet / 4, "low bet"); // минимальная ставка должна быть не меньше 1/4 от минимальной игровой ставки
require(rooms[_room].status == 3, "bets are prohibited"); // статус комнаты должен быть 3, т.е. можно принимать ставки на игроков
require(rooms[_room].player1_users.length <= maxUsersPerPlayer, "Many users with bets"); // количество ставящих пользователей не должно превышать максимум
uint256 _index;
bool _check;
(_index, _check) = _getIndex(rooms[_room].player1_users);
if(_check){ // если пользователь ранее делал ставки
rooms[_room].player1_bets[_index] += msg.value;
} else {
rooms[_room].player1_users.push(msg.sender);
rooms[_room].player1_bets.push(msg.value);
}
rooms[_room].bankRoom += msg.value; // добавляем ставку в банк комнаты
emit UsedRoom(_room); // события использования комнаты
}
// ставка на Игрока 2
function betOnPlayer2(uint256 _room) public payable {
require(msg.sender == tx.origin, "Only EOA"); // другие контракты не могут вызывать данную функцию
require(msg.value >= minGameBet / 4, "low bet"); // минимальная ставка должна быть не меньше 1/4 от минимальной игровой ставки
require(rooms[_room].status == 3, "bets are prohibited"); // статус комнаты должен быть 3, т.е. можно принимать ставки на игроков
require(rooms[_room].player2_users.length <= maxUsersPerPlayer, "Many users with bets"); // количество ставящих пользователей не должно превышать максимум
uint256 _index;
bool _check;
(_index, _check) = _getIndex(rooms[_room].player2_users);
if(_check){ // если пользователь ранее делал ставки
rooms[_room].player2_bets[_index] += msg.value;
} else {
rooms[_room].player2_users.push(msg.sender);
rooms[_room].player2_bets.push(msg.value);
}
rooms[_room].bankRoom += msg.value; // добавляем ставку в банк комнаты
emit UsedRoom(_room); // события использования комнаты
}
// приватная фунция возвращает индекс в массиве ставящих пользователей по заданному адресу
function _getIndex(address[] storage _arr) private view returns (uint256, bool) {
for(uint256 i = 0; i < _arr.length; i++){
if(msg.sender == _arr[i]){
return (i, true);
}
}
return (0, false);
}
// Завершить игру в комнате с определением победителя может только оракул
function setWinner(uint256 _room, address _winner) external onlyOracle {
require((rooms[_room].player1_users[0] == _winner) || (rooms[_room].player2_users[0] == _winner)); // адрес победителя должен быть адресом одного из игроков комнаты
uint256 _fee = rooms[_room].bankRoom * rooms[_room].fees / (100 * 1e18); // находим комиссию
rooms[_room].bet *= 2; // находим выигрыш победителя за победу, пока без учета его ставки
rooms[_room].bankRoom -= (_fee + rooms[_room].bet); // уменьшаем банк комнаты на комиссию + выигрыш победителя
// весь оставшийся банк комнаты надо распределить по ставкам победителей
if(rooms[_room].player1_users[0] == _winner){ // если победил игрок 1
_winnerPay(rooms[_room].bankRoom, rooms[_room].bet, rooms[_room].player1_users, rooms[_room].player1_bets);
}
else{ // если победил игрок 2
_winnerPay(rooms[_room].bankRoom, rooms[_room].bet, rooms[_room].player2_users, rooms[_room].player2_bets);
}
// Производим последнюю выплату - это игровая комиссия
payable(commission).transfer(_fee); // выплачиваем комиссию
// Уничтожаем игровую комнату
_delRoom(_room); // Удаляем игровую комнату из списка созданных комнат
delete rooms[_room];
emit UsedRoom(_room); // события использования комнаты
}
// приватная фунция расчета и выплат всем победителям
function _winnerPay(uint256 _bank, uint256 _amountWin, address[] storage _arrAddress, uint256[] storage _arrBet) private {
uint _sum; // сумма всех ставок
uint[] memory _arrPay = new uint[](_arrAddress.length); // выплаты которые должны получить пользователи
for(uint256 i = 0; i < _arrAddress.length; i++){
_sum += _arrBet[i];
}
for(uint256 i = 0; i < _arrAddress.length; i++){
_arrPay[i] = _arrBet[i] * (100 * 1e18) / _sum; // находим процент от суммы ставок, который должен получить пользователь
_arrPay[i] = _bank * _arrPay[i] / (100 * 1e18);
}
_arrPay[0] += _amountWin; // к ставки игрока добавляется его награда за победу в игре
for(uint256 i = 0; i < _arrAddress.length; i++){ // производим выплаты
payable(_arrAddress[i]).transfer(_arrPay[i]);
}
}
// Принудительное закрытие комнаты с возвратом всех ставок игрокам, служит на тот случай если с игровым сервером что-то случится
function closeRoom(uint256 _room) external onlyOwner {
require((rooms[_room].status == 3) || (rooms[_room].status == 2), "bad status"); // статус комнаты должен быть 3 или 2
rooms[_room].player1_bets[0] += rooms[_room].bet; // к ставке игрока 1 добавляем его игровую ставку
rooms[_room].player2_bets[0] += rooms[_room].bet; // к ставке игрока 2 добавляем его игровую ставку
for(uint256 i = 0; i < rooms[_room].player1_users.length; i++){
payable(rooms[_room].player1_users[i]).transfer(rooms[_room].player1_bets[i]); // выплачиваем все ставки на игрока 1
}
for(uint256 i = 0; i < rooms[_room].player2_users.length; i++){
payable(rooms[_room].player2_users[i]).transfer(rooms[_room].player2_bets[i]); // выплачиваем все ставки на игрока 2
}
// Уничтожаем игровую комнату
_delRoom(_room); // Удаляем игровую комнату из списка созданных комнат
delete rooms[_room];
emit UsedRoom(_room); // события использования комнаты
}
// сохранение настроек пользователя
function saveSettings(uint8 _avatar, string memory _lang, string memory _name) external {
settings[msg.sender].avatar = _avatar;
settings[msg.sender].lang = _lang;
settings[msg.sender].name = _name;
}
// Изменение минимальной игровой ставки
function setMinGameBet(uint256 _minGameBet) external onlyOwner {
minGameBet = _minGameBet;
}
// Изменение процента, сколько от своей ставки игрок ставит на свою победу
function setGamerBetPool(uint256 _gamerBetPool) external onlyOwner {
gamerBetPool = _gamerBetPool;
}
// Изменение комиссионных сборов
function setFees(uint256 _fees) external onlyOwner {
fees = _fees;
}
// Изменение максимальное количество человек которые могут ставить на одного игрока
function setMaxUsersPerPlayer(uint256 _maxUsersPerPlayer) external onlyOwner {
maxUsersPerPlayer = _maxUsersPerPlayer;
}
// Изменение максимального количества игровых комнат
function setGameRoomsMax(uint256 _gameRoomMax) external onlyOwner {
gameRoomMax = _gameRoomMax;
}
// назначить нового оракула может только владелец
function setNewOracle(address _newOracle) external onlyOwner {
oracle = _newOracle;
}
// назначить новый адрес для получения комиссий может только владелец
function setNewCommission(address _commission) external onlyOwner {
commission = _commission;
}
// назначить новый статус комнаты может только оракул (статус 2 - идет игра, ставки запрещены; статус 3 - идет игра, ставки разрешены)
function setRoomStatus(uint256 _room, uint256 _status) external onlyOracle {
require(_status == 2 || _status == 3); // статус комнаты может быть установлен только на 2 или 3
require((rooms[_room].status == 2) || (rooms[_room].status == 3)); // комната где планируется изменение статуса должна быть на статусе 2 или 3
rooms[_room].status = _status;
emit UsedRoom(_room); // события использования комнаты
}
function _addRoom(uint _room) private { // добавление новой комнаты в список комнат
roomList[_room].room = _room;
roomList[_room].next = 0;
roomList[_room].prev = roomList[0].prev;
roomList[roomList[0].prev].next = _room;
roomList[0].prev = _room;
amountGames++; // увеличиваем количество созданных игровых комнат
}
function _delRoom(uint _room) private { // удаление комнаты из списка комнат
roomList[roomList[_room].prev].next = roomList[_room].next;
roomList[roomList[_room].next].prev = roomList[_room].prev;
amountGames--; // уменьшаем количество созданных игровых комнат
delete roomList[_room];
}
// Возвращаем настройки пользователя
function getSettings(address _user) public view returns (User memory){
return (settings[_user]);
}
// Возвращаем структуру игровой комнаты
function getRoom(uint256 _room) public view returns (Room memory){
return (rooms[_room]);
}
// Возвращаем информацию по всем созданным игровым комнатам
function getCreatedRooms() public view returns (ActiveRoom[] memory){
ActiveRoom[] memory _result = new ActiveRoom[](amountGames);
uint _index = roomList[0].next;
for(uint i; i < amountGames; i++){
_result[i].room = _index;
_result[i].bankRoom = rooms[_index].bankRoom;
_result[i].bet = rooms[_index].bet;
_result[i].status = rooms[_index].status;
_result[i].player1 = rooms[_index].player1_users[0];
if(rooms[_index].status > 1){
_result[i].player2 = rooms[_index].player2_users[0];
}
_index = roomList[_index].next;
}
return (_result);
}
// Возвращаем предварительный расчет выплат победителям
function getPreview(uint256 _room) public view returns (uint256, address [] memory, uint [] memory, address [] memory, uint [] memory){
if(rooms[_room].status < 2){
return (0, new address[](0), new uint[](0), new address[](0), new uint[](0));
}
address [] memory _arrPlayer1 = new address[](rooms[_room].player1_users.length); // адреса поставивщие на победу игрока 1
uint[] memory _arrPay1 = new uint[](rooms[_room].player1_users.length); // выплаты которые должны получить пользователи
address [] memory _arrPlayer2 = new address[](rooms[_room].player2_users.length); // адреса поставивщие на победу игрока 2
uint[] memory _arrPay2 = new uint[](rooms[_room].player2_users.length); // выплаты которые должны получить пользователи
uint _bank = rooms[_room].bankRoom;
_bank -= (rooms[_room].bet * 2 + (_bank * rooms[_room].fees / (100 * 1e18))); // уменьшаем банк комнаты на комиссию + выигрыш победителя
uint _sum; // сумма всех ставок
for(uint256 i = 0; i < rooms[_room].player1_users.length; i++){
_arrPlayer1[i] = rooms[_room].player1_users[i]; // копируем всех кто ставил на игрока 1
_arrPay1[i] = rooms[_room].player1_bets[i]; // копируем все ставки на игрока 1
_sum += _arrPay1[i]; // ссумируем все их ставки, для точного определения процента каждого
}
for(uint256 i = 0; i < rooms[_room].player1_users.length; i++){
_arrPay1[i] = _arrPay1[i] * (100 * 1e18) / _sum; // находим процент от суммы ставок, который должен получить пользователь
_arrPay1[i] = _bank * _arrPay1[i] / (100 * 1e18); // находим выплату по проценту
}
_arrPay1[0] += (rooms[_room].bet * 2); // к ставки игрока добавляется его награда за победу в игре
_sum = 0; // обнуляем сумму для расчета других победителей
for(uint256 i = 0; i < rooms[_room].player2_users.length; i++){
_arrPlayer2[i] = rooms[_room].player2_users[i]; // копируем всех кто ставил на игрока 2
_arrPay2[i] = rooms[_room].player2_bets[i]; // копируем все ставки на игрока 2
_sum += _arrPay2[i]; // ссумируем все их ставки, для точного определения процента каждого
}
for(uint256 i = 0; i < rooms[_room].player2_users.length; i++){
_arrPay2[i] = _arrPay2[i] * (100 * 1e18) / _sum; // находим процент от суммы ставок, который должен получить пользователь
_arrPay2[i] = _bank * _arrPay2[i] / (100 * 1e18); // находим выплату по проценту
}
_arrPay2[0] += (rooms[_room].bet * 2); // к ставки игрока добавляется его награда за победу в игре
// Возвращаем банк комнаты и 4 массива (игроки1, выплаты1, игроки2, выплаты2)
return (rooms[_room].bankRoom, _arrPlayer1, _arrPay1, _arrPlayer2, _arrPay2);
}
}
Contract ABI
[{"type":"event","name":"UsedRoom","inputs":[{"type":"uint256","name":"room","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"amountGames","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"betOnPlayer1","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"betOnPlayer2","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"closeRoom","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"commission","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"depositCancel","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"depositGame","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gameRoom","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gameRoomMax","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gamerBetPool","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct AstralCards.ActiveRoom[]","components":[{"type":"uint256","name":"room","internalType":"uint256"},{"type":"uint256","name":"bankRoom","internalType":"uint256"},{"type":"uint256","name":"bet","internalType":"uint256"},{"type":"uint256","name":"status","internalType":"uint256"},{"type":"address","name":"player1","internalType":"address"},{"type":"address","name":"player2","internalType":"address"}]}],"name":"getCreatedRooms","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address[]","name":"","internalType":"address[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"address[]","name":"","internalType":"address[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getPreview","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct AstralCards.Room","components":[{"type":"uint256","name":"bankRoom","internalType":"uint256"},{"type":"uint256","name":"bet","internalType":"uint256"},{"type":"uint256","name":"fees","internalType":"uint256"},{"type":"uint256","name":"status","internalType":"uint256"},{"type":"address[]","name":"player1_users","internalType":"address[]"},{"type":"uint256[]","name":"player1_bets","internalType":"uint256[]"},{"type":"address[]","name":"player2_users","internalType":"address[]"},{"type":"uint256[]","name":"player2_bets","internalType":"uint256[]"}]}],"name":"getRoom","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct AstralCards.User","components":[{"type":"uint8","name":"avatar","internalType":"uint8"},{"type":"string","name":"lang","internalType":"string"},{"type":"string","name":"name","internalType":"string"}]}],"name":"getSettings","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxUsersPerPlayer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minGameBet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"oracle","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"saveSettings","inputs":[{"type":"uint8","name":"_avatar","internalType":"uint8"},{"type":"string","name":"_lang","internalType":"string"},{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_fees","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGameRoomsMax","inputs":[{"type":"uint256","name":"_gameRoomMax","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGamerBetPool","inputs":[{"type":"uint256","name":"_gamerBetPool","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxUsersPerPlayer","inputs":[{"type":"uint256","name":"_maxUsersPerPlayer","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinGameBet","inputs":[{"type":"uint256","name":"_minGameBet","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNewCommission","inputs":[{"type":"address","name":"_commission","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNewOracle","inputs":[{"type":"address","name":"_newOracle","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRoomStatus","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"},{"type":"uint256","name":"_status","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWinner","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"},{"type":"address","name":"_winner","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x608060405260016000556008600255678ac7230489e8000060035568015af1d78b58c40000600455601e600555674563918244f4000060065533600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561010757600080fd5b50614e89806101176000396000f3fe6080604052600436106101c65760003560e01c80638699aa0b116100f7578063afa723a011610095578063d1c4cd8311610064578063d1c4cd83146105e0578063e034d87b14610609578063e148919114610634578063e1e6f1501461065f576101d5565b8063afa723a01461054a578063bdd42aee14610575578063ca01e3361461059e578063cc28f73d146105c9576101d5565b80639af1d35a116100d15780639af1d35a146104c15780639c623683146104ec578063aab30a3b14610515578063ae94058e1461051f576101d5565b80638699aa0b1461042c5780638d617c1c146104555780638da5cb5b14610496576101d5565b806341b1311a116101645780636d8a74cb1161013e5780636d8a74cb1461035c578063754b174d146103995780637706d1f6146103c45780637dc0d1d014610401576101d5565b806341b1311a146102ee5780634c42e4b4146103175780635ccf3e9314610340576101d5565b80631c3a8892116101a05780631c3a88921461024a57806327081703146102735780633d18678e1461029c5780633d6a3664146102c5576101d5565b80630ceb14fa146101da5780630ffa13ce14610205578063147778221461022e576101d5565b366101d5576101d361068a565b005b600080fd5b3480156101e657600080fd5b506101ef610cfe565b6040516101fc9190613b71565b60405180910390f35b34801561021157600080fd5b5061022c60048036038101906102279190613bcc565b610d04565b005b61024860048036038101906102439190613bcc565b610d9e565b005b34801561025657600080fd5b50610271600480360381019061026c9190613bcc565b6110a5565b005b34801561027f57600080fd5b5061029a60048036038101906102959190613bcc565b611524565b005b3480156102a857600080fd5b506102c360048036038101906102be9190613bcc565b6115be565b005b3480156102d157600080fd5b506102ec60048036038101906102e79190613c57565b611658565b005b3480156102fa57600080fd5b5061031560048036038101906103109190613bcc565b61172c565b005b34801561032357600080fd5b5061033e60048036038101906103399190613bcc565b6117c6565b005b61035a60048036038101906103559190613bcc565b611860565b005b34801561036857600080fd5b50610383600480360381019061037e9190613bcc565b611b67565b6040516103909190613ec5565b60405180910390f35b3480156103a557600080fd5b506103ae611d89565b6040516103bb9190613b71565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613c57565b611d8f565b6040516103f89190613fea565b60405180910390f35b34801561040d57600080fd5b50610416611f29565b604051610423919061401b565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613c57565b611f4f565b005b34801561046157600080fd5b5061047c60048036038101906104779190613bcc565b612023565b60405161048d959493929190614114565b60405180910390f35b3480156104a257600080fd5b506104ab6128ff565b6040516104b8919061401b565b60405180910390f35b3480156104cd57600080fd5b506104d6612925565b6040516104e39190613b71565b60405180910390f35b3480156104f857600080fd5b50610513600480360381019061050e9190614183565b61292b565b005b61051d61068a565b005b34801561052b57600080fd5b50610534612e05565b60405161054191906142ed565b60405180910390f35b34801561055657600080fd5b5061055f6130fa565b60405161056c9190613b71565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190614470565b613100565b005b3480156105aa57600080fd5b506105b3613200565b6040516105c09190613b71565b60405180910390f35b3480156105d557600080fd5b506105de613206565b005b3480156105ec57600080fd5b50610607600480360381019061060291906144fb565b6133fd565b005b34801561061557600080fd5b5061061e613535565b60405161062b9190613b71565b60405180910390f35b34801561064057600080fd5b5061064961353b565b604051610656919061401b565b60405180910390f35b34801561066b57600080fd5b50610674613561565b6040516106819190613b71565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef90614598565b60405180910390fd5b60035434101561073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490614604565b60405180910390fd5b6000600b600080548152602001908152602001600020600301540361089257600254600154106107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990614670565b60405180910390fd5b34600b600080548152602001908152602001600020600101819055506001600b60008054815260200190815260200160002060030181905550600b600080548152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061085e600054613567565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2610cfc565b600b6000805481526020019081526020016000206004016000815481106108bc576108bb614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b9061470b565b60405180910390fd5b600b600080548152602001908152602001600020600101543411156109e1573373ffffffffffffffffffffffffffffffffffffffff166108fc600b60008054815260200190815260200160002060010154346109b0919061475a565b9081150290604051600060405180830381858888f193505050501580156109db573d6000803e3d6000fd5b50610adb565b600b60008054815260200190815260200160002060010154341015610ada57600b600080548152602001908152602001600020600401600081548110610a2a57610a29614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc34600b60008054815260200190815260200160002060010154610a91919061475a565b9081150290604051600060405180830381858888f19350505050158015610abc573d6000803e3d6000fd5b5034600b600080548152602001908152602001600020600101819055505b5b6002600b60008054815260200190815260200160002060010154610aff919061478e565b600b60008054815260200190815260200160002060000181905550600068056bc75e2d63100000600454600b60008054815260200190815260200160002060010154610b4b919061478e565b610b559190614817565b905080600b6000805481526020019081526020016000206001016000828254610b7e919061475a565b92505081905550600b600080548152602001908152602001600020600501819080600181540180825580915050600190039060005260206000200160009091909190915055600b600080548152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b600080548152602001908152602001600020600701819080600181540180825580915050600190039060005260206000200160009091909190915055600654600b600080548152602001908152602001600020600201819055506003600b600080548152602001908152602001600020600301819055506000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2600080815480929190610cf590614848565b9190505550505b565b60015481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b906148dc565b60405180910390fd5b8060028190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0390614598565b60405180910390fd5b6004600354610e1b9190614817565b341015610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5490614604565b60405180910390fd5b6003600b60008381526020019081526020016000206003015414610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90614948565b60405180910390fd5b600554600b6000838152602001908152602001600020600601805490501115610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b906149b4565b60405180910390fd5b600080610f35600b6000858152602001908152602001600020600601613636565b80925081935050508015610f915734600b60008581526020019081526020016000206007018381548110610f6c57610f6b614690565b5b906000526020600020016000828254610f8591906149d4565b92505081905550611046565b600b6000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008481526020019081526020016000206007013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600b6000858152602001908152602001600020600001600082825461106c91906149d4565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c906148dc565b60405180910390fd5b6003600b600083815260200190815260200160002060030154148061117057506002600b600083815260200190815260200160002060030154145b6111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690614a54565b60405180910390fd5b600b600082815260200190815260200160002060010154600b60008381526020019081526020016000206005016000815481106111ef576111ee614690565b5b90600052602060002001600082825461120891906149d4565b92505081905550600b600082815260200190815260200160002060010154600b600083815260200190815260200160002060070160008154811061124f5761124e614690565b5b90600052602060002001600082825461126891906149d4565b9250508190555060005b600b60008381526020019081526020016000206004018054905081101561137157600b600083815260200190815260200160002060040181815481106112bb576112ba614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600b6000858152602001908152602001600020600501838154811061132757611326614690565b5b90600052602060002001549081150290604051600060405180830381858888f1935050505015801561135d573d6000803e3d6000fd5b50808061136990614848565b915050611272565b5060005b600b60008381526020019081526020016000206006018054905081101561147457600b600083815260200190815260200160002060060181815481106113be576113bd614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600b6000858152602001908152602001600020600701838154811061142a57611429614690565b5b90600052602060002001549081150290604051600060405180830381858888f19350505050158015611460573d6000803e3d6000fd5b50808061146c90614848565b915050611375565b5061147e816136e6565b600b60008281526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160006114c29190613a2e565b6005820160006114d29190613a4f565b6006820160006114e29190613a2e565b6007820160006114f29190613a4f565b5050807fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a250565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab906148dc565b60405180910390fd5b8060038190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461164e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611645906148dc565b60405180910390fd5b8060068190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df906148dc565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b3906148dc565b60405180910390fd5b8060048190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d906148dc565b60405180910390fd5b8060058190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c590614598565b60405180910390fd5b60046003546118dd9190614817565b34101561191f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191690614604565b60405180910390fd5b6003600b60008381526020019081526020016000206003015414611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90614948565b60405180910390fd5b600554600b60008381526020019081526020016000206004018054905011156119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd906149b4565b60405180910390fd5b6000806119f7600b6000858152602001908152602001600020600401613636565b80925081935050508015611a535734600b60008581526020019081526020016000206005018381548110611a2e57611a2d614690565b5b906000526020600020016000828254611a4791906149d4565b92505081905550611b08565b600b6000848152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008481526020019081526020016000206005013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600b60008581526020019081526020016000206000016000828254611b2e91906149d4565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b611b6f613a70565b600b6000838152602001908152602001600020604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201805480602002602001604051908101604052809291908181526020018280548015611c3b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611bf1575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611c9357602002820191906000526020600020905b815481526020019060010190808311611c7f575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611d2157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cd7575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015611d7957602002820191906000526020600020905b815481526020019060010190808311611d65575b5050505050815250509050919050565b60025481565b611d97613ab5565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff1660ff1660ff168152602001600182018054611e0e90614aa3565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3a90614aa3565b8015611e875780601f10611e5c57610100808354040283529160200191611e87565b820191906000526020600020905b815481529060010190602001808311611e6a57829003601f168201915b50505050508152602001600282018054611ea090614aa3565b80601f0160208091040260200160405190810160405280929190818152602001828054611ecc90614aa3565b8015611f195780601f10611eee57610100808354040283529160200191611f19565b820191906000526020600020905b815481529060010190602001808311611efc57829003601f168201915b5050505050815250509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd6906148dc565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006060806060806002600b60008881526020019081526020016000206003015410156121825760008067ffffffffffffffff81111561206657612065614345565b5b6040519080825280602002602001820160405280156120945781602001602082028036833780820191505090505b50600067ffffffffffffffff8111156120b0576120af614345565b5b6040519080825280602002602001820160405280156120de5781602001602082028036833780820191505090505b50600067ffffffffffffffff8111156120fa576120f9614345565b5b6040519080825280602002602001820160405280156121285781602001602082028036833780820191505090505b50600067ffffffffffffffff81111561214457612143614345565b5b6040519080825280602002602001820160405280156121725781602001602082028036833780820191505090505b50945094509450945094506128f6565b6000600b60008881526020019081526020016000206004018054905067ffffffffffffffff8111156121b7576121b6614345565b5b6040519080825280602002602001820160405280156121e55781602001602082028036833780820191505090505b5090506000600b60008981526020019081526020016000206004018054905067ffffffffffffffff81111561221d5761221c614345565b5b60405190808252806020026020018201604052801561224b5781602001602082028036833780820191505090505b5090506000600b60008a81526020019081526020016000206006018054905067ffffffffffffffff81111561228357612282614345565b5b6040519080825280602002602001820160405280156122b15781602001602082028036833780820191505090505b5090506000600b60008b81526020019081526020016000206006018054905067ffffffffffffffff8111156122e9576122e8614345565b5b6040519080825280602002602001820160405280156123175781602001602082028036833780820191505090505b5090506000600b60008c815260200190815260200160002060000154905068056bc75e2d63100000600b60008d81526020019081526020016000206002015482612361919061478e565b61236b9190614817565b6002600b60008e81526020019081526020016000206001015461238e919061478e565b61239891906149d4565b816123a3919061475a565b9050600080600090505b600b60008e8152602001908152602001600020600401805490508110156124fb57600b60008e815260200190815260200160002060040181815481106123f6576123f5614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687828151811061243457612433614690565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008e8152602001908152602001600020600501818154811061249657612495614690565b5b90600052602060002001548682815181106124b4576124b3614690565b5b6020026020010181815250508581815181106124d3576124d2614690565b5b6020026020010151826124e691906149d4565b915080806124f390614848565b9150506123ad565b5060005b600b60008e8152602001908152602001600020600401805490508110156125e5578168056bc75e2d6310000087838151811061253e5761253d614690565b5b6020026020010151612550919061478e565b61255a9190614817565b86828151811061256d5761256c614690565b5b60200260200101818152505068056bc75e2d6310000086828151811061259657612595614690565b5b6020026020010151846125a9919061478e565b6125b39190614817565b8682815181106125c6576125c5614690565b5b60200260200101818152505080806125dd90614848565b9150506124ff565b506002600b60008e815260200190815260200160002060010154612609919061478e565b8560008151811061261d5761261c614690565b5b6020026020010181815161263191906149d4565b915081815250506000905060005b600b60008e81526020019081526020016000206006018054905081101561278d57600b60008e8152602001908152602001600020600601818154811061268857612687614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168582815181106126c6576126c5614690565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008e8152602001908152602001600020600701818154811061272857612727614690565b5b906000526020600020015484828151811061274657612745614690565b5b60200260200101818152505083818151811061276557612764614690565b5b60200260200101518261277891906149d4565b9150808061278590614848565b91505061263f565b5060005b600b60008e815260200190815260200160002060060180549050811015612877578168056bc75e2d631000008583815181106127d0576127cf614690565b5b60200260200101516127e2919061478e565b6127ec9190614817565b8482815181106127ff576127fe614690565b5b60200260200101818152505068056bc75e2d6310000084828151811061282857612827614690565b5b60200260200101518461283b919061478e565b6128459190614817565b84828151811061285857612857614690565b5b602002602001018181525050808061286f90614848565b915050612791565b506002600b60008e81526020019081526020016000206001015461289b919061478e565b836000815181106128af576128ae614690565b5b602002602001018181516128c391906149d4565b91508181525050600b60008d815260200190815260200160002060000154868686869a509a509a509a509a505050505050505b91939590929450565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b290614b20565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60008481526020019081526020016000206004016000815481106129fb576129fa614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612ac657508073ffffffffffffffffffffffffffffffffffffffff16600b6000848152602001908152602001600020600601600081548110612a8357612a82614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612acf57600080fd5b600068056bc75e2d63100000600b600085815260200190815260200160002060020154600b600086815260200190815260200160002060000154612b13919061478e565b612b1d9190614817565b90506002600b60008581526020019081526020016000206001016000828254612b46919061478e565b92505081905550600b60008481526020019081526020016000206001015481612b6f91906149d4565b600b60008581526020019081526020016000206000016000828254612b94919061475a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600b6000858152602001908152602001600020600401600081548110612bdb57612bda614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c8857612c83600b600085815260200190815260200160002060000154600b600086815260200190815260200160002060010154600b6000878152602001908152602001600020600401600b60008881526020019081526020016000206005016137bd565b612ceb565b612cea600b600085815260200190815260200160002060000154600b600086815260200190815260200160002060010154600b6000878152602001908152602001600020600601600b60008881526020019081526020016000206007016137bd565b5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612d53573d6000803e3d6000fd5b50612d5d836136e6565b600b6000848152602001908152602001600020600080820160009055600182016000905560028201600090556003820160009055600482016000612da19190613a2e565b600582016000612db19190613a4f565b600682016000612dc19190613a2e565b600782016000612dd19190613a4f565b5050827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b6060600060015467ffffffffffffffff811115612e2557612e24614345565b5b604051908082528060200260200182016040528015612e5e57816020015b612e4b613ad9565b815260200190600190039081612e435790505b5090506000600c600080815260200190815260200160002060010154905060005b6001548110156130f15781838281518110612e9d57612e9c614690565b5b60200260200101516000018181525050600b600083815260200190815260200160002060000154838281518110612ed757612ed6614690565b5b60200260200101516020018181525050600b600083815260200190815260200160002060010154838281518110612f1157612f10614690565b5b60200260200101516040018181525050600b600083815260200190815260200160002060030154838281518110612f4b57612f4a614690565b5b60200260200101516060018181525050600b6000838152602001908152602001600020600401600081548110612f8457612f83614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110612fc257612fc1614690565b5b60200260200101516080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600b60008481526020019081526020016000206003015411156130c557600b600083815260200190815260200160002060060160008154811061304857613047614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061308657613085614690565b5b602002602001015160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b600c600083815260200190815260200160002060010154915080806130e990614848565b915050612e7f565b50819250505090565b60035481565b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010190816131aa9190614cec565b5080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020190816131fa9190614cec565b50505050565b60045481565b600b6000805481526020019081526020016000206004016000815481106132305761322f614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bf90614e0a565b60405180910390fd5b6001600b60008054815260200190815260200160002060030154146132ec57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc600b600080548152602001908152602001600020600101549081150290604051600060405180830381858888f19350505050158015613349573d6000803e3d6000fd5b50600b60008054815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600061338f9190613a2e565b60058201600061339f9190613a4f565b6006820160006133af9190613a2e565b6007820160006133bf9190613a4f565b50506133cc6000546136e6565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461348d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348490614b20565b60405180910390fd5b600281148061349c5750600381145b6134a557600080fd5b6002600b60008481526020019081526020016000206003015414806134e057506003600b600084815260200190815260200160002060030154145b6134e957600080fd5b80600b600084815260200190815260200160002060030181905550817fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a25050565b60055481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b80600c6000838152602001908152602001600020600001819055506000600c600083815260200190815260200160002060010181905550600c600080815260200190815260200160002060020154600c60008381526020019081526020016000206002018190555080600c6000600c60008081526020019081526020016000206002015481526020019081526020016000206001018190555080600c6000808152602001908152602001600020600201819055506001600081548092919061362e90614848565b919050555050565b60008060005b83805490508110156136d85783818154811061365b5761365a614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036136c55780600192509250506136e1565b80806136d090614848565b91505061363c565b50600080915091505b915091565b600c600082815260200190815260200160002060010154600c6000600c600085815260200190815260200160002060020154815260200190815260200160002060010181905550600c600082815260200190815260200160002060020154600c6000600c6000858152602001908152602001600020600101548152602001908152602001600020600201819055506001600081548092919061378790614e2a565b9190505550600c600082815260200190815260200160002060008082016000905560018201600090556002820160009055505050565b600080838054905067ffffffffffffffff8111156137de576137dd614345565b5b60405190808252806020026020018201604052801561380c5781602001602082028036833780820191505090505b50905060005b848054905081101561385c5783818154811061383157613830614690565b5b90600052602060002001548361384791906149d4565b9250808061385490614848565b915050613812565b5060005b8480549050811015613934578268056bc75e2d6310000085838154811061388a57613889614690565b5b906000526020600020015461389f919061478e565b6138a99190614817565b8282815181106138bc576138bb614690565b5b60200260200101818152505068056bc75e2d631000008282815181106138e5576138e4614690565b5b6020026020010151886138f8919061478e565b6139029190614817565b82828151811061391557613914614690565b5b602002602001018181525050808061392c90614848565b915050613860565b50848160008151811061394a57613949614690565b5b6020026020010181815161395e91906149d4565b9150818152505060005b8480549050811015613a255784818154811061398757613986614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8383815181106139de576139dd614690565b5b60200260200101519081150290604051600060405180830381858888f19350505050158015613a11573d6000803e3d6000fd5b508080613a1d90614848565b915050613968565b50505050505050565b5080546000825590600052602060002090810190613a4c9190613b3b565b50565b5080546000825590600052602060002090810190613a6d9190613b3b565b50565b60405180610100016040528060008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040518060c0016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b5b80821115613b54576000816000905550600101613b3c565b5090565b6000819050919050565b613b6b81613b58565b82525050565b6000602082019050613b866000830184613b62565b92915050565b6000604051905090565b600080fd5b600080fd5b613ba981613b58565b8114613bb457600080fd5b50565b600081359050613bc681613ba0565b92915050565b600060208284031215613be257613be1613b96565b5b6000613bf084828501613bb7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c2482613bf9565b9050919050565b613c3481613c19565b8114613c3f57600080fd5b50565b600081359050613c5181613c2b565b92915050565b600060208284031215613c6d57613c6c613b96565b5b6000613c7b84828501613c42565b91505092915050565b613c8d81613b58565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613cc881613c19565b82525050565b6000613cda8383613cbf565b60208301905092915050565b6000602082019050919050565b6000613cfe82613c93565b613d088185613c9e565b9350613d1383613caf565b8060005b83811015613d44578151613d2b8882613cce565b9750613d3683613ce6565b925050600181019050613d17565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000613d898383613c84565b60208301905092915050565b6000602082019050919050565b6000613dad82613d51565b613db78185613d5c565b9350613dc283613d6d565b8060005b83811015613df3578151613dda8882613d7d565b9750613de583613d95565b925050600181019050613dc6565b5085935050505092915050565b600061010083016000830151613e196000860182613c84565b506020830151613e2c6020860182613c84565b506040830151613e3f6040860182613c84565b506060830151613e526060860182613c84565b5060808301518482036080860152613e6a8282613cf3565b91505060a083015184820360a0860152613e848282613da2565b91505060c083015184820360c0860152613e9e8282613cf3565b91505060e083015184820360e0860152613eb88282613da2565b9150508091505092915050565b60006020820190508181036000830152613edf8184613e00565b905092915050565b600060ff82169050919050565b613efd81613ee7565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f3d578082015181840152602081019050613f22565b60008484015250505050565b6000601f19601f8301169050919050565b6000613f6582613f03565b613f6f8185613f0e565b9350613f7f818560208601613f1f565b613f8881613f49565b840191505092915050565b6000606083016000830151613fab6000860182613ef4565b5060208301518482036020860152613fc38282613f5a565b91505060408301518482036040860152613fdd8282613f5a565b9150508091505092915050565b600060208201905081810360008301526140048184613f93565b905092915050565b61401581613c19565b82525050565b6000602082019050614030600083018461400c565b92915050565b600082825260208201905092915050565b600061405282613c93565b61405c8185614036565b935061406783613caf565b8060005b8381101561409857815161407f8882613cce565b975061408a83613ce6565b92505060018101905061406b565b5085935050505092915050565b600082825260208201905092915050565b60006140c182613d51565b6140cb81856140a5565b93506140d683613d6d565b8060005b838110156141075781516140ee8882613d7d565b97506140f983613d95565b9250506001810190506140da565b5085935050505092915050565b600060a0820190506141296000830188613b62565b818103602083015261413b8187614047565b9050818103604083015261414f81866140b6565b905081810360608301526141638185614047565b9050818103608083015261417781846140b6565b90509695505050505050565b6000806040838503121561419a57614199613b96565b5b60006141a885828601613bb7565b92505060206141b985828601613c42565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c0820160008201516142056000850182613c84565b5060208201516142186020850182613c84565b50604082015161422b6040850182613c84565b50606082015161423e6060850182613c84565b5060808201516142516080850182613cbf565b5060a082015161426460a0850182613cbf565b50505050565b600061427683836141ef565b60c08301905092915050565b6000602082019050919050565b600061429a826141c3565b6142a481856141ce565b93506142af836141df565b8060005b838110156142e05781516142c7888261426a565b97506142d283614282565b9250506001810190506142b3565b5085935050505092915050565b60006020820190508181036000830152614307818461428f565b905092915050565b61431881613ee7565b811461432357600080fd5b50565b6000813590506143358161430f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61437d82613f49565b810181811067ffffffffffffffff8211171561439c5761439b614345565b5b80604052505050565b60006143af613b8c565b90506143bb8282614374565b919050565b600067ffffffffffffffff8211156143db576143da614345565b5b6143e482613f49565b9050602081019050919050565b82818337600083830152505050565b600061441361440e846143c0565b6143a5565b90508281526020810184848401111561442f5761442e614340565b5b61443a8482856143f1565b509392505050565b600082601f8301126144575761445661433b565b5b8135614467848260208601614400565b91505092915050565b60008060006060848603121561448957614488613b96565b5b600061449786828701614326565b935050602084013567ffffffffffffffff8111156144b8576144b7613b9b565b5b6144c486828701614442565b925050604084013567ffffffffffffffff8111156144e5576144e4613b9b565b5b6144f186828701614442565b9150509250925092565b6000806040838503121561451257614511613b96565b5b600061452085828601613bb7565b925050602061453185828601613bb7565b9150509250929050565b600082825260208201905092915050565b7f4f6e6c7920454f41000000000000000000000000000000000000000000000000600082015250565b600061458260088361453b565b915061458d8261454c565b602082019050919050565b600060208201905081810360008301526145b181614575565b9050919050565b7f6c6f772062657400000000000000000000000000000000000000000000000000600082015250565b60006145ee60078361453b565b91506145f9826145b8565b602082019050919050565b6000602082019050818103600083015261461d816145e1565b9050919050565b7f6d617820726f6f6d732063726561746564000000000000000000000000000000600082015250565b600061465a60118361453b565b915061466582614624565b602082019050919050565b600060208201905081810360008301526146898161464d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f616c726561647920616464656400000000000000000000000000000000000000600082015250565b60006146f5600d8361453b565b9150614700826146bf565b602082019050919050565b60006020820190508181036000830152614724816146e8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061476582613b58565b915061477083613b58565b92508282039050818111156147885761478761472b565b5b92915050565b600061479982613b58565b91506147a483613b58565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147dd576147dc61472b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061482282613b58565b915061482d83613b58565b92508261483d5761483c6147e8565b5b828204905092915050565b600061485382613b58565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148855761488461472b565b5b600182019050919050565b7f4f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b60006148c6600a8361453b565b91506148d182614890565b602082019050919050565b600060208201905081810360008301526148f5816148b9565b9050919050565b7f62657473206172652070726f6869626974656400000000000000000000000000600082015250565b600061493260138361453b565b915061493d826148fc565b602082019050919050565b6000602082019050818103600083015261496181614925565b9050919050565b7f4d616e7920757365727320776974682062657473000000000000000000000000600082015250565b600061499e60148361453b565b91506149a982614968565b602082019050919050565b600060208201905081810360008301526149cd81614991565b9050919050565b60006149df82613b58565b91506149ea83613b58565b9250828201905080821115614a0257614a0161472b565b5b92915050565b7f6261642073746174757300000000000000000000000000000000000000000000600082015250565b6000614a3e600a8361453b565b9150614a4982614a08565b602082019050919050565b60006020820190508181036000830152614a6d81614a31565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614abb57607f821691505b602082108103614ace57614acd614a74565b5b50919050565b7f4f6e6c79206f7261636c65000000000000000000000000000000000000000000600082015250565b6000614b0a600b8361453b565b9150614b1582614ad4565b602082019050919050565b60006020820190508181036000830152614b3981614afd565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614ba27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614b65565b614bac8683614b65565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614be9614be4614bdf84613b58565b614bc4565b613b58565b9050919050565b6000819050919050565b614c0383614bce565b614c17614c0f82614bf0565b848454614b72565b825550505050565b600090565b614c2c614c1f565b614c37818484614bfa565b505050565b5b81811015614c5b57614c50600082614c24565b600181019050614c3d565b5050565b601f821115614ca057614c7181614b40565b614c7a84614b55565b81016020851015614c89578190505b614c9d614c9585614b55565b830182614c3c565b50505b505050565b600082821c905092915050565b6000614cc360001984600802614ca5565b1980831691505092915050565b6000614cdc8383614cb2565b9150826002028217905092915050565b614cf582613f03565b67ffffffffffffffff811115614d0e57614d0d614345565b5b614d188254614aa3565b614d23828285614c5f565b600060209050601f831160018114614d565760008415614d44578287015190505b614d4e8582614cd0565b865550614db6565b601f198416614d6486614b40565b60005b82811015614d8c57848901518255600182019150602085019450602081019050614d67565b86831015614da95784890151614da5601f891682614cb2565b8355505b6001600288020188555050505b505050505050565b7f6e6f7420796f7572206265740000000000000000000000000000000000000000600082015250565b6000614df4600c8361453b565b9150614dff82614dbe565b602082019050919050565b60006020820190508181036000830152614e2381614de7565b9050919050565b6000614e3582613b58565b915060008203614e4857614e4761472b565b5b60018203905091905056fea2646970667358221220a3735d7eae832d76a40337567edbb2ec30bf171e45f940d7798ed2e739f5f8e164736f6c63430008100033
Deployed ByteCode
0x6080604052600436106101c65760003560e01c80638699aa0b116100f7578063afa723a011610095578063d1c4cd8311610064578063d1c4cd83146105e0578063e034d87b14610609578063e148919114610634578063e1e6f1501461065f576101d5565b8063afa723a01461054a578063bdd42aee14610575578063ca01e3361461059e578063cc28f73d146105c9576101d5565b80639af1d35a116100d15780639af1d35a146104c15780639c623683146104ec578063aab30a3b14610515578063ae94058e1461051f576101d5565b80638699aa0b1461042c5780638d617c1c146104555780638da5cb5b14610496576101d5565b806341b1311a116101645780636d8a74cb1161013e5780636d8a74cb1461035c578063754b174d146103995780637706d1f6146103c45780637dc0d1d014610401576101d5565b806341b1311a146102ee5780634c42e4b4146103175780635ccf3e9314610340576101d5565b80631c3a8892116101a05780631c3a88921461024a57806327081703146102735780633d18678e1461029c5780633d6a3664146102c5576101d5565b80630ceb14fa146101da5780630ffa13ce14610205578063147778221461022e576101d5565b366101d5576101d361068a565b005b600080fd5b3480156101e657600080fd5b506101ef610cfe565b6040516101fc9190613b71565b60405180910390f35b34801561021157600080fd5b5061022c60048036038101906102279190613bcc565b610d04565b005b61024860048036038101906102439190613bcc565b610d9e565b005b34801561025657600080fd5b50610271600480360381019061026c9190613bcc565b6110a5565b005b34801561027f57600080fd5b5061029a60048036038101906102959190613bcc565b611524565b005b3480156102a857600080fd5b506102c360048036038101906102be9190613bcc565b6115be565b005b3480156102d157600080fd5b506102ec60048036038101906102e79190613c57565b611658565b005b3480156102fa57600080fd5b5061031560048036038101906103109190613bcc565b61172c565b005b34801561032357600080fd5b5061033e60048036038101906103399190613bcc565b6117c6565b005b61035a60048036038101906103559190613bcc565b611860565b005b34801561036857600080fd5b50610383600480360381019061037e9190613bcc565b611b67565b6040516103909190613ec5565b60405180910390f35b3480156103a557600080fd5b506103ae611d89565b6040516103bb9190613b71565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613c57565b611d8f565b6040516103f89190613fea565b60405180910390f35b34801561040d57600080fd5b50610416611f29565b604051610423919061401b565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613c57565b611f4f565b005b34801561046157600080fd5b5061047c60048036038101906104779190613bcc565b612023565b60405161048d959493929190614114565b60405180910390f35b3480156104a257600080fd5b506104ab6128ff565b6040516104b8919061401b565b60405180910390f35b3480156104cd57600080fd5b506104d6612925565b6040516104e39190613b71565b60405180910390f35b3480156104f857600080fd5b50610513600480360381019061050e9190614183565b61292b565b005b61051d61068a565b005b34801561052b57600080fd5b50610534612e05565b60405161054191906142ed565b60405180910390f35b34801561055657600080fd5b5061055f6130fa565b60405161056c9190613b71565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190614470565b613100565b005b3480156105aa57600080fd5b506105b3613200565b6040516105c09190613b71565b60405180910390f35b3480156105d557600080fd5b506105de613206565b005b3480156105ec57600080fd5b50610607600480360381019061060291906144fb565b6133fd565b005b34801561061557600080fd5b5061061e613535565b60405161062b9190613b71565b60405180910390f35b34801561064057600080fd5b5061064961353b565b604051610656919061401b565b60405180910390f35b34801561066b57600080fd5b50610674613561565b6040516106819190613b71565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef90614598565b60405180910390fd5b60035434101561073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490614604565b60405180910390fd5b6000600b600080548152602001908152602001600020600301540361089257600254600154106107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990614670565b60405180910390fd5b34600b600080548152602001908152602001600020600101819055506001600b60008054815260200190815260200160002060030181905550600b600080548152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061085e600054613567565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2610cfc565b600b6000805481526020019081526020016000206004016000815481106108bc576108bb614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b9061470b565b60405180910390fd5b600b600080548152602001908152602001600020600101543411156109e1573373ffffffffffffffffffffffffffffffffffffffff166108fc600b60008054815260200190815260200160002060010154346109b0919061475a565b9081150290604051600060405180830381858888f193505050501580156109db573d6000803e3d6000fd5b50610adb565b600b60008054815260200190815260200160002060010154341015610ada57600b600080548152602001908152602001600020600401600081548110610a2a57610a29614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc34600b60008054815260200190815260200160002060010154610a91919061475a565b9081150290604051600060405180830381858888f19350505050158015610abc573d6000803e3d6000fd5b5034600b600080548152602001908152602001600020600101819055505b5b6002600b60008054815260200190815260200160002060010154610aff919061478e565b600b60008054815260200190815260200160002060000181905550600068056bc75e2d63100000600454600b60008054815260200190815260200160002060010154610b4b919061478e565b610b559190614817565b905080600b6000805481526020019081526020016000206001016000828254610b7e919061475a565b92505081905550600b600080548152602001908152602001600020600501819080600181540180825580915050600190039060005260206000200160009091909190915055600b600080548152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b600080548152602001908152602001600020600701819080600181540180825580915050600190039060005260206000200160009091909190915055600654600b600080548152602001908152602001600020600201819055506003600b600080548152602001908152602001600020600301819055506000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2600080815480929190610cf590614848565b9190505550505b565b60015481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b906148dc565b60405180910390fd5b8060028190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0390614598565b60405180910390fd5b6004600354610e1b9190614817565b341015610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5490614604565b60405180910390fd5b6003600b60008381526020019081526020016000206003015414610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90614948565b60405180910390fd5b600554600b6000838152602001908152602001600020600601805490501115610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b906149b4565b60405180910390fd5b600080610f35600b6000858152602001908152602001600020600601613636565b80925081935050508015610f915734600b60008581526020019081526020016000206007018381548110610f6c57610f6b614690565b5b906000526020600020016000828254610f8591906149d4565b92505081905550611046565b600b6000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008481526020019081526020016000206007013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600b6000858152602001908152602001600020600001600082825461106c91906149d4565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c906148dc565b60405180910390fd5b6003600b600083815260200190815260200160002060030154148061117057506002600b600083815260200190815260200160002060030154145b6111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690614a54565b60405180910390fd5b600b600082815260200190815260200160002060010154600b60008381526020019081526020016000206005016000815481106111ef576111ee614690565b5b90600052602060002001600082825461120891906149d4565b92505081905550600b600082815260200190815260200160002060010154600b600083815260200190815260200160002060070160008154811061124f5761124e614690565b5b90600052602060002001600082825461126891906149d4565b9250508190555060005b600b60008381526020019081526020016000206004018054905081101561137157600b600083815260200190815260200160002060040181815481106112bb576112ba614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600b6000858152602001908152602001600020600501838154811061132757611326614690565b5b90600052602060002001549081150290604051600060405180830381858888f1935050505015801561135d573d6000803e3d6000fd5b50808061136990614848565b915050611272565b5060005b600b60008381526020019081526020016000206006018054905081101561147457600b600083815260200190815260200160002060060181815481106113be576113bd614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600b6000858152602001908152602001600020600701838154811061142a57611429614690565b5b90600052602060002001549081150290604051600060405180830381858888f19350505050158015611460573d6000803e3d6000fd5b50808061146c90614848565b915050611375565b5061147e816136e6565b600b60008281526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160006114c29190613a2e565b6005820160006114d29190613a4f565b6006820160006114e29190613a2e565b6007820160006114f29190613a4f565b5050807fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a250565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab906148dc565b60405180910390fd5b8060038190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461164e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611645906148dc565b60405180910390fd5b8060068190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df906148dc565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b3906148dc565b60405180910390fd5b8060048190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d906148dc565b60405180910390fd5b8060058190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c590614598565b60405180910390fd5b60046003546118dd9190614817565b34101561191f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191690614604565b60405180910390fd5b6003600b60008381526020019081526020016000206003015414611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90614948565b60405180910390fd5b600554600b60008381526020019081526020016000206004018054905011156119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd906149b4565b60405180910390fd5b6000806119f7600b6000858152602001908152602001600020600401613636565b80925081935050508015611a535734600b60008581526020019081526020016000206005018381548110611a2e57611a2d614690565b5b906000526020600020016000828254611a4791906149d4565b92505081905550611b08565b600b6000848152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008481526020019081526020016000206005013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600b60008581526020019081526020016000206000016000828254611b2e91906149d4565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b611b6f613a70565b600b6000838152602001908152602001600020604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201805480602002602001604051908101604052809291908181526020018280548015611c3b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611bf1575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611c9357602002820191906000526020600020905b815481526020019060010190808311611c7f575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611d2157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cd7575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015611d7957602002820191906000526020600020905b815481526020019060010190808311611d65575b5050505050815250509050919050565b60025481565b611d97613ab5565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff1660ff1660ff168152602001600182018054611e0e90614aa3565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3a90614aa3565b8015611e875780601f10611e5c57610100808354040283529160200191611e87565b820191906000526020600020905b815481529060010190602001808311611e6a57829003601f168201915b50505050508152602001600282018054611ea090614aa3565b80601f0160208091040260200160405190810160405280929190818152602001828054611ecc90614aa3565b8015611f195780601f10611eee57610100808354040283529160200191611f19565b820191906000526020600020905b815481529060010190602001808311611efc57829003601f168201915b5050505050815250509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd6906148dc565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006060806060806002600b60008881526020019081526020016000206003015410156121825760008067ffffffffffffffff81111561206657612065614345565b5b6040519080825280602002602001820160405280156120945781602001602082028036833780820191505090505b50600067ffffffffffffffff8111156120b0576120af614345565b5b6040519080825280602002602001820160405280156120de5781602001602082028036833780820191505090505b50600067ffffffffffffffff8111156120fa576120f9614345565b5b6040519080825280602002602001820160405280156121285781602001602082028036833780820191505090505b50600067ffffffffffffffff81111561214457612143614345565b5b6040519080825280602002602001820160405280156121725781602001602082028036833780820191505090505b50945094509450945094506128f6565b6000600b60008881526020019081526020016000206004018054905067ffffffffffffffff8111156121b7576121b6614345565b5b6040519080825280602002602001820160405280156121e55781602001602082028036833780820191505090505b5090506000600b60008981526020019081526020016000206004018054905067ffffffffffffffff81111561221d5761221c614345565b5b60405190808252806020026020018201604052801561224b5781602001602082028036833780820191505090505b5090506000600b60008a81526020019081526020016000206006018054905067ffffffffffffffff81111561228357612282614345565b5b6040519080825280602002602001820160405280156122b15781602001602082028036833780820191505090505b5090506000600b60008b81526020019081526020016000206006018054905067ffffffffffffffff8111156122e9576122e8614345565b5b6040519080825280602002602001820160405280156123175781602001602082028036833780820191505090505b5090506000600b60008c815260200190815260200160002060000154905068056bc75e2d63100000600b60008d81526020019081526020016000206002015482612361919061478e565b61236b9190614817565b6002600b60008e81526020019081526020016000206001015461238e919061478e565b61239891906149d4565b816123a3919061475a565b9050600080600090505b600b60008e8152602001908152602001600020600401805490508110156124fb57600b60008e815260200190815260200160002060040181815481106123f6576123f5614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687828151811061243457612433614690565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008e8152602001908152602001600020600501818154811061249657612495614690565b5b90600052602060002001548682815181106124b4576124b3614690565b5b6020026020010181815250508581815181106124d3576124d2614690565b5b6020026020010151826124e691906149d4565b915080806124f390614848565b9150506123ad565b5060005b600b60008e8152602001908152602001600020600401805490508110156125e5578168056bc75e2d6310000087838151811061253e5761253d614690565b5b6020026020010151612550919061478e565b61255a9190614817565b86828151811061256d5761256c614690565b5b60200260200101818152505068056bc75e2d6310000086828151811061259657612595614690565b5b6020026020010151846125a9919061478e565b6125b39190614817565b8682815181106125c6576125c5614690565b5b60200260200101818152505080806125dd90614848565b9150506124ff565b506002600b60008e815260200190815260200160002060010154612609919061478e565b8560008151811061261d5761261c614690565b5b6020026020010181815161263191906149d4565b915081815250506000905060005b600b60008e81526020019081526020016000206006018054905081101561278d57600b60008e8152602001908152602001600020600601818154811061268857612687614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168582815181106126c6576126c5614690565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008e8152602001908152602001600020600701818154811061272857612727614690565b5b906000526020600020015484828151811061274657612745614690565b5b60200260200101818152505083818151811061276557612764614690565b5b60200260200101518261277891906149d4565b9150808061278590614848565b91505061263f565b5060005b600b60008e815260200190815260200160002060060180549050811015612877578168056bc75e2d631000008583815181106127d0576127cf614690565b5b60200260200101516127e2919061478e565b6127ec9190614817565b8482815181106127ff576127fe614690565b5b60200260200101818152505068056bc75e2d6310000084828151811061282857612827614690565b5b60200260200101518461283b919061478e565b6128459190614817565b84828151811061285857612857614690565b5b602002602001018181525050808061286f90614848565b915050612791565b506002600b60008e81526020019081526020016000206001015461289b919061478e565b836000815181106128af576128ae614690565b5b602002602001018181516128c391906149d4565b91508181525050600b60008d815260200190815260200160002060000154868686869a509a509a509a509a505050505050505b91939590929450565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b290614b20565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60008481526020019081526020016000206004016000815481106129fb576129fa614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612ac657508073ffffffffffffffffffffffffffffffffffffffff16600b6000848152602001908152602001600020600601600081548110612a8357612a82614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612acf57600080fd5b600068056bc75e2d63100000600b600085815260200190815260200160002060020154600b600086815260200190815260200160002060000154612b13919061478e565b612b1d9190614817565b90506002600b60008581526020019081526020016000206001016000828254612b46919061478e565b92505081905550600b60008481526020019081526020016000206001015481612b6f91906149d4565b600b60008581526020019081526020016000206000016000828254612b94919061475a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600b6000858152602001908152602001600020600401600081548110612bdb57612bda614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c8857612c83600b600085815260200190815260200160002060000154600b600086815260200190815260200160002060010154600b6000878152602001908152602001600020600401600b60008881526020019081526020016000206005016137bd565b612ceb565b612cea600b600085815260200190815260200160002060000154600b600086815260200190815260200160002060010154600b6000878152602001908152602001600020600601600b60008881526020019081526020016000206007016137bd565b5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612d53573d6000803e3d6000fd5b50612d5d836136e6565b600b6000848152602001908152602001600020600080820160009055600182016000905560028201600090556003820160009055600482016000612da19190613a2e565b600582016000612db19190613a4f565b600682016000612dc19190613a2e565b600782016000612dd19190613a4f565b5050827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b6060600060015467ffffffffffffffff811115612e2557612e24614345565b5b604051908082528060200260200182016040528015612e5e57816020015b612e4b613ad9565b815260200190600190039081612e435790505b5090506000600c600080815260200190815260200160002060010154905060005b6001548110156130f15781838281518110612e9d57612e9c614690565b5b60200260200101516000018181525050600b600083815260200190815260200160002060000154838281518110612ed757612ed6614690565b5b60200260200101516020018181525050600b600083815260200190815260200160002060010154838281518110612f1157612f10614690565b5b60200260200101516040018181525050600b600083815260200190815260200160002060030154838281518110612f4b57612f4a614690565b5b60200260200101516060018181525050600b6000838152602001908152602001600020600401600081548110612f8457612f83614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110612fc257612fc1614690565b5b60200260200101516080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600b60008481526020019081526020016000206003015411156130c557600b600083815260200190815260200160002060060160008154811061304857613047614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061308657613085614690565b5b602002602001015160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b600c600083815260200190815260200160002060010154915080806130e990614848565b915050612e7f565b50819250505090565b60035481565b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010190816131aa9190614cec565b5080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020190816131fa9190614cec565b50505050565b60045481565b600b6000805481526020019081526020016000206004016000815481106132305761322f614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bf90614e0a565b60405180910390fd5b6001600b60008054815260200190815260200160002060030154146132ec57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc600b600080548152602001908152602001600020600101549081150290604051600060405180830381858888f19350505050158015613349573d6000803e3d6000fd5b50600b60008054815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600061338f9190613a2e565b60058201600061339f9190613a4f565b6006820160006133af9190613a2e565b6007820160006133bf9190613a4f565b50506133cc6000546136e6565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461348d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348490614b20565b60405180910390fd5b600281148061349c5750600381145b6134a557600080fd5b6002600b60008481526020019081526020016000206003015414806134e057506003600b600084815260200190815260200160002060030154145b6134e957600080fd5b80600b600084815260200190815260200160002060030181905550817fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a25050565b60055481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b80600c6000838152602001908152602001600020600001819055506000600c600083815260200190815260200160002060010181905550600c600080815260200190815260200160002060020154600c60008381526020019081526020016000206002018190555080600c6000600c60008081526020019081526020016000206002015481526020019081526020016000206001018190555080600c6000808152602001908152602001600020600201819055506001600081548092919061362e90614848565b919050555050565b60008060005b83805490508110156136d85783818154811061365b5761365a614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036136c55780600192509250506136e1565b80806136d090614848565b91505061363c565b50600080915091505b915091565b600c600082815260200190815260200160002060010154600c6000600c600085815260200190815260200160002060020154815260200190815260200160002060010181905550600c600082815260200190815260200160002060020154600c6000600c6000858152602001908152602001600020600101548152602001908152602001600020600201819055506001600081548092919061378790614e2a565b9190505550600c600082815260200190815260200160002060008082016000905560018201600090556002820160009055505050565b600080838054905067ffffffffffffffff8111156137de576137dd614345565b5b60405190808252806020026020018201604052801561380c5781602001602082028036833780820191505090505b50905060005b848054905081101561385c5783818154811061383157613830614690565b5b90600052602060002001548361384791906149d4565b9250808061385490614848565b915050613812565b5060005b8480549050811015613934578268056bc75e2d6310000085838154811061388a57613889614690565b5b906000526020600020015461389f919061478e565b6138a99190614817565b8282815181106138bc576138bb614690565b5b60200260200101818152505068056bc75e2d631000008282815181106138e5576138e4614690565b5b6020026020010151886138f8919061478e565b6139029190614817565b82828151811061391557613914614690565b5b602002602001018181525050808061392c90614848565b915050613860565b50848160008151811061394a57613949614690565b5b6020026020010181815161395e91906149d4565b9150818152505060005b8480549050811015613a255784818154811061398757613986614690565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8383815181106139de576139dd614690565b5b60200260200101519081150290604051600060405180830381858888f19350505050158015613a11573d6000803e3d6000fd5b508080613a1d90614848565b915050613968565b50505050505050565b5080546000825590600052602060002090810190613a4c9190613b3b565b50565b5080546000825590600052602060002090810190613a6d9190613b3b565b50565b60405180610100016040528060008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040518060c0016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b5b80821115613b54576000816000905550600101613b3c565b5090565b6000819050919050565b613b6b81613b58565b82525050565b6000602082019050613b866000830184613b62565b92915050565b6000604051905090565b600080fd5b600080fd5b613ba981613b58565b8114613bb457600080fd5b50565b600081359050613bc681613ba0565b92915050565b600060208284031215613be257613be1613b96565b5b6000613bf084828501613bb7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c2482613bf9565b9050919050565b613c3481613c19565b8114613c3f57600080fd5b50565b600081359050613c5181613c2b565b92915050565b600060208284031215613c6d57613c6c613b96565b5b6000613c7b84828501613c42565b91505092915050565b613c8d81613b58565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613cc881613c19565b82525050565b6000613cda8383613cbf565b60208301905092915050565b6000602082019050919050565b6000613cfe82613c93565b613d088185613c9e565b9350613d1383613caf565b8060005b83811015613d44578151613d2b8882613cce565b9750613d3683613ce6565b925050600181019050613d17565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000613d898383613c84565b60208301905092915050565b6000602082019050919050565b6000613dad82613d51565b613db78185613d5c565b9350613dc283613d6d565b8060005b83811015613df3578151613dda8882613d7d565b9750613de583613d95565b925050600181019050613dc6565b5085935050505092915050565b600061010083016000830151613e196000860182613c84565b506020830151613e2c6020860182613c84565b506040830151613e3f6040860182613c84565b506060830151613e526060860182613c84565b5060808301518482036080860152613e6a8282613cf3565b91505060a083015184820360a0860152613e848282613da2565b91505060c083015184820360c0860152613e9e8282613cf3565b91505060e083015184820360e0860152613eb88282613da2565b9150508091505092915050565b60006020820190508181036000830152613edf8184613e00565b905092915050565b600060ff82169050919050565b613efd81613ee7565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f3d578082015181840152602081019050613f22565b60008484015250505050565b6000601f19601f8301169050919050565b6000613f6582613f03565b613f6f8185613f0e565b9350613f7f818560208601613f1f565b613f8881613f49565b840191505092915050565b6000606083016000830151613fab6000860182613ef4565b5060208301518482036020860152613fc38282613f5a565b91505060408301518482036040860152613fdd8282613f5a565b9150508091505092915050565b600060208201905081810360008301526140048184613f93565b905092915050565b61401581613c19565b82525050565b6000602082019050614030600083018461400c565b92915050565b600082825260208201905092915050565b600061405282613c93565b61405c8185614036565b935061406783613caf565b8060005b8381101561409857815161407f8882613cce565b975061408a83613ce6565b92505060018101905061406b565b5085935050505092915050565b600082825260208201905092915050565b60006140c182613d51565b6140cb81856140a5565b93506140d683613d6d565b8060005b838110156141075781516140ee8882613d7d565b97506140f983613d95565b9250506001810190506140da565b5085935050505092915050565b600060a0820190506141296000830188613b62565b818103602083015261413b8187614047565b9050818103604083015261414f81866140b6565b905081810360608301526141638185614047565b9050818103608083015261417781846140b6565b90509695505050505050565b6000806040838503121561419a57614199613b96565b5b60006141a885828601613bb7565b92505060206141b985828601613c42565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c0820160008201516142056000850182613c84565b5060208201516142186020850182613c84565b50604082015161422b6040850182613c84565b50606082015161423e6060850182613c84565b5060808201516142516080850182613cbf565b5060a082015161426460a0850182613cbf565b50505050565b600061427683836141ef565b60c08301905092915050565b6000602082019050919050565b600061429a826141c3565b6142a481856141ce565b93506142af836141df565b8060005b838110156142e05781516142c7888261426a565b97506142d283614282565b9250506001810190506142b3565b5085935050505092915050565b60006020820190508181036000830152614307818461428f565b905092915050565b61431881613ee7565b811461432357600080fd5b50565b6000813590506143358161430f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61437d82613f49565b810181811067ffffffffffffffff8211171561439c5761439b614345565b5b80604052505050565b60006143af613b8c565b90506143bb8282614374565b919050565b600067ffffffffffffffff8211156143db576143da614345565b5b6143e482613f49565b9050602081019050919050565b82818337600083830152505050565b600061441361440e846143c0565b6143a5565b90508281526020810184848401111561442f5761442e614340565b5b61443a8482856143f1565b509392505050565b600082601f8301126144575761445661433b565b5b8135614467848260208601614400565b91505092915050565b60008060006060848603121561448957614488613b96565b5b600061449786828701614326565b935050602084013567ffffffffffffffff8111156144b8576144b7613b9b565b5b6144c486828701614442565b925050604084013567ffffffffffffffff8111156144e5576144e4613b9b565b5b6144f186828701614442565b9150509250925092565b6000806040838503121561451257614511613b96565b5b600061452085828601613bb7565b925050602061453185828601613bb7565b9150509250929050565b600082825260208201905092915050565b7f4f6e6c7920454f41000000000000000000000000000000000000000000000000600082015250565b600061458260088361453b565b915061458d8261454c565b602082019050919050565b600060208201905081810360008301526145b181614575565b9050919050565b7f6c6f772062657400000000000000000000000000000000000000000000000000600082015250565b60006145ee60078361453b565b91506145f9826145b8565b602082019050919050565b6000602082019050818103600083015261461d816145e1565b9050919050565b7f6d617820726f6f6d732063726561746564000000000000000000000000000000600082015250565b600061465a60118361453b565b915061466582614624565b602082019050919050565b600060208201905081810360008301526146898161464d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f616c726561647920616464656400000000000000000000000000000000000000600082015250565b60006146f5600d8361453b565b9150614700826146bf565b602082019050919050565b60006020820190508181036000830152614724816146e8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061476582613b58565b915061477083613b58565b92508282039050818111156147885761478761472b565b5b92915050565b600061479982613b58565b91506147a483613b58565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147dd576147dc61472b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061482282613b58565b915061482d83613b58565b92508261483d5761483c6147e8565b5b828204905092915050565b600061485382613b58565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148855761488461472b565b5b600182019050919050565b7f4f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b60006148c6600a8361453b565b91506148d182614890565b602082019050919050565b600060208201905081810360008301526148f5816148b9565b9050919050565b7f62657473206172652070726f6869626974656400000000000000000000000000600082015250565b600061493260138361453b565b915061493d826148fc565b602082019050919050565b6000602082019050818103600083015261496181614925565b9050919050565b7f4d616e7920757365727320776974682062657473000000000000000000000000600082015250565b600061499e60148361453b565b91506149a982614968565b602082019050919050565b600060208201905081810360008301526149cd81614991565b9050919050565b60006149df82613b58565b91506149ea83613b58565b9250828201905080821115614a0257614a0161472b565b5b92915050565b7f6261642073746174757300000000000000000000000000000000000000000000600082015250565b6000614a3e600a8361453b565b9150614a4982614a08565b602082019050919050565b60006020820190508181036000830152614a6d81614a31565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614abb57607f821691505b602082108103614ace57614acd614a74565b5b50919050565b7f4f6e6c79206f7261636c65000000000000000000000000000000000000000000600082015250565b6000614b0a600b8361453b565b9150614b1582614ad4565b602082019050919050565b60006020820190508181036000830152614b3981614afd565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614ba27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614b65565b614bac8683614b65565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614be9614be4614bdf84613b58565b614bc4565b613b58565b9050919050565b6000819050919050565b614c0383614bce565b614c17614c0f82614bf0565b848454614b72565b825550505050565b600090565b614c2c614c1f565b614c37818484614bfa565b505050565b5b81811015614c5b57614c50600082614c24565b600181019050614c3d565b5050565b601f821115614ca057614c7181614b40565b614c7a84614b55565b81016020851015614c89578190505b614c9d614c9585614b55565b830182614c3c565b50505b505050565b600082821c905092915050565b6000614cc360001984600802614ca5565b1980831691505092915050565b6000614cdc8383614cb2565b9150826002028217905092915050565b614cf582613f03565b67ffffffffffffffff811115614d0e57614d0d614345565b5b614d188254614aa3565b614d23828285614c5f565b600060209050601f831160018114614d565760008415614d44578287015190505b614d4e8582614cd0565b865550614db6565b601f198416614d6486614b40565b60005b82811015614d8c57848901518255600182019150602085019450602081019050614d67565b86831015614da95784890151614da5601f891682614cb2565b8355505b6001600288020188555050505b505050505050565b7f6e6f7420796f7572206265740000000000000000000000000000000000000000600082015250565b6000614df4600c8361453b565b9150614dff82614dbe565b602082019050919050565b60006020820190508181036000830152614e2381614de7565b9050919050565b6000614e3582613b58565b915060008203614e4857614e4761472b565b5b60018203905091905056fea2646970667358221220a3735d7eae832d76a40337567edbb2ec30bf171e45f940d7798ed2e739f5f8e164736f6c63430008100033