- Contract name:
- ProxyStorage
- Optimization enabled
- true
- Compiler version
- v0.4.24+commit.e67f0147
- Verified at
- 2019-02-26T14:11:28.452786Z
Contract source code
pragma solidity ^0.4.24; /** * @title EternalStorage * @dev This contract holds all the necessary state variables to carry out the storage of any contract * and to support the upgrade functionality. */ contract EternalStorage { // Version number of the current implementation uint256 internal _version; // Address of the current implementation address internal _implementation; // Storage mappings mapping(bytes32 => uint256) internal uintStorage; mapping(bytes32 => string) internal stringStorage; mapping(bytes32 => address) internal addressStorage; mapping(bytes32 => bytes) internal bytesStorage; mapping(bytes32 => bool) internal boolStorage; mapping(bytes32 => int256) internal intStorage; mapping(bytes32 => bytes32) internal bytes32Storage; mapping(bytes32 => uint256[]) internal uintArrayStorage; mapping(bytes32 => string[]) internal stringArrayStorage; mapping(bytes32 => address[]) internal addressArrayStorage; //mapping(bytes32 => bytes[]) internal bytesArrayStorage; mapping(bytes32 => bool[]) internal boolArrayStorage; mapping(bytes32 => int256[]) internal intArrayStorage; mapping(bytes32 => bytes32[]) internal bytes32ArrayStorage; } interface IEternalStorageProxy { function upgradeTo(address) external returns(bool); } interface IPoaNetworkConsensus { function addValidator(address, bool) external returns(bool); function finalizeChange() external; function removeValidator(address, bool) external returns(bool); function swapValidatorKey(address, address) external returns(bool); function isMasterOfCeremonyRemoved() external view returns(bool); function isValidator(address) external view returns(bool); function getCurrentValidatorsLength() external view returns(uint256); function getCurrentValidatorsLengthWithoutMoC() external view returns(uint256); function getPendingList() external view returns(address[]); function getValidators() external view returns(address[]); function masterOfCeremony() external view returns(address); } interface IPoaNetworkConsensusForVotingToChange { function currentValidators(uint256) external view returns(address); function getCurrentValidatorsLength() external view returns(uint256); } interface IProxyStorage { function initializeAddresses( address, address, address, address, address, address, address, address ) external; function setContractAddress(uint256, address) external returns(bool); function getBallotsStorage() external view returns(address); function getKeysManager() external view returns(address); function getPoaConsensus() external view returns(address); function getValidatorMetadata() external view returns(address); function getVotingToChangeKeys() external view returns(address); function getVotingToChangeMinThreshold() external view returns(address); } contract ProxyStorage is EternalStorage, IProxyStorage { bytes32 internal constant INIT_DISABLED = keccak256("initDisabled"); bytes32 internal constant BALLOTS_STORAGE_ETERNAL_STORAGE = keccak256("ballotsStorageEternalStorage"); bytes32 internal constant KEYS_MANAGER_ETERNAL_STORAGE = keccak256("keysManagerEternalStorage"); bytes32 internal constant MOC_INITIALIZED = keccak256("mocInitialized"); bytes32 internal constant OWNER = keccak256("owner"); bytes32 internal constant POA_CONSENSUS = keccak256("poaConsensus"); bytes32 internal constant REWARD_BY_BLOCK_ETERNAL_STORAGE = keccak256("rewardByBlockEternalStorage"); bytes32 internal constant VALIDATOR_METADATA_ETERNAL_STORAGE = keccak256("validatorMetadataEternalStorage"); bytes32 internal constant VOTING_TO_CHANGE_KEYS_ETERNAL_STORAGE = keccak256("votingToChangeKeysEternalStorage"); bytes32 internal constant VOTING_TO_CHANGE_MIN_THRESHOLD_ETERNAL_STORAGE = keccak256("votingToChangeMinThresholdEternalStorage"); bytes32 internal constant VOTING_TO_CHANGE_PROXY_ETERNAL_STORAGE = keccak256("votingToChangeProxyEternalStorage"); bytes32 internal constant VOTING_TO_MANAGE_EMISSION_FUNDS_ETERNAL_STORAGE = keccak256("votingToManageEmissionFundsEternalStorage"); enum ContractTypes { Invalid, KeysManager, VotingToChangeKeys, VotingToChangeMinThreshold, VotingToChangeProxy, BallotsStorage, PoaConsensus, ValidatorMetadata, ProxyStorage, RewardByBlock } event ProxyInitialized( address keysManagerEternalStorage, address votingToChangeKeysEternalStorage, address votingToChangeMinThresholdEternalStorage, address votingToChangeProxyEternalStorage, address votingToManageEmissionFundsEternalStorage, address ballotsStorageEternalStorage, address validatorMetadataEternalStorage, address rewardByBlockEternalStorage ); event AddressSet(uint256 contractType, address contractAddress); modifier onlyVotingToChangeProxy() { require(msg.sender == getVotingToChangeProxy()); _; } modifier onlyOwner() { require(_isOwner(msg.sender)); _; } function initDisabled() public view returns(bool) { return boolStorage[INIT_DISABLED]; } function init(address _poaConsensus) public onlyOwner { require(!initDisabled()); require(_poaConsensus != address(0)); require(_poaConsensus != address(this)); _setPoaConsensus(_poaConsensus); boolStorage[INIT_DISABLED] = true; } function mocInitialized() public view returns(bool) { return boolStorage[MOC_INITIALIZED]; } function getKeysManager() public view returns(address) { return addressStorage[KEYS_MANAGER_ETERNAL_STORAGE]; } function getVotingToChangeKeys() public view returns(address) { return addressStorage[VOTING_TO_CHANGE_KEYS_ETERNAL_STORAGE]; } function getVotingToChangeMinThreshold() public view returns(address) { return addressStorage[VOTING_TO_CHANGE_MIN_THRESHOLD_ETERNAL_STORAGE]; } function getVotingToChangeProxy() public view returns(address) { return addressStorage[VOTING_TO_CHANGE_PROXY_ETERNAL_STORAGE]; } function getVotingToManageEmissionFunds() public view returns(address) { return addressStorage[VOTING_TO_MANAGE_EMISSION_FUNDS_ETERNAL_STORAGE]; } function getPoaConsensus() public view returns(address) { return addressStorage[POA_CONSENSUS]; } function getBallotsStorage() public view returns(address) { return addressStorage[BALLOTS_STORAGE_ETERNAL_STORAGE]; } function getValidatorMetadata() public view returns(address) { return addressStorage[VALIDATOR_METADATA_ETERNAL_STORAGE]; } function getRewardByBlock() public view returns(address) { return addressStorage[REWARD_BY_BLOCK_ETERNAL_STORAGE]; } function initializeAddresses( address _keysManagerEternalStorage, address _votingToChangeKeysEternalStorage, address _votingToChangeMinThresholdEternalStorage, address _votingToChangeProxyEternalStorage, address _votingToManageEmissionFundsEternalStorage, address _ballotsStorageEternalStorage, address _validatorMetadataEternalStorage, address _rewardByBlockEternalStorage ) public { require(_isOwner(msg.sender) || _isMoC(msg.sender)); require(!mocInitialized()); addressStorage[KEYS_MANAGER_ETERNAL_STORAGE] = _keysManagerEternalStorage; addressStorage[VOTING_TO_CHANGE_KEYS_ETERNAL_STORAGE] = _votingToChangeKeysEternalStorage; addressStorage[VOTING_TO_CHANGE_MIN_THRESHOLD_ETERNAL_STORAGE] = _votingToChangeMinThresholdEternalStorage; addressStorage[VOTING_TO_CHANGE_PROXY_ETERNAL_STORAGE] = _votingToChangeProxyEternalStorage; addressStorage[VOTING_TO_MANAGE_EMISSION_FUNDS_ETERNAL_STORAGE] = _votingToManageEmissionFundsEternalStorage; addressStorage[BALLOTS_STORAGE_ETERNAL_STORAGE] = _ballotsStorageEternalStorage; addressStorage[VALIDATOR_METADATA_ETERNAL_STORAGE] = _validatorMetadataEternalStorage; addressStorage[REWARD_BY_BLOCK_ETERNAL_STORAGE] = _rewardByBlockEternalStorage; boolStorage[MOC_INITIALIZED] = true; emit ProxyInitialized( _keysManagerEternalStorage, _votingToChangeKeysEternalStorage, _votingToChangeMinThresholdEternalStorage, _votingToChangeProxyEternalStorage, _votingToManageEmissionFundsEternalStorage, _ballotsStorageEternalStorage, _validatorMetadataEternalStorage, _rewardByBlockEternalStorage ); } // solhint-disable code-complexity function setContractAddress(uint256 _contractType, address _contractAddress) public onlyVotingToChangeProxy returns(bool) { if (!mocInitialized()) return false; if (!initDisabled()) return false; if (_contractAddress == address(0)) return false; bool success = false; if (_contractType == uint256(ContractTypes.KeysManager)) { success = IEternalStorageProxy( getKeysManager() ).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.VotingToChangeKeys)) { success = IEternalStorageProxy( getVotingToChangeKeys() ).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.VotingToChangeMinThreshold)) { success = IEternalStorageProxy( getVotingToChangeMinThreshold() ).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.VotingToChangeProxy)) { success = IEternalStorageProxy( getVotingToChangeProxy() ).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.BallotsStorage)) { success = IEternalStorageProxy( getBallotsStorage() ).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.PoaConsensus)) { _setPoaConsensus(_contractAddress); success = true; } else if (_contractType == uint256(ContractTypes.ValidatorMetadata)) { success = IEternalStorageProxy( getValidatorMetadata() ).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.ProxyStorage)) { success = IEternalStorageProxy(this).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.RewardByBlock)) { success = IEternalStorageProxy( getRewardByBlock() ).upgradeTo(_contractAddress); } if (success) { emit AddressSet(_contractType, _contractAddress); } return success; } // solhint-enable code-complexity function _isMoC(address _validator) private view returns(bool) { IPoaNetworkConsensus poa = IPoaNetworkConsensus(getPoaConsensus()); return _validator == poa.masterOfCeremony() && !poa.isMasterOfCeremonyRemoved(); } function _isOwner(address _sender) private view returns(bool) { return _sender == addressStorage[OWNER]; } function _setPoaConsensus(address _poaConsensus) private { addressStorage[POA_CONSENSUS] = _poaConsensus; } }
Contract ABI
[{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getRewardByBlock","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getVotingToChangeProxy","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"init","inputs":[{"type":"address","name":"_poaConsensus"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getBallotsStorage","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getVotingToChangeKeys","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"initDisabled","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"mocInitialized","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getVotingToManageEmissionFunds","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getPoaConsensus","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getKeysManager","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"initializeAddresses","inputs":[{"type":"address","name":"_keysManagerEternalStorage"},{"type":"address","name":"_votingToChangeKeysEternalStorage"},{"type":"address","name":"_votingToChangeMinThresholdEternalStorage"},{"type":"address","name":"_votingToChangeProxyEternalStorage"},{"type":"address","name":"_votingToManageEmissionFundsEternalStorage"},{"type":"address","name":"_ballotsStorageEternalStorage"},{"type":"address","name":"_validatorMetadataEternalStorage"},{"type":"address","name":"_rewardByBlockEternalStorage"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getVotingToChangeMinThreshold","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getValidatorMetadata","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"setContractAddress","inputs":[{"type":"uint256","name":"_contractType"},{"type":"address","name":"_contractAddress"}],"constant":false},{"type":"event","name":"ProxyInitialized","inputs":[{"type":"address","name":"keysManagerEternalStorage","indexed":false},{"type":"address","name":"votingToChangeKeysEternalStorage","indexed":false},{"type":"address","name":"votingToChangeMinThresholdEternalStorage","indexed":false},{"type":"address","name":"votingToChangeProxyEternalStorage","indexed":false},{"type":"address","name":"votingToManageEmissionFundsEternalStorage","indexed":false},{"type":"address","name":"ballotsStorageEternalStorage","indexed":false},{"type":"address","name":"validatorMetadataEternalStorage","indexed":false},{"type":"address","name":"rewardByBlockEternalStorage","indexed":false}],"anonymous":false},{"type":"event","name":"AddressSet","inputs":[{"type":"uint256","name":"contractType","indexed":false},{"type":"address","name":"contractAddress","indexed":false}],"anonymous":false}]
Contract Creation Code
0x608060405234801561001057600080fd5b50611124806100206000396000f3006080604052600436106100b65763ffffffff60e060020a60003504166302afdfd481146100bb57806313e468b3146100ec57806319ab453c1461010157806336ee77731461012457806349285b581461013957806352a369381461014e5780636398316c146101775780636ecad99d1461018c5780638b8414c4146101a15780639a573786146101b65780639efa82cf146101cb578063a3b3fff114610216578063b1339de31461022b578063bb0165b114610240575b600080fd5b3480156100c757600080fd5b506100d0610264565b60408051600160a060020a039092168252519081900360200190f35b3480156100f857600080fd5b506100d06102ae565b34801561010d57600080fd5b50610122600160a060020a0360043516610323565b005b34801561013057600080fd5b506100d06103c8565b34801561014557600080fd5b506100d0610412565b34801561015a57600080fd5b5061016361045d565b604080519115158252519081900360200190f35b34801561018357600080fd5b506101636104a1565b34801561019857600080fd5b506100d06104e5565b3480156101ad57600080fd5b506100d061055a565b3480156101c257600080fd5b506100d06105a4565b3480156101d757600080fd5b50610122600160a060020a0360043581169060243581169060443581169060643581169060843581169060a43581169060c43581169060e435166105ee565b34801561022257600080fd5b506100d0610baf565b34801561023757600080fd5b506100d0610c24565b34801561024c57600080fd5b50610163600435600160a060020a0360243516610c6e565b604080517f7265776172644279426c6f636b457465726e616c53746f7261676500000000008152815190819003601b019020600090815260046020522054600160a060020a031690565b604080517f766f74696e67546f4368616e676550726f7879457465726e616c53746f72616781527f6500000000000000000000000000000000000000000000000000000000000000602080830191909152825191829003602101909120600090815260049091522054600160a060020a031690565b61032c33610f3d565b151561033757600080fd5b61033f61045d565b1561034957600080fd5b600160a060020a038116151561035e57600080fd5b600160a060020a03811630141561037457600080fd5b61037d81610f8e565b50604080517f696e697444697361626c656400000000000000000000000000000000000000008152815190819003600c0190206000908152600660205220805460ff19166001179055565b604080517f62616c6c6f747353746f72616765457465726e616c53746f72616765000000008152815190819003601c019020600090815260046020522054600160a060020a031690565b604080517f766f74696e67546f4368616e67654b657973457465726e616c53746f726167658152815160209181900382019020600090815260049091522054600160a060020a031690565b604080517f696e697444697361626c656400000000000000000000000000000000000000008152815190819003600c01902060009081526006602052205460ff1690565b604080517f6d6f63496e697469616c697a65640000000000000000000000000000000000008152815190819003600e01902060009081526006602052205460ff1690565b604080517f766f74696e67546f4d616e616765456d697373696f6e46756e6473457465726e81527f616c53746f726167650000000000000000000000000000000000000000000000602080830191909152825191829003602901909120600090815260049091522054600160a060020a031690565b604080517f706f61436f6e73656e73757300000000000000000000000000000000000000008152815190819003600c019020600090815260046020522054600160a060020a031690565b604080517f6b6579734d616e61676572457465726e616c53746f726167650000000000000081528151908190036019019020600090815260046020522054600160a060020a031690565b6105f733610f3d565b80610606575061060633610ff9565b151561061157600080fd5b6106196104a1565b1561062357600080fd5b876004600060405180807f6b6579734d616e61676572457465726e616c53746f7261676500000000000000815250601901905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550866004600060405180807f766f74696e67546f4368616e67654b657973457465726e616c53746f72616765815250602001905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550856004600060405180807f766f74696e67546f4368616e67654d696e5468726573686f6c64457465726e6181526020017f6c53746f72616765000000000000000000000000000000000000000000000000815250602801905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550846004600060405180807f766f74696e67546f4368616e676550726f7879457465726e616c53746f72616781526020017f6500000000000000000000000000000000000000000000000000000000000000815250602101905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550836004600060405180807f766f74696e67546f4d616e616765456d697373696f6e46756e6473457465726e81526020017f616c53746f726167650000000000000000000000000000000000000000000000815250602901905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550826004600060405180807f62616c6c6f747353746f72616765457465726e616c53746f7261676500000000815250601c01905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550816004600060405180807f76616c696461746f724d65746164617461457465726e616c53746f7261676500815250601f01905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550806004600060405180807f7265776172644279426c6f636b457465726e616c53746f726167650000000000815250601b01905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a0316021790555060016006600060405180807f6d6f63496e697469616c697a6564000000000000000000000000000000000000815250600e01905060405180910390206000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa0b05192e1273ceffbbdd1e02195c6ea17c6555a090c4f498adbd7ba31a19eb688888888888888886040518089600160a060020a0316600160a060020a0316815260200188600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019850505050505050505060405180910390a15050505050505050565b604080517f766f74696e67546f4368616e67654d696e5468726573686f6c64457465726e6181527f6c53746f72616765000000000000000000000000000000000000000000000000602080830191909152825191829003602801909120600090815260049091522054600160a060020a031690565b604080517f76616c696461746f724d65746164617461457465726e616c53746f72616765008152815190819003601f019020600090815260046020522054600160a060020a031690565b600080610c796102ae565b600160a060020a03163314610c8d57600080fd5b610c956104a1565b1515610ca45760009150610f36565b610cac61045d565b1515610cbb5760009150610f36565b600160a060020a0383161515610cd45760009150610f36565b5060006001841415610d7557610ce86105a4565b600160a060020a0316633659cfe6846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d4257600080fd5b505af1158015610d56573d6000803e3d6000fd5b505050506040513d6020811015610d6c57600080fd5b50519050610ee8565b6002841415610d8657610ce8610412565b6003841415610d9757610ce8610baf565b6004841415610da857610ce86102ae565b6005841415610db957610ce86103c8565b6006841415610dd357610dcb83610f8e565b506001610ee8565b6007841415610de457610ce8610c24565b6008841415610e4e57604080517f3659cfe6000000000000000000000000000000000000000000000000000000008152600160a060020a038516600482015290513091633659cfe69160248083019260209291908290030181600087803b158015610d4257600080fd5b6009841415610ee857610e5f610264565b600160a060020a0316633659cfe6846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610eb957600080fd5b505af1158015610ecd573d6000803e3d6000fd5b505050506040513d6020811015610ee357600080fd5b505190505b8015610f325760408051858152600160a060020a038516602082015281517fcb8f0f32182a0f756b1e065dab832c24d2c48fa533912c33552252a7f25bf4ae929181900390910190a15b8091505b5092915050565b604080517f6f776e657200000000000000000000000000000000000000000000000000000081528151908190036005019020600090815260046020522054600160a060020a03828116911614919050565b604080517f706f61436f6e73656e73757300000000000000000000000000000000000000008152815190819003600c01902060009081526004602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b60008061100461055a565b905080600160a060020a031663fa81b2006040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d602081101561106e57600080fd5b5051600160a060020a0384811691161480156110f1575080600160a060020a031663379fed9a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110c357600080fd5b505af11580156110d7573d6000803e3d6000fd5b505050506040513d60208110156110ed57600080fd5b5051155b93925050505600a165627a7a72305820c4e40563da9dd306565687d95ac620e3977d835521791cd4b1523851223435bf0029
Deployed ByteCode
0x6080604052600436106100b65763ffffffff60e060020a60003504166302afdfd481146100bb57806313e468b3146100ec57806319ab453c1461010157806336ee77731461012457806349285b581461013957806352a369381461014e5780636398316c146101775780636ecad99d1461018c5780638b8414c4146101a15780639a573786146101b65780639efa82cf146101cb578063a3b3fff114610216578063b1339de31461022b578063bb0165b114610240575b600080fd5b3480156100c757600080fd5b506100d0610264565b60408051600160a060020a039092168252519081900360200190f35b3480156100f857600080fd5b506100d06102ae565b34801561010d57600080fd5b50610122600160a060020a0360043516610323565b005b34801561013057600080fd5b506100d06103c8565b34801561014557600080fd5b506100d0610412565b34801561015a57600080fd5b5061016361045d565b604080519115158252519081900360200190f35b34801561018357600080fd5b506101636104a1565b34801561019857600080fd5b506100d06104e5565b3480156101ad57600080fd5b506100d061055a565b3480156101c257600080fd5b506100d06105a4565b3480156101d757600080fd5b50610122600160a060020a0360043581169060243581169060443581169060643581169060843581169060a43581169060c43581169060e435166105ee565b34801561022257600080fd5b506100d0610baf565b34801561023757600080fd5b506100d0610c24565b34801561024c57600080fd5b50610163600435600160a060020a0360243516610c6e565b604080517f7265776172644279426c6f636b457465726e616c53746f7261676500000000008152815190819003601b019020600090815260046020522054600160a060020a031690565b604080517f766f74696e67546f4368616e676550726f7879457465726e616c53746f72616781527f6500000000000000000000000000000000000000000000000000000000000000602080830191909152825191829003602101909120600090815260049091522054600160a060020a031690565b61032c33610f3d565b151561033757600080fd5b61033f61045d565b1561034957600080fd5b600160a060020a038116151561035e57600080fd5b600160a060020a03811630141561037457600080fd5b61037d81610f8e565b50604080517f696e697444697361626c656400000000000000000000000000000000000000008152815190819003600c0190206000908152600660205220805460ff19166001179055565b604080517f62616c6c6f747353746f72616765457465726e616c53746f72616765000000008152815190819003601c019020600090815260046020522054600160a060020a031690565b604080517f766f74696e67546f4368616e67654b657973457465726e616c53746f726167658152815160209181900382019020600090815260049091522054600160a060020a031690565b604080517f696e697444697361626c656400000000000000000000000000000000000000008152815190819003600c01902060009081526006602052205460ff1690565b604080517f6d6f63496e697469616c697a65640000000000000000000000000000000000008152815190819003600e01902060009081526006602052205460ff1690565b604080517f766f74696e67546f4d616e616765456d697373696f6e46756e6473457465726e81527f616c53746f726167650000000000000000000000000000000000000000000000602080830191909152825191829003602901909120600090815260049091522054600160a060020a031690565b604080517f706f61436f6e73656e73757300000000000000000000000000000000000000008152815190819003600c019020600090815260046020522054600160a060020a031690565b604080517f6b6579734d616e61676572457465726e616c53746f726167650000000000000081528151908190036019019020600090815260046020522054600160a060020a031690565b6105f733610f3d565b80610606575061060633610ff9565b151561061157600080fd5b6106196104a1565b1561062357600080fd5b876004600060405180807f6b6579734d616e61676572457465726e616c53746f7261676500000000000000815250601901905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550866004600060405180807f766f74696e67546f4368616e67654b657973457465726e616c53746f72616765815250602001905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550856004600060405180807f766f74696e67546f4368616e67654d696e5468726573686f6c64457465726e6181526020017f6c53746f72616765000000000000000000000000000000000000000000000000815250602801905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550846004600060405180807f766f74696e67546f4368616e676550726f7879457465726e616c53746f72616781526020017f6500000000000000000000000000000000000000000000000000000000000000815250602101905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550836004600060405180807f766f74696e67546f4d616e616765456d697373696f6e46756e6473457465726e81526020017f616c53746f726167650000000000000000000000000000000000000000000000815250602901905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550826004600060405180807f62616c6c6f747353746f72616765457465726e616c53746f7261676500000000815250601c01905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550816004600060405180807f76616c696461746f724d65746164617461457465726e616c53746f7261676500815250601f01905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550806004600060405180807f7265776172644279426c6f636b457465726e616c53746f726167650000000000815250601b01905060405180910390206000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a0316021790555060016006600060405180807f6d6f63496e697469616c697a6564000000000000000000000000000000000000815250600e01905060405180910390206000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa0b05192e1273ceffbbdd1e02195c6ea17c6555a090c4f498adbd7ba31a19eb688888888888888886040518089600160a060020a0316600160a060020a0316815260200188600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019850505050505050505060405180910390a15050505050505050565b604080517f766f74696e67546f4368616e67654d696e5468726573686f6c64457465726e6181527f6c53746f72616765000000000000000000000000000000000000000000000000602080830191909152825191829003602801909120600090815260049091522054600160a060020a031690565b604080517f76616c696461746f724d65746164617461457465726e616c53746f72616765008152815190819003601f019020600090815260046020522054600160a060020a031690565b600080610c796102ae565b600160a060020a03163314610c8d57600080fd5b610c956104a1565b1515610ca45760009150610f36565b610cac61045d565b1515610cbb5760009150610f36565b600160a060020a0383161515610cd45760009150610f36565b5060006001841415610d7557610ce86105a4565b600160a060020a0316633659cfe6846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d4257600080fd5b505af1158015610d56573d6000803e3d6000fd5b505050506040513d6020811015610d6c57600080fd5b50519050610ee8565b6002841415610d8657610ce8610412565b6003841415610d9757610ce8610baf565b6004841415610da857610ce86102ae565b6005841415610db957610ce86103c8565b6006841415610dd357610dcb83610f8e565b506001610ee8565b6007841415610de457610ce8610c24565b6008841415610e4e57604080517f3659cfe6000000000000000000000000000000000000000000000000000000008152600160a060020a038516600482015290513091633659cfe69160248083019260209291908290030181600087803b158015610d4257600080fd5b6009841415610ee857610e5f610264565b600160a060020a0316633659cfe6846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610eb957600080fd5b505af1158015610ecd573d6000803e3d6000fd5b505050506040513d6020811015610ee357600080fd5b505190505b8015610f325760408051858152600160a060020a038516602082015281517fcb8f0f32182a0f756b1e065dab832c24d2c48fa533912c33552252a7f25bf4ae929181900390910190a15b8091505b5092915050565b604080517f6f776e657200000000000000000000000000000000000000000000000000000081528151908190036005019020600090815260046020522054600160a060020a03828116911614919050565b604080517f706f61436f6e73656e73757300000000000000000000000000000000000000008152815190819003600c01902060009081526004602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b60008061100461055a565b905080600160a060020a031663fa81b2006040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d602081101561106e57600080fd5b5051600160a060020a0384811691161480156110f1575080600160a060020a031663379fed9a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110c357600080fd5b505af11580156110d7573d6000803e3d6000fd5b505050506040513d60208110156110ed57600080fd5b5051155b93925050505600a165627a7a72305820c4e40563da9dd306565687d95ac620e3977d835521791cd4b1523851223435bf0029