Address Details
contract

0xC004331DfC51aCA4937462D39C1D751753ceE12E

Contract Name
PushNotifications
Creator
0x93a8ba–4feaee at 0xf3e5e3–df0da8
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
6318068
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
PushNotifications




Optimization enabled
false
Compiler version
v0.5.16+commit.9c3226ce




EVM Version
istanbul




Verified at
2022-09-30T12:19:32.409059Z

/Users/vaibhavchopra/code/cpns/smart-contracts/contracts/PushNotifications.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract PushNotifications{
    event NotifyOneInChannel(
        address recipient,
        uint256 channel,
        string title,
        string action,
        string body,
        string imageHash,
        bool privateNotification
    );

    event NotifyAllInChannel(
        uint256 channel,
        string title,
        string action,
        string body,
        string imageHash
    );
    
    struct Channel{
        string name;
        string description;
        string iconHash;
        string badgeHash;
        address admin;
        address[] subscribers;
    }
    //      channel index => pushing address => permission boolean
    mapping(uint256 => mapping(address => bool)) public pushAccess; // mapping of addresses OTHER THAN ADMIN who can send push notifications

    Channel[] public channels; // this refers to a dynamic array containing info on various channels

    //  user address => channel index => subscription boolean
    mapping (address=>mapping(uint256=>bool)) public subscriptions;  // mapping of addresses who subscribed to channels
    mapping (address=>string) public publicKeys; // used for sending notifications privately to one person

    function subscribe(uint256 _channel) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        require(subscriptions[msg.sender][_channel] != true,"You shouldn't be subscribed already");
        subscriptions[msg.sender][_channel] = true;
        channels[_channel].subscribers.push(msg.sender);
        return true;
    }

    function unsubscribe(uint256 _channel) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        require(
            subscriptions[msg.sender][_channel] == true,
            "You should be subscribed already"
        ); 
        subscriptions[msg.sender][_channel] = false;
        Channel storage channel = channels[_channel];
        uint256 indexToBeDeleted;
        for(uint i=0;i<channel.subscribers.length;i++){
            if(channel.subscribers[i] == msg.sender){
                indexToBeDeleted = i;
                break;
            }
        }

        // replace last element with current element
        channel.subscribers[indexToBeDeleted] = channel.subscribers[channel.subscribers.length-1];

        // remove the last element
        channel.subscribers.pop();
        return true;
    }
    function createChannel(
        string memory _name,
        string memory _description,
        string memory _iconHash,
        string memory _badgeHash
        ) public returns (uint256){
        Channel memory channel;
        channel.name = _name;
        channel.description = _description;
        channel.iconHash = _iconHash;
        channel.badgeHash = _badgeHash;
        channel.admin = msg.sender;
        channels.push(channel);
        return channels.length; // return the new standing count of channels
    }

    function editChannel(
        uint256 _channel,
        string memory _name,
        string memory _description,
        string memory _iconHash,
        string memory _badgeHash
        ) 
    public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        require(msg.sender == channels[_channel].admin,"You must be the channel admin to edit a channel");
        channels[_channel].name = _name;
        channels[_channel].description = _description;
        channels[_channel].iconHash = _iconHash;
        channels[_channel].badgeHash = _badgeHash;
        return true;
    }

    function setPublicKey(string memory _publicKey) public returns (bool){
        publicKeys[msg.sender] = _publicKey;
        return true;
    }

    // this is useful when you want a notification event to be fireable from a contract, you 
    function setPushAccess(uint256 _channel,address _address,bool _access) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        require(msg.sender == channels[_channel].admin,"You must be the channel admin to set push access");
        pushAccess[_channel][_address] = _access;
        return true;
    }

    // in the case of private notification, it is assumed that fields like title, action, body 
    // and imageHash have already been encrypted by the sender who is compulsarily admin of channel
    // in that case.
    function notifyOneInChannel(
        address _recipient,
        uint256 _channel,
        string memory _title,
        string memory _action,
        string memory _body,
        string memory _imageHash,
        bool _privateNotification
    ) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        Channel memory channel = channels[_channel];
        // require that the sender is an admin or one of the permissed contracts
        if(_privateNotification){
            require(channel.admin == msg.sender,"sender is not admin of channel, private notification can only be sent admin of channel. Private notifications are disabled for smart contracts since secrets can't be kept on-chain");
        }
        else{
            require(channel.admin == msg.sender || pushAccess[_channel][msg.sender] == true,"public notifications to one person in channel can only be sent by the admin or one of the allowed addresses/contracts");
        }

        require(
            subscriptions[_recipient][_channel] == true,
            "recipient should be subscribed to the channel"
        );

        emit NotifyOneInChannel(
            _recipient,
            _channel,
            _title,
            _action,
            _body,
            _imageHash,
            _privateNotification
        );

        return true;
    }

    function notifyAllInChannel(
        uint256 _channel,
        string memory _title,
        string memory _action, 
        string memory _body,
        string memory _imageHash
    ) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        Channel memory channel = channels[_channel];
        require(msg.sender == channel.admin || pushAccess[_channel][msg.sender] == true,"sender is not admin of channel or one of the other addresses who have push access");

        emit NotifyAllInChannel(
            _channel,
            _title,
            _action,
            _body,
            _imageHash
        );

        return true;
    }

    function subscribersCountInChannel(uint256 _channel) public view returns (uint256){
        require(_channel < channels.length,"channel does not exist");
        return channels[_channel].subscribers.length;
    }

    function subscribersInChannel(uint256 _channel) public view returns (address [] memory){
        require(_channel < channels.length,"channel does not exist");
        return channels[_channel].subscribers;
    }
}
        

