Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x718ff07ff86671907b5ed33d2691c739a0036e45.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
- Contract name:
- MedianVLXUSD
- Optimization enabled
- false
- Compiler version
- v0.5.12+commit.7709ece9
- Verified at
- 2021-10-27T19:00:03.386766Z
Contract source code
pragma solidity >=0.5.10;
contract LibNote {
event LogNote(
bytes4 indexed sig,
address indexed usr,
bytes32 indexed arg1,
bytes32 indexed arg2,
bytes data
) anonymous;
modifier note {
_;
assembly {
// log an 'anonymous' event with a constant 6 words of calldata
// and four indexed topics: selector, caller, arg1 and arg2
let mark := msize() // end of memory ensures zero
mstore(0x40, add(mark, 288)) // update free memory pointer
mstore(mark, 0x20) // bytes type data offset
mstore(add(mark, 0x20), 224) // bytes size (padded)
calldatacopy(add(mark, 0x40), 0, 224) // bytes payload
log4(mark, 288, // calldata
shl(224, shr(224, calldataload(0))), // msg.sig
caller(), // msg.sender
calldataload(4), // arg1
calldataload(36) // arg2
)
}
}
}
contract Median is LibNote {
// --- Auth ---
mapping (address => uint) public wards;
function rely(address usr) external note auth { wards[usr] = 1; }
function deny(address usr) external note auth { wards[usr] = 0; }
modifier auth {
require(wards[msg.sender] == 1, "Median/not-authorized");
_;
}
uint128 val;
uint32 public age;
bytes32 public constant wat = "ethusd"; // You want to change this every deploy
uint256 public bar = 1;
// Authorized oracles, set by an auth
mapping (address => uint256) public orcl;
// Whitelisted contracts, set by an auth
mapping (address => uint256) public bud;
// Mapping for at most 256 oracles
mapping (uint8 => address) public slot;
modifier toll { require(bud[msg.sender] == 1, "Median/contract-not-whitelisted"); _;}
event LogMedianPrice(uint256 val, uint256 age);
//Set type of Oracle
constructor() public {
wards[msg.sender] = 1;
}
function read() external view toll returns (uint256) {
require(val > 0, "Median/invalid-price-feed");
return val;
}
function peek() external view toll returns (uint256,bool) {
return (val, val > 0);
}
function recover(uint256 val_, uint256 age_, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
return ecrecover(
keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(val_, age_, wat)))),
v, r, s
);
}
function poke(
uint256[] calldata val_, uint256[] calldata age_,
uint8[] calldata v, bytes32[] calldata r, bytes32[] calldata s) external
{
require(val_.length == bar, "Median/bar-too-low");
uint256 bloom = 0;
uint256 last = 0;
uint256 zzz = age;
for (uint i = 0; i < val_.length; i++) {
// Validate the values were signed by an authorized oracle
address signer = recover(val_[i], age_[i], v[i], r[i], s[i]);
// Check that signer is an oracle
require(orcl[signer] == 1, "Median/invalid-oracle");
// Price feed age greater than last medianizer age
require(age_[i] > zzz, "Median/stale-message");
// Check for ordered values
require(val_[i] >= last, "Median/messages-not-in-order");
last = val_[i];
// Bloom filter for signer uniqueness
uint8 sl = uint8(uint256(signer) >> 152);
require((bloom >> sl) % 2 == 0, "Median/oracle-already-signed");
bloom += uint256(2) ** sl;
}
val = uint128(val_[val_.length >> 1]);
age = uint32(block.timestamp);
emit LogMedianPrice(val, age);
}
function lift(address[] calldata a) external note auth {
for (uint i = 0; i < a.length; i++) {
require(a[i] != address(0), "Median/no-oracle-0");
uint8 s = uint8(uint256(a[i]) >> 152);
require(slot[s] == address(0), "Median/signer-already-exists");
orcl[a[i]] = 1;
slot[s] = a[i];
}
}
function drop(address[] calldata a) external note auth {
for (uint i = 0; i < a.length; i++) {
orcl[a[i]] = 0;
slot[uint8(uint256(a[i]) >> 152)] = address(0);
}
}
function setBar(uint256 bar_) external note auth {
require(bar_ > 0, "Median/quorum-is-zero");
require(bar_ % 2 != 0, "Median/quorum-not-odd-number");
bar = bar_;
}
function kiss(address a) external note auth {
require(a != address(0), "Median/no-contract-0");
bud[a] = 1;
}
function diss(address a) external note auth {
bud[a] = 0;
}
function kiss(address[] calldata a) external note auth {
for(uint i = 0; i < a.length; i++) {
require(a[i] != address(0), "Median/no-contract-0");
bud[a[i]] = 1;
}
}
function diss(address[] calldata a) external note auth {
for(uint i = 0; i < a.length; i++) {
bud[a[i]] = 0;
}
}
}
contract MedianVLXUSD is Median {
bytes32 public constant wat = "VLXUSD";
function recover(uint256 val_, uint256 age_, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
return ecrecover(
keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(val_, age_, wat)))),
v, r, s
);
}
}
Contract ABI
[{"type":"event","name":"LogMedianPrice","inputs":[{"type":"uint256","name":"val","internalType":"uint256","indexed":false},{"type":"uint256","name":"age","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LogNote","inputs":[{"type":"bytes4","name":"sig","internalType":"bytes4","indexed":true},{"type":"address","name":"usr","internalType":"address","indexed":true},{"type":"bytes32","name":"arg1","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"arg2","internalType":"bytes32","indexed":true},{"type":"bytes","name":"data","internalType":"bytes","indexed":false}],"anonymous":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"age","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"bar","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"bud","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"deny","inputs":[{"type":"address","name":"usr","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"diss","inputs":[{"type":"address[]","name":"a","internalType":"address[]"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"diss","inputs":[{"type":"address","name":"a","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"drop","inputs":[{"type":"address[]","name":"a","internalType":"address[]"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"kiss","inputs":[{"type":"address[]","name":"a","internalType":"address[]"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"kiss","inputs":[{"type":"address","name":"a","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"lift","inputs":[{"type":"address[]","name":"a","internalType":"address[]"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"orcl","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"bool","name":"","internalType":"bool"}],"name":"peek","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"poke","inputs":[{"type":"uint256[]","name":"val_","internalType":"uint256[]"},{"type":"uint256[]","name":"age_","internalType":"uint256[]"},{"type":"uint8[]","name":"v","internalType":"uint8[]"},{"type":"bytes32[]","name":"r","internalType":"bytes32[]"},{"type":"bytes32[]","name":"s","internalType":"bytes32[]"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"read","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"rely","inputs":[{"type":"address","name":"usr","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setBar","inputs":[{"type":"uint256","name":"bar_","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"slot","inputs":[{"type":"uint8","name":"","internalType":"uint8"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"wards","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"wat","inputs":[],"constant":true}]
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c806365c4ce7a116100ad578063943181061161007157806394318106146106c45780639c52a7f11461073d578063bf353dbb14610781578063f29c29c4146107d9578063febb0f7e1461081d57610121565b806365c4ce7a1461038557806365fae35e146103c957806389bbb8b21461040d5780638d0e5a9a146105da5780638ef5eaf01461064b57610121565b806346d4577d116100f457806346d4577d1461024f5780634ca29923146102c85780634fce7a2a146102e657806357de26a41461033e57806359e02dd71461035c57610121565b8063020b2e32146101265780631b25b65f1461017e578063262a9dff146101f7578063352d3fba14610221575b600080fd5b6101686004803603602081101561013c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061083b565b6040518082815260200191505060405180910390f35b6101f56004803603602081101561019457600080fd5b81019080803590602001906401000000008111156101b157600080fd5b8201836020820111156101c357600080fd5b803590602001918460208302840111640100000000831117156101e557600080fd5b9091929391929390505050610853565b005b6101ff610a95565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b61024d6004803603602081101561023757600080fd5b8101908080359060200190929190505050610aab565b005b6102c66004803603602081101561026557600080fd5b810190808035906020019064010000000081111561028257600080fd5b82018360208201111561029457600080fd5b803590602001918460208302840111640100000000831117156102b657600080fd5b9091929391929390505050610c93565b005b6102d0610e0a565b6040518082815260200191505060405180910390f35b610328600480360360208110156102fc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e2e565b6040518082815260200191505060405180910390f35b610346610e46565b6040518082815260200191505060405180910390f35b610364610fd9565b60405180838152602001821515151581526020019250505060405180910390f35b6103c76004803603602081101561039b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611101565b005b61040b600480360360208110156103df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611230565b005b6105d8600480360360a081101561042357600080fd5b810190808035906020019064010000000081111561044057600080fd5b82018360208201111561045257600080fd5b8035906020019184602083028401116401000000008311171561047457600080fd5b90919293919293908035906020019064010000000081111561049557600080fd5b8201836020820111156104a757600080fd5b803590602001918460208302840111640100000000831117156104c957600080fd5b9091929391929390803590602001906401000000008111156104ea57600080fd5b8201836020820111156104fc57600080fd5b8035906020019184602083028401116401000000008311171561051e57600080fd5b90919293919293908035906020019064010000000081111561053f57600080fd5b82018360208201111561055157600080fd5b8035906020019184602083028401116401000000008311171561057357600080fd5b90919293919293908035906020019064010000000081111561059457600080fd5b8201836020820111156105a657600080fd5b803590602001918460208302840111640100000000831117156105c857600080fd5b909192939192939050505061135e565b005b610609600480360360208110156105f057600080fd5b81019080803560ff169060200190929190505050611820565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106c26004803603602081101561066157600080fd5b810190808035906020019064010000000081111561067e57600080fd5b82018360208201111561069057600080fd5b803590602001918460208302840111640100000000831117156106b257600080fd5b9091929391929390505050611853565b005b61073b600480360360208110156106da57600080fd5b81019080803590602001906401000000008111156106f757600080fd5b82018360208201111561070957600080fd5b8035906020019184602083028401116401000000008311171561072b57600080fd5b9091929391929390505050611a65565b005b61077f6004803603602081101561075357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e4a565b005b6107c36004803603602081101561079757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f78565b6040518082815260200191505060405180910390f35b61081b600480360360208110156107ef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f90565b005b610825612162565b6040518082815260200191505060405180910390f35b60036020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f6e6f742d617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b60008090505b82829050811015610a5d57600073ffffffffffffffffffffffffffffffffffffffff1683838381811061093c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d656469616e2f6e6f2d636f6e74726163742d3000000000000000000000000081525060200191505060405180910390fd5b6001600460008585858181106109f557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808060010191505061090d565b505961012081016040526020815260e0602082015260e0600060408301376024356004353360003560e01c60e01b61012085a4505050565b600160109054906101000a900463ffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610b5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f6e6f742d617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b60008111610bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f71756f72756d2d69732d7a65726f000000000000000000000081525060200191505060405180910390fd5b600060028281610be157fe5b061415610c56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d656469616e2f71756f72756d2d6e6f742d6f64642d6e756d6265720000000081525060200191505060405180910390fd5b806002819055505961012081016040526020815260e0602082015260e0600060408301376024356004353360003560e01c60e01b61012085a45050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f6e6f742d617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b60008090505b82829050811015610dd257600060046000858585818110610d6a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080600101915050610d4d565b505961012081016040526020815260e0602082015260e0600060408301376024356004353360003560e01c60e01b61012085a4505050565b7f564c58555344000000000000000000000000000000000000000000000000000081565b60046020528060005260406000206000915090505481565b60006001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4d656469616e2f636f6e74726163742d6e6f742d77686974656c69737465640081525060200191505060405180910390fd5b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1611610fa3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4d656469616e2f696e76616c69642d70726963652d666565640000000000000081525060200191505060405180910390fd5b600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905090565b6000806001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4d656469616e2f636f6e74726163742d6e6f742d77686974656c69737465640081525060200191505060405180910390fd5b600160009054906101000a90046fffffffffffffffffffffffffffffffff166000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1611816fffffffffffffffffffffffffffffffff169150915091509091565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f6e6f742d617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505961012081016040526020815260e0602082015260e0600060408301376024356004353360003560e01c60e01b61012085a45050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f6e6f742d617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505961012081016040526020815260e0602082015260e0600060408301376024356004353360003560e01c60e01b61012085a45050565b6002548a8a9050146113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4d656469616e2f6261722d746f6f2d6c6f77000000000000000000000000000081525060200191505060405180910390fd5b600080905060008090506000600160109054906101000a900463ffffffff1663ffffffff16905060008090505b8d8d905081101561171657600061147c8f8f8481811061142157fe5b905060200201358e8e8581811061143457fe5b905060200201358d8d8681811061144757fe5b9050602002013560ff168c8c8781811061145d57fe5b905060200201358b8b8881811061147057fe5b90506020020135612168565b90506001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611533576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f696e76616c69642d6f7261636c65000000000000000000000081525060200191505060405180910390fd5b828d8d8481811061154057fe5b90506020020135116115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d656469616e2f7374616c652d6d65737361676500000000000000000000000081525060200191505060405180910390fd5b838f8f848181106115c757fe5b905060200201351015611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d656469616e2f6d657373616765732d6e6f742d696e2d6f726465720000000081525060200191505060405180910390fd5b8e8e8381811061164e57fe5b905060200201359350600060988273ffffffffffffffffffffffffffffffffffffffff16901c9050600060028260ff1688901c8161168857fe5b06146116fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d656469616e2f6f7261636c652d616c72656164792d7369676e65640000000081525060200191505060405180910390fd5b8060ff1660020a8601955050508080600101915050611405565b508c8c60018f8f9050901c81811061172a57fe5b90506020020135600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555042600160106101000a81548163ffffffff021916908363ffffffff1602179055507fb78ebc573f1f889ca9e1e0fb62c843c836f3d3a2e1f43ef62940e9b894f4ea4c600160009054906101000a90046fffffffffffffffffffffffffffffffff16600160109054906101000a900463ffffffff1660405180836fffffffffffffffffffffffffffffffff1681526020018263ffffffff1681526020019250505060405180910390a150505050505050505050505050565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f6e6f742d617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b60008090505b82829050811015611a2d5760006003600085858581811061192a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060056000609886868681811061199957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16901c60ff1660ff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808060010191505061190d565b505961012081016040526020815260e0602082015260e0600060408301376024356004353360003560e01c60e01b61012085a4505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611b19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f6e6f742d617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b60008090505b82829050811015611e1257600073ffffffffffffffffffffffffffffffffffffffff16838383818110611b4e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bf5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4d656469616e2f6e6f2d6f7261636c652d30000000000000000000000000000081525060200191505060405180910390fd5b60006098848484818110611c0557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16901c9050600073ffffffffffffffffffffffffffffffffffffffff16600560008360ff1660ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d656469616e2f7369676e65722d616c72656164792d6578697374730000000081525060200191505060405180910390fd5b600160036000868686818110611d2957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550838383818110611d9057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16600560008360ff1660ff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080600101915050611b1f565b505961012081016040526020815260e0602082015260e0600060408301376024356004353360003560e01c60e01b61012085a4505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611efe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f6e6f742d617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505961012081016040526020815260e0602082015260e0600060408301376024356004353360003560e01c60e01b61012085a45050565b60006020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612044576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d656469616e2f6e6f742d617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d656469616e2f6e6f2d636f6e74726163742d3000000000000000000000000081525060200191505060405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505961012081016040526020815260e0602082015260e0600060408301376024356004353360003560e01c60e01b61012085a45050565b60025481565b6000600186867f564c5855534400000000000000000000000000000000000000000000000000006040516020018084815260200183815260200182815260200193505050506040516020818303038152906040528051906020012060405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012085858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561226b573d6000803e3d6000fd5b5050506020604051035190509594505050505056fea265627a7a72315820e486754961d8e0bdaf6c3be85a31fff52cd800f15c83ebd9dff10a8f3095646664736f6c634300050c0032