Contract Address Details

0x23DAA8d59dE6C07c38F0E8B27E709851135dC651

Contract Name
GovernanceDAO
Creator
0xebe894–7a24f6 at 0x33798a–3325c7
Balance
0 CLO ( )
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
14734727
Contract name:
GovernanceDAO




Optimization enabled
false
Compiler version
v0.8.16+commit.07a7930e




EVM Version
default




Verified at
2024-03-14T08:54:03.824128Z

Constructor Arguments

000000000000000000000000ebe894814554c8382ea6a24ccddf1527407a24f6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000055570617574000000000000000000000000000000000000000000000000000000

Arg [0] (address) : 0xebe894814554c8382ea6a24ccddf1527407a24f6
Arg [1] (string) : Upaut

              

Contract source code

// All rights reserved.
// SPDX-License-Identifier: No License (None)
// Разработчик: Upaut

pragma solidity ^0.8.16;

contract GovernanceDAO {

    struct UserData { // структура описывающая данные каждого участника
        uint256 index; // индекс участника
        uint256 votes; // сколько раз всего голосовал участник
        uint256 entered; // после какого голосования добавился участник
        address userAddr; // адрес участника (упростит задачу frontend)
        string name; // имя участника
    }

    struct ProposalData { // структура описывающая данные каждого предложения для голосования
        uint256 id; // уникальный номер предложения (упростит задачу frontend)
        uint256 time; // Дата создания предложения
        uint256 reward; // награда для участников голосования
        uint256 deadLine; // крайний срок голосования
        address owner; // адрес инициатора предложения
        uint8 status; // текущий статус предложения (1 - голосование, 2 - завершено, 3 - исполнено)
        string comment; // комментарий к предложению
        address[] vocesYes; // сколько участников проголосовало за предложение
        address[] vocesNo; // сколько участников проголосовало против предложения

        address to; // вызываемый контракт при исполнении данного предложения
        bytes data; // данные транзакции
    }

    uint256 public total_voting; // всего голосований
    uint256 public total_close_voting; // всего завершенных голосований    
    uint256 public total_user; // всего пользователей в DAO
    uint256 public expire_period = 3 days; // сколько дней отведено на голосование (возможное значение от 3 до 14 дней)
    uint256 public min_payment_DAO = 100 * 1e18; // минимальная оплата за вынесение предложения на голосование для членов DAO.
    uint256 public min_payment_other = 10000 * 1e18; // минимальная оплата за вынесение предложения на голосование для не членов DAO.

    mapping(uint256 => address) private indexes; // адреса участников по индексу
    mapping(address => UserData) private users; // связь пользователей с их структурой данных
    mapping(uint256 => ProposalData) private proposals; // список всех предложений
    mapping(uint256 => mapping(address => bool)) private rewards; // награды за голосование

    event CreateProposal(uint indexed _id, uint _reward); // ID предложения и награда за голосование
    event Vote(address indexed _sender, uint indexed _id, bool _answer); // Участник, ID предложения, решение
    event ChangeStatus(uint indexed _id, uint8 _status); // ID предложения, новый статус
    event Claim(address indexed _sender, uint indexed _id, uint _pay); // Участник, ID предложения, сколько было выплачено

    modifier onlyThis() {
        require(address(this) == msg.sender, "Only GovernanceDAO");
        _;
    }

    constructor(address _firstUser, string memory _name)
    {
        ++total_user; // увеличиваем количество участников
        indexes[total_user] = _firstUser; // привязываем адрес участника к индексу
        users[_firstUser] = UserData(total_user, 0, 0, _firstUser, _name); // инициализация данных участника
    }


    function setExpirePeriod(uint256 _period) external onlyThis { // установить новый период голосования
        if((_period >= 3 days) && (_period <= 14 days)) expire_period = _period; // новый период должен быть в диапазоне от 3 до 14 дней (включительно)
    }

    function setMinPayments(uint256 _min_payment_DAO, uint256 _min_payment_other) external onlyThis { // установить новые минимальные сборы за вынесение предложения на голосование
        min_payment_DAO = _min_payment_DAO; // минимальная оплата за вынесение предложения на голосование для членов DAO.
        min_payment_other = _min_payment_other; // минимальная оплата за вынесение предложения на голосование для не членов DAO.
    }

    function addUserInDAO(address _user, string calldata _name) external onlyThis { // добавить нового участника
        if(_user == address(0)) return; // участник не может иметь нулевой адрес
        if (users[_user].index == 0){ // только новый участник 
            ++total_user; // увеличиваем количество участников
            indexes[total_user] = _user; // привязываем адрес участника к индексу
            users[_user] = UserData(total_user, 0, total_close_voting, _user, _name); // инициализация данных участника
        }
    }

    function delUserInDAO(address _user) external onlyThis { // удалить участника из DAO
        uint256 _ind = users[_user].index; // индекс удаляемого участника
        if (_ind > 0){ // только существующий участник 
            if(_ind != total_user){ // индекс участника непоследний
                indexes[_ind] = indexes[total_user]; // привязываем адрес последнего участника к новому индексу
                users[indexes[_ind]].index = _ind; // меняем индекс в данных последнего участника
            }
            delete indexes[total_user]; // обнуляем последний индекс
            delete users[_user]; // удаляем данные участника
            --total_user; // уменьшаем количество участников
        }
    }



    function createProposal(address _contract, bytes calldata _data, string calldata _comment) payable external { // создание предложения
        // _contract - адрес контракта, который будет вызван при принятии этого предложения
        // _data - данные вызова (функция и аргументы), закодированные через encodeABI()
        // _comment - краткий комментарий к предложению, возможно ссылка на github с proposal

        if(users[msg.sender].index > 0){ // адрес который выдвигает предложение состоит в DAO
            require(msg.value >= min_payment_DAO, "small payment"); // проверка оплаты предложения
        }
        else{ // адрес который выдвигает предложение не состоит в DAO
            require(msg.value >= min_payment_other, "small payment"); // проверка оплаты предложения
        }

        ++total_voting; // идентификатор нового голосования
        proposals[total_voting].id = total_voting; // уникальный номер предложения
        proposals[total_voting].time = block.timestamp; // Дата создания предложения
        proposals[total_voting].reward = msg.value; // награда для участников голосования
        proposals[total_voting].deadLine = block.timestamp + expire_period; // крайний срок голосования
        proposals[total_voting].owner = msg.sender; // адрес инициатора предложения
        proposals[total_voting].status = 1; // текущий статус предложения
        proposals[total_voting].comment = _comment; // комментарий к предложению
        proposals[total_voting].to = _contract; // вызываемый контракт при исполнении данного предложения
        proposals[total_voting].data = _data; // данные транзакции

        emit CreateProposal(total_voting, msg.value); // логируем ID предложения и награду за голосование
    }


    function vote(uint _id, bool _answer) external { // голосование
        // _id - идентификатор предложения
        // _answer - ваш ответ (0 - отклонить предложение, 1 - одобрить предложение)

        require(proposals[_id].time > 0, "proposal does not exist"); // проверяем что предложение существует
        if(proposals[_id].status > 1) return; // голосование по данному предложению завершено
        if(block.timestamp > proposals[_id].deadLine){ // время голосования истекло
            proposals[_id].status = 2; // голосование завершено
            ++total_close_voting; // увеличиваем количество завершенных голосований
            emit ChangeStatus(_id, 2); // ID предложения, новый статус
            return;
        }

        uint _index = users[msg.sender].index; // получим индекс голосующего в списке DAO
        require(_index > 0, "you are not a member"); // проверяем что голосующий состоит в DAO
        require(!rewards[_id][msg.sender], "you have already voted"); // проверяем что голосующий, ранее не голосовал за это предложение

        rewards[_id][msg.sender] = true; // подтверждаем принятие голоса c фиксацией выплаты за это голосование
        users[msg.sender].votes++; // увеличиваем количество всех голосований участника

        emit Vote(msg.sender, _id, _answer); // логируем участника, ID предложения, принятое решение

        if(_answer){ // голос отдан за принятие предложения
            proposals[_id].vocesYes.push(msg.sender);
        }
        else{ // голос отдан за отклонение предложения
            proposals[_id].vocesNo.push(msg.sender);
        }


        uint _amount_votes = proposals[_id].vocesYes.length + proposals[_id].vocesNo.length; // количество проголосовавших
        if(_amount_votes == total_user){ // если все участники DAO проголосовали, то голосование досрочно завершаем
            proposals[_id].status = 2; // голосование завершено
            ++total_close_voting; // увеличиваем количество завершенных голосований
            emit ChangeStatus(_id, 2); // ID предложения, новый статус
        }
    }


    function execute(uint _id) external { // Исполнение предложения
        // _id - идентификатор предложения
        require(proposals[_id].status == 2, "proposal is not completed"); // только завершенное предложение можно привести к исполнению
        proposals[_id].status = 3; // меняем статус на состояние "Исполнено"
        if(proposals[_id].vocesYes.length > proposals[_id].vocesNo.length){ // если большинство проголосовало за принятия предложения, то приводим его в исполнение
            _execute(proposals[_id].to, proposals[_id].data);
        }
        emit ChangeStatus(_id, 3); // ID предложения, новый статус
    }

    function _execute(address _to, bytes memory _data) private {
        (bool success,) = _to.call(_data);
        require(success, "Execute error");
    }


    function claim(uint _id) external { // Получить вознаграждение за проведенное голосование
        // _id - идентификатор предложения
        require(proposals[_id].status > 1, "proposal is not completed"); // награду можно требовать только когда голосование завершено
        require(rewards[_id][msg.sender], "no payment"); // проверяем имеет ли отправитель право на выплату
        rewards[_id][msg.sender] = false; // фиксируем выплату отправителю

        uint _amount_votes = proposals[_id].vocesYes.length + proposals[_id].vocesNo.length; // количество проголосовавших
        uint _pay = proposals[_id].reward / _amount_votes; // расчет выплаты для каждого участника
        payable(msg.sender).transfer(_pay); // выплата
        emit Claim(msg.sender, _id, _pay); // Участник, ID предложения, сколько было выплачено
    }



    // ФУНКЦИИ ЧТЕНИЯ

    function getUser(address _user) public view returns (UserData memory) { // Возвращаем данные конкретного пользователя по его адресу
        return (users[_user]);
    }

    function getUsersList(uint _start_index, uint _amount) public view returns (UserData[] memory) { // Возвращаем данные нескольких пользователей из списка
        UserData[] memory _result = new UserData[](_amount);  
        for(uint i; i < _amount; i++) _result[i] = getUser(indexes[_start_index++]);
        return (_result);
    }

    function getProposal(uint _id) public view returns (ProposalData memory) { // Возвращаем данные конкретного предложения по его ID
        return (proposals[_id]);
    }

    function getProposalsList(uint _start_ID, uint _amount) public view returns (ProposalData[] memory) { // Возвращаем данные нескольких предложений из списка
        ProposalData[] memory _result = new ProposalData[](_amount);  
        for(uint i; i < _amount; i++) _result[i] = getProposal(_start_ID++);
        return (_result);
    }

    function checkClaim(uint _id, address _user) public view returns (bool) { // Проверяет наличие вознаграждения для указанного адреса, в указанном предложении
        return (rewards[_id][_user]);
    }

    function getClaimList(address _user, uint _start_ID, uint _amount) public view returns (uint [] memory, bool [] memory) { // Возвращаем массив предложений и массив наград для указанного адреса
        // _user - адрес для которого смотрим награды
        // _start_ID - с какого предложения начинать вести поиск наград
        // _amount - количество просматриваемых предложений
        uint[] memory _proposalID = new uint[](_amount);
        bool[] memory _claim = new bool[](_amount);

        for(uint i; i < _amount; i++){
            _proposalID[i] = _start_ID;
            _claim[i] = rewards[_start_ID][_user];
            ++_start_ID;
        } 
        return (_proposalID, _claim);
    }

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_firstUser","internalType":"address"},{"type":"string","name":"_name","internalType":"string"}]},{"type":"event","name":"ChangeStatus","inputs":[{"type":"uint256","name":"_id","internalType":"uint256","indexed":true},{"type":"uint8","name":"_status","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"Claim","inputs":[{"type":"address","name":"_sender","internalType":"address","indexed":true},{"type":"uint256","name":"_id","internalType":"uint256","indexed":true},{"type":"uint256","name":"_pay","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"CreateProposal","inputs":[{"type":"uint256","name":"_id","internalType":"uint256","indexed":true},{"type":"uint256","name":"_reward","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Vote","inputs":[{"type":"address","name":"_sender","internalType":"address","indexed":true},{"type":"uint256","name":"_id","internalType":"uint256","indexed":true},{"type":"bool","name":"_answer","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addUserInDAO","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkClaim","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"createProposal","inputs":[{"type":"address","name":"_contract","internalType":"address"},{"type":"bytes","name":"_data","internalType":"bytes"},{"type":"string","name":"_comment","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delUserInDAO","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"execute","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"expire_period","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"bool[]","name":"","internalType":"bool[]"}],"name":"getClaimList","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_start_ID","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct GovernanceDAO.ProposalData","components":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"time","internalType":"uint256"},{"type":"uint256","name":"reward","internalType":"uint256"},{"type":"uint256","name":"deadLine","internalType":"uint256"},{"type":"address","name":"owner","internalType":"address"},{"type":"uint8","name":"status","internalType":"uint8"},{"type":"string","name":"comment","internalType":"string"},{"type":"address[]","name":"vocesYes","internalType":"address[]"},{"type":"address[]","name":"vocesNo","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"bytes","name":"data","internalType":"bytes"}]}],"name":"getProposal","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct GovernanceDAO.ProposalData[]","components":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"time","internalType":"uint256"},{"type":"uint256","name":"reward","internalType":"uint256"},{"type":"uint256","name":"deadLine","internalType":"uint256"},{"type":"address","name":"owner","internalType":"address"},{"type":"uint8","name":"status","internalType":"uint8"},{"type":"string","name":"comment","internalType":"string"},{"type":"address[]","name":"vocesYes","internalType":"address[]"},{"type":"address[]","name":"vocesNo","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"bytes","name":"data","internalType":"bytes"}]}],"name":"getProposalsList","inputs":[{"type":"uint256","name":"_start_ID","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct GovernanceDAO.UserData","components":[{"type":"uint256","name":"index","internalType":"uint256"},{"type":"uint256","name":"votes","internalType":"uint256"},{"type":"uint256","name":"entered","internalType":"uint256"},{"type":"address","name":"userAddr","internalType":"address"},{"type":"string","name":"name","internalType":"string"}]}],"name":"getUser","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct GovernanceDAO.UserData[]","components":[{"type":"uint256","name":"index","internalType":"uint256"},{"type":"uint256","name":"votes","internalType":"uint256"},{"type":"uint256","name":"entered","internalType":"uint256"},{"type":"address","name":"userAddr","internalType":"address"},{"type":"string","name":"name","internalType":"string"}]}],"name":"getUsersList","inputs":[{"type":"uint256","name":"_start_index","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"min_payment_DAO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"min_payment_other","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExpirePeriod","inputs":[{"type":"uint256","name":"_period","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinPayments","inputs":[{"type":"uint256","name":"_min_payment_DAO","internalType":"uint256"},{"type":"uint256","name":"_min_payment_other","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"total_close_voting","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"total_user","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"total_voting","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"vote","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"},{"type":"bool","name":"_answer","internalType":"bool"}]}]
            

Contract Creation Code

0x60806040526203f48060035568056bc75e2d6310000060045569021e19e0c9bab24000006005553480156200003357600080fd5b50604051620041a4380380620041a48339818101604052810190620000599190620003c5565b6002600081546200006a9062000464565b919050819055508160066000600254815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060a00160405280600254815260200160008152602001600081526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815250600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004019081620001c19190620006f2565b509050505050620007d9565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200020e82620001e1565b9050919050565b620002208162000201565b81146200022c57600080fd5b50565b600081519050620002408162000215565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200029b8262000250565b810181811067ffffffffffffffff82111715620002bd57620002bc62000261565b5b80604052505050565b6000620002d2620001cd565b9050620002e0828262000290565b919050565b600067ffffffffffffffff82111562000303576200030262000261565b5b6200030e8262000250565b9050602081019050919050565b60005b838110156200033b5780820151818401526020810190506200031e565b60008484015250505050565b60006200035e6200035884620002e5565b620002c6565b9050828152602081018484840111156200037d576200037c6200024b565b5b6200038a8482856200031b565b509392505050565b600082601f830112620003aa57620003a962000246565b5b8151620003bc84826020860162000347565b91505092915050565b60008060408385031215620003df57620003de620001d7565b5b6000620003ef858286016200022f565b925050602083015167ffffffffffffffff811115620004135762000412620001dc565b5b620004218582860162000392565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600062000471826200045a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620004a657620004a56200042b565b5b600182019050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050457607f821691505b6020821081036200051a5762000519620004bc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000545565b62000590868362000545565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620005d3620005cd620005c7846200045a565b620005a8565b6200045a565b9050919050565b6000819050919050565b620005ef83620005b2565b62000607620005fe82620005da565b84845462000552565b825550505050565b600090565b6200061e6200060f565b6200062b818484620005e4565b505050565b5b8181101562000653576200064760008262000614565b60018101905062000631565b5050565b601f821115620006a2576200066c8162000520565b620006778462000535565b8101602085101562000687578190505b6200069f620006968562000535565b83018262000630565b50505b505050565b600082821c905092915050565b6000620006c760001984600802620006a7565b1980831691505092915050565b6000620006e28383620006b4565b9150826002028217905092915050565b620006fd82620004b1565b67ffffffffffffffff81111562000719576200071862000261565b5b620007258254620004eb565b6200073282828562000657565b600060209050601f8311600181146200076a576000841562000755578287015190505b620007618582620006d4565b865550620007d1565b601f1984166200077a8662000520565b60005b82811015620007a4578489015182556001820191506020850194506020810190506200077d565b86831015620007c45784890151620007c0601f891682620006b4565b8355505b6001600288020188555050505b505050505050565b6139bb80620007e96000396000f3fe60806040526004361061011f5760003560e01c80636f77926b116100a0578063ce83ad9611610064578063ce83ad96146103ef578063d7a52fa914610418578063eb72d0c814610441578063ef81bf1b1461047e578063fe0d94c1146104a75761011f565b80636f77926b146102f6578063b029091414610333578063be8e4d191461035e578063c7f758a814610389578063c9d27afe146103c65761011f565b8063396e75cc116100e7578063396e75cc1461020957806340912990146102465780634dee3534146102715780635d003332146102af57806364bd0cb2146102da5761011f565b806301081fc31461012457806310a4a2dc1461014d57806323ddd0711461017857806331218954146101a3578063379607f5146101e0575b600080fd5b34801561013057600080fd5b5061014b60048036038101906101469190612243565b6104d0565b005b34801561015957600080fd5b5061016261077d565b60405161016f9190612289565b60405180910390f35b34801561018457600080fd5b5061018d610783565b60405161019a9190612289565b60405180910390f35b3480156101af57600080fd5b506101ca60048036038101906101c591906122d0565b610789565b6040516101d7919061232b565b60405180910390f35b3480156101ec57600080fd5b5061020760048036038101906102029190612346565b6107f1565b005b34801561021557600080fd5b50610230600480360381019061022b9190612373565b610a63565b60405161023d9190612747565b60405180910390f35b34801561025257600080fd5b5061025b610b19565b6040516102689190612289565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612769565b610b1f565b6040516102a6929190612929565b60405180910390f35b3480156102bb57600080fd5b506102c4610c9a565b6040516102d19190612289565b60405180910390f35b6102f460048036038101906102ef9190612a1b565b610ca0565b005b34801561030257600080fd5b5061031d60048036038101906103189190612243565b610f7b565b60405161032a9190612b26565b60405180910390f35b34801561033f57600080fd5b506103486110da565b6040516103559190612289565b60405180910390f35b34801561036a57600080fd5b506103736110e0565b6040516103809190612289565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190612346565b6110e6565b6040516103bd9190612c4c565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190612c9a565b611445565b005b3480156103fb57600080fd5b5061041660048036038101906104119190612cda565b611972565b005b34801561042457600080fd5b5061043f600480360381019061043a9190612346565b611c13565b005b34801561044d57600080fd5b5061046860048036038101906104639190612373565b611ca7565b6040516104759190612e72565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190612373565b611d90565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190612346565b611e10565b005b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461053e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053590612ef1565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111156107795760025481146106995760066000600254815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b60066000600254815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560048201600061076091906120b0565b505060026000815461077190612f40565b919050819055505b5050565b60035481565b60015481565b60006009600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60016008600083815260200190815260200160002060040160149054906101000a900460ff1660ff161161085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190612fb5565b60405180910390fd5b6009600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90613021565b60405180910390fd5b60006009600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600860008381526020019081526020016000206007018054905060086000848152602001908152602001600020600601805490506109a09190613041565b905060008160086000858152602001908152602001600020600201546109c691906130a4565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a0e573d6000803e3d6000fd5b50823373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf783604051610a569190612289565b60405180910390a3505050565b606060008267ffffffffffffffff811115610a8157610a806130d5565b5b604051908082528060200260200182016040528015610aba57816020015b610aa76120f0565b815260200190600190039081610a9f5790505b50905060005b83811015610b0e57610add8580610ad690613104565b96506110e6565b828281518110610af057610aef61314c565b5b60200260200101819052508080610b0690613104565b915050610ac0565b508091505092915050565b60025481565b60608060008367ffffffffffffffff811115610b3e57610b3d6130d5565b5b604051908082528060200260200182016040528015610b6c5781602001602082028036833780820191505090505b50905060008467ffffffffffffffff811115610b8b57610b8a6130d5565b5b604051908082528060200260200182016040528015610bb95781602001602082028036833780820191505090505b50905060005b85811015610c895786838281518110610bdb57610bda61314c565b5b6020026020010181815250506009600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16828281518110610c5857610c5761314c565b5b60200260200101901515908115158152505086610c7490613104565b96508080610c8190613104565b915050610bbf565b508181935093505050935093915050565b60045481565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610d3557600454341015610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d27906131c7565b60405180910390fd5b610d7b565b600554341015610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906131c7565b60405180910390fd5b5b6000808154610d8990613104565b91905081905550600054600860008054815260200190815260200160002060000181905550426008600080548152602001908152602001600020600101819055503460086000805481526020019081526020016000206002018190555060035442610df49190613041565b60086000805481526020019081526020016000206003018190555033600860008054815260200190815260200160002060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860008054815260200190815260200160002060040160146101000a81548160ff021916908360ff160217905550818160086000805481526020019081526020016000206005019182610ebc9291906133fe565b5084600860008054815260200190815260200160002060080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838360086000805481526020019081526020016000206009019182610f39929190613534565b506000547f6638d63c6abdbf0a059e322e8c8b9401488d94b95731a935ca9f76cde49fa48334604051610f6c9190612289565b60405180910390a25050505050565b610f83612179565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201805461105190613221565b80601f016020809104026020016040519081016040528092919081815260200182805461107d90613221565b80156110ca5780601f1061109f576101008083540402835291602001916110ca565b820191906000526020600020905b8154815290600101906020018083116110ad57829003601f168201915b5050505050815250509050919050565b60055481565b60005481565b6110ee6120f0565b6008600083815260200190815260200160002060405180610160016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160149054906101000a900460ff1660ff1660ff1681526020016005820180546111b890613221565b80601f01602080910402602001604051908101604052809291908181526020018280546111e490613221565b80156112315780601f1061120657610100808354040283529160200191611231565b820191906000526020600020905b81548152906001019060200180831161121457829003601f168201915b50505050508152602001600682018054806020026020016040519081016040528092919081815260200182805480156112bf57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611275575b505050505081526020016007820180548060200260200160405190810160405280929190818152602001828054801561134d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611303575b505050505081526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820180546113bc90613221565b80601f01602080910402602001604051908101604052809291908181526020018280546113e890613221565b80156114355780601f1061140a57610100808354040283529160200191611435565b820191906000526020600020905b81548152906001019060200180831161141857829003601f168201915b5050505050815250509050919050565b600060086000848152602001908152602001600020600101541161149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590613650565b60405180910390fd5b60016008600084815260200190815260200160002060040160149054906101000a900460ff1660ff161161196e57600860008381526020019081526020016000206003015442111561156e5760026008600084815260200190815260200160002060040160146101000a81548160ff021916908360ff16021790555060016000815461152990613104565b91905081905550817f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e8600260405161156191906136ab565b60405180910390a261196e565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081116115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90613712565b60405180910390fd5b6009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168d9061377e565b60405180910390fd5b60016009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600081548092919061175290613104565b9190505550823373ffffffffffffffffffffffffffffffffffffffff167f8d85a70fd2c5d140a4a01143492d27ff82cfad4cead313e66c53f39b0feb5e0f8460405161179e919061232b565b60405180910390a381156118285760086000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506118a0565b60086000848152602001908152602001600020600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600860008581526020019081526020016000206007018054905060086000868152602001908152602001600020600601805490506118e09190613041565b9050600254810361196b5760026008600086815260200190815260200160002060040160146101000a81548160ff021916908360ff16021790555060016000815461192a90613104565b91905081905550837f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e8600260405161196291906136ab565b60405180910390a25b50505b5050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790612ef1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160315611c0e576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403611c0d57600260008154611a6e90613104565b919050819055508260066000600254815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060a0016040528060025481526020016000815260200160015481526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004019081611c08919061379e565b509050505b5b505050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890612ef1565b60405180910390fd5b6203f4808110158015611c975750621275008111155b15611ca457806003819055505b50565b606060008267ffffffffffffffff811115611cc557611cc46130d5565b5b604051908082528060200260200182016040528015611cfe57816020015b611ceb612179565b815260200190600190039081611ce35790505b50905060005b83811015611d8557611d54600660008780611d1e90613104565b9850815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f7b565b828281518110611d6757611d6661314c565b5b60200260200101819052508080611d7d90613104565b915050611d04565b508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df590612ef1565b60405180910390fd5b81600481905550806005819055505050565b60026008600083815260200190815260200160002060040160149054906101000a900460ff1660ff1614611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090612fb5565b60405180910390fd5b60036008600083815260200190815260200160002060040160146101000a81548160ff021916908360ff160217905550600860008281526020019081526020016000206007018054905060086000838152602001908152602001600020600601805490501115611fc257611fc16008600083815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860008481526020019081526020016000206009018054611f3e90613221565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6a90613221565b8015611fb75780601f10611f8c57610100808354040283529160200191611fb7565b820191906000526020600020905b815481529060010190602001808311611f9a57829003601f168201915b5050505050611ffe565b5b807f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e86003604051611ff391906138ab565b60405180910390a250565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516120259190613902565b6000604051808303816000865af19150503d8060008114612062576040519150601f19603f3d011682016040523d82523d6000602084013e612067565b606091505b50509050806120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a290613965565b60405180910390fd5b505050565b5080546120bc90613221565b6000825580601f106120ce57506120ed565b601f0160209004906000526020600020908101906120ec91906121be565b5b50565b60405180610160016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b5b808211156121d75760008160009055506001016121bf565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612210826121e5565b9050919050565b61222081612205565b811461222b57600080fd5b50565b60008135905061223d81612217565b92915050565b600060208284031215612259576122586121db565b5b60006122678482850161222e565b91505092915050565b6000819050919050565b61228381612270565b82525050565b600060208201905061229e600083018461227a565b92915050565b6122ad81612270565b81146122b857600080fd5b50565b6000813590506122ca816122a4565b92915050565b600080604083850312156122e7576122e66121db565b5b60006122f5858286016122bb565b92505060206123068582860161222e565b9150509250929050565b60008115159050919050565b61232581612310565b82525050565b6000602082019050612340600083018461231c565b92915050565b60006020828403121561235c5761235b6121db565b5b600061236a848285016122bb565b91505092915050565b6000806040838503121561238a576123896121db565b5b6000612398858286016122bb565b92505060206123a9858286016122bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123e881612270565b82525050565b6123f781612205565b82525050565b600060ff82169050919050565b612413816123fd565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612453578082015181840152602081019050612438565b60008484015250505050565b6000601f19601f8301169050919050565b600061247b82612419565b6124858185612424565b9350612495818560208601612435565b61249e8161245f565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006124e183836123ee565b60208301905092915050565b6000602082019050919050565b6000612505826124a9565b61250f81856124b4565b935061251a836124c5565b8060005b8381101561254b57815161253288826124d5565b975061253d836124ed565b92505060018101905061251e565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b600061257f82612558565b6125898185612563565b9350612599818560208601612435565b6125a28161245f565b840191505092915050565b6000610160830160008301516125c660008601826123df565b5060208301516125d960208601826123df565b5060408301516125ec60408601826123df565b5060608301516125ff60608601826123df565b50608083015161261260808601826123ee565b5060a083015161262560a086018261240a565b5060c083015184820360c086015261263d8282612470565b91505060e083015184820360e086015261265782826124fa565b91505061010083015184820361010086015261267382826124fa565b91505061012083015161268a6101208601826123ee565b506101408301518482036101408601526126a48282612574565b9150508091505092915050565b60006126bd83836125ad565b905092915050565b6000602082019050919050565b60006126dd826123b3565b6126e781856123be565b9350836020820285016126f9856123cf565b8060005b85811015612735578484038952815161271685826126b1565b9450612721836126c5565b925060208a019950506001810190506126fd565b50829750879550505050505092915050565b6000602082019050818103600083015261276181846126d2565b905092915050565b600080600060608486031215612782576127816121db565b5b60006127908682870161222e565b93505060206127a1868287016122bb565b92505060406127b2868287016122bb565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006127f483836123df565b60208301905092915050565b6000602082019050919050565b6000612818826127bc565b61282281856127c7565b935061282d836127d8565b8060005b8381101561285e57815161284588826127e8565b975061285083612800565b925050600181019050612831565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6128a081612310565b82525050565b60006128b28383612897565b60208301905092915050565b6000602082019050919050565b60006128d68261286b565b6128e08185612876565b93506128eb83612887565b8060005b8381101561291c57815161290388826128a6565b975061290e836128be565b9250506001810190506128ef565b5085935050505092915050565b60006040820190508181036000830152612943818561280d565b9050818103602083015261295781846128cb565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261298557612984612960565b5b8235905067ffffffffffffffff8111156129a2576129a1612965565b5b6020830191508360018202830111156129be576129bd61296a565b5b9250929050565b60008083601f8401126129db576129da612960565b5b8235905067ffffffffffffffff8111156129f8576129f7612965565b5b602083019150836001820283011115612a1457612a1361296a565b5b9250929050565b600080600080600060608688031215612a3757612a366121db565b5b6000612a458882890161222e565b955050602086013567ffffffffffffffff811115612a6657612a656121e0565b5b612a728882890161296f565b9450945050604086013567ffffffffffffffff811115612a9557612a946121e0565b5b612aa1888289016129c5565b92509250509295509295909350565b600060a083016000830151612ac860008601826123df565b506020830151612adb60208601826123df565b506040830151612aee60408601826123df565b506060830151612b0160608601826123ee565b5060808301518482036080860152612b198282612470565b9150508091505092915050565b60006020820190508181036000830152612b408184612ab0565b905092915050565b600061016083016000830151612b6160008601826123df565b506020830151612b7460208601826123df565b506040830151612b8760408601826123df565b506060830151612b9a60608601826123df565b506080830151612bad60808601826123ee565b5060a0830151612bc060a086018261240a565b5060c083015184820360c0860152612bd88282612470565b91505060e083015184820360e0860152612bf282826124fa565b915050610100830151848203610100860152612c0e82826124fa565b915050610120830151612c256101208601826123ee565b50610140830151848203610140860152612c3f8282612574565b9150508091505092915050565b60006020820190508181036000830152612c668184612b48565b905092915050565b612c7781612310565b8114612c8257600080fd5b50565b600081359050612c9481612c6e565b92915050565b60008060408385031215612cb157612cb06121db565b5b6000612cbf858286016122bb565b9250506020612cd085828601612c85565b9150509250929050565b600080600060408486031215612cf357612cf26121db565b5b6000612d018682870161222e565b935050602084013567ffffffffffffffff811115612d2257612d216121e0565b5b612d2e868287016129c5565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060a083016000830151612d7e60008601826123df565b506020830151612d9160208601826123df565b506040830151612da460408601826123df565b506060830151612db760608601826123ee565b5060808301518482036080860152612dcf8282612470565b9150508091505092915050565b6000612de88383612d66565b905092915050565b6000602082019050919050565b6000612e0882612d3a565b612e128185612d45565b935083602082028501612e2485612d56565b8060005b85811015612e605784840389528151612e418582612ddc565b9450612e4c83612df0565b925060208a01995050600181019050612e28565b50829750879550505050505092915050565b60006020820190508181036000830152612e8c8184612dfd565b905092915050565b600082825260208201905092915050565b7f4f6e6c7920476f7665726e616e636544414f0000000000000000000000000000600082015250565b6000612edb601283612e94565b9150612ee682612ea5565b602082019050919050565b60006020820190508181036000830152612f0a81612ece565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f4b82612270565b915060008203612f5e57612f5d612f11565b5b600182039050919050565b7f70726f706f73616c206973206e6f7420636f6d706c6574656400000000000000600082015250565b6000612f9f601983612e94565b9150612faa82612f69565b602082019050919050565b60006020820190508181036000830152612fce81612f92565b9050919050565b7f6e6f207061796d656e7400000000000000000000000000000000000000000000600082015250565b600061300b600a83612e94565b915061301682612fd5565b602082019050919050565b6000602082019050818103600083015261303a81612ffe565b9050919050565b600061304c82612270565b915061305783612270565b925082820190508082111561306f5761306e612f11565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006130af82612270565b91506130ba83612270565b9250826130ca576130c9613075565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061310f82612270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361314157613140612f11565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f736d616c6c207061796d656e7400000000000000000000000000000000000000600082015250565b60006131b1600d83612e94565b91506131bc8261317b565b602082019050919050565b600060208201905081810360008301526131e0816131a4565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061323957607f821691505b60208210810361324c5761324b6131f2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613277565b6132be8683613277565b95508019841693508086168417925050509392505050565b6000819050919050565b60006132fb6132f66132f184612270565b6132d6565b612270565b9050919050565b6000819050919050565b613315836132e0565b61332961332182613302565b848454613284565b825550505050565b600090565b61333e613331565b61334981848461330c565b505050565b5b8181101561336d57613362600082613336565b60018101905061334f565b5050565b601f8211156133b25761338381613252565b61338c84613267565b8101602085101561339b578190505b6133af6133a785613267565b83018261334e565b50505b505050565b600082821c905092915050565b60006133d5600019846008026133b7565b1980831691505092915050565b60006133ee83836133c4565b9150826002028217905092915050565b61340883836131e7565b67ffffffffffffffff811115613421576134206130d5565b5b61342b8254613221565b613436828285613371565b6000601f8311600181146134655760008415613453578287013590505b61345d85826133e2565b8655506134c5565b601f19841661347386613252565b60005b8281101561349b57848901358255600182019150602085019450602081019050613476565b868310156134b857848901356134b4601f8916826133c4565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b60008190508160005260206000209050919050565b601f82111561352f57613500816134d9565b61350984613267565b81016020851015613518578190505b61352c61352485613267565b83018261334e565b50505b505050565b61353e83836134ce565b67ffffffffffffffff811115613557576135566130d5565b5b6135618254613221565b61356c8282856134ee565b6000601f83116001811461359b5760008415613589578287013590505b61359385826133e2565b8655506135fb565b601f1984166135a9866134d9565b60005b828110156135d1578489013582556001820191506020850194506020810190506135ac565b868310156135ee57848901356135ea601f8916826133c4565b8355505b6001600288020188555050505b50505050505050565b7f70726f706f73616c20646f6573206e6f74206578697374000000000000000000600082015250565b600061363a601783612e94565b915061364582613604565b602082019050919050565b600060208201905081810360008301526136698161362d565b9050919050565b6000819050919050565b600061369561369061368b84613670565b6132d6565b6123fd565b9050919050565b6136a58161367a565b82525050565b60006020820190506136c0600083018461369c565b92915050565b7f796f7520617265206e6f742061206d656d626572000000000000000000000000600082015250565b60006136fc601483612e94565b9150613707826136c6565b602082019050919050565b6000602082019050818103600083015261372b816136ef565b9050919050565b7f796f75206861766520616c726561647920766f74656400000000000000000000600082015250565b6000613768601683612e94565b915061377382613732565b602082019050919050565b600060208201905081810360008301526137978161375b565b9050919050565b6137a782612419565b67ffffffffffffffff8111156137c0576137bf6130d5565b5b6137ca8254613221565b6137d5828285613371565b600060209050601f83116001811461380857600084156137f6578287015190505b61380085826133e2565b865550613868565b601f19841661381686613252565b60005b8281101561383e57848901518255600182019150602085019450602081019050613819565b8683101561385b5784890151613857601f8916826133c4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b600061389561389061388b84613870565b6132d6565b6123fd565b9050919050565b6138a58161387a565b82525050565b60006020820190506138c0600083018461389c565b92915050565b600081905092915050565b60006138dc82612558565b6138e681856138c6565b93506138f6818560208601612435565b80840191505092915050565b600061390e82846138d1565b915081905092915050565b7f45786563757465206572726f7200000000000000000000000000000000000000600082015250565b600061394f600d83612e94565b915061395a82613919565b602082019050919050565b6000602082019050818103600083015261397e81613942565b905091905056fea264697066735822122060073151b861e65e386e136f2772337128d9e4687acfe14e7d1ce48a611e5bb464736f6c63430008100033000000000000000000000000ebe894814554c8382ea6a24ccddf1527407a24f6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000055570617574000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x60806040526004361061011f5760003560e01c80636f77926b116100a0578063ce83ad9611610064578063ce83ad96146103ef578063d7a52fa914610418578063eb72d0c814610441578063ef81bf1b1461047e578063fe0d94c1146104a75761011f565b80636f77926b146102f6578063b029091414610333578063be8e4d191461035e578063c7f758a814610389578063c9d27afe146103c65761011f565b8063396e75cc116100e7578063396e75cc1461020957806340912990146102465780634dee3534146102715780635d003332146102af57806364bd0cb2146102da5761011f565b806301081fc31461012457806310a4a2dc1461014d57806323ddd0711461017857806331218954146101a3578063379607f5146101e0575b600080fd5b34801561013057600080fd5b5061014b60048036038101906101469190612243565b6104d0565b005b34801561015957600080fd5b5061016261077d565b60405161016f9190612289565b60405180910390f35b34801561018457600080fd5b5061018d610783565b60405161019a9190612289565b60405180910390f35b3480156101af57600080fd5b506101ca60048036038101906101c591906122d0565b610789565b6040516101d7919061232b565b60405180910390f35b3480156101ec57600080fd5b5061020760048036038101906102029190612346565b6107f1565b005b34801561021557600080fd5b50610230600480360381019061022b9190612373565b610a63565b60405161023d9190612747565b60405180910390f35b34801561025257600080fd5b5061025b610b19565b6040516102689190612289565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612769565b610b1f565b6040516102a6929190612929565b60405180910390f35b3480156102bb57600080fd5b506102c4610c9a565b6040516102d19190612289565b60405180910390f35b6102f460048036038101906102ef9190612a1b565b610ca0565b005b34801561030257600080fd5b5061031d60048036038101906103189190612243565b610f7b565b60405161032a9190612b26565b60405180910390f35b34801561033f57600080fd5b506103486110da565b6040516103559190612289565b60405180910390f35b34801561036a57600080fd5b506103736110e0565b6040516103809190612289565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190612346565b6110e6565b6040516103bd9190612c4c565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190612c9a565b611445565b005b3480156103fb57600080fd5b5061041660048036038101906104119190612cda565b611972565b005b34801561042457600080fd5b5061043f600480360381019061043a9190612346565b611c13565b005b34801561044d57600080fd5b5061046860048036038101906104639190612373565b611ca7565b6040516104759190612e72565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190612373565b611d90565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190612346565b611e10565b005b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461053e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053590612ef1565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111156107795760025481146106995760066000600254815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b60066000600254815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560048201600061076091906120b0565b505060026000815461077190612f40565b919050819055505b5050565b60035481565b60015481565b60006009600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60016008600083815260200190815260200160002060040160149054906101000a900460ff1660ff161161085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085190612fb5565b60405180910390fd5b6009600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90613021565b60405180910390fd5b60006009600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600860008381526020019081526020016000206007018054905060086000848152602001908152602001600020600601805490506109a09190613041565b905060008160086000858152602001908152602001600020600201546109c691906130a4565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a0e573d6000803e3d6000fd5b50823373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf783604051610a569190612289565b60405180910390a3505050565b606060008267ffffffffffffffff811115610a8157610a806130d5565b5b604051908082528060200260200182016040528015610aba57816020015b610aa76120f0565b815260200190600190039081610a9f5790505b50905060005b83811015610b0e57610add8580610ad690613104565b96506110e6565b828281518110610af057610aef61314c565b5b60200260200101819052508080610b0690613104565b915050610ac0565b508091505092915050565b60025481565b60608060008367ffffffffffffffff811115610b3e57610b3d6130d5565b5b604051908082528060200260200182016040528015610b6c5781602001602082028036833780820191505090505b50905060008467ffffffffffffffff811115610b8b57610b8a6130d5565b5b604051908082528060200260200182016040528015610bb95781602001602082028036833780820191505090505b50905060005b85811015610c895786838281518110610bdb57610bda61314c565b5b6020026020010181815250506009600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16828281518110610c5857610c5761314c565b5b60200260200101901515908115158152505086610c7490613104565b96508080610c8190613104565b915050610bbf565b508181935093505050935093915050565b60045481565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610d3557600454341015610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d27906131c7565b60405180910390fd5b610d7b565b600554341015610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906131c7565b60405180910390fd5b5b6000808154610d8990613104565b91905081905550600054600860008054815260200190815260200160002060000181905550426008600080548152602001908152602001600020600101819055503460086000805481526020019081526020016000206002018190555060035442610df49190613041565b60086000805481526020019081526020016000206003018190555033600860008054815260200190815260200160002060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860008054815260200190815260200160002060040160146101000a81548160ff021916908360ff160217905550818160086000805481526020019081526020016000206005019182610ebc9291906133fe565b5084600860008054815260200190815260200160002060080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838360086000805481526020019081526020016000206009019182610f39929190613534565b506000547f6638d63c6abdbf0a059e322e8c8b9401488d94b95731a935ca9f76cde49fa48334604051610f6c9190612289565b60405180910390a25050505050565b610f83612179565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201805461105190613221565b80601f016020809104026020016040519081016040528092919081815260200182805461107d90613221565b80156110ca5780601f1061109f576101008083540402835291602001916110ca565b820191906000526020600020905b8154815290600101906020018083116110ad57829003601f168201915b5050505050815250509050919050565b60055481565b60005481565b6110ee6120f0565b6008600083815260200190815260200160002060405180610160016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160149054906101000a900460ff1660ff1660ff1681526020016005820180546111b890613221565b80601f01602080910402602001604051908101604052809291908181526020018280546111e490613221565b80156112315780601f1061120657610100808354040283529160200191611231565b820191906000526020600020905b81548152906001019060200180831161121457829003601f168201915b50505050508152602001600682018054806020026020016040519081016040528092919081815260200182805480156112bf57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611275575b505050505081526020016007820180548060200260200160405190810160405280929190818152602001828054801561134d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611303575b505050505081526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820180546113bc90613221565b80601f01602080910402602001604051908101604052809291908181526020018280546113e890613221565b80156114355780601f1061140a57610100808354040283529160200191611435565b820191906000526020600020905b81548152906001019060200180831161141857829003601f168201915b5050505050815250509050919050565b600060086000848152602001908152602001600020600101541161149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590613650565b60405180910390fd5b60016008600084815260200190815260200160002060040160149054906101000a900460ff1660ff161161196e57600860008381526020019081526020016000206003015442111561156e5760026008600084815260200190815260200160002060040160146101000a81548160ff021916908360ff16021790555060016000815461152990613104565b91905081905550817f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e8600260405161156191906136ab565b60405180910390a261196e565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081116115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90613712565b60405180910390fd5b6009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168d9061377e565b60405180910390fd5b60016009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600081548092919061175290613104565b9190505550823373ffffffffffffffffffffffffffffffffffffffff167f8d85a70fd2c5d140a4a01143492d27ff82cfad4cead313e66c53f39b0feb5e0f8460405161179e919061232b565b60405180910390a381156118285760086000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506118a0565b60086000848152602001908152602001600020600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600860008581526020019081526020016000206007018054905060086000868152602001908152602001600020600601805490506118e09190613041565b9050600254810361196b5760026008600086815260200190815260200160002060040160146101000a81548160ff021916908360ff16021790555060016000815461192a90613104565b91905081905550837f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e8600260405161196291906136ab565b60405180910390a25b50505b5050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790612ef1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160315611c0e576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403611c0d57600260008154611a6e90613104565b919050819055508260066000600254815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060a0016040528060025481526020016000815260200160015481526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004019081611c08919061379e565b509050505b5b505050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890612ef1565b60405180910390fd5b6203f4808110158015611c975750621275008111155b15611ca457806003819055505b50565b606060008267ffffffffffffffff811115611cc557611cc46130d5565b5b604051908082528060200260200182016040528015611cfe57816020015b611ceb612179565b815260200190600190039081611ce35790505b50905060005b83811015611d8557611d54600660008780611d1e90613104565b9850815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f7b565b828281518110611d6757611d6661314c565b5b60200260200101819052508080611d7d90613104565b915050611d04565b508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df590612ef1565b60405180910390fd5b81600481905550806005819055505050565b60026008600083815260200190815260200160002060040160149054906101000a900460ff1660ff1614611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090612fb5565b60405180910390fd5b60036008600083815260200190815260200160002060040160146101000a81548160ff021916908360ff160217905550600860008281526020019081526020016000206007018054905060086000838152602001908152602001600020600601805490501115611fc257611fc16008600083815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860008481526020019081526020016000206009018054611f3e90613221565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6a90613221565b8015611fb75780601f10611f8c57610100808354040283529160200191611fb7565b820191906000526020600020905b815481529060010190602001808311611f9a57829003601f168201915b5050505050611ffe565b5b807f199c49764c24c272ab05711f746ea69945084e537b524515f05902c3c9a7e9e86003604051611ff391906138ab565b60405180910390a250565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516120259190613902565b6000604051808303816000865af19150503d8060008114612062576040519150601f19603f3d011682016040523d82523d6000602084013e612067565b606091505b50509050806120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a290613965565b60405180910390fd5b505050565b5080546120bc90613221565b6000825580601f106120ce57506120ed565b601f0160209004906000526020600020908101906120ec91906121be565b5b50565b60405180610160016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b5b808211156121d75760008160009055506001016121bf565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612210826121e5565b9050919050565b61222081612205565b811461222b57600080fd5b50565b60008135905061223d81612217565b92915050565b600060208284031215612259576122586121db565b5b60006122678482850161222e565b91505092915050565b6000819050919050565b61228381612270565b82525050565b600060208201905061229e600083018461227a565b92915050565b6122ad81612270565b81146122b857600080fd5b50565b6000813590506122ca816122a4565b92915050565b600080604083850312156122e7576122e66121db565b5b60006122f5858286016122bb565b92505060206123068582860161222e565b9150509250929050565b60008115159050919050565b61232581612310565b82525050565b6000602082019050612340600083018461231c565b92915050565b60006020828403121561235c5761235b6121db565b5b600061236a848285016122bb565b91505092915050565b6000806040838503121561238a576123896121db565b5b6000612398858286016122bb565b92505060206123a9858286016122bb565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123e881612270565b82525050565b6123f781612205565b82525050565b600060ff82169050919050565b612413816123fd565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612453578082015181840152602081019050612438565b60008484015250505050565b6000601f19601f8301169050919050565b600061247b82612419565b6124858185612424565b9350612495818560208601612435565b61249e8161245f565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006124e183836123ee565b60208301905092915050565b6000602082019050919050565b6000612505826124a9565b61250f81856124b4565b935061251a836124c5565b8060005b8381101561254b57815161253288826124d5565b975061253d836124ed565b92505060018101905061251e565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b600061257f82612558565b6125898185612563565b9350612599818560208601612435565b6125a28161245f565b840191505092915050565b6000610160830160008301516125c660008601826123df565b5060208301516125d960208601826123df565b5060408301516125ec60408601826123df565b5060608301516125ff60608601826123df565b50608083015161261260808601826123ee565b5060a083015161262560a086018261240a565b5060c083015184820360c086015261263d8282612470565b91505060e083015184820360e086015261265782826124fa565b91505061010083015184820361010086015261267382826124fa565b91505061012083015161268a6101208601826123ee565b506101408301518482036101408601526126a48282612574565b9150508091505092915050565b60006126bd83836125ad565b905092915050565b6000602082019050919050565b60006126dd826123b3565b6126e781856123be565b9350836020820285016126f9856123cf565b8060005b85811015612735578484038952815161271685826126b1565b9450612721836126c5565b925060208a019950506001810190506126fd565b50829750879550505050505092915050565b6000602082019050818103600083015261276181846126d2565b905092915050565b600080600060608486031215612782576127816121db565b5b60006127908682870161222e565b93505060206127a1868287016122bb565b92505060406127b2868287016122bb565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006127f483836123df565b60208301905092915050565b6000602082019050919050565b6000612818826127bc565b61282281856127c7565b935061282d836127d8565b8060005b8381101561285e57815161284588826127e8565b975061285083612800565b925050600181019050612831565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6128a081612310565b82525050565b60006128b28383612897565b60208301905092915050565b6000602082019050919050565b60006128d68261286b565b6128e08185612876565b93506128eb83612887565b8060005b8381101561291c57815161290388826128a6565b975061290e836128be565b9250506001810190506128ef565b5085935050505092915050565b60006040820190508181036000830152612943818561280d565b9050818103602083015261295781846128cb565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261298557612984612960565b5b8235905067ffffffffffffffff8111156129a2576129a1612965565b5b6020830191508360018202830111156129be576129bd61296a565b5b9250929050565b60008083601f8401126129db576129da612960565b5b8235905067ffffffffffffffff8111156129f8576129f7612965565b5b602083019150836001820283011115612a1457612a1361296a565b5b9250929050565b600080600080600060608688031215612a3757612a366121db565b5b6000612a458882890161222e565b955050602086013567ffffffffffffffff811115612a6657612a656121e0565b5b612a728882890161296f565b9450945050604086013567ffffffffffffffff811115612a9557612a946121e0565b5b612aa1888289016129c5565b92509250509295509295909350565b600060a083016000830151612ac860008601826123df565b506020830151612adb60208601826123df565b506040830151612aee60408601826123df565b506060830151612b0160608601826123ee565b5060808301518482036080860152612b198282612470565b9150508091505092915050565b60006020820190508181036000830152612b408184612ab0565b905092915050565b600061016083016000830151612b6160008601826123df565b506020830151612b7460208601826123df565b506040830151612b8760408601826123df565b506060830151612b9a60608601826123df565b506080830151612bad60808601826123ee565b5060a0830151612bc060a086018261240a565b5060c083015184820360c0860152612bd88282612470565b91505060e083015184820360e0860152612bf282826124fa565b915050610100830151848203610100860152612c0e82826124fa565b915050610120830151612c256101208601826123ee565b50610140830151848203610140860152612c3f8282612574565b9150508091505092915050565b60006020820190508181036000830152612c668184612b48565b905092915050565b612c7781612310565b8114612c8257600080fd5b50565b600081359050612c9481612c6e565b92915050565b60008060408385031215612cb157612cb06121db565b5b6000612cbf858286016122bb565b9250506020612cd085828601612c85565b9150509250929050565b600080600060408486031215612cf357612cf26121db565b5b6000612d018682870161222e565b935050602084013567ffffffffffffffff811115612d2257612d216121e0565b5b612d2e868287016129c5565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060a083016000830151612d7e60008601826123df565b506020830151612d9160208601826123df565b506040830151612da460408601826123df565b506060830151612db760608601826123ee565b5060808301518482036080860152612dcf8282612470565b9150508091505092915050565b6000612de88383612d66565b905092915050565b6000602082019050919050565b6000612e0882612d3a565b612e128185612d45565b935083602082028501612e2485612d56565b8060005b85811015612e605784840389528151612e418582612ddc565b9450612e4c83612df0565b925060208a01995050600181019050612e28565b50829750879550505050505092915050565b60006020820190508181036000830152612e8c8184612dfd565b905092915050565b600082825260208201905092915050565b7f4f6e6c7920476f7665726e616e636544414f0000000000000000000000000000600082015250565b6000612edb601283612e94565b9150612ee682612ea5565b602082019050919050565b60006020820190508181036000830152612f0a81612ece565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f4b82612270565b915060008203612f5e57612f5d612f11565b5b600182039050919050565b7f70726f706f73616c206973206e6f7420636f6d706c6574656400000000000000600082015250565b6000612f9f601983612e94565b9150612faa82612f69565b602082019050919050565b60006020820190508181036000830152612fce81612f92565b9050919050565b7f6e6f207061796d656e7400000000000000000000000000000000000000000000600082015250565b600061300b600a83612e94565b915061301682612fd5565b602082019050919050565b6000602082019050818103600083015261303a81612ffe565b9050919050565b600061304c82612270565b915061305783612270565b925082820190508082111561306f5761306e612f11565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006130af82612270565b91506130ba83612270565b9250826130ca576130c9613075565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061310f82612270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361314157613140612f11565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f736d616c6c207061796d656e7400000000000000000000000000000000000000600082015250565b60006131b1600d83612e94565b91506131bc8261317b565b602082019050919050565b600060208201905081810360008301526131e0816131a4565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061323957607f821691505b60208210810361324c5761324b6131f2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613277565b6132be8683613277565b95508019841693508086168417925050509392505050565b6000819050919050565b60006132fb6132f66132f184612270565b6132d6565b612270565b9050919050565b6000819050919050565b613315836132e0565b61332961332182613302565b848454613284565b825550505050565b600090565b61333e613331565b61334981848461330c565b505050565b5b8181101561336d57613362600082613336565b60018101905061334f565b5050565b601f8211156133b25761338381613252565b61338c84613267565b8101602085101561339b578190505b6133af6133a785613267565b83018261334e565b50505b505050565b600082821c905092915050565b60006133d5600019846008026133b7565b1980831691505092915050565b60006133ee83836133c4565b9150826002028217905092915050565b61340883836131e7565b67ffffffffffffffff811115613421576134206130d5565b5b61342b8254613221565b613436828285613371565b6000601f8311600181146134655760008415613453578287013590505b61345d85826133e2565b8655506134c5565b601f19841661347386613252565b60005b8281101561349b57848901358255600182019150602085019450602081019050613476565b868310156134b857848901356134b4601f8916826133c4565b8355505b6001600288020188555050505b50505050505050565b600082905092915050565b60008190508160005260206000209050919050565b601f82111561352f57613500816134d9565b61350984613267565b81016020851015613518578190505b61352c61352485613267565b83018261334e565b50505b505050565b61353e83836134ce565b67ffffffffffffffff811115613557576135566130d5565b5b6135618254613221565b61356c8282856134ee565b6000601f83116001811461359b5760008415613589578287013590505b61359385826133e2565b8655506135fb565b601f1984166135a9866134d9565b60005b828110156135d1578489013582556001820191506020850194506020810190506135ac565b868310156135ee57848901356135ea601f8916826133c4565b8355505b6001600288020188555050505b50505050505050565b7f70726f706f73616c20646f6573206e6f74206578697374000000000000000000600082015250565b600061363a601783612e94565b915061364582613604565b602082019050919050565b600060208201905081810360008301526136698161362d565b9050919050565b6000819050919050565b600061369561369061368b84613670565b6132d6565b6123fd565b9050919050565b6136a58161367a565b82525050565b60006020820190506136c0600083018461369c565b92915050565b7f796f7520617265206e6f742061206d656d626572000000000000000000000000600082015250565b60006136fc601483612e94565b9150613707826136c6565b602082019050919050565b6000602082019050818103600083015261372b816136ef565b9050919050565b7f796f75206861766520616c726561647920766f74656400000000000000000000600082015250565b6000613768601683612e94565b915061377382613732565b602082019050919050565b600060208201905081810360008301526137978161375b565b9050919050565b6137a782612419565b67ffffffffffffffff8111156137c0576137bf6130d5565b5b6137ca8254613221565b6137d5828285613371565b600060209050601f83116001811461380857600084156137f6578287015190505b61380085826133e2565b865550613868565b601f19841661381686613252565b60005b8281101561383e57848901518255600182019150602085019450602081019050613819565b8683101561385b5784890151613857601f8916826133c4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b600061389561389061388b84613870565b6132d6565b6123fd565b9050919050565b6138a58161387a565b82525050565b60006020820190506138c0600083018461389c565b92915050565b600081905092915050565b60006138dc82612558565b6138e681856138c6565b93506138f6818560208601612435565b80840191505092915050565b600061390e82846138d1565b915081905092915050565b7f45786563757465206572726f7200000000000000000000000000000000000000600082015250565b600061394f600d83612e94565b915061395a82613919565b602082019050919050565b6000602082019050818103600083015261397e81613942565b905091905056fea264697066735822122060073151b861e65e386e136f2772337128d9e4687acfe14e7d1ce48a611e5bb464736f6c63430008100033