Contract ABI

[{"type":"event","name":"NotifyAllInChannel","inputs":[{"type":"uint256","name":"channel","internalType":"uint256","indexed":false},{"type":"string","name":"title","internalType":"string","indexed":false},{"type":"string","name":"action","internalType":"string","indexed":false},{"type":"string","name":"body","internalType":"string","indexed":false},{"type":"string","name":"imageHash","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"NotifyOneInChannel","inputs":[{"type":"address","name":"recipient","internalType":"address","indexed":false},{"type":"uint256","name":"channel","internalType":"uint256","indexed":false},{"type":"string","name":"title","internalType":"string","indexed":false},{"type":"string","name":"action","internalType":"string","indexed":false},{"type":"string","name":"body","internalType":"string","indexed":false},{"type":"string","name":"imageHash","internalType":"string","indexed":false},{"type":"bool","name":"privateNotification","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"description","internalType":"string"},{"type":"string","name":"iconHash","internalType":"string"},{"type":"string","name":"badgeHash","internalType":"string"},{"type":"address","name":"admin","internalType":"address"}],"name":"channels","inputs":[{"type":"uint256","name":"","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createChannel","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_description","internalType":"string"},{"type":"string","name":"_iconHash","internalType":"string"},{"type":"string","name":"_badgeHash","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"editChannel","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"},{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_description","internalType":"string"},{"type":"string","name":"_iconHash","internalType":"string"},{"type":"string","name":"_badgeHash","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"notifyAllInChannel","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"},{"type":"string","name":"_title","internalType":"string"},{"type":"string","name":"_action","internalType":"string"},{"type":"string","name":"_body","internalType":"string"},{"type":"string","name":"_imageHash","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"notifyOneInChannel","inputs":[{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_channel","internalType":"uint256"},{"type":"string","name":"_title","internalType":"string"},{"type":"string","name":"_action","internalType":"string"},{"type":"string","name":"_body","internalType":"string"},{"type":"string","name":"_imageHash","internalType":"string"},{"type":"bool","name":"_privateNotification","internalType":"bool"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"","internalType":"string"}],"name":"publicKeys","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"pushAccess","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"setPublicKey","inputs":[{"type":"string","name":"_publicKey","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"setPushAccess","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"},{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_access","internalType":"bool"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"subscribe","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"subscribersCountInChannel","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"subscribersInChannel","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"subscriptions","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"unsubscribe","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"}],"constant":false}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b506136cf806100206000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80639a2717ea1161008c578063b8cb7de911610066578063b8cb7de914610c5b578063db40b4c514610c9d578063e5949b5d14610d20578063eb21424014610f3e576100ea565b80639a2717ea146108b6578063a3d6f9a914610b58578063ad0b27fb14610c15576100ea565b8063623da3d1116100c8578063623da3d11461044957806369c3bf64146104af5780636f6fc0771461051557806387276555146105e8576100ea565b80630f574ba7146100ef5780631ec250b414610135578063345c9337146103d7575b600080fd5b61011b6004803603602081101561010557600080fd5b81019080803590602001909291905050506111d2565b604051808215151515815260200191505060405180910390f35b6103bd600480360360a081101561014b57600080fd5b81019080803590602001909291908035906020019064010000000081111561017257600080fd5b82018360208201111561018457600080fd5b803590602001918460018302840111640100000000831117156101a657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561020957600080fd5b82018360208201111561021b57600080fd5b8035906020019184600183028401116401000000008311171561023d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156102a057600080fd5b8201836020820111156102b257600080fd5b803590602001918460018302840111640100000000831117156102d457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561033757600080fd5b82018360208201111561034957600080fd5b8035906020019184600183028401116401000000008311171561036b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506113fd565b604051808215151515815260200191505060405180910390f35b61042f600480360360608110156103ed57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611b01565b604051808215151515815260200191505060405180910390f35b6104956004803603604081101561045f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cb1565b604051808215151515815260200191505060405180910390f35b6104fb600480360360408110156104c557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ce0565b604051808215151515815260200191505060405180910390f35b6105ce6004803603602081101561052b57600080fd5b810190808035906020019064010000000081111561054857600080fd5b82018360208201111561055a57600080fd5b8035906020019184600183028401116401000000008311171561057c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d0f565b604051808215151515815260200191505060405180910390f35b61089c600480360360e08110156105fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184600183028401116401000000008311171561067957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156106dc57600080fd5b8201836020820111156106ee57600080fd5b8035906020019184600183028401116401000000008311171561071057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561077357600080fd5b82018360208201111561078557600080fd5b803590602001918460018302840111640100000000831117156107a757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561080a57600080fd5b82018360208201111561081c57600080fd5b8035906020019184600183028401116401000000008311171561083e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803515159060200190929190505050611d6e565b604051808215151515815260200191505060405180910390f35b610b3e600480360360a08110156108cc57600080fd5b8101908080359060200190929190803590602001906401000000008111156108f357600080fd5b82018360208201111561090557600080fd5b8035906020019184600183028401116401000000008311171561092757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561098a57600080fd5b82018360208201111561099c57600080fd5b803590602001918460018302840111640100000000831117156109be57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a2157600080fd5b820183602082011115610a3357600080fd5b80359060200191846001830284011164010000000083111715610a5557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ab857600080fd5b820183602082011115610aca57600080fd5b80359060200191846001830284011164010000000083111715610aec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612602565b604051808215151515815260200191505060405180910390f35b610b9a60048036036020811015610b6e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612819565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bda578082015181840152602081019050610bbf565b50505050905090810190601f168015610c075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610c4160048036036020811015610c2b57600080fd5b81019080803590602001909291905050506128c9565b604051808215151515815260200191505060405180910390f35b610c8760048036036020811015610c7157600080fd5b8101908080359060200190929190505050612c26565b6040518082815260200191505060405180910390f35b610cc960048036036020811015610cb357600080fd5b8101908080359060200190929190505050612ccb565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d0c578082015181840152602081019050610cf1565b505050509050019250505060405180910390f35b610d4c60048036036020811015610d3657600080fd5b8101908080359060200190929190505050612df1565b60405180806020018060200180602001806020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185810385528a818151815260200191508051906020019080838360005b83811015610dca578082015181840152602081019050610daf565b50505050905090810190601f168015610df75780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b83811015610e30578082015181840152602081019050610e15565b50505050905090810190601f168015610e5d5780820380516001836020036101000a031916815260200191505b50858103835288818151815260200191508051906020019080838360005b83811015610e96578082015181840152602081019050610e7b565b50505050905090810190601f168015610ec35780820380516001836020036101000a031916815260200191505b50858103825287818151815260200191508051906020019080838360005b83811015610efc578082015181840152602081019050610ee1565b50505050905090810190601f168015610f295780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b6111bc60048036036080811015610f5457600080fd5b8101908080359060200190640100000000811115610f7157600080fd5b820183602082011115610f8357600080fd5b80359060200191846001830284011164010000000083111715610fa557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561100857600080fd5b82018360208201111561101a57600080fd5b8035906020019184600183028401116401000000008311171561103c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561109f57600080fd5b8201836020820111156110b157600080fd5b803590602001918460018302840111640100000000831117156110d357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561113657600080fd5b82018360208201111561114857600080fd5b8035906020019184600183028401116401000000008311171561116a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506130b4565b6040518082815260200191505060405180910390f35b6000600180549050821061124e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff1615151415611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061364b6023913960400191505060405180910390fd5b6001600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001828154811061137f57fe5b90600052602060002090600602016005013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060019050919050565b60006001805490508610611479576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b611481613234565b6001878154811061148e57fe5b90600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115405780601f1061151557610100808354040283529160200191611540565b820191906000526020600020905b81548152906001019060200180831161152357829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115e25780601f106115b7576101008083540402835291602001916115e2565b820191906000526020600020905b8154815290600101906020018083116115c557829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116845780601f1061165957610100808354040283529160200191611684565b820191906000526020600020905b81548152906001019060200180831161166757829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117265780601f106116fb57610100808354040283529160200191611726565b820191906000526020600020905b81548152906001019060200180831161170957829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820180548060200260200160405190810160405280929190818152602001828054801561180a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117c0575b5050505050815250509050806080015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118b357506001151560008089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260518152602001806134a26051913960600191505060405180910390fd5b7ff73c1e00503e2cc9d434555ad1d81c1240f3fa1f2fe25638f1e09a80fbe8b1c187878787876040518086815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b83811015611980578082015181840152602081019050611965565b50505050905090810190601f1680156119ad5780820380516001836020036101000a031916815260200191505b50858103845288818151815260200191508051906020019080838360005b838110156119e65780820151818401526020810190506119cb565b50505050905090810190601f168015611a135780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015611a4c578082015181840152602081019050611a31565b50505050905090810190601f168015611a795780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b83811015611ab2578082015181840152602081019050611a97565b50505050905090810190601f168015611adf5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a1600191505095945050505050565b60006001805490508410611b7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60018481548110611b8a57fe5b906000526020600020906006020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806135686030913960400191505060405180910390fd5b8160008086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600190509392505050565b60026020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60006020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190611d64929190613280565b5060019050919050565b60006001805490508710611dea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b611df2613234565b60018881548110611dff57fe5b90600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611eb15780601f10611e8657610100808354040283529160200191611eb1565b820191906000526020600020905b815481529060010190602001808311611e9457829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f535780601f10611f2857610100808354040283529160200191611f53565b820191906000526020600020905b815481529060010190602001808311611f3657829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ff55780601f10611fca57610100808354040283529160200191611ff5565b820191906000526020600020905b815481529060010190602001808311611fd857829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120975780601f1061206c57610100808354040283529160200191612097565b820191906000526020600020905b81548152906001019060200180831161207a57829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820180548060200260200160405190810160405280929190818152602001828054801561217b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612131575b50505050508152505090508215612219573373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff1614612214576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260b381526020018061359860b3913960c00191505060405180910390fd5b61230d565b3373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff1614806122b75750600115156000808a815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b61230c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260758152602001806134f36075913960800191505060405180910390fd5b5b60011515600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a815260200190815260200160002060009054906101000a900460ff161515146123c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061366e602d913960400191505060405180910390fd5b7f6452d1959b586a46259f51796a37a9a53d9a48aa68983fe166ddf2de2f4ec82289898989898989604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001806020018060200180602001806020018615151515815260200185810385528a818151815260200191508051906020019080838360005b8381101561247d578082015181840152602081019050612462565b50505050905090810190601f1680156124aa5780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b838110156124e35780820151818401526020810190506124c8565b50505050905090810190601f1680156125105780820380516001836020036101000a031916815260200191505b50858103835288818151815260200191508051906020019080838360005b8381101561254957808201518184015260208101905061252e565b50505050905090810190601f1680156125765780820380516001836020036101000a031916815260200191505b50858103825287818151815260200191508051906020019080838360005b838110156125af578082015181840152602081019050612594565b50505050905090810190601f1680156125dc5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a16001915050979650505050505050565b6000600180549050861061267e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b6001868154811061268b57fe5b906000526020600020906006020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613473602f913960400191505060405180910390fd5b846001878154811061274e57fe5b90600052602060002090600602016000019080519060200190612772929190613280565b50836001878154811061278157fe5b906000526020600020906006020160010190805190602001906127a5929190613280565b5082600187815481106127b457fe5b906000526020600020906006020160020190805190602001906127d8929190613280565b5081600187815481106127e757fe5b9060005260206000209060060201600301908051906020019061280b929190613280565b506001905095945050505050565b60036020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128c15780601f10612896576101008083540402835291602001916128c1565b820191906000526020600020905b8154815290600101906020018083116128a457829003601f168201915b505050505081565b60006001805490508210612945576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16151514612a1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f596f752073686f756c64206265207375627363726962656420616c726561647981525060200191505060405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff021916908315150217905550600060018381548110612a9457fe5b90600052602060002090600602019050600080600090505b8260050180549050811015612b3d573373ffffffffffffffffffffffffffffffffffffffff16836005018281548110612ae157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b3057809150612b3d565b8080600101915050612aac565b5081600501600183600501805490500381548110612b5757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826005018281548110612b9157fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600501805480612be657fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600192505050919050565b60006001805490508210612ca2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60018281548110612caf57fe5b9060005260206000209060060201600501805490509050919050565b60606001805490508210612d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60018281548110612d5457fe5b9060005260206000209060060201600501805480602002602001604051908101604052809291908181526020018280548015612de557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612d9b575b50505050509050919050565b60018181548110612dfe57fe5b9060005260206000209060060201600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612eaa5780601f10612e7f57610100808354040283529160200191612eaa565b820191906000526020600020905b815481529060010190602001808311612e8d57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f485780601f10612f1d57610100808354040283529160200191612f48565b820191906000526020600020905b815481529060010190602001808311612f2b57829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612fe65780601f10612fbb57610100808354040283529160200191612fe6565b820191906000526020600020905b815481529060010190602001808311612fc957829003601f168201915b505050505090806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130845780601f1061305957610100808354040283529160200191613084565b820191906000526020600020905b81548152906001019060200180831161306757829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b60006130be613234565b85816000018190525084816020018190525083816040018190525082816060018190525033816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181908060018154018082558091505090600182039060005260206000209060060201600090919290919091506000820151816000019080519060200190613164929190613300565b506020820151816001019080519060200190613181929190613300565b50604082015181600201908051906020019061319e929190613300565b5060608201518160030190805190602001906131bb929190613300565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a082015181600501908051906020019061321f929190613380565b50505050600180549050915050949350505050565b6040518060c0016040528060608152602001606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106132c157805160ff19168380011785556132ef565b828001600101855582156132ef579182015b828111156132ee5782518255916020019190600101906132d3565b5b5090506132fc919061340a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061334157805160ff191683800117855561336f565b8280016001018555821561336f579182015b8281111561336e578251825591602001919060010190613353565b5b50905061337c919061340a565b5090565b8280548282559060005260206000209081019282156133f9579160200282015b828111156133f85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906133a0565b5b509050613406919061342f565b5090565b61342c91905b80821115613428576000816000905550600101613410565b5090565b90565b61346f91905b8082111561346b57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101613435565b5090565b9056fe596f75206d75737420626520746865206368616e6e656c2061646d696e20746f20656469742061206368616e6e656c73656e646572206973206e6f742061646d696e206f66206368616e6e656c206f72206f6e65206f6620746865206f74686572206164647265737365732077686f20686176652070757368206163636573737075626c6963206e6f74696669636174696f6e7320746f206f6e6520706572736f6e20696e206368616e6e656c2063616e206f6e6c792062652073656e74206279207468652061646d696e206f72206f6e65206f662074686520616c6c6f776564206164647265737365732f636f6e747261637473596f75206d75737420626520746865206368616e6e656c2061646d696e20746f2073657420707573682061636365737373656e646572206973206e6f742061646d696e206f66206368616e6e656c2c2070726976617465206e6f74696669636174696f6e2063616e206f6e6c792062652073656e742061646d696e206f66206368616e6e656c2e2050726976617465206e6f74696669636174696f6e73206172652064697361626c656420666f7220736d61727420636f6e7472616374732073696e636520736563726574732063616e2774206265206b657074206f6e2d636861696e596f752073686f756c646e2774206265207375627363726962656420616c7265616479726563697069656e742073686f756c64206265207375627363726962656420746f20746865206368616e6e656ca265627a7a72315820aa956c133007311b7f1bdf7a0a01a508c2ae1ed31df8d19b141520721b462d9264736f6c63430005100032

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80639a2717ea1161008c578063b8cb7de911610066578063b8cb7de914610c5b578063db40b4c514610c9d578063e5949b5d14610d20578063eb21424014610f3e576100ea565b80639a2717ea146108b6578063a3d6f9a914610b58578063ad0b27fb14610c15576100ea565b8063623da3d1116100c8578063623da3d11461044957806369c3bf64146104af5780636f6fc0771461051557806387276555146105e8576100ea565b80630f574ba7146100ef5780631ec250b414610135578063345c9337146103d7575b600080fd5b61011b6004803603602081101561010557600080fd5b81019080803590602001909291905050506111d2565b604051808215151515815260200191505060405180910390f35b6103bd600480360360a081101561014b57600080fd5b81019080803590602001909291908035906020019064010000000081111561017257600080fd5b82018360208201111561018457600080fd5b803590602001918460018302840111640100000000831117156101a657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561020957600080fd5b82018360208201111561021b57600080fd5b8035906020019184600183028401116401000000008311171561023d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156102a057600080fd5b8201836020820111156102b257600080fd5b803590602001918460018302840111640100000000831117156102d457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561033757600080fd5b82018360208201111561034957600080fd5b8035906020019184600183028401116401000000008311171561036b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506113fd565b604051808215151515815260200191505060405180910390f35b61042f600480360360608110156103ed57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611b01565b604051808215151515815260200191505060405180910390f35b6104956004803603604081101561045f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cb1565b604051808215151515815260200191505060405180910390f35b6104fb600480360360408110156104c557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ce0565b604051808215151515815260200191505060405180910390f35b6105ce6004803603602081101561052b57600080fd5b810190808035906020019064010000000081111561054857600080fd5b82018360208201111561055a57600080fd5b8035906020019184600183028401116401000000008311171561057c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d0f565b604051808215151515815260200191505060405180910390f35b61089c600480360360e08110156105fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184600183028401116401000000008311171561067957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156106dc57600080fd5b8201836020820111156106ee57600080fd5b8035906020019184600183028401116401000000008311171561071057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561077357600080fd5b82018360208201111561078557600080fd5b803590602001918460018302840111640100000000831117156107a757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561080a57600080fd5b82018360208201111561081c57600080fd5b8035906020019184600183028401116401000000008311171561083e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803515159060200190929190505050611d6e565b604051808215151515815260200191505060405180910390f35b610b3e600480360360a08110156108cc57600080fd5b8101908080359060200190929190803590602001906401000000008111156108f357600080fd5b82018360208201111561090557600080fd5b8035906020019184600183028401116401000000008311171561092757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561098a57600080fd5b82018360208201111561099c57600080fd5b803590602001918460018302840111640100000000831117156109be57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a2157600080fd5b820183602082011115610a3357600080fd5b80359060200191846001830284011164010000000083111715610a5557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ab857600080fd5b820183602082011115610aca57600080fd5b80359060200191846001830284011164010000000083111715610aec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612602565b604051808215151515815260200191505060405180910390f35b610b9a60048036036020811015610b6e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612819565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bda578082015181840152602081019050610bbf565b50505050905090810190601f168015610c075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610c4160048036036020811015610c2b57600080fd5b81019080803590602001909291905050506128c9565b604051808215151515815260200191505060405180910390f35b610c8760048036036020811015610c7157600080fd5b8101908080359060200190929190505050612c26565b6040518082815260200191505060405180910390f35b610cc960048036036020811015610cb357600080fd5b8101908080359060200190929190505050612ccb565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d0c578082015181840152602081019050610cf1565b505050509050019250505060405180910390f35b610d4c60048036036020811015610d3657600080fd5b8101908080359060200190929190505050612df1565b60405180806020018060200180602001806020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185810385528a818151815260200191508051906020019080838360005b83811015610dca578082015181840152602081019050610daf565b50505050905090810190601f168015610df75780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b83811015610e30578082015181840152602081019050610e15565b50505050905090810190601f168015610e5d5780820380516001836020036101000a031916815260200191505b50858103835288818151815260200191508051906020019080838360005b83811015610e96578082015181840152602081019050610e7b565b50505050905090810190601f168015610ec35780820380516001836020036101000a031916815260200191505b50858103825287818151815260200191508051906020019080838360005b83811015610efc578082015181840152602081019050610ee1565b50505050905090810190601f168015610f295780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b6111bc60048036036080811015610f5457600080fd5b8101908080359060200190640100000000811115610f7157600080fd5b820183602082011115610f8357600080fd5b80359060200191846001830284011164010000000083111715610fa557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561100857600080fd5b82018360208201111561101a57600080fd5b8035906020019184600183028401116401000000008311171561103c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561109f57600080fd5b8201836020820111156110b157600080fd5b803590602001918460018302840111640100000000831117156110d357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561113657600080fd5b82018360208201111561114857600080fd5b8035906020019184600183028401116401000000008311171561116a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506130b4565b6040518082815260200191505060405180910390f35b6000600180549050821061124e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff1615151415611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061364b6023913960400191505060405180910390fd5b6001600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001828154811061137f57fe5b90600052602060002090600602016005013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060019050919050565b60006001805490508610611479576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b611481613234565b6001878154811061148e57fe5b90600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115405780601f1061151557610100808354040283529160200191611540565b820191906000526020600020905b81548152906001019060200180831161152357829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115e25780601f106115b7576101008083540402835291602001916115e2565b820191906000526020600020905b8154815290600101906020018083116115c557829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116845780601f1061165957610100808354040283529160200191611684565b820191906000526020600020905b81548152906001019060200180831161166757829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117265780601f106116fb57610100808354040283529160200191611726565b820191906000526020600020905b81548152906001019060200180831161170957829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820180548060200260200160405190810160405280929190818152602001828054801561180a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117c0575b5050505050815250509050806080015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118b357506001151560008089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260518152602001806134a26051913960600191505060405180910390fd5b7ff73c1e00503e2cc9d434555ad1d81c1240f3fa1f2fe25638f1e09a80fbe8b1c187878787876040518086815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b83811015611980578082015181840152602081019050611965565b50505050905090810190601f1680156119ad5780820380516001836020036101000a031916815260200191505b50858103845288818151815260200191508051906020019080838360005b838110156119e65780820151818401526020810190506119cb565b50505050905090810190601f168015611a135780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015611a4c578082015181840152602081019050611a31565b50505050905090810190601f168015611a795780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b83811015611ab2578082015181840152602081019050611a97565b50505050905090810190601f168015611adf5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a1600191505095945050505050565b60006001805490508410611b7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60018481548110611b8a57fe5b906000526020600020906006020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806135686030913960400191505060405180910390fd5b8160008086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600190509392505050565b60026020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60006020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190611d64929190613280565b5060019050919050565b60006001805490508710611dea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b611df2613234565b60018881548110611dff57fe5b90600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611eb15780601f10611e8657610100808354040283529160200191611eb1565b820191906000526020600020905b815481529060010190602001808311611e9457829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f535780601f10611f2857610100808354040283529160200191611f53565b820191906000526020600020905b815481529060010190602001808311611f3657829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ff55780601f10611fca57610100808354040283529160200191611ff5565b820191906000526020600020905b815481529060010190602001808311611fd857829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120975780601f1061206c57610100808354040283529160200191612097565b820191906000526020600020905b81548152906001019060200180831161207a57829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820180548060200260200160405190810160405280929190818152602001828054801561217b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612131575b50505050508152505090508215612219573373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff1614612214576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260b381526020018061359860b3913960c00191505060405180910390fd5b61230d565b3373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff1614806122b75750600115156000808a815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b61230c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260758152602001806134f36075913960800191505060405180910390fd5b5b60011515600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a815260200190815260200160002060009054906101000a900460ff161515146123c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061366e602d913960400191505060405180910390fd5b7f6452d1959b586a46259f51796a37a9a53d9a48aa68983fe166ddf2de2f4ec82289898989898989604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001806020018060200180602001806020018615151515815260200185810385528a818151815260200191508051906020019080838360005b8381101561247d578082015181840152602081019050612462565b50505050905090810190601f1680156124aa5780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b838110156124e35780820151818401526020810190506124c8565b50505050905090810190601f1680156125105780820380516001836020036101000a031916815260200191505b50858103835288818151815260200191508051906020019080838360005b8381101561254957808201518184015260208101905061252e565b50505050905090810190601f1680156125765780820380516001836020036101000a031916815260200191505b50858103825287818151815260200191508051906020019080838360005b838110156125af578082015181840152602081019050612594565b50505050905090810190601f1680156125dc5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a16001915050979650505050505050565b6000600180549050861061267e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b6001868154811061268b57fe5b906000526020600020906006020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613473602f913960400191505060405180910390fd5b846001878154811061274e57fe5b90600052602060002090600602016000019080519060200190612772929190613280565b50836001878154811061278157fe5b906000526020600020906006020160010190805190602001906127a5929190613280565b5082600187815481106127b457fe5b906000526020600020906006020160020190805190602001906127d8929190613280565b5081600187815481106127e757fe5b9060005260206000209060060201600301908051906020019061280b929190613280565b506001905095945050505050565b60036020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128c15780601f10612896576101008083540402835291602001916128c1565b820191906000526020600020905b8154815290600101906020018083116128a457829003601f168201915b505050505081565b60006001805490508210612945576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16151514612a1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f596f752073686f756c64206265207375627363726962656420616c726561647981525060200191505060405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff021916908315150217905550600060018381548110612a9457fe5b90600052602060002090600602019050600080600090505b8260050180549050811015612b3d573373ffffffffffffffffffffffffffffffffffffffff16836005018281548110612ae157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b3057809150612b3d565b8080600101915050612aac565b5081600501600183600501805490500381548110612b5757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826005018281548110612b9157fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600501805480612be657fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600192505050919050565b60006001805490508210612ca2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60018281548110612caf57fe5b9060005260206000209060060201600501805490509050919050565b60606001805490508210612d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6368616e6e656c20646f6573206e6f742065786973740000000000000000000081525060200191505060405180910390fd5b60018281548110612d5457fe5b9060005260206000209060060201600501805480602002602001604051908101604052809291908181526020018280548015612de557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612d9b575b50505050509050919050565b60018181548110612dfe57fe5b9060005260206000209060060201600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612eaa5780601f10612e7f57610100808354040283529160200191612eaa565b820191906000526020600020905b815481529060010190602001808311612e8d57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f485780601f10612f1d57610100808354040283529160200191612f48565b820191906000526020600020905b815481529060010190602001808311612f2b57829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612fe65780601f10612fbb57610100808354040283529160200191612fe6565b820191906000526020600020905b815481529060010190602001808311612fc957829003601f168201915b505050505090806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130845780601f1061305957610100808354040283529160200191613084565b820191906000526020600020905b81548152906001019060200180831161306757829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b60006130be613234565b85816000018190525084816020018190525083816040018190525082816060018190525033816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181908060018154018082558091505090600182039060005260206000209060060201600090919290919091506000820151816000019080519060200190613164929190613300565b506020820151816001019080519060200190613181929190613300565b50604082015181600201908051906020019061319e929190613300565b5060608201518160030190805190602001906131bb929190613300565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a082015181600501908051906020019061321f929190613380565b50505050600180549050915050949350505050565b6040518060c0016040528060608152602001606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106132c157805160ff19168380011785556132ef565b828001600101855582156132ef579182015b828111156132ee5782518255916020019190600101906132d3565b5b5090506132fc919061340a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061334157805160ff191683800117855561336f565b8280016001018555821561336f579182015b8281111561336e578251825591602001919060010190613353565b5b50905061337c919061340a565b5090565b8280548282559060005260206000209081019282156133f9579160200282015b828111156133f85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906133a0565b5b509050613406919061342f565b5090565b61342c91905b80821115613428576000816000905550600101613410565b5090565b90565b61346f91905b8082111561346b57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101613435565b5090565b9056fe596f75206d75737420626520746865206368616e6e656c2061646d696e20746f20656469742061206368616e6e656c73656e646572206973206e6f742061646d696e206f66206368616e6e656c206f72206f6e65206f6620746865206f74686572206164647265737365732077686f20686176652070757368206163636573737075626c6963206e6f74696669636174696f6e7320746f206f6e6520706572736f6e20696e206368616e6e656c2063616e206f6e6c792062652073656e74206279207468652061646d696e206f72206f6e65206f662074686520616c6c6f776564206164647265737365732f636f6e747261637473596f75206d75737420626520746865206368616e6e656c2061646d696e20746f2073657420707573682061636365737373656e646572206973206e6f742061646d696e206f66206368616e6e656c2c2070726976617465206e6f74696669636174696f6e2063616e206f6e6c792062652073656e742061646d696e206f66206368616e6e656c2e2050726976617465206e6f74696669636174696f6e73206172652064697361626c656420666f7220736d61727420636f6e7472616374732073696e636520736563726574732063616e2774206265206b657074206f6e2d636861696e596f752073686f756c646e2774206265207375627363726962656420616c7265616479726563697069656e742073686f756c64206265207375627363726962656420746f20746865206368616e6e656ca265627a7a72315820aa956c133007311b7f1bdf7a0a01a508c2ae1ed31df8d19b141520721b462d9264736f6c63430005100032