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-17T06:43:26.448282Z
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 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
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);
rooms[gameRoom].bet = 0;
rooms[gameRoom].status = 0;
delete rooms[gameRoom].player1_users[0];
_delRoom(gameRoom); // Удаляем игровую комнату из списка созданных комнат
emit UsedRoom(gameRoom); // события использования комнаты
}
// ставка на Игрока 1
function betOnPlayer1(uint256 _room) public payable {
require(msg.value >= minGameBet, "low bet"); // проверка минимальной ставки
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.value >= minGameBet, "low bet"); // проверка минимальной ставки
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 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];
_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){
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":"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":"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
0x60806040526001600055678ac7230489e8000060025568015af1d78b58c40000600355601e600455674563918244f4000060055533600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561010257600080fd5b50614a6b806101126000396000f3fe6080604052600436106101a05760003560e01c80638d617c1c116100ec578063bdd42aee1161008a578063d1c4cd8311610064578063d1c4cd8314610566578063e034d87b1461058f578063e1489191146105ba578063e1e6f150146105e5576101af565b8063bdd42aee146104fb578063ca01e33614610524578063cc28f73d1461054f576101af565b80639c623683116100c65780639c62368314610472578063aab30a3b1461049b578063ae94058e146104a5578063afa723a0146104d0576101af565b80638d617c1c146103db5780638da5cb5b1461041c5780639af1d35a14610447576101af565b806341b1311a116101595780636d8a74cb116101335780636d8a74cb1461030d5780637706d1f61461034a5780637dc0d1d0146103875780638699aa0b146103b2576101af565b806341b1311a1461029f5780634c42e4b4146102c85780635ccf3e93146102f1576101af565b80630ceb14fa146101b457806314777822146101df5780631c3a8892146101fb57806327081703146102245780633d18678e1461024d5780633d6a366414610276576101af565b366101af576101ad610610565b005b600080fd5b3480156101c057600080fd5b506101c9610c3e565b6040516101d691906137bf565b60405180910390f35b6101f960048036038101906101f4919061381a565b610c44565b005b34801561020757600080fd5b50610222600480360381019061021d919061381a565b610ed1565b005b34801561023057600080fd5b5061024b6004803603810190610246919061381a565b611350565b005b34801561025957600080fd5b50610274600480360381019061026f919061381a565b6113ea565b005b34801561028257600080fd5b5061029d600480360381019061029891906138a5565b611484565b005b3480156102ab57600080fd5b506102c660048036038101906102c1919061381a565b611558565b005b3480156102d457600080fd5b506102ef60048036038101906102ea919061381a565b6115f2565b005b61030b6004803603810190610306919061381a565b61168c565b005b34801561031957600080fd5b50610334600480360381019061032f919061381a565b611919565b6040516103419190613b13565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c91906138a5565b611b3b565b60405161037e9190613c38565b60405180910390f35b34801561039357600080fd5b5061039c611cd5565b6040516103a99190613c69565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906138a5565b611cfb565b005b3480156103e757600080fd5b5061040260048036038101906103fd919061381a565b611dcf565b604051610413959493929190613d62565b60405180910390f35b34801561042857600080fd5b50610431612553565b60405161043e9190613c69565b60405180910390f35b34801561045357600080fd5b5061045c612579565b60405161046991906137bf565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613dd1565b61257f565b005b6104a3610610565b005b3480156104b157600080fd5b506104ba612a59565b6040516104c79190613f3b565b60405180910390f35b3480156104dc57600080fd5b506104e5612d2e565b6040516104f291906137bf565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d91906140be565b612d34565b005b34801561053057600080fd5b50610539612e34565b60405161054691906137bf565b60405180910390f35b34801561055b57600080fd5b50610564612e3a565b005b34801561057257600080fd5b5061058d60048036038101906105889190614149565b61304b565b005b34801561059b57600080fd5b506105a4613183565b6040516105b191906137bf565b60405180910390f35b3480156105c657600080fd5b506105cf613189565b6040516105dc9190613c69565b60405180910390f35b3480156105f157600080fd5b506105fa6131af565b60405161060791906137bf565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461067e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610675906141e6565b60405180910390fd5b6002543410156106c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ba90614252565b60405180910390fd5b6000600a60008054815260200190815260200160002060030154036107d25734600a600080548152602001908152602001600020600101819055506001600a60008054815260200190815260200160002060030181905550600a600080548152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061079e6000546131b5565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2610c3c565b600a6000805481526020019081526020016000206004016000815481106107fc576107fb614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b906142ed565b60405180910390fd5b600a60008054815260200190815260200160002060010154341115610921573373ffffffffffffffffffffffffffffffffffffffff166108fc600a60008054815260200190815260200160002060010154346108f0919061433c565b9081150290604051600060405180830381858888f1935050505015801561091b573d6000803e3d6000fd5b50610a1b565b600a60008054815260200190815260200160002060010154341015610a1a57600a60008054815260200190815260200160002060040160008154811061096a57610969614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc34600a600080548152602001908152602001600020600101546109d1919061433c565b9081150290604051600060405180830381858888f193505050501580156109fc573d6000803e3d6000fd5b5034600a600080548152602001908152602001600020600101819055505b5b6002600a60008054815260200190815260200160002060010154610a3f9190614370565b600a60008054815260200190815260200160002060000181905550600068056bc75e2d63100000600354600a60008054815260200190815260200160002060010154610a8b9190614370565b610a9591906143f9565b905080600a6000805481526020019081526020016000206001016000828254610abe919061433c565b92505081905550600a600080548152602001908152602001600020600501819080600181540180825580915050600190039060005260206000200160009091909190915055600a600080548152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a600080548152602001908152602001600020600701819080600181540180825580915050600190039060005260206000200160009091909190915055600554600a600080548152602001908152602001600020600201819055506003600a600080548152602001908152602001600020600301819055506000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2600080815480929190610c359061442a565b9190505550505b565b60015481565b600254341015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090614252565b60405180910390fd5b6003600a60008381526020019081526020016000206003015414610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd9906144be565b60405180910390fd5b600454600a6000838152602001908152602001600020600601805490501115610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d379061452a565b60405180910390fd5b600080610d61600a6000858152602001908152602001600020600601613284565b80925081935050508015610dbd5734600a60008581526020019081526020016000206007018381548110610d9857610d97614272565b5b906000526020600020016000828254610db1919061454a565b92505081905550610e72565b600a6000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60008481526020019081526020016000206007013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600a60008581526020019081526020016000206000016000828254610e98919061454a565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f58906145ca565b60405180910390fd5b6003600a6000838152602001908152602001600020600301541480610f9c57506002600a600083815260200190815260200160002060030154145b610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290614636565b60405180910390fd5b600a600082815260200190815260200160002060010154600a600083815260200190815260200160002060050160008154811061101b5761101a614272565b5b906000526020600020016000828254611034919061454a565b92505081905550600a600082815260200190815260200160002060010154600a600083815260200190815260200160002060070160008154811061107b5761107a614272565b5b906000526020600020016000828254611094919061454a565b9250508190555060005b600a60008381526020019081526020016000206004018054905081101561119d57600a600083815260200190815260200160002060040181815481106110e7576110e6614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a6000858152602001908152602001600020600501838154811061115357611152614272565b5b90600052602060002001549081150290604051600060405180830381858888f19350505050158015611189573d6000803e3d6000fd5b5080806111959061442a565b91505061109e565b5060005b600a6000838152602001908152602001600020600601805490508110156112a057600a600083815260200190815260200160002060060181815481106111ea576111e9614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a6000858152602001908152602001600020600701838154811061125657611255614272565b5b90600052602060002001549081150290604051600060405180830381858888f1935050505015801561128c573d6000803e3d6000fd5b5080806112989061442a565b9150506111a1565b506112aa81613334565b600a60008281526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160006112ee919061367c565b6005820160006112fe919061369d565b60068201600061130e919061367c565b60078201600061131e919061369d565b5050807fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a250565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d7906145ca565b60405180910390fd5b8060028190555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461147a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611471906145ca565b60405180910390fd5b8060058190555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906145ca565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df906145ca565b60405180910390fd5b8060038190555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611679906145ca565b60405180910390fd5b8060048190555050565b6002543410156116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c890614252565b60405180910390fd5b6003600a6000838152602001908152602001600020600301541461172a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611721906144be565b60405180910390fd5b600454600a6000838152602001908152602001600020600401805490501115611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f9061452a565b60405180910390fd5b6000806117a9600a6000858152602001908152602001600020600401613284565b809250819350505080156118055734600a600085815260200190815260200160002060050183815481106117e0576117df614272565b5b9060005260206000200160008282546117f9919061454a565b925050819055506118ba565b600a6000848152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60008481526020019081526020016000206005013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600a600085815260200190815260200160002060000160008282546118e0919061454a565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b6119216136be565b600a60008381526020019081526020016000206040518061010001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054806020026020016040519081016040528092919081815260200182805480156119ed57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116119a3575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611a4557602002820191906000526020600020905b815481526020019060010190808311611a31575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611ad357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611a89575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015611b2b57602002820191906000526020600020905b815481526020019060010190808311611b17575b5050505050815250509050919050565b611b43613703565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff1660ff1660ff168152602001600182018054611bba90614685565b80601f0160208091040260200160405190810160405280929190818152602001828054611be690614685565b8015611c335780601f10611c0857610100808354040283529160200191611c33565b820191906000526020600020905b815481529060010190602001808311611c1657829003601f168201915b50505050508152602001600282018054611c4c90614685565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7890614685565b8015611cc55780601f10611c9a57610100808354040283529160200191611cc5565b820191906000526020600020905b815481529060010190602001808311611ca857829003601f168201915b5050505050815250509050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d82906145ca565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006060806060806000600a60008881526020019081526020016000206004018054905067ffffffffffffffff811115611e0c57611e0b613f93565b5b604051908082528060200260200182016040528015611e3a5781602001602082028036833780820191505090505b5090506000600a60008981526020019081526020016000206004018054905067ffffffffffffffff811115611e7257611e71613f93565b5b604051908082528060200260200182016040528015611ea05781602001602082028036833780820191505090505b5090506000600a60008a81526020019081526020016000206006018054905067ffffffffffffffff811115611ed857611ed7613f93565b5b604051908082528060200260200182016040528015611f065781602001602082028036833780820191505090505b5090506000600a60008b81526020019081526020016000206006018054905067ffffffffffffffff811115611f3e57611f3d613f93565b5b604051908082528060200260200182016040528015611f6c5781602001602082028036833780820191505090505b5090506000600a60008c815260200190815260200160002060000154905068056bc75e2d63100000600a60008d81526020019081526020016000206002015482611fb69190614370565b611fc091906143f9565b6002600a60008e815260200190815260200160002060010154611fe39190614370565b611fed919061454a565b81611ff8919061433c565b9050600080600090505b600a60008e81526020019081526020016000206004018054905081101561215057600a60008e8152602001908152602001600020600401818154811061204b5761204a614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687828151811061208957612088614272565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a60008e815260200190815260200160002060050181815481106120eb576120ea614272565b5b906000526020600020015486828151811061210957612108614272565b5b60200260200101818152505085818151811061212857612127614272565b5b60200260200101518261213b919061454a565b915080806121489061442a565b915050612002565b5060005b600a60008e81526020019081526020016000206004018054905081101561223a578168056bc75e2d6310000087838151811061219357612192614272565b5b60200260200101516121a59190614370565b6121af91906143f9565b8682815181106121c2576121c1614272565b5b60200260200101818152505068056bc75e2d631000008682815181106121eb576121ea614272565b5b6020026020010151846121fe9190614370565b61220891906143f9565b86828151811061221b5761221a614272565b5b60200260200101818152505080806122329061442a565b915050612154565b506002600a60008e81526020019081526020016000206001015461225e9190614370565b8560008151811061227257612271614272565b5b60200260200101818151612286919061454a565b915081815250506000905060005b600a60008e8152602001908152602001600020600601805490508110156123e257600a60008e815260200190815260200160002060060181815481106122dd576122dc614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685828151811061231b5761231a614272565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a60008e8152602001908152602001600020600701818154811061237d5761237c614272565b5b906000526020600020015484828151811061239b5761239a614272565b5b6020026020010181815250508381815181106123ba576123b9614272565b5b6020026020010151826123cd919061454a565b915080806123da9061442a565b915050612294565b5060005b600a60008e8152602001908152602001600020600601805490508110156124cc578168056bc75e2d6310000085838151811061242557612424614272565b5b60200260200101516124379190614370565b61244191906143f9565b84828151811061245457612453614272565b5b60200260200101818152505068056bc75e2d6310000084828151811061247d5761247c614272565b5b6020026020010151846124909190614370565b61249a91906143f9565b8482815181106124ad576124ac614272565b5b60200260200101818152505080806124c49061442a565b9150506123e6565b506002600a60008e8152602001908152602001600020600101546124f09190614370565b8360008151811061250457612503614272565b5b60200260200101818151612518919061454a565b91508181525050600a60008d815260200190815260200160002060000154868686869a509a509a509a509a5050505050505091939590929450565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461260f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260690614702565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a600084815260200190815260200160002060040160008154811061264f5761264e614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061271a57508073ffffffffffffffffffffffffffffffffffffffff16600a60008481526020019081526020016000206006016000815481106126d7576126d6614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61272357600080fd5b600068056bc75e2d63100000600a600085815260200190815260200160002060020154600a6000868152602001908152602001600020600001546127679190614370565b61277191906143f9565b90506002600a6000858152602001908152602001600020600101600082825461279a9190614370565b92505081905550600a600084815260200190815260200160002060010154816127c3919061454a565b600a600085815260200190815260200160002060000160008282546127e8919061433c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600a600085815260200190815260200160002060040160008154811061282f5761282e614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036128dc576128d7600a600085815260200190815260200160002060000154600a600086815260200190815260200160002060010154600a6000878152602001908152602001600020600401600a600088815260200190815260200160002060050161340b565b61293f565b61293e600a600085815260200190815260200160002060000154600a600086815260200190815260200160002060010154600a6000878152602001908152602001600020600601600a600088815260200190815260200160002060070161340b565b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156129a7573d6000803e3d6000fd5b506129b183613334565b600a60008481526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160006129f5919061367c565b600582016000612a05919061369d565b600682016000612a15919061367c565b600782016000612a25919061369d565b5050827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b6060600060015467ffffffffffffffff811115612a7957612a78613f93565b5b604051908082528060200260200182016040528015612ab257816020015b612a9f613727565b815260200190600190039081612a975790505b5090506000600b600080815260200190815260200160002060010154905060005b600154811015612d255781838281518110612af157612af0614272565b5b60200260200101516000018181525050600a600083815260200190815260200160002060000154838281518110612b2b57612b2a614272565b5b60200260200101516020018181525050600a600083815260200190815260200160002060010154838281518110612b6557612b64614272565b5b60200260200101516040018181525050600a600083815260200190815260200160002060030154838281518110612b9f57612b9e614272565b5b60200260200101516060018181525050600a6000838152602001908152602001600020600401600081548110612bd857612bd7614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110612c1657612c15614272565b5b60200260200101516080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a6000838152602001908152602001600020600601600081548110612c7d57612c7c614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110612cbb57612cba614272565b5b602002602001015160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008381526020019081526020016000206001015491508080612d1d9061442a565b915050612ad3565b50819250505090565b60025481565b82600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001019081612dde91906148ce565b5080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002019081612e2e91906148ce565b50505050565b60035481565b600a600080548152602001908152602001600020600401600081548110612e6457612e63614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef3906149ec565b60405180910390fd5b6001600a6000805481526020019081526020016000206003015414612f2057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc600a600080548152602001908152602001600020600101549081150290604051600060405180830381858888f19350505050158015612f7d573d6000803e3d6000fd5b506000600a600080548152602001908152602001600020600101819055506000600a60008054815260200190815260200160002060030181905550600a600080548152602001908152602001600020600401600081548110612fe257612fe1614272565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561301a600054613334565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146130db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d290614702565b60405180910390fd5b60028114806130ea5750600381145b6130f357600080fd5b6002600a600084815260200190815260200160002060030154148061312e57506003600a600084815260200190815260200160002060030154145b61313757600080fd5b80600a600084815260200190815260200160002060030181905550817fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a25050565b60045481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b80600b6000838152602001908152602001600020600001819055506000600b600083815260200190815260200160002060010181905550600b600080815260200190815260200160002060020154600b60008381526020019081526020016000206002018190555080600b6000600b60008081526020019081526020016000206002015481526020019081526020016000206001018190555080600b6000808152602001908152602001600020600201819055506001600081548092919061327c9061442a565b919050555050565b60008060005b8380549050811015613326578381815481106132a9576132a8614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361331357806001925092505061332f565b808061331e9061442a565b91505061328a565b50600080915091505b915091565b600b600082815260200190815260200160002060010154600b6000600b600085815260200190815260200160002060020154815260200190815260200160002060010181905550600b600082815260200190815260200160002060020154600b6000600b600085815260200190815260200160002060010154815260200190815260200160002060020181905550600160008154809291906133d590614a0c565b9190505550600b600082815260200190815260200160002060008082016000905560018201600090556002820160009055505050565b600080838054905067ffffffffffffffff81111561342c5761342b613f93565b5b60405190808252806020026020018201604052801561345a5781602001602082028036833780820191505090505b50905060005b84805490508110156134aa5783818154811061347f5761347e614272565b5b906000526020600020015483613495919061454a565b925080806134a29061442a565b915050613460565b5060005b8480549050811015613582578268056bc75e2d631000008583815481106134d8576134d7614272565b5b90600052602060002001546134ed9190614370565b6134f791906143f9565b82828151811061350a57613509614272565b5b60200260200101818152505068056bc75e2d6310000082828151811061353357613532614272565b5b6020026020010151886135469190614370565b61355091906143f9565b82828151811061356357613562614272565b5b602002602001018181525050808061357a9061442a565b9150506134ae565b50848160008151811061359857613597614272565b5b602002602001018181516135ac919061454a565b9150818152505060005b8480549050811015613673578481815481106135d5576135d4614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc83838151811061362c5761362b614272565b5b60200260200101519081150290604051600060405180830381858888f1935050505015801561365f573d6000803e3d6000fd5b50808061366b9061442a565b9150506135b6565b50505050505050565b508054600082559060005260206000209081019061369a9190613789565b50565b50805460008255906000526020600020908101906136bb9190613789565b50565b60405180610100016040528060008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040518060c0016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b5b808211156137a257600081600090555060010161378a565b5090565b6000819050919050565b6137b9816137a6565b82525050565b60006020820190506137d460008301846137b0565b92915050565b6000604051905090565b600080fd5b600080fd5b6137f7816137a6565b811461380257600080fd5b50565b600081359050613814816137ee565b92915050565b6000602082840312156138305761382f6137e4565b5b600061383e84828501613805565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061387282613847565b9050919050565b61388281613867565b811461388d57600080fd5b50565b60008135905061389f81613879565b92915050565b6000602082840312156138bb576138ba6137e4565b5b60006138c984828501613890565b91505092915050565b6138db816137a6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61391681613867565b82525050565b6000613928838361390d565b60208301905092915050565b6000602082019050919050565b600061394c826138e1565b61395681856138ec565b9350613961836138fd565b8060005b83811015613992578151613979888261391c565b975061398483613934565b925050600181019050613965565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006139d783836138d2565b60208301905092915050565b6000602082019050919050565b60006139fb8261399f565b613a0581856139aa565b9350613a10836139bb565b8060005b83811015613a41578151613a2888826139cb565b9750613a33836139e3565b925050600181019050613a14565b5085935050505092915050565b600061010083016000830151613a6760008601826138d2565b506020830151613a7a60208601826138d2565b506040830151613a8d60408601826138d2565b506060830151613aa060608601826138d2565b5060808301518482036080860152613ab88282613941565b91505060a083015184820360a0860152613ad282826139f0565b91505060c083015184820360c0860152613aec8282613941565b91505060e083015184820360e0860152613b0682826139f0565b9150508091505092915050565b60006020820190508181036000830152613b2d8184613a4e565b905092915050565b600060ff82169050919050565b613b4b81613b35565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b8b578082015181840152602081019050613b70565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bb382613b51565b613bbd8185613b5c565b9350613bcd818560208601613b6d565b613bd681613b97565b840191505092915050565b6000606083016000830151613bf96000860182613b42565b5060208301518482036020860152613c118282613ba8565b91505060408301518482036040860152613c2b8282613ba8565b9150508091505092915050565b60006020820190508181036000830152613c528184613be1565b905092915050565b613c6381613867565b82525050565b6000602082019050613c7e6000830184613c5a565b92915050565b600082825260208201905092915050565b6000613ca0826138e1565b613caa8185613c84565b9350613cb5836138fd565b8060005b83811015613ce6578151613ccd888261391c565b9750613cd883613934565b925050600181019050613cb9565b5085935050505092915050565b600082825260208201905092915050565b6000613d0f8261399f565b613d198185613cf3565b9350613d24836139bb565b8060005b83811015613d55578151613d3c88826139cb565b9750613d47836139e3565b925050600181019050613d28565b5085935050505092915050565b600060a082019050613d7760008301886137b0565b8181036020830152613d898187613c95565b90508181036040830152613d9d8186613d04565b90508181036060830152613db18185613c95565b90508181036080830152613dc58184613d04565b90509695505050505050565b60008060408385031215613de857613de76137e4565b5b6000613df685828601613805565b9250506020613e0785828601613890565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c082016000820151613e5360008501826138d2565b506020820151613e6660208501826138d2565b506040820151613e7960408501826138d2565b506060820151613e8c60608501826138d2565b506080820151613e9f608085018261390d565b5060a0820151613eb260a085018261390d565b50505050565b6000613ec48383613e3d565b60c08301905092915050565b6000602082019050919050565b6000613ee882613e11565b613ef28185613e1c565b9350613efd83613e2d565b8060005b83811015613f2e578151613f158882613eb8565b9750613f2083613ed0565b925050600181019050613f01565b5085935050505092915050565b60006020820190508181036000830152613f558184613edd565b905092915050565b613f6681613b35565b8114613f7157600080fd5b50565b600081359050613f8381613f5d565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fcb82613b97565b810181811067ffffffffffffffff82111715613fea57613fe9613f93565b5b80604052505050565b6000613ffd6137da565b90506140098282613fc2565b919050565b600067ffffffffffffffff82111561402957614028613f93565b5b61403282613b97565b9050602081019050919050565b82818337600083830152505050565b600061406161405c8461400e565b613ff3565b90508281526020810184848401111561407d5761407c613f8e565b5b61408884828561403f565b509392505050565b600082601f8301126140a5576140a4613f89565b5b81356140b584826020860161404e565b91505092915050565b6000806000606084860312156140d7576140d66137e4565b5b60006140e586828701613f74565b935050602084013567ffffffffffffffff811115614106576141056137e9565b5b61411286828701614090565b925050604084013567ffffffffffffffff811115614133576141326137e9565b5b61413f86828701614090565b9150509250925092565b600080604083850312156141605761415f6137e4565b5b600061416e85828601613805565b925050602061417f85828601613805565b9150509250929050565b600082825260208201905092915050565b7f4f6e6c7920454f41000000000000000000000000000000000000000000000000600082015250565b60006141d0600883614189565b91506141db8261419a565b602082019050919050565b600060208201905081810360008301526141ff816141c3565b9050919050565b7f6c6f772062657400000000000000000000000000000000000000000000000000600082015250565b600061423c600783614189565b915061424782614206565b602082019050919050565b6000602082019050818103600083015261426b8161422f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f616c726561647920616464656400000000000000000000000000000000000000600082015250565b60006142d7600d83614189565b91506142e2826142a1565b602082019050919050565b60006020820190508181036000830152614306816142ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614347826137a6565b9150614352836137a6565b925082820390508181111561436a5761436961430d565b5b92915050565b600061437b826137a6565b9150614386836137a6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143bf576143be61430d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614404826137a6565b915061440f836137a6565b92508261441f5761441e6143ca565b5b828204905092915050565b6000614435826137a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144675761446661430d565b5b600182019050919050565b7f62657473206172652070726f6869626974656400000000000000000000000000600082015250565b60006144a8601383614189565b91506144b382614472565b602082019050919050565b600060208201905081810360008301526144d78161449b565b9050919050565b7f4d616e7920757365727320776974682062657473000000000000000000000000600082015250565b6000614514601483614189565b915061451f826144de565b602082019050919050565b6000602082019050818103600083015261454381614507565b9050919050565b6000614555826137a6565b9150614560836137a6565b92508282019050808211156145785761457761430d565b5b92915050565b7f4f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b60006145b4600a83614189565b91506145bf8261457e565b602082019050919050565b600060208201905081810360008301526145e3816145a7565b9050919050565b7f6261642073746174757300000000000000000000000000000000000000000000600082015250565b6000614620600a83614189565b915061462b826145ea565b602082019050919050565b6000602082019050818103600083015261464f81614613565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061469d57607f821691505b6020821081036146b0576146af614656565b5b50919050565b7f4f6e6c79206f7261636c65000000000000000000000000000000000000000000600082015250565b60006146ec600b83614189565b91506146f7826146b6565b602082019050919050565b6000602082019050818103600083015261471b816146df565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026147847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614747565b61478e8683614747565b95508019841693508086168417925050509392505050565b6000819050919050565b60006147cb6147c66147c1846137a6565b6147a6565b6137a6565b9050919050565b6000819050919050565b6147e5836147b0565b6147f96147f1826147d2565b848454614754565b825550505050565b600090565b61480e614801565b6148198184846147dc565b505050565b5b8181101561483d57614832600082614806565b60018101905061481f565b5050565b601f8211156148825761485381614722565b61485c84614737565b8101602085101561486b578190505b61487f61487785614737565b83018261481e565b50505b505050565b600082821c905092915050565b60006148a560001984600802614887565b1980831691505092915050565b60006148be8383614894565b9150826002028217905092915050565b6148d782613b51565b67ffffffffffffffff8111156148f0576148ef613f93565b5b6148fa8254614685565b614905828285614841565b600060209050601f8311600181146149385760008415614926578287015190505b61493085826148b2565b865550614998565b601f19841661494686614722565b60005b8281101561496e57848901518255600182019150602085019450602081019050614949565b8683101561498b5784890151614987601f891682614894565b8355505b6001600288020188555050505b505050505050565b7f6e6f7420796f7572206265740000000000000000000000000000000000000000600082015250565b60006149d6600c83614189565b91506149e1826149a0565b602082019050919050565b60006020820190508181036000830152614a05816149c9565b9050919050565b6000614a17826137a6565b915060008203614a2a57614a2961430d565b5b60018203905091905056fea2646970667358221220e8218b5bd97c4fa1d9665fbcf0f32cadfdf28609f832ab297d45e3cd4769746764736f6c63430008100033
Deployed ByteCode
0x6080604052600436106101a05760003560e01c80638d617c1c116100ec578063bdd42aee1161008a578063d1c4cd8311610064578063d1c4cd8314610566578063e034d87b1461058f578063e1489191146105ba578063e1e6f150146105e5576101af565b8063bdd42aee146104fb578063ca01e33614610524578063cc28f73d1461054f576101af565b80639c623683116100c65780639c62368314610472578063aab30a3b1461049b578063ae94058e146104a5578063afa723a0146104d0576101af565b80638d617c1c146103db5780638da5cb5b1461041c5780639af1d35a14610447576101af565b806341b1311a116101595780636d8a74cb116101335780636d8a74cb1461030d5780637706d1f61461034a5780637dc0d1d0146103875780638699aa0b146103b2576101af565b806341b1311a1461029f5780634c42e4b4146102c85780635ccf3e93146102f1576101af565b80630ceb14fa146101b457806314777822146101df5780631c3a8892146101fb57806327081703146102245780633d18678e1461024d5780633d6a366414610276576101af565b366101af576101ad610610565b005b600080fd5b3480156101c057600080fd5b506101c9610c3e565b6040516101d691906137bf565b60405180910390f35b6101f960048036038101906101f4919061381a565b610c44565b005b34801561020757600080fd5b50610222600480360381019061021d919061381a565b610ed1565b005b34801561023057600080fd5b5061024b6004803603810190610246919061381a565b611350565b005b34801561025957600080fd5b50610274600480360381019061026f919061381a565b6113ea565b005b34801561028257600080fd5b5061029d600480360381019061029891906138a5565b611484565b005b3480156102ab57600080fd5b506102c660048036038101906102c1919061381a565b611558565b005b3480156102d457600080fd5b506102ef60048036038101906102ea919061381a565b6115f2565b005b61030b6004803603810190610306919061381a565b61168c565b005b34801561031957600080fd5b50610334600480360381019061032f919061381a565b611919565b6040516103419190613b13565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c91906138a5565b611b3b565b60405161037e9190613c38565b60405180910390f35b34801561039357600080fd5b5061039c611cd5565b6040516103a99190613c69565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906138a5565b611cfb565b005b3480156103e757600080fd5b5061040260048036038101906103fd919061381a565b611dcf565b604051610413959493929190613d62565b60405180910390f35b34801561042857600080fd5b50610431612553565b60405161043e9190613c69565b60405180910390f35b34801561045357600080fd5b5061045c612579565b60405161046991906137bf565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613dd1565b61257f565b005b6104a3610610565b005b3480156104b157600080fd5b506104ba612a59565b6040516104c79190613f3b565b60405180910390f35b3480156104dc57600080fd5b506104e5612d2e565b6040516104f291906137bf565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d91906140be565b612d34565b005b34801561053057600080fd5b50610539612e34565b60405161054691906137bf565b60405180910390f35b34801561055b57600080fd5b50610564612e3a565b005b34801561057257600080fd5b5061058d60048036038101906105889190614149565b61304b565b005b34801561059b57600080fd5b506105a4613183565b6040516105b191906137bf565b60405180910390f35b3480156105c657600080fd5b506105cf613189565b6040516105dc9190613c69565b60405180910390f35b3480156105f157600080fd5b506105fa6131af565b60405161060791906137bf565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461067e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610675906141e6565b60405180910390fd5b6002543410156106c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ba90614252565b60405180910390fd5b6000600a60008054815260200190815260200160002060030154036107d25734600a600080548152602001908152602001600020600101819055506001600a60008054815260200190815260200160002060030181905550600a600080548152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061079e6000546131b5565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2610c3c565b600a6000805481526020019081526020016000206004016000815481106107fc576107fb614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b906142ed565b60405180910390fd5b600a60008054815260200190815260200160002060010154341115610921573373ffffffffffffffffffffffffffffffffffffffff166108fc600a60008054815260200190815260200160002060010154346108f0919061433c565b9081150290604051600060405180830381858888f1935050505015801561091b573d6000803e3d6000fd5b50610a1b565b600a60008054815260200190815260200160002060010154341015610a1a57600a60008054815260200190815260200160002060040160008154811061096a57610969614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc34600a600080548152602001908152602001600020600101546109d1919061433c565b9081150290604051600060405180830381858888f193505050501580156109fc573d6000803e3d6000fd5b5034600a600080548152602001908152602001600020600101819055505b5b6002600a60008054815260200190815260200160002060010154610a3f9190614370565b600a60008054815260200190815260200160002060000181905550600068056bc75e2d63100000600354600a60008054815260200190815260200160002060010154610a8b9190614370565b610a9591906143f9565b905080600a6000805481526020019081526020016000206001016000828254610abe919061433c565b92505081905550600a600080548152602001908152602001600020600501819080600181540180825580915050600190039060005260206000200160009091909190915055600a600080548152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a600080548152602001908152602001600020600701819080600181540180825580915050600190039060005260206000200160009091909190915055600554600a600080548152602001908152602001600020600201819055506003600a600080548152602001908152602001600020600301819055506000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2600080815480929190610c359061442a565b9190505550505b565b60015481565b600254341015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090614252565b60405180910390fd5b6003600a60008381526020019081526020016000206003015414610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd9906144be565b60405180910390fd5b600454600a6000838152602001908152602001600020600601805490501115610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d379061452a565b60405180910390fd5b600080610d61600a6000858152602001908152602001600020600601613284565b80925081935050508015610dbd5734600a60008581526020019081526020016000206007018381548110610d9857610d97614272565b5b906000526020600020016000828254610db1919061454a565b92505081905550610e72565b600a6000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60008481526020019081526020016000206007013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600a60008581526020019081526020016000206000016000828254610e98919061454a565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f58906145ca565b60405180910390fd5b6003600a6000838152602001908152602001600020600301541480610f9c57506002600a600083815260200190815260200160002060030154145b610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290614636565b60405180910390fd5b600a600082815260200190815260200160002060010154600a600083815260200190815260200160002060050160008154811061101b5761101a614272565b5b906000526020600020016000828254611034919061454a565b92505081905550600a600082815260200190815260200160002060010154600a600083815260200190815260200160002060070160008154811061107b5761107a614272565b5b906000526020600020016000828254611094919061454a565b9250508190555060005b600a60008381526020019081526020016000206004018054905081101561119d57600a600083815260200190815260200160002060040181815481106110e7576110e6614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a6000858152602001908152602001600020600501838154811061115357611152614272565b5b90600052602060002001549081150290604051600060405180830381858888f19350505050158015611189573d6000803e3d6000fd5b5080806111959061442a565b91505061109e565b5060005b600a6000838152602001908152602001600020600601805490508110156112a057600a600083815260200190815260200160002060060181815481106111ea576111e9614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a6000858152602001908152602001600020600701838154811061125657611255614272565b5b90600052602060002001549081150290604051600060405180830381858888f1935050505015801561128c573d6000803e3d6000fd5b5080806112989061442a565b9150506111a1565b506112aa81613334565b600a60008281526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160006112ee919061367c565b6005820160006112fe919061369d565b60068201600061130e919061367c565b60078201600061131e919061369d565b5050807fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a250565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d7906145ca565b60405180910390fd5b8060028190555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461147a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611471906145ca565b60405180910390fd5b8060058190555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906145ca565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df906145ca565b60405180910390fd5b8060038190555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611679906145ca565b60405180910390fd5b8060048190555050565b6002543410156116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c890614252565b60405180910390fd5b6003600a6000838152602001908152602001600020600301541461172a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611721906144be565b60405180910390fd5b600454600a6000838152602001908152602001600020600401805490501115611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f9061452a565b60405180910390fd5b6000806117a9600a6000858152602001908152602001600020600401613284565b809250819350505080156118055734600a600085815260200190815260200160002060050183815481106117e0576117df614272565b5b9060005260206000200160008282546117f9919061454a565b925050819055506118ba565b600a6000848152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60008481526020019081526020016000206005013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600a600085815260200190815260200160002060000160008282546118e0919061454a565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b6119216136be565b600a60008381526020019081526020016000206040518061010001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054806020026020016040519081016040528092919081815260200182805480156119ed57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116119a3575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611a4557602002820191906000526020600020905b815481526020019060010190808311611a31575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611ad357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611a89575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015611b2b57602002820191906000526020600020905b815481526020019060010190808311611b17575b5050505050815250509050919050565b611b43613703565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff1660ff1660ff168152602001600182018054611bba90614685565b80601f0160208091040260200160405190810160405280929190818152602001828054611be690614685565b8015611c335780601f10611c0857610100808354040283529160200191611c33565b820191906000526020600020905b815481529060010190602001808311611c1657829003601f168201915b50505050508152602001600282018054611c4c90614685565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7890614685565b8015611cc55780601f10611c9a57610100808354040283529160200191611cc5565b820191906000526020600020905b815481529060010190602001808311611ca857829003601f168201915b5050505050815250509050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d82906145ca565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006060806060806000600a60008881526020019081526020016000206004018054905067ffffffffffffffff811115611e0c57611e0b613f93565b5b604051908082528060200260200182016040528015611e3a5781602001602082028036833780820191505090505b5090506000600a60008981526020019081526020016000206004018054905067ffffffffffffffff811115611e7257611e71613f93565b5b604051908082528060200260200182016040528015611ea05781602001602082028036833780820191505090505b5090506000600a60008a81526020019081526020016000206006018054905067ffffffffffffffff811115611ed857611ed7613f93565b5b604051908082528060200260200182016040528015611f065781602001602082028036833780820191505090505b5090506000600a60008b81526020019081526020016000206006018054905067ffffffffffffffff811115611f3e57611f3d613f93565b5b604051908082528060200260200182016040528015611f6c5781602001602082028036833780820191505090505b5090506000600a60008c815260200190815260200160002060000154905068056bc75e2d63100000600a60008d81526020019081526020016000206002015482611fb69190614370565b611fc091906143f9565b6002600a60008e815260200190815260200160002060010154611fe39190614370565b611fed919061454a565b81611ff8919061433c565b9050600080600090505b600a60008e81526020019081526020016000206004018054905081101561215057600a60008e8152602001908152602001600020600401818154811061204b5761204a614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687828151811061208957612088614272565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a60008e815260200190815260200160002060050181815481106120eb576120ea614272565b5b906000526020600020015486828151811061210957612108614272565b5b60200260200101818152505085818151811061212857612127614272565b5b60200260200101518261213b919061454a565b915080806121489061442a565b915050612002565b5060005b600a60008e81526020019081526020016000206004018054905081101561223a578168056bc75e2d6310000087838151811061219357612192614272565b5b60200260200101516121a59190614370565b6121af91906143f9565b8682815181106121c2576121c1614272565b5b60200260200101818152505068056bc75e2d631000008682815181106121eb576121ea614272565b5b6020026020010151846121fe9190614370565b61220891906143f9565b86828151811061221b5761221a614272565b5b60200260200101818152505080806122329061442a565b915050612154565b506002600a60008e81526020019081526020016000206001015461225e9190614370565b8560008151811061227257612271614272565b5b60200260200101818151612286919061454a565b915081815250506000905060005b600a60008e8152602001908152602001600020600601805490508110156123e257600a60008e815260200190815260200160002060060181815481106122dd576122dc614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685828151811061231b5761231a614272565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a60008e8152602001908152602001600020600701818154811061237d5761237c614272565b5b906000526020600020015484828151811061239b5761239a614272565b5b6020026020010181815250508381815181106123ba576123b9614272565b5b6020026020010151826123cd919061454a565b915080806123da9061442a565b915050612294565b5060005b600a60008e8152602001908152602001600020600601805490508110156124cc578168056bc75e2d6310000085838151811061242557612424614272565b5b60200260200101516124379190614370565b61244191906143f9565b84828151811061245457612453614272565b5b60200260200101818152505068056bc75e2d6310000084828151811061247d5761247c614272565b5b6020026020010151846124909190614370565b61249a91906143f9565b8482815181106124ad576124ac614272565b5b60200260200101818152505080806124c49061442a565b9150506123e6565b506002600a60008e8152602001908152602001600020600101546124f09190614370565b8360008151811061250457612503614272565b5b60200260200101818151612518919061454a565b91508181525050600a60008d815260200190815260200160002060000154868686869a509a509a509a509a5050505050505091939590929450565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461260f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260690614702565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a600084815260200190815260200160002060040160008154811061264f5761264e614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061271a57508073ffffffffffffffffffffffffffffffffffffffff16600a60008481526020019081526020016000206006016000815481106126d7576126d6614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61272357600080fd5b600068056bc75e2d63100000600a600085815260200190815260200160002060020154600a6000868152602001908152602001600020600001546127679190614370565b61277191906143f9565b90506002600a6000858152602001908152602001600020600101600082825461279a9190614370565b92505081905550600a600084815260200190815260200160002060010154816127c3919061454a565b600a600085815260200190815260200160002060000160008282546127e8919061433c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600a600085815260200190815260200160002060040160008154811061282f5761282e614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036128dc576128d7600a600085815260200190815260200160002060000154600a600086815260200190815260200160002060010154600a6000878152602001908152602001600020600401600a600088815260200190815260200160002060050161340b565b61293f565b61293e600a600085815260200190815260200160002060000154600a600086815260200190815260200160002060010154600a6000878152602001908152602001600020600601600a600088815260200190815260200160002060070161340b565b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156129a7573d6000803e3d6000fd5b506129b183613334565b600a60008481526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160006129f5919061367c565b600582016000612a05919061369d565b600682016000612a15919061367c565b600782016000612a25919061369d565b5050827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b6060600060015467ffffffffffffffff811115612a7957612a78613f93565b5b604051908082528060200260200182016040528015612ab257816020015b612a9f613727565b815260200190600190039081612a975790505b5090506000600b600080815260200190815260200160002060010154905060005b600154811015612d255781838281518110612af157612af0614272565b5b60200260200101516000018181525050600a600083815260200190815260200160002060000154838281518110612b2b57612b2a614272565b5b60200260200101516020018181525050600a600083815260200190815260200160002060010154838281518110612b6557612b64614272565b5b60200260200101516040018181525050600a600083815260200190815260200160002060030154838281518110612b9f57612b9e614272565b5b60200260200101516060018181525050600a6000838152602001908152602001600020600401600081548110612bd857612bd7614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110612c1657612c15614272565b5b60200260200101516080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a6000838152602001908152602001600020600601600081548110612c7d57612c7c614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110612cbb57612cba614272565b5b602002602001015160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008381526020019081526020016000206001015491508080612d1d9061442a565b915050612ad3565b50819250505090565b60025481565b82600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001019081612dde91906148ce565b5080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002019081612e2e91906148ce565b50505050565b60035481565b600a600080548152602001908152602001600020600401600081548110612e6457612e63614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef3906149ec565b60405180910390fd5b6001600a6000805481526020019081526020016000206003015414612f2057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc600a600080548152602001908152602001600020600101549081150290604051600060405180830381858888f19350505050158015612f7d573d6000803e3d6000fd5b506000600a600080548152602001908152602001600020600101819055506000600a60008054815260200190815260200160002060030181905550600a600080548152602001908152602001600020600401600081548110612fe257612fe1614272565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561301a600054613334565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146130db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d290614702565b60405180910390fd5b60028114806130ea5750600381145b6130f357600080fd5b6002600a600084815260200190815260200160002060030154148061312e57506003600a600084815260200190815260200160002060030154145b61313757600080fd5b80600a600084815260200190815260200160002060030181905550817fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a25050565b60045481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b80600b6000838152602001908152602001600020600001819055506000600b600083815260200190815260200160002060010181905550600b600080815260200190815260200160002060020154600b60008381526020019081526020016000206002018190555080600b6000600b60008081526020019081526020016000206002015481526020019081526020016000206001018190555080600b6000808152602001908152602001600020600201819055506001600081548092919061327c9061442a565b919050555050565b60008060005b8380549050811015613326578381815481106132a9576132a8614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361331357806001925092505061332f565b808061331e9061442a565b91505061328a565b50600080915091505b915091565b600b600082815260200190815260200160002060010154600b6000600b600085815260200190815260200160002060020154815260200190815260200160002060010181905550600b600082815260200190815260200160002060020154600b6000600b600085815260200190815260200160002060010154815260200190815260200160002060020181905550600160008154809291906133d590614a0c565b9190505550600b600082815260200190815260200160002060008082016000905560018201600090556002820160009055505050565b600080838054905067ffffffffffffffff81111561342c5761342b613f93565b5b60405190808252806020026020018201604052801561345a5781602001602082028036833780820191505090505b50905060005b84805490508110156134aa5783818154811061347f5761347e614272565b5b906000526020600020015483613495919061454a565b925080806134a29061442a565b915050613460565b5060005b8480549050811015613582578268056bc75e2d631000008583815481106134d8576134d7614272565b5b90600052602060002001546134ed9190614370565b6134f791906143f9565b82828151811061350a57613509614272565b5b60200260200101818152505068056bc75e2d6310000082828151811061353357613532614272565b5b6020026020010151886135469190614370565b61355091906143f9565b82828151811061356357613562614272565b5b602002602001018181525050808061357a9061442a565b9150506134ae565b50848160008151811061359857613597614272565b5b602002602001018181516135ac919061454a565b9150818152505060005b8480549050811015613673578481815481106135d5576135d4614272565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc83838151811061362c5761362b614272565b5b60200260200101519081150290604051600060405180830381858888f1935050505015801561365f573d6000803e3d6000fd5b50808061366b9061442a565b9150506135b6565b50505050505050565b508054600082559060005260206000209081019061369a9190613789565b50565b50805460008255906000526020600020908101906136bb9190613789565b50565b60405180610100016040528060008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040518060c0016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b5b808211156137a257600081600090555060010161378a565b5090565b6000819050919050565b6137b9816137a6565b82525050565b60006020820190506137d460008301846137b0565b92915050565b6000604051905090565b600080fd5b600080fd5b6137f7816137a6565b811461380257600080fd5b50565b600081359050613814816137ee565b92915050565b6000602082840312156138305761382f6137e4565b5b600061383e84828501613805565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061387282613847565b9050919050565b61388281613867565b811461388d57600080fd5b50565b60008135905061389f81613879565b92915050565b6000602082840312156138bb576138ba6137e4565b5b60006138c984828501613890565b91505092915050565b6138db816137a6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61391681613867565b82525050565b6000613928838361390d565b60208301905092915050565b6000602082019050919050565b600061394c826138e1565b61395681856138ec565b9350613961836138fd565b8060005b83811015613992578151613979888261391c565b975061398483613934565b925050600181019050613965565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006139d783836138d2565b60208301905092915050565b6000602082019050919050565b60006139fb8261399f565b613a0581856139aa565b9350613a10836139bb565b8060005b83811015613a41578151613a2888826139cb565b9750613a33836139e3565b925050600181019050613a14565b5085935050505092915050565b600061010083016000830151613a6760008601826138d2565b506020830151613a7a60208601826138d2565b506040830151613a8d60408601826138d2565b506060830151613aa060608601826138d2565b5060808301518482036080860152613ab88282613941565b91505060a083015184820360a0860152613ad282826139f0565b91505060c083015184820360c0860152613aec8282613941565b91505060e083015184820360e0860152613b0682826139f0565b9150508091505092915050565b60006020820190508181036000830152613b2d8184613a4e565b905092915050565b600060ff82169050919050565b613b4b81613b35565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b8b578082015181840152602081019050613b70565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bb382613b51565b613bbd8185613b5c565b9350613bcd818560208601613b6d565b613bd681613b97565b840191505092915050565b6000606083016000830151613bf96000860182613b42565b5060208301518482036020860152613c118282613ba8565b91505060408301518482036040860152613c2b8282613ba8565b9150508091505092915050565b60006020820190508181036000830152613c528184613be1565b905092915050565b613c6381613867565b82525050565b6000602082019050613c7e6000830184613c5a565b92915050565b600082825260208201905092915050565b6000613ca0826138e1565b613caa8185613c84565b9350613cb5836138fd565b8060005b83811015613ce6578151613ccd888261391c565b9750613cd883613934565b925050600181019050613cb9565b5085935050505092915050565b600082825260208201905092915050565b6000613d0f8261399f565b613d198185613cf3565b9350613d24836139bb565b8060005b83811015613d55578151613d3c88826139cb565b9750613d47836139e3565b925050600181019050613d28565b5085935050505092915050565b600060a082019050613d7760008301886137b0565b8181036020830152613d898187613c95565b90508181036040830152613d9d8186613d04565b90508181036060830152613db18185613c95565b90508181036080830152613dc58184613d04565b90509695505050505050565b60008060408385031215613de857613de76137e4565b5b6000613df685828601613805565b9250506020613e0785828601613890565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c082016000820151613e5360008501826138d2565b506020820151613e6660208501826138d2565b506040820151613e7960408501826138d2565b506060820151613e8c60608501826138d2565b506080820151613e9f608085018261390d565b5060a0820151613eb260a085018261390d565b50505050565b6000613ec48383613e3d565b60c08301905092915050565b6000602082019050919050565b6000613ee882613e11565b613ef28185613e1c565b9350613efd83613e2d565b8060005b83811015613f2e578151613f158882613eb8565b9750613f2083613ed0565b925050600181019050613f01565b5085935050505092915050565b60006020820190508181036000830152613f558184613edd565b905092915050565b613f6681613b35565b8114613f7157600080fd5b50565b600081359050613f8381613f5d565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fcb82613b97565b810181811067ffffffffffffffff82111715613fea57613fe9613f93565b5b80604052505050565b6000613ffd6137da565b90506140098282613fc2565b919050565b600067ffffffffffffffff82111561402957614028613f93565b5b61403282613b97565b9050602081019050919050565b82818337600083830152505050565b600061406161405c8461400e565b613ff3565b90508281526020810184848401111561407d5761407c613f8e565b5b61408884828561403f565b509392505050565b600082601f8301126140a5576140a4613f89565b5b81356140b584826020860161404e565b91505092915050565b6000806000606084860312156140d7576140d66137e4565b5b60006140e586828701613f74565b935050602084013567ffffffffffffffff811115614106576141056137e9565b5b61411286828701614090565b925050604084013567ffffffffffffffff811115614133576141326137e9565b5b61413f86828701614090565b9150509250925092565b600080604083850312156141605761415f6137e4565b5b600061416e85828601613805565b925050602061417f85828601613805565b9150509250929050565b600082825260208201905092915050565b7f4f6e6c7920454f41000000000000000000000000000000000000000000000000600082015250565b60006141d0600883614189565b91506141db8261419a565b602082019050919050565b600060208201905081810360008301526141ff816141c3565b9050919050565b7f6c6f772062657400000000000000000000000000000000000000000000000000600082015250565b600061423c600783614189565b915061424782614206565b602082019050919050565b6000602082019050818103600083015261426b8161422f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f616c726561647920616464656400000000000000000000000000000000000000600082015250565b60006142d7600d83614189565b91506142e2826142a1565b602082019050919050565b60006020820190508181036000830152614306816142ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614347826137a6565b9150614352836137a6565b925082820390508181111561436a5761436961430d565b5b92915050565b600061437b826137a6565b9150614386836137a6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143bf576143be61430d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614404826137a6565b915061440f836137a6565b92508261441f5761441e6143ca565b5b828204905092915050565b6000614435826137a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144675761446661430d565b5b600182019050919050565b7f62657473206172652070726f6869626974656400000000000000000000000000600082015250565b60006144a8601383614189565b91506144b382614472565b602082019050919050565b600060208201905081810360008301526144d78161449b565b9050919050565b7f4d616e7920757365727320776974682062657473000000000000000000000000600082015250565b6000614514601483614189565b915061451f826144de565b602082019050919050565b6000602082019050818103600083015261454381614507565b9050919050565b6000614555826137a6565b9150614560836137a6565b92508282019050808211156145785761457761430d565b5b92915050565b7f4f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b60006145b4600a83614189565b91506145bf8261457e565b602082019050919050565b600060208201905081810360008301526145e3816145a7565b9050919050565b7f6261642073746174757300000000000000000000000000000000000000000000600082015250565b6000614620600a83614189565b915061462b826145ea565b602082019050919050565b6000602082019050818103600083015261464f81614613565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061469d57607f821691505b6020821081036146b0576146af614656565b5b50919050565b7f4f6e6c79206f7261636c65000000000000000000000000000000000000000000600082015250565b60006146ec600b83614189565b91506146f7826146b6565b602082019050919050565b6000602082019050818103600083015261471b816146df565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026147847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614747565b61478e8683614747565b95508019841693508086168417925050509392505050565b6000819050919050565b60006147cb6147c66147c1846137a6565b6147a6565b6137a6565b9050919050565b6000819050919050565b6147e5836147b0565b6147f96147f1826147d2565b848454614754565b825550505050565b600090565b61480e614801565b6148198184846147dc565b505050565b5b8181101561483d57614832600082614806565b60018101905061481f565b5050565b601f8211156148825761485381614722565b61485c84614737565b8101602085101561486b578190505b61487f61487785614737565b83018261481e565b50505b505050565b600082821c905092915050565b60006148a560001984600802614887565b1980831691505092915050565b60006148be8383614894565b9150826002028217905092915050565b6148d782613b51565b67ffffffffffffffff8111156148f0576148ef613f93565b5b6148fa8254614685565b614905828285614841565b600060209050601f8311600181146149385760008415614926578287015190505b61493085826148b2565b865550614998565b601f19841661494686614722565b60005b8281101561496e57848901518255600182019150602085019450602081019050614949565b8683101561498b5784890151614987601f891682614894565b8355505b6001600288020188555050505b505050505050565b7f6e6f7420796f7572206265740000000000000000000000000000000000000000600082015250565b60006149d6600c83614189565b91506149e1826149a0565b602082019050919050565b60006020820190508181036000830152614a05816149c9565b9050919050565b6000614a17826137a6565b915060008203614a2a57614a2961430d565b5b60018203905091905056fea2646970667358221220e8218b5bd97c4fa1d9665fbcf0f32cadfdf28609f832ab297d45e3cd4769746764736f6c63430008100033