Contract Overview
Balance:
9,009.646587904851349524 Ether
EtherValue:
$14,752,665.61 (@ $1,637.43/ETH)
Token:
More Info
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
Bridge
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-15 */ // File: @openzeppelin/contracts/utils/Context.sol // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/utils/Pausable.sol pragma solidity ^0.7.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: contracts/Container.sol pragma solidity ^0.7.0; contract Container { struct Item { uint256 itemType; uint256 status; address[] addresses; } uint256 MaxItemAddressNum = 255; mapping(bytes32 => Item) private container; function itemAddressExists(bytes32 _id, address _oneAddress) internal view returns (bool) { for (uint256 i = 0; i < container[_id].addresses.length; i++) { if (container[_id].addresses[i] == _oneAddress) return true; } return false; } function getItemAddresses(bytes32 _id) internal view returns (address[] memory) { return container[_id].addresses; } function getItemInfo(bytes32 _id) internal view returns (uint256, uint256, uint256) { return (container[_id].itemType, container[_id].status, container[_id].addresses.length); } function getItemAddressCount(bytes32 _id) internal view returns (uint256) { return container[_id].addresses.length; } function setItemInfo(bytes32 _id, uint256 _itemType, uint256 _status) internal { container[_id].itemType = _itemType; container[_id].status = _status; } function addItemAddress(bytes32 _id, address _oneAddress) internal { require(!itemAddressExists(_id, _oneAddress), "Container:dup address added"); require(container[_id].addresses.length < MaxItemAddressNum, "Container:too many addresses"); container[_id].addresses.push(_oneAddress); } function removeItemAddresses(bytes32 _id) internal { delete container[_id].addresses; } function removeOneItemAddress(bytes32 _id, address _oneAddress) internal { for (uint256 i = 0; i < container[_id].addresses.length; i++) { if (container[_id].addresses[i] == _oneAddress) { container[_id].addresses[i] = container[_id].addresses[container[_id].addresses.length - 1]; container[_id].addresses.pop(); return; } } } function removeItem(bytes32 _id) internal { delete container[_id]; } function replaceItemAddress(bytes32 _id, address _oneAddress, address _anotherAddress) internal { for (uint256 i = 0; i < container[_id].addresses.length; i++) { if (container[_id].addresses[i] == _oneAddress) { container[_id].addresses[i] = _anotherAddress; return; } } } } // File: contracts/BridgeAdmin.sol pragma solidity ^0.7.0; contract BridgeAdmin is Container { bytes32 internal constant OWNERHASH = 0x02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c0; bytes32 internal constant OPERATORHASH = 0x46a52cf33029de9f84853745a87af28464c80bf0346df1b32e205fc73319f622; bytes32 internal constant PAUSERHASH = 0x0cc58340b26c619cd4edc70f833d3f4d9d26f3ae7d5ef2965f81fe5495049a4f; bytes32 internal constant STOREHASH = 0xe41d88711b08bdcd7556c5d2d24e0da6fa1f614cf2055f4d7e10206017cd1680; bytes32 internal constant LOGICHASH = 0x397bc5b97f629151e68146caedba62f10b47e426b38db589771a288c0861f182; uint256 internal constant MAXUSERNUM = 255; bytes32[] private classHashArray; uint256 internal ownerRequireNum; uint256 internal operatorRequireNum; event AdminChanged(string TaskType, string class, address oldAddress, address newAddress); event AdminRequiredNumChanged(string TaskType, string class, uint256 previousNum, uint256 requiredNum); event AdminTaskDropped(bytes32 taskHash); modifier validRequirement(uint ownerCount, uint _required) { require(ownerCount <= MaxItemAddressNum && _required <= ownerCount && _required > 0 && ownerCount > 0); _; } modifier onlyOwner() { require(itemAddressExists(OWNERHASH, msg.sender), "BridgeAdmin:only use owner to call"); _; } function initAdmin(address[] memory _owners, uint _ownerRequired) internal validRequirement(_owners.length, _ownerRequired) { for (uint i = 0; i < _owners.length; i++) { addItemAddress(OWNERHASH, _owners[i]); } addItemAddress(PAUSERHASH, _owners[0]); // we need an init pauser addItemAddress(LOGICHASH, address(0x0)); addItemAddress(STOREHASH, address(0x1)); classHashArray.push(OWNERHASH); classHashArray.push(OPERATORHASH); classHashArray.push(PAUSERHASH); classHashArray.push(STOREHASH); classHashArray.push(LOGICHASH); ownerRequireNum = _ownerRequired; operatorRequireNum = 2; } function classHashExist(bytes32 aHash) private view returns (bool) { for (uint256 i = 0; i < classHashArray.length; i++) if (classHashArray[i] == aHash) return true; return false; } function getAdminAddresses(string memory class) public view returns (address[] memory) { bytes32 classHash = getClassHash(class); return getItemAddresses(classHash); } function getOwnerRequireNum() public view returns (uint256) { return ownerRequireNum; } function getOperatorRequireNum() public view returns (uint256) { return operatorRequireNum; } function resetRequiredNum(string memory class, uint256 requiredNum) public onlyOwner returns (bool) { bytes32 classHash = getClassHash(class); require((classHash == OPERATORHASH) || (classHash == OWNERHASH), "BridgeAdmin:wrong class"); bytes32 taskHash = keccak256(abi.encodePacked("resetRequiredNum", class, requiredNum)); addItemAddress(taskHash, msg.sender); if (getItemAddressCount(taskHash) >= ownerRequireNum) { removeItem(taskHash); uint256 previousNum = 0; if (classHash == OWNERHASH) { require(getItemAddressCount(classHash) >= requiredNum, "BridgeAdmin:insufficiency addresses"); previousNum = ownerRequireNum; ownerRequireNum = requiredNum; } else if (classHash == OPERATORHASH) { previousNum = operatorRequireNum; operatorRequireNum = requiredNum; } else { revert("BridgeAdmin:wrong class"); } emit AdminRequiredNumChanged("resetRequiredNum", class, previousNum, requiredNum); } return true; } function modifyAddress(string memory class, address oldAddress, address newAddress) internal onlyOwner returns (bool) { bytes32 classHash = getClassHash(class); bytes32 taskHash = keccak256(abi.encodePacked("modifyAddress", class, oldAddress, newAddress)); addItemAddress(taskHash, msg.sender); if (getItemAddressCount(taskHash) >= ownerRequireNum) { replaceItemAddress(classHash, oldAddress, newAddress); emit AdminChanged("modifyAddress", class, oldAddress, newAddress); removeItem(taskHash); return true; } return false; } function getClassHash(string memory class) private view returns (bytes32) { bytes32 classHash = keccak256(abi.encodePacked(class)); require(classHashExist(classHash), "BridgeAdmin:invalid class"); return classHash; } function dropAddress(string memory class, address oneAddress) public onlyOwner returns (bool) { bytes32 classHash = getClassHash(class); require(classHash != STOREHASH && classHash != LOGICHASH, "BridgeAdmin:wrong class"); require(itemAddressExists(classHash, oneAddress), "BridgeAdmin:no such address exists"); if (classHash == OWNERHASH) require(getItemAddressCount(classHash) > ownerRequireNum, "BridgeAdmin:insufficiency addresses"); bytes32 taskHash = keccak256(abi.encodePacked("dropAddress", class, oneAddress)); addItemAddress(taskHash, msg.sender); if (getItemAddressCount(taskHash) >= ownerRequireNum) { removeOneItemAddress(classHash, oneAddress); emit AdminChanged("dropAddress", class, oneAddress, oneAddress); removeItem(taskHash); return true; } return false; } function addAddress(string memory class, address oneAddress) public onlyOwner returns (bool) { bytes32 classHash = getClassHash(class); require(classHash != STOREHASH && classHash != LOGICHASH, "BridgeAdmin:wrong class"); bytes32 taskHash = keccak256(abi.encodePacked("addAddress", class, oneAddress)); addItemAddress(taskHash, msg.sender); if (getItemAddressCount(taskHash) >= ownerRequireNum) { addItemAddress(classHash, oneAddress); emit AdminChanged("addAddress", class, oneAddress, oneAddress); removeItem(taskHash); return true; } return false; } function dropTask(bytes32 taskHash) public onlyOwner returns (bool) { removeItem(taskHash); emit AdminTaskDropped(taskHash); return true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: contracts/BridgeStorage.sol pragma solidity ^0.7.0; contract BridgeStorage is Container { string public constant name = "BridgeStorage"; address private caller; constructor(address aCaller) { caller = aCaller; } modifier onlyCaller() { require(msg.sender == caller, "BridgeStorage:only use main contract to call"); _; } function supporterExists(bytes32 taskHash, address user) public view returns (bool) { return itemAddressExists(taskHash, user); } function setTaskInfo(bytes32 taskHash, uint256 taskType, uint256 status) external onlyCaller { setItemInfo(taskHash, taskType, status); } function getTaskInfo(bytes32 taskHash) public view returns (uint256, uint256, uint256) { return getItemInfo(taskHash); } function addSupporter(bytes32 taskHash, address oneAddress) external onlyCaller { addItemAddress(taskHash, oneAddress); } function removeAllSupporter(bytes32 taskHash) external onlyCaller { removeItemAddresses(taskHash); } function removeTask(bytes32 taskHash) external onlyCaller { removeItem(taskHash); } } // File: contracts/BridgeLogic.sol pragma solidity ^0.7.0; contract BridgeLogic { using SafeMath for uint256; string public constant name = "BridgeLogic"; bytes32 internal constant OPERATORHASH = 0x46a52cf33029de9f84853745a87af28464c80bf0346df1b32e205fc73319f622; uint256 public constant TASKINIT = 0; uint256 public constant TASKPROCESSING = 1; uint256 public constant TASKCANCELLED = 2; uint256 public constant TASKDONE = 3; uint256 public constant WITHDRAWTASK = 1; address private caller; BridgeStorage private store; constructor(address aCaller) { caller = aCaller; } modifier onlyCaller() { require(msg.sender == caller, "BridgeLogic:only use main contract to call"); _; } modifier operatorExists(address operator) { require(store.supporterExists(OPERATORHASH, operator), "BridgeLogic:wrong operator"); _; } function resetStoreLogic(address storeAddress) external onlyCaller { store = BridgeStorage(storeAddress); } function getStoreAddress() public view returns (address) { return address(store); } function supportTask(uint256 taskType, bytes32 taskHash, address oneAddress, uint256 requireNum) external onlyCaller returns (uint256) { require(!store.supporterExists(taskHash, oneAddress), "BridgeLogic:supporter already exists"); (uint256 theTaskType,uint256 theTaskStatus,uint256 theSupporterNum) = store.getTaskInfo(taskHash); require(theTaskStatus < TASKDONE, "BridgeLogic:wrong status"); if (theTaskStatus != TASKINIT) require(theTaskType == taskType, "BridgeLogic:task type not match"); store.addSupporter(taskHash, oneAddress); theSupporterNum++; if (theSupporterNum >= requireNum) theTaskStatus = TASKDONE; else theTaskStatus = TASKPROCESSING; store.setTaskInfo(taskHash, taskType, theTaskStatus); return theTaskStatus; } function cancelTask(bytes32 taskHash) external onlyCaller returns (uint256) { (uint256 theTaskType,uint256 theTaskStatus,uint256 theSupporterNum) = store.getTaskInfo(taskHash); require(theTaskStatus == TASKPROCESSING, "BridgeLogic:wrong status"); if (theSupporterNum > 0) store.removeAllSupporter(taskHash); theTaskStatus = TASKCANCELLED; store.setTaskInfo(taskHash, theTaskType, theTaskStatus); return theTaskStatus; } function removeTask(bytes32 taskHash) external onlyCaller { store.removeTask(taskHash); } } // File: contracts/Bridge.sol pragma solidity ^0.7.0; contract Bridge is BridgeAdmin, Pausable { using SafeMath for uint256; string public constant name = "Bridge"; BridgeLogic private logic; uint256 public swapFee; address public feeTo; struct assetSelector { string selector; bool isValueFirst; } mapping(address => assetSelector) public depositSelector; mapping(address => assetSelector) public withdrawSelector; mapping(bytes32 => bool) public filledTx; event FeeToTransferred(address indexed previousFeeTo, address indexed newFeeTo); event SwapFeeChanged(uint256 indexed previousSwapFee, uint256 indexed newSwapFee); event DepositNative(address indexed from, uint256 value, string targetAddress, string chain, uint256 feeValue); event DepositToken(address indexed from, uint256 value, address indexed token, string targetAddress, string chain, uint256 feeValue); event WithdrawingNative(address indexed to, uint256 value, string proof); event WithdrawingToken(address indexed to, address indexed token, uint256 value, string proof); event WithdrawDoneNative(address indexed to, uint256 value, string proof); event WithdrawDoneToken(address indexed to, address indexed token, uint256 value, string proof); modifier onlyOperator() { require(itemAddressExists(OPERATORHASH, msg.sender), "Bridge:wrong operator"); _; } modifier onlyPauser() { require(itemAddressExists(PAUSERHASH, msg.sender), "Bridge:wrong pauser"); _; } modifier positiveValue(uint _value) { require(_value > 0, "Bridge:value need > 0"); _; } constructor(address[] memory _owners, uint _ownerRequired) { initAdmin(_owners, _ownerRequired); } function depositNative(string memory _targetAddress, string memory chain) public payable { require(msg.value >= swapFee, "Bridge:insufficient swap fee"); if (swapFee != 0) { payable(feeTo).transfer(swapFee); } emit DepositNative(msg.sender, msg.value - swapFee, _targetAddress, chain, swapFee); } function depositToken(address _token, uint value, string memory _targetAddress, string memory chain) public payable returns (bool) { require(msg.value == swapFee, "Bridge:swap fee not equal"); if (swapFee != 0) { payable(feeTo).transfer(swapFee); } bool res = depositTokenLogic(_token, msg.sender, value); emit DepositToken(msg.sender, value, _token, _targetAddress, chain, swapFee); return res; } function withdrawNative(address payable to, uint value, string memory proof, bytes32 taskHash) public onlyOperator whenNotPaused positiveValue(value) returns (bool) { require(address(this).balance >= value, "Bridge:not enough native token"); require(taskHash == keccak256((abi.encodePacked(to, value, proof))), "Bridge:taskHash is wrong"); require(!filledTx[taskHash], "Bridge:tx filled already"); uint256 status = logic.supportTask(logic.WITHDRAWTASK(), taskHash, msg.sender, operatorRequireNum); if (status == logic.TASKPROCESSING()) { emit WithdrawingNative(to, value, proof); } else if (status == logic.TASKDONE()) { emit WithdrawingNative(to, value, proof); emit WithdrawDoneNative(to, value, proof); to.transfer(value); filledTx[taskHash] = true; logic.removeTask(taskHash); } return true; } function withdrawToken(address _token, address to, uint value, string memory proof, bytes32 taskHash) public onlyOperator whenNotPaused positiveValue(value) returns (bool) { require(taskHash == keccak256((abi.encodePacked(to, value, proof))), "Bridge:taskHash is wrong"); require(!filledTx[taskHash], "Bridge:tx filled already"); uint256 status = logic.supportTask(logic.WITHDRAWTASK(), taskHash, msg.sender, operatorRequireNum); if (status == logic.TASKPROCESSING()) { emit WithdrawingToken(to, _token, value, proof); } else if (status == logic.TASKDONE()) { bool res = withdrawTokenLogic(_token, to, value); emit WithdrawingToken(to, _token, value, proof); emit WithdrawDoneToken(to, _token, value, proof); filledTx[taskHash] = true; logic.removeTask(taskHash); return res; } return true; } function modifyAdminAddress(string memory class, address oldAddress, address newAddress) public whenPaused { require(newAddress != address(0x0), "Bridge:wrong address"); bool flag = modifyAddress(class, oldAddress, newAddress); if (flag) { bytes32 classHash = keccak256(abi.encodePacked(class)); if (classHash == LOGICHASH) { logic = BridgeLogic(newAddress); } else if (classHash == STOREHASH) { logic.resetStoreLogic(newAddress); } } } function getLogicAddress() public view returns (address) { return address(logic); } function getStoreAddress() public view returns (address) { return logic.getStoreAddress(); } function pause() public onlyPauser { _pause(); } function unpause() public onlyPauser { _unpause(); } function setDepositSelector(address token, string memory method, bool _isValueFirst) onlyOperator external { depositSelector[token] = assetSelector(method, _isValueFirst); } function setWithdrawSelector(address token, string memory method, bool _isValueFirst) onlyOperator external { withdrawSelector[token] = assetSelector(method, _isValueFirst); } function setSwapFee(uint256 _swapFee) onlyOwner external { emit SwapFeeChanged(swapFee, _swapFee); swapFee = _swapFee; } function setFeeTo(address _feeTo) onlyOwner external { emit FeeToTransferred(feeTo, _feeTo); feeTo = _feeTo; } function depositTokenLogic(address token, address _from, uint256 _value) internal returns (bool) { bool status = false; bytes memory returnedData; if (bytes(depositSelector[token].selector).length == 0) { (status, returnedData) = token.call(abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, this, _value)); } else { assetSelector memory aselector = depositSelector[token]; if (aselector.isValueFirst) { (status, returnedData) = token.call(abi.encodeWithSignature(aselector.selector, _value, _from)); } else { (status, returnedData) = token.call(abi.encodeWithSignature(aselector.selector, _from, _value)); } } require(status && (returnedData.length == 0 || abi.decode(returnedData, (bool))), 'Bridge:deposit failed'); return true; } function withdrawTokenLogic(address token, address _to, uint256 _value) internal returns (bool) { bool status = false; bytes memory returnedData; if (bytes(withdrawSelector[token].selector).length == 0) { (status, returnedData) = token.call(abi.encodeWithSignature("transfer(address,uint256)", _to, _value)); } else { assetSelector memory aselector = withdrawSelector[token]; if (aselector.isValueFirst) { (status, returnedData) = token.call(abi.encodeWithSignature(aselector.selector, _value, _to)); } else { (status, returnedData) = token.call(abi.encodeWithSignature(aselector.selector, _to, _value)); } } require(status && (returnedData.length == 0 || abi.decode(returnedData, (bool))), 'Bridge:withdraw failed'); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_ownerRequired","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"TaskType","type":"string"},{"indexed":false,"internalType":"string","name":"class","type":"string"},{"indexed":false,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"TaskType","type":"string"},{"indexed":false,"internalType":"string","name":"class","type":"string"},{"indexed":false,"internalType":"uint256","name":"previousNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requiredNum","type":"uint256"}],"name":"AdminRequiredNumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"taskHash","type":"bytes32"}],"name":"AdminTaskDropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"targetAddress","type":"string"},{"indexed":false,"internalType":"string","name":"chain","type":"string"},{"indexed":false,"internalType":"uint256","name":"feeValue","type":"uint256"}],"name":"DepositNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"string","name":"targetAddress","type":"string"},{"indexed":false,"internalType":"string","name":"chain","type":"string"},{"indexed":false,"internalType":"uint256","name":"feeValue","type":"uint256"}],"name":"DepositToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousFeeTo","type":"address"},{"indexed":true,"internalType":"address","name":"newFeeTo","type":"address"}],"name":"FeeToTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"previousSwapFee","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newSwapFee","type":"uint256"}],"name":"SwapFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"proof","type":"string"}],"name":"WithdrawDoneNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"proof","type":"string"}],"name":"WithdrawDoneToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"proof","type":"string"}],"name":"WithdrawingNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"proof","type":"string"}],"name":"WithdrawingToken","type":"event"},{"inputs":[{"internalType":"string","name":"class","type":"string"},{"internalType":"address","name":"oneAddress","type":"address"}],"name":"addAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_targetAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"}],"name":"depositNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositSelector","outputs":[{"internalType":"string","name":"selector","type":"string"},{"internalType":"bool","name":"isValueFirst","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"_targetAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"}],"name":"depositToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"class","type":"string"},{"internalType":"address","name":"oneAddress","type":"address"}],"name":"dropAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"taskHash","type":"bytes32"}],"name":"dropTask","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"filledTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"class","type":"string"}],"name":"getAdminAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLogicAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperatorRequireNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwnerRequireNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStoreAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"class","type":"string"},{"internalType":"address","name":"oldAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"}],"name":"modifyAdminAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"class","type":"string"},{"internalType":"uint256","name":"requiredNum","type":"uint256"}],"name":"resetRequiredNum","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"method","type":"string"},{"internalType":"bool","name":"_isValueFirst","type":"bool"}],"name":"setDepositSelector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"method","type":"string"},{"internalType":"bool","name":"_isValueFirst","type":"bool"}],"name":"setWithdrawSelector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"proof","type":"string"},{"internalType":"bytes32","name":"taskHash","type":"bytes32"}],"name":"withdrawNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawSelector","outputs":[{"internalType":"string","name":"selector","type":"string"},{"internalType":"bool","name":"isValueFirst","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"proof","type":"string"},{"internalType":"bytes32","name":"taskHash","type":"bytes32"}],"name":"withdrawToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260ff6000553480156200001657600080fd5b5060405162004aff38038062004aff833981810160405260408110156200003c57600080fd5b81019080805160405193929190846401000000008211156200005d57600080fd5b9083019060208201858111156200007357600080fd5b82518660208202830111640100000000821117156200009157600080fd5b82525081516020918201928201910280838360005b83811015620000c0578181015183820152602001620000a6565b505050509190910160405250602001516005805460ff191690559150620000ea90508282620000f2565b505062000433565b8151816000548211158015620001085750818111155b8015620001155750600081115b8015620001225750600082115b6200012c57600080fd5b60005b84518110156200017a576200017160008051602062004abf83398151915260001b8683815181106200015d57fe5b6020026020010151620002a760201b60201c565b6001016200012f565b50620001a060008051602062004a7f83398151915260001b856000815181106200015d57fe5b620001bc60008051602062004a9f8339815191526000620002a7565b620001d860008051602062004adf8339815191526001620002a7565b50506002805460018181018355600083905260008051602062004abf8339815191527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace92830155825480820184557f46a52cf33029de9f84853745a87af28464c80bf0346df1b32e205fc73319f622908301558254808201845560008051602062004a7f833981519152908301558254808201845560008051602062004adf833981519152908301558254908101835560008051602062004a9f83398151915291015560039190915560045550565b620002b38282620003af565b1562000306576040805162461bcd60e51b815260206004820152601b60248201527f436f6e7461696e65723a64757020616464726573732061646465640000000000604482015290519081900360640190fd5b600080548382526001602052604090912060020154106200036e576040805162461bcd60e51b815260206004820152601c60248201527f436f6e7461696e65723a746f6f206d616e792061646472657373657300000000604482015290519081900360640190fd5b6000918252600160208181526040842060020180549283018155845290922090910180546001600160a01b0319166001600160a01b03909216919091179055565b6000805b6000848152600160205260409020600201548110156200042757600084815260016020526040902060020180546001600160a01b038516919083908110620003f757fe5b6000918252602090912001546001600160a01b031614156200041e5760019150506200042d565b600101620003b3565b50600090505b92915050565b61463c80620004436000396000f3fe60806040526004361061019b5760003560e01c80638609d28c116100ec578063ceb35b0f1161008a578063e6a81ec411610064578063e6a81ec414610d10578063e9e211bd14610d25578063f46901ed14610dd8578063f60c757f14610e0b5761019b565b8063ceb35b0f14610a4e578063d5b99d3c14610b0a578063dd9b86c114610bd25761019b565b8063b07ed3a9116100c6578063b07ed3a9146107c1578063c8e369bf146107d6578063c8fd90f9146108d7578063cb08e3ca1461099a5761019b565b80638609d28c146105c757806391c40bf7146106f0578063abd108ba146107ac5761019b565b806334e199071161015957806354cf2aeb1161013357806354cf2aeb1461055e5780635c975abb1461057357806364908649146105885780638456cb59146105b25761019b565b806334e19907146104f55780633f4ba83a1461051f578063521cb590146105345761019b565b8062674f63146101a0578063017e7e581461026557806302c1927c1461029657806306fdde031461037d5780631d75807c146104075780632c2df7421461042e575b600080fd5b3480156101ac57600080fd5b50610263600480360360608110156101c357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156101ed57600080fd5b8201836020820111156101ff57600080fd5b803590602001918460018302840111600160201b8311171561022057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050503515159050610e3e565b005b34801561027157600080fd5b5061027a610f04565b604080516001600160a01b039092168252519081900360200190f35b3480156102a257600080fd5b50610369600480360360a08110156102b957600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102f357600080fd5b82018360208201111561030557600080fd5b803590602001918460018302840111600160201b8311171561032657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610f13915050565b604080519115158252519081900360200190f35b34801561038957600080fd5b50610392611612565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103cc5781810151838201526020016103b4565b50505050905090810190601f1680156103f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041357600080fd5b5061041c611634565b60408051918252519081900360200190f35b34801561043a57600080fd5b506102636004803603606081101561045157600080fd5b810190602081018135600160201b81111561046b57600080fd5b82018360208201111561047d57600080fd5b803590602001918460018302840111600160201b8311171561049e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b03833581169450602090930135909216915061163a9050565b34801561050157600080fd5b506102636004803603602081101561051857600080fd5b5035611860565b34801561052b57600080fd5b506102636118e7565b34801561054057600080fd5b506103696004803603602081101561055757600080fd5b5035611962565b34801561056a57600080fd5b5061041c6119fc565b34801561057f57600080fd5b50610369611a02565b34801561059457600080fd5b50610369600480360360208110156105ab57600080fd5b5035611a0b565b3480156105be57600080fd5b50610263611a20565b610263600480360360408110156105dd57600080fd5b810190602081018135600160201b8111156105f757600080fd5b82018360208201111561060957600080fd5b803590602001918460018302840111600160201b8311171561062a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561067c57600080fd5b82018360208201111561068e57600080fd5b803590602001918460018302840111600160201b831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a99945050505050565b3480156106fc57600080fd5b506103696004803603604081101561071357600080fd5b810190602081018135600160201b81111561072d57600080fd5b82018360208201111561073f57600080fd5b803590602001918460018302840111600160201b8311171561076057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b03169150611c5a9050565b3480156107b857600080fd5b5061027a611fbe565b3480156107cd57600080fd5b5061027a611fd2565b3480156107e257600080fd5b50610887600480360360208110156107f957600080fd5b810190602081018135600160201b81111561081357600080fd5b82018360208201111561082557600080fd5b803590602001918460018302840111600160201b8311171561084657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612053945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156108c35781810151838201526020016108ab565b505050509050019250505060405180910390f35b3480156108e357600080fd5b50610263600480360360608110156108fa57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561092457600080fd5b82018360208201111561093657600080fd5b803590602001918460018302840111600160201b8311171561095757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050503515159050612072565b3480156109a657600080fd5b506109cd600480360360208110156109bd57600080fd5b50356001600160a01b0316612117565b60405180806020018315158152602001828103825284818151815260200191508051906020019080838360005b83811015610a125781810151838201526020016109fa565b50505050905090810190601f168015610a3f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b348015610a5a57600080fd5b5061036960048036036040811015610a7157600080fd5b810190602081018135600160201b811115610a8b57600080fd5b820183602082011115610a9d57600080fd5b803590602001918460018302840111600160201b83111715610abe57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506121c19050565b348015610b1657600080fd5b5061036960048036036080811015610b2d57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610b5c57600080fd5b820183602082011115610b6e57600080fd5b803590602001918460018302840111600160201b83111715610b8f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250612421915050565b61036960048036036080811015610be857600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610c1757600080fd5b820183602082011115610c2957600080fd5b803590602001918460018302840111600160201b83111715610c4a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610c9c57600080fd5b820183602082011115610cae57600080fd5b803590602001918460018302840111600160201b83111715610ccf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612b73945050505050565b348015610d1c57600080fd5b5061041c612d4f565b348015610d3157600080fd5b5061036960048036036040811015610d4857600080fd5b810190602081018135600160201b811115610d6257600080fd5b820183602082011115610d7457600080fd5b803590602001918460018302840111600160201b83111715610d9557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250612d55915050565b348015610de457600080fd5b5061026360048036036020811015610dfb57600080fd5b50356001600160a01b0316613096565b348015610e1757600080fd5b506109cd60048036036020811015610e2e57600080fd5b50356001600160a01b0316613145565b610e56600080516020614583833981519152336131b1565b610e9f576040805162461bcd60e51b8152602060048201526015602482015274213934b233b29d3bb937b7339037b832b930ba37b960591b604482015290519081900360640190fd5b6040805180820182528381528215156020808301919091526001600160a01b038616600090815260088252929092208151805192939192610ee39284920190614485565b50602091909101516001909101805460ff1916911515919091179055505050565b6007546001600160a01b031681565b6000610f2d600080516020614583833981519152336131b1565b610f76576040805162461bcd60e51b8152602060048201526015602482015274213934b233b29d3bb937b7339037b832b930ba37b960591b604482015290519081900360640190fd5b610f7e611a02565b15610fc3576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b8360008111611011576040805162461bcd60e51b815260206004820152601560248201527404272696467653a76616c7565206e656564203e203605c1b604482015290519081900360640190fd5b85858560405160200180846001600160a01b031660601b815260140183815260200182805190602001908083835b6020831061105e5780518252601f19909201916020918201910161103f565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040528051906020012083146110e9576040805162461bcd60e51b81526020600482015260186024820152774272696467653a7461736b486173682069732077726f6e6760401b604482015290519081900360640190fd5b6000838152600a602052604090205460ff1615611148576040805162461bcd60e51b81526020600482015260186024820152774272696467653a74782066696c6c656420616c726561647960401b604482015290519081900360640190fd5b600554604080516323c29c0160e11b8152905160009261010090046001600160a01b03169163ae0fd47f9183916347853802916004808301926020929190829003018186803b15801561119a57600080fd5b505afa1580156111ae573d6000803e3d6000fd5b505050506040513d60208110156111c457600080fd5b505160048054604080516001600160e01b031960e087901b16815292830193909352602482018990523360448301526064820152905160848083019260209291908290030181600087803b15801561121b57600080fd5b505af115801561122f573d6000803e3d6000fd5b505050506040513d602081101561124557600080fd5b5051600554604080516357ea327960e11b815290519293506101009091046001600160a01b03169163afd464f291600480820192602092909190829003018186803b15801561129357600080fd5b505afa1580156112a7573d6000803e3d6000fd5b505050506040513d60208110156112bd57600080fd5b505181141561138057876001600160a01b0316876001600160a01b03167f91b4005f248ece53c5402f0c547c6a472d18676fbb0e2e15029d4869140cbe2088886040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611340578181015183820152602001611328565b50505050905090810190601f16801561136d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3611602565b600560019054906101000a90046001600160a01b03166001600160a01b03166310224a986040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ce57600080fd5b505afa1580156113e2573d6000803e3d6000fd5b505050506040513d60208110156113f857600080fd5b505181141561160257600061140e89898961322e565b9050886001600160a01b0316886001600160a01b03167f91b4005f248ece53c5402f0c547c6a472d18676fbb0e2e15029d4869140cbe2089896040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561148a578181015183820152602001611472565b50505050905090810190601f1680156114b75780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3886001600160a01b0316886001600160a01b03167f044513e921a12ac6560730ac3063f7946fdcb715deb39bc6f84c38be8083648a89896040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561153f578181015183820152602001611527565b50505050905090810190601f16801561156c5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a36000858152600a60205260408082208054600160ff19909116179055600554815163281adb1160e11b81526004810189905291516101009091046001600160a01b031692635035b622926024808201939182900301818387803b1580156115e057600080fd5b505af11580156115f4573d6000803e3d6000fd5b505050508093505050611608565b60019250505b5095945050505050565b6040518060400160405280600681526020016542726964676560d01b81525081565b60045490565b611642611a02565b61168a576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6001600160a01b0381166116dc576040805162461bcd60e51b81526020600482015260146024820152734272696467653a77726f6e67206164647265737360601b604482015290519081900360640190fd5b60006116e9848484613750565b9050801561185a576000846040516020018082805190602001908083835b602083106117265780518252601f199092019160209182019101611707565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012090507f397bc5b97f629151e68146caedba62f10b47e426b38db589771a288c0861f18260001b8114156117b35760058054610100600160a81b0319166101006001600160a01b03861602179055611858565b7fe41d88711b08bdcd7556c5d2d24e0da6fa1f614cf2055f4d7e10206017cd168081141561185857600560019054906101000a90046001600160a01b03166001600160a01b031663b0d80346846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561183f57600080fd5b505af1158015611853573d6000803e3d6000fd5b505050505b505b50505050565b6118786000805160206145a3833981519152336131b1565b6118b35760405162461bcd60e51b81526004018080602001828103825260228152602001806145e56022913960400191505060405180910390fd5b6006546040518291907fad321f810529281bbb90384fd6fecbdda41509a5ccd7bd5aed986ed827f6a02690600090a3600655565b6119117f0cc58340b26c619cd4edc70f833d3f4d9d26f3ae7d5ef2965f81fe5495049a4f336131b1565b611958576040805162461bcd60e51b8152602060048201526013602482015272213934b233b29d3bb937b733903830bab9b2b960691b604482015290519081900360640190fd5b61196061398e565b565b600061197c6000805160206145a3833981519152336131b1565b6119b75760405162461bcd60e51b81526004018080602001828103825260228152602001806145e56022913960400191505060405180910390fd5b6119c082613a2e565b6040805183815290517f468b360fa155a4c5fdf0cb38ce238407e41508a56023e7536088c21b2cd641399181900360200190a15060015b919050565b60065481565b60055460ff1690565b600a6020526000908152604090205460ff1681565b611a4a7f0cc58340b26c619cd4edc70f833d3f4d9d26f3ae7d5ef2965f81fe5495049a4f336131b1565b611a91576040805162461bcd60e51b8152602060048201526013602482015272213934b233b29d3bb937b733903830bab9b2b960691b604482015290519081900360640190fd5b611960613a5a565b600654341015611af0576040805162461bcd60e51b815260206004820152601c60248201527f4272696467653a696e73756666696369656e7420737761702066656500000000604482015290519081900360640190fd5b60065415611b36576007546006546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015611b34573d6000803e3d6000fd5b505b336001600160a01b03167f0f0febc7655213f7f4ed640f722413acbfa5bab0fac4cd58ae8792c618e2ab3760065434038484600654604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015611bb8578181015183820152602001611ba0565b50505050905090810190601f168015611be55780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015611c18578181015183820152602001611c00565b50505050905090810190601f168015611c455780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a25050565b6000611c746000805160206145a3833981519152336131b1565b611caf5760405162461bcd60e51b81526004018080602001828103825260228152602001806145e56022913960400191505060405180910390fd5b6000611cba84613add565b90507fe41d88711b08bdcd7556c5d2d24e0da6fa1f614cf2055f4d7e10206017cd16808114801590611d0c57507f397bc5b97f629151e68146caedba62f10b47e426b38db589771a288c0861f1828114155b611d57576040805162461bcd60e51b815260206004820152601760248201527642726964676541646d696e3a77726f6e6720636c61737360481b604482015290519081900360640190fd5b611d6181846131b1565b611d9c5760405162461bcd60e51b81526004018080602001828103825260228152602001806145c36022913960400191505060405180910390fd5b6000805160206145a3833981519152811415611dfa57600354611dbe82613baa565b11611dfa5760405162461bcd60e51b81526004018080602001828103825260238152602001806145606023913960400191505060405180910390fd5b6000848460405160200180806a64726f704164647265737360a81b815250600b0183805190602001908083835b60208310611e465780518252601f199092019160209182019101611e27565b6001836020036101000a038019825116818451168082178552505050505050905001826001600160a01b031660601b815260140192505050604051602081830303815290604052805190602001209050611ea08133613bbf565b600354611eac82613baa565b10611fb157611ebb8285613cc3565b7fb02ddf2800cd4468f7eb14268a7c9f1b6e816aa425ed542d13d8d3a96fa44566858586604051808060200180602001856001600160a01b03168152602001846001600160a01b031681526020018381038352600b8152602001806a64726f704164647265737360a81b815250602001838103825286818151815260200191508051906020019080838360005b83811015611f60578181015183820152602001611f48565b50505050905090810190601f168015611f8d5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1611fa681613a2e565b600192505050611fb8565b6000925050505b92915050565b60055461010090046001600160a01b031690565b6000600560019054906101000a90046001600160a01b03166001600160a01b031663b07ed3a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561202257600080fd5b505afa158015612036573d6000803e3d6000fd5b505050506040513d602081101561204c57600080fd5b5051905090565b6060600061206083613add565b905061206b81613df3565b9392505050565b61208a600080516020614583833981519152336131b1565b6120d3576040805162461bcd60e51b8152602060048201526015602482015274213934b233b29d3bb937b7339037b832b930ba37b960591b604482015290519081900360640190fd5b6040805180820182528381528215156020808301919091526001600160a01b038616600090815260098252929092208151805192939192610ee39284920190614485565b60096020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529092918391908301828280156121ae5780601f10612183576101008083540402835291602001916121ae565b820191906000526020600020905b81548152906001019060200180831161219157829003601f168201915b5050506001909301549192505060ff1682565b60006121db6000805160206145a3833981519152336131b1565b6122165760405162461bcd60e51b81526004018080602001828103825260228152602001806145e56022913960400191505060405180910390fd5b600061222184613add565b90507fe41d88711b08bdcd7556c5d2d24e0da6fa1f614cf2055f4d7e10206017cd1680811480159061227357507f397bc5b97f629151e68146caedba62f10b47e426b38db589771a288c0861f1828114155b6122be576040805162461bcd60e51b815260206004820152601760248201527642726964676541646d696e3a77726f6e6720636c61737360481b604482015290519081900360640190fd5b600084846040516020018080696164644164647265737360b01b815250600a0183805190602001908083835b602083106123095780518252601f1990920191602091820191016122ea565b6001836020036101000a038019825116818451168082178552505050505050905001826001600160a01b031660601b8152601401925050506040516020818303038152906040528051906020012090506123638133613bbf565b60035461236f82613baa565b10611fb15761237e8285613bbf565b7fb02ddf2800cd4468f7eb14268a7c9f1b6e816aa425ed542d13d8d3a96fa44566858586604051808060200180602001856001600160a01b03168152602001846001600160a01b031681526020018381038352600a815260200180696164644164647265737360b01b8152506020018381038252868181518152602001915080519060200190808383600083811015611f60578181015183820152602001611f48565b600061243b600080516020614583833981519152336131b1565b612484576040805162461bcd60e51b8152602060048201526015602482015274213934b233b29d3bb937b7339037b832b930ba37b960591b604482015290519081900360640190fd5b61248c611a02565b156124d1576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b836000811161251f576040805162461bcd60e51b815260206004820152601560248201527404272696467653a76616c7565206e656564203e203605c1b604482015290519081900360640190fd5b84471015612574576040805162461bcd60e51b815260206004820152601e60248201527f4272696467653a6e6f7420656e6f756768206e617469766520746f6b656e0000604482015290519081900360640190fd5b85858560405160200180846001600160a01b031660601b815260140183815260200182805190602001908083835b602083106125c15780518252601f1990920191602091820191016125a2565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405280519060200120831461264c576040805162461bcd60e51b81526020600482015260186024820152774272696467653a7461736b486173682069732077726f6e6760401b604482015290519081900360640190fd5b6000838152600a602052604090205460ff16156126ab576040805162461bcd60e51b81526020600482015260186024820152774272696467653a74782066696c6c656420616c726561647960401b604482015290519081900360640190fd5b600554604080516323c29c0160e11b8152905160009261010090046001600160a01b03169163ae0fd47f9183916347853802916004808301926020929190829003018186803b1580156126fd57600080fd5b505afa158015612711573d6000803e3d6000fd5b505050506040513d602081101561272757600080fd5b505160048054604080516001600160e01b031960e087901b16815292830193909352602482018990523360448301526064820152905160848083019260209291908290030181600087803b15801561277e57600080fd5b505af1158015612792573d6000803e3d6000fd5b505050506040513d60208110156127a857600080fd5b5051600554604080516357ea327960e11b815290519293506101009091046001600160a01b03169163afd464f291600480820192602092909190829003018186803b1580156127f657600080fd5b505afa15801561280a573d6000803e3d6000fd5b505050506040513d602081101561282057600080fd5b50518114156128d957866001600160a01b03167f85c53e7e269cd44a12210170eb2636cdc0d111b93e101a211305e0144733995587876040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612899578181015183820152602001612881565b50505050905090810190601f1680156128c65780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2612b66565b600560019054906101000a90046001600160a01b03166001600160a01b03166310224a986040518163ffffffff1660e01b815260040160206040518083038186803b15801561292757600080fd5b505afa15801561293b573d6000803e3d6000fd5b505050506040513d602081101561295157600080fd5b5051811415612b6657866001600160a01b03167f85c53e7e269cd44a12210170eb2636cdc0d111b93e101a211305e0144733995587876040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156129ca5781810151838201526020016129b2565b50505050905090810190601f1680156129f75780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2866001600160a01b03167fd8ff38332185c42ca14ded5671b8eb2842095abf024f6900cb42760ccb438f3387876040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612a75578181015183820152602001612a5d565b50505050905090810190601f168015612aa25780820380516001836020036101000a031916815260200191505b50935050505060405180910390a26040516001600160a01b0388169087156108fc029088906000818181858888f19350505050158015612ae6573d6000803e3d6000fd5b506000848152600a60205260408082208054600160ff19909116179055600554815163281adb1160e11b81526004810188905291516101009091046001600160a01b031692635035b622926024808201939182900301818387803b158015612b4d57600080fd5b505af1158015612b61573d6000803e3d6000fd5b505050505b5060019695505050505050565b60006006543414612bcb576040805162461bcd60e51b815260206004820152601960248201527f4272696467653a7377617020666565206e6f7420657175616c00000000000000604482015290519081900360640190fd5b60065415612c11576007546006546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015612c0f573d6000803e3d6000fd5b505b6000612c1e863387613e62565b9050856001600160a01b0316336001600160a01b03167f63333d9ba80d323ed3a2c486809215e8f1fb8c645691606b862787fad572c1c7878787600654604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015612ca8578181015183820152602001612c90565b50505050905090810190601f168015612cd55780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015612d08578181015183820152602001612cf0565b50505050905090810190601f168015612d355780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a395945050505050565b60035490565b6000612d6f6000805160206145a3833981519152336131b1565b612daa5760405162461bcd60e51b81526004018080602001828103825260228152602001806145e56022913960400191505060405180910390fd5b6000612db584613add565b9050600080516020614583833981519152811480612de057506000805160206145a383398151915281145b612e2b576040805162461bcd60e51b815260206004820152601760248201527642726964676541646d696e3a77726f6e6720636c61737360481b604482015290519081900360640190fd5b6000848460405160200180806f726573657452657175697265644e756d60801b81525060100183805190602001908083835b60208310612e7c5780518252601f199092019160209182019101612e5d565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152938201905282519201919091209250612ec2915082905033613bbf565b600354612ece82613baa565b1061308b57612edc81613a2e565b60006000805160206145a3833981519152831415612f495784612efe84613baa565b1015612f3b5760405162461bcd60e51b81526004018080602001828103825260238152602001806145606023913960400191505060405180910390fd5b506003805490859055612fb4565b600080516020614583833981519152831415612f6d57506004805490859055612fb4565b6040805162461bcd60e51b815260206004820152601760248201527642726964676541646d696e3a77726f6e6720636c61737360481b604482015290519081900360640190fd5b7fce49fc04234925e87b95750e0e50cac6d4ffcf8a696e3316b3e13bedc84ee7a8868287604051808060200180602001858152602001848152602001838103835260108152602001806f726573657452657175697265644e756d60801b815250602001838103825286818151815260200191508051906020019080838360005b8381101561304c578181015183820152602001613034565b50505050905090810190601f1680156130795780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1505b506001949350505050565b6130ae6000805160206145a3833981519152336131b1565b6130e95760405162461bcd60e51b81526004018080602001828103825260228152602001806145e56022913960400191505060405180910390fd5b6007546040516001600160a01b038084169216907f941bed5eb8a4f7abb41f1a8547c6b5fded98a6fbe47dbd60aee080690de5f0d590600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b60086020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529092918391908301828280156121ae5780601f10612183576101008083540402835291602001916121ae565b6000805b60008481526001602052604090206002015481101561322457600084815260016020526040902060020180546001600160a01b0385169190839081106131f757fe5b6000918252602090912001546001600160a01b0316141561321c576001915050611fb8565b6001016131b5565b5060009392505050565b6001600160a01b03831660009081526009602052604081205481906060906002600019610100600184161502019091160461334c57604080516001600160a01b038781166024830152604480830188905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17815292518251918a169390918291908083835b602083106132da5780518252601f1990920191602091820191016132bb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461333c576040519150601f19603f3d011682016040523d82523d6000602084013e613341565b606091505b5090925090506136d1565b613354614511565b6001600160a01b0387166000908152600960209081526040918290208251815460026001821615610100026000190190911604601f81018490049093028101606090810185529381018381529093919284928491908401828280156133fa5780601f106133cf576101008083540402835291602001916133fa565b820191906000526020600020905b8154815290600101906020018083116133dd57829003601f168201915b50505091835250506001919091015460ff1615156020918201528101519091501561357957866001600160a01b03168160000151868860405160240180838152602001826001600160a01b0316815260200192505050604051602081830303815290604052906040518082805190602001908083835b6020831061348f5780518252601f199092019160209182019101613470565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932092860180516001600160e01b03166001600160e01b031990941693909317835251855190945084935090508083835b602083106135075780518252601f1990920191602091820191016134e8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613569576040519150601f19603f3d011682016040523d82523d6000602084013e61356e565b606091505b5090935091506136cf565b866001600160a01b03168160000151878760405160240180836001600160a01b0316815260200182815260200192505050604051602081830303815290604052906040518082805190602001908083835b602083106135e95780518252601f1990920191602091820191016135ca565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932092860180516001600160e01b03166001600160e01b031990941693909317835251855190945084935090508083835b602083106136615780518252601f199092019160209182019101613642565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146136c3576040519150601f19603f3d011682016040523d82523d6000602084013e6136c8565b606091505b5090935091505b505b8180156136fa5750805115806136fa57508080602001905160208110156136f757600080fd5b50515b613744576040805162461bcd60e51b8152602060048201526016602482015275109c9a5919d94e9dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b50600195945050505050565b600061376a6000805160206145a3833981519152336131b1565b6137a55760405162461bcd60e51b81526004018080602001828103825260228152602001806145e56022913960400191505060405180910390fd5b60006137b085613add565b9050600085858560405160200180806c6d6f646966794164647265737360981b815250600d0184805190602001908083835b602083106138015780518252601f1990920191602091820191016137e2565b6001836020036101000a038019825116818451168082178552505050505050905001836001600160a01b031660601b8152601401826001600160a01b031660601b8152601401935050505060405160208183030381529060405280519060200120905061386e8133613bbf565b60035461387a82613baa565b106139825761388a82868661437d565b7fb02ddf2800cd4468f7eb14268a7c9f1b6e816aa425ed542d13d8d3a96fa44566868686604051808060200180602001856001600160a01b03168152602001846001600160a01b031681526020018381038352600d8152602001806c6d6f646966794164647265737360981b815250602001838103825286818151815260200191508051906020019080838360005b83811015613931578181015183820152602001613919565b50505050905090810190601f16801561395e5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a161397781613a2e565b60019250505061206b565b50600095945050505050565b613996611a02565b6139de576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613a11614439565b604080516001600160a01b039092168252519081900360200190a1565b6000818152600160208190526040822082815590810182905590613a556002830182614529565b505050565b613a62611a02565b15613aa7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613a11614439565b600080826040516020018082805190602001908083835b60208310613b135780518252601f199092019160209182019101613af4565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050613b598161443d565b611fb8576040805162461bcd60e51b815260206004820152601960248201527f42726964676541646d696e3a696e76616c696420636c61737300000000000000604482015290519081900360640190fd5b60009081526001602052604090206002015490565b613bc982826131b1565b15613c1b576040805162461bcd60e51b815260206004820152601b60248201527f436f6e7461696e65723a64757020616464726573732061646465640000000000604482015290519081900360640190fd5b60008054838252600160205260409091206002015410613c82576040805162461bcd60e51b815260206004820152601c60248201527f436f6e7461696e65723a746f6f206d616e792061646472657373657300000000604482015290519081900360640190fd5b6000918252600160208181526040842060020180549283018155845290922090910180546001600160a01b0319166001600160a01b03909216919091179055565b60005b600083815260016020526040902060020154811015613a5557600083815260016020526040902060020180546001600160a01b038416919083908110613d0857fe5b6000918252602090912001546001600160a01b03161415613de757600083815260016020526040902060020180546000198101908110613d4457fe5b60009182526020808320909101548583526001909152604090912060020180546001600160a01b039092169183908110613d7a57fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039490941693909317909255848152600190915260409020600201805480613dbf57fe5b600082815260209020810160001990810180546001600160a01b031916905501905550613def565b600101613cc6565b5050565b600081815260016020908152604091829020600201805483518184028101840190945280845260609392830182828015613e5657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613e38575b50505050509050919050565b6001600160a01b038316600090815260086020526040812054819060609060026000196101006001841615020190911604613f8657604080516001600160a01b038781166024830152306044830152606480830188905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251918a169390918291908083835b60208310613f145780518252601f199092019160209182019101613ef5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f76576040519150601f19603f3d011682016040523d82523d6000602084013e613f7b565b606091505b50909250905061430b565b613f8e614511565b6001600160a01b0387166000908152600860209081526040918290208251815460026001821615610100026000190190911604601f81018490049093028101606090810185529381018381529093919284928491908401828280156140345780601f1061400957610100808354040283529160200191614034565b820191906000526020600020905b81548152906001019060200180831161401757829003601f168201915b50505091835250506001919091015460ff161515602091820152810151909150156141b357866001600160a01b03168160000151868860405160240180838152602001826001600160a01b0316815260200192505050604051602081830303815290604052906040518082805190602001908083835b602083106140c95780518252601f1990920191602091820191016140aa565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932092860180516001600160e01b03166001600160e01b031990941693909317835251855190945084935090508083835b602083106141415780518252601f199092019160209182019101614122565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141a3576040519150601f19603f3d011682016040523d82523d6000602084013e6141a8565b606091505b509093509150614309565b866001600160a01b03168160000151878760405160240180836001600160a01b0316815260200182815260200192505050604051602081830303815290604052906040518082805190602001908083835b602083106142235780518252601f199092019160209182019101614204565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932092860180516001600160e01b03166001600160e01b031990941693909317835251855190945084935090508083835b6020831061429b5780518252601f19909201916020918201910161427c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142fd576040519150601f19603f3d011682016040523d82523d6000602084013e614302565b606091505b5090935091505b505b818015614334575080511580614334575080806020019051602081101561433157600080fd5b50515b613744576040805162461bcd60e51b8152602060048201526015602482015274109c9a5919d94e99195c1bdcda5d0819985a5b1959605a1b604482015290519081900360640190fd5b60005b60008481526001602052604090206002015481101561185a57600084815260016020526040902060020180546001600160a01b0385169190839081106143c257fe5b6000918252602090912001546001600160a01b031614156144315760008481526001602052604090206002018054839190839081106143fd57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050613a55565b600101614380565b3390565b6000805b60025481101561447c57826002828154811061445957fe5b906000526020600020015414156144745760019150506119f7565b600101614441565b50600092915050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826144bb5760008555614501565b82601f106144d457805160ff1916838001178555614501565b82800160010185558215614501579182015b828111156145015782518255916020019190600101906144e6565b5061450d92915061454a565b5090565b60408051808201909152606081526000602082015290565b5080546000825590600052602060002090810190614547919061454a565b50565b5b8082111561450d576000815560010161454b56fe42726964676541646d696e3a696e73756666696369656e63792061646472657373657346a52cf33029de9f84853745a87af28464c80bf0346df1b32e205fc73319f62202016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c042726964676541646d696e3a6e6f207375636820616464726573732065786973747342726964676541646d696e3a6f6e6c7920757365206f776e657220746f2063616c6ca26469706673582212204cc2b3fe807b742ed23bfa25d80efe6c88d9e53210798af5defd60e46614d1cd64736f6c634300070400330cc58340b26c619cd4edc70f833d3f4d9d26f3ae7d5ef2965f81fe5495049a4f397bc5b97f629151e68146caedba62f10b47e426b38db589771a288c0861f18202016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c0e41d88711b08bdcd7556c5d2d24e0da6fa1f614cf2055f4d7e10206017cd16800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000948c528116427ff4dc4a099ef73ad6ca7142bd90000000000000000000000003ae6f839abb088ac41a951f8e10269bd61f30de3
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000948c528116427ff4dc4a099ef73ad6ca7142bd90000000000000000000000003ae6f839abb088ac41a951f8e10269bd61f30de3
-----Decoded View---------------
Arg [0] : _owners (address[]): 0x0948c528116427FF4dC4a099EF73AD6cA7142BD9,0x3ae6F839abB088ac41a951f8e10269bd61f30DE3
Arg [1] : _ownerRequired (uint256): 1
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 0000000000000000000000000948c528116427ff4dc4a099ef73ad6ca7142bd9
Arg [4] : 0000000000000000000000003ae6f839abb088ac41a951f8e10269bd61f30de3
Deployed ByteCode Sourcemap
23997:8104:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29538:187;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29538:187:0;;;;;;;;;;;;;;;-1:-1:-1;;;29538:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29538:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29538:187:0;;-1:-1:-1;;;;29538:187:0;;;;-1:-1:-1;29538:187:0;:::i;:::-;;24188:20;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;24188:20:0;;;;;;;;;;;;;;27616:980;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27616:980:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27616:980:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27616:980:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27616:980:0;;-1:-1:-1;;27616:980:0;;;-1:-1:-1;27616:980:0;;-1:-1:-1;;27616:980:0:i;:::-;;;;;;;;;;;;;;;;;;24080:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8558:107;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28604:563;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28604:563:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28604:563:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28604:563:0;;-1:-1:-1;;;;;;;28604:563:0;;;;;-1:-1:-1;28604:563:0;;;;;;;;;-1:-1:-1;28604:563:0;;-1:-1:-1;28604:563:0:i;29930:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29930:143:0;;:::i;29464:66::-;;;;;;;;;;;;;:::i;12385:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12385:171:0;;:::i;24159:22::-;;;;;;;;;;;;;:::i;2093:86::-;;;;;;;;;;;;;:::i;24436:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24436:40:0;;:::i;29394:62::-;;;;;;;;;;;;;:::i;25792:350::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25792:350:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25792:350:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25792:350:0;;;;;;;;-1:-1:-1;25792:350:0;;-1:-1:-1;;;;;25792:350:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25792:350:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25792:350:0;;-1:-1:-1;25792:350:0;;-1:-1:-1;;;;;25792:350:0:i;10764:931::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10764:931:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10764:931:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10764:931:0;;-1:-1:-1;;;10764:931:0;;-1:-1:-1;;;;;10764:931:0;;-1:-1:-1;10764:931:0;;-1:-1:-1;10764:931:0:i;29175:97::-;;;;;;;;;;;;;:::i;29280:106::-;;;;;;;;;;;;;:::i;8251:190::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8251:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8251:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8251:190:0;;-1:-1:-1;8251:190:0;;-1:-1:-1;;;;;8251:190:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29733:189;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29733:189:0;;;;;;;;;;;;;;;-1:-1:-1;;;29733:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29733:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29733:189:0;;-1:-1:-1;;;;29733:189:0;;;;-1:-1:-1;29733:189:0;:::i;24372:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24372:57:0;-1:-1:-1;;;;;24372:57:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11703:674;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11703:674:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11703:674:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11703:674:0;;-1:-1:-1;;;11703:674:0;;-1:-1:-1;;;;;11703:674:0;;-1:-1:-1;11703:674:0;;-1:-1:-1;11703:674:0:i;26629:979::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26629:979:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26629:979:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26629:979:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26629:979:0;;-1:-1:-1;;26629:979:0;;;-1:-1:-1;26629:979:0;;-1:-1:-1;;26629:979:0:i;26150:471::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26150:471:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26150:471:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26150:471:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26150:471:0;;;;;;;;-1:-1:-1;26150:471:0;;-1:-1:-1;;;;;26150:471:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26150:471:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26150:471:0;;-1:-1:-1;26150:471:0;;-1:-1:-1;;;;;26150:471:0:i;8449:101::-;;;;;;;;;;;;;:::i;8673:1183::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8673:1183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8673:1183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8673:1183:0;;-1:-1:-1;;8673:1183:0;;;-1:-1:-1;8673:1183:0;;-1:-1:-1;;8673:1183:0:i;30081:133::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30081:133:0;-1:-1:-1;;;;;30081:133:0;;:::i;24308:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24308:57:0;-1:-1:-1;;;;;24308:57:0;;:::i;29538:187::-;25322:43;-1:-1:-1;;;;;;;;;;;25354:10:0;25322:17;:43::i;:::-;25314:77;;;;;-1:-1:-1;;;25314:77:0;;;;;;;;;;;;-1:-1:-1;;;25314:77:0;;;;;;;;;;;;;;;29681:36:::1;::::0;;;;::::1;::::0;;;;;;::::1;;;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;29656:22:0;::::1;-1:-1:-1::0;29656:22:0;;;:15:::1;:22:::0;;;;;;:61;;;;29681:36;;29656:22;;:61:::1;::::0;:22;;:61:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;29656:61:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;29656:61:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;;29538:187:0:o;24188:20::-;;;-1:-1:-1;;;;;24188:20:0;;:::o;27616:980::-;27802:4;25322:43;-1:-1:-1;;;;;;;;;;;25354:10:0;25322:17;:43::i;:::-;25314:77;;;;;-1:-1:-1;;;25314:77:0;;;;;;;;;;;;-1:-1:-1;;;25314:77:0;;;;;;;;;;;;;;;2419:8:::1;:6;:8::i;:::-;2418:9;2410:38;;;::::0;;-1:-1:-1;;;2410:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;2410:38:0;;;;;;;;;;;;;::::1;;27781:5:::2;25617:1;25608:6;:10;25600:44;;;::::0;;-1:-1:-1;;;25600:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;25600:44:0;;;;;;;;;;;;;::::2;;27872:2:::3;27876:5;27883;27855:34;;;;;;-1:-1:-1::0;;;;;27855:34:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;27855:34:0;;;;::::3;::::0;;::::3;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27844:47;;;;;;27832:8;:59;27824:96;;;::::0;;-1:-1:-1;;;27824:96:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;27824:96:0;;;;;;;;;;;;;::::3;;27940:18;::::0;;;:8:::3;:18;::::0;;;;;::::3;;27939:19;27931:56;;;::::0;;-1:-1:-1;;;27931:56:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;27931:56:0;;;;;;;;;;;;;::::3;;28015:5;::::0;28033:20:::3;::::0;;-1:-1:-1;;;28033:20:0;;;;27998:14:::3;::::0;28015:5:::3;::::0;::::3;-1:-1:-1::0;;;;;28015:5:0::3;::::0;:17:::3;::::0;:5;;28033:18:::3;::::0;:20:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;28015:5;28033:20;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;28033:20:0;28077:18:::3;::::0;;28015:81:::3;::::0;;-1:-1:-1;;;;;;28015:81:0::3;::::0;;;;;;;;::::3;::::0;;;;;;;;;;28065:10:::3;28015:81:::0;;;;;;;;;;;;;;;28033:20:::3;::::0;28015:81;;;;;;;-1:-1:-1;28015:81:0;;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;28015:81:0;28123:5:::3;::::0;:22:::3;::::0;;-1:-1:-1;;;28123:22:0;;;;28015:81;;-1:-1:-1;28123:5:0::3;::::0;;::::3;-1:-1:-1::0;;;;;28123:5:0::3;::::0;:20:::3;::::0;:22:::3;::::0;;::::3;::::0;28015:81:::3;::::0;28123:22;;;;;;;;:5;:22;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;28123:22:0;28113:32;::::3;28109:458;;;28188:6;-1:-1:-1::0;;;;;28167:42:0::3;28184:2;-1:-1:-1::0;;;;;28167:42:0::3;;28196:5;28203;28167:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::3;::::0;;;::::3;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28109:458;;;28241:5;;;;;;;;;-1:-1:-1::0;;;;;28241:5:0::3;-1:-1:-1::0;;;;;28241:14:0::3;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;28241:16:0;28231:26;::::3;28227:340;;;28274:8;28285:37;28304:6;28312:2;28316:5;28285:18;:37::i;:::-;28274:48;;28365:6;-1:-1:-1::0;;;;;28344:42:0::3;28361:2;-1:-1:-1::0;;;;;28344:42:0::3;;28373:5;28380;28344:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::3;::::0;;;::::3;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28428:6;-1:-1:-1::0;;;;;28406:43:0::3;28424:2;-1:-1:-1::0;;;;;28406:43:0::3;;28436:5;28443;28406:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::3;::::0;;;::::3;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28464:18;::::0;;;:8:::3;:18;::::0;;;;;:25;;28485:4:::3;-1:-1:-1::0;;28464:25:0;;::::3;;::::0;;28504:5:::3;::::0;:26;;-1:-1:-1;;;28504:26:0;;::::3;::::0;::::3;::::0;;;;;28464:25:::3;28504:5:::0;;::::3;-1:-1:-1::0;;;;;28504:5:0::3;::::0;:16:::3;::::0;:26;;;;;;;;;;;28464:18;28504:5;:26;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;28552:3;28545:10;;;;;;28227:340;28584:4;28577:11;;;25655:1;2459::::2;27616:980:::0;;;;;;;:::o;24080:38::-;;;;;;;;;;;;;;-1:-1:-1;;;24080:38:0;;;;:::o;8558:107::-;8639:18;;8558:107;:::o;28604:563::-;2696:8;:6;:8::i;:::-;2688:41;;;;;-1:-1:-1;;;2688:41:0;;;;;;;;;;;;-1:-1:-1;;;2688:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28730:26:0;::::1;28722:59;;;::::0;;-1:-1:-1;;;28722:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28722:59:0;;;;;;;;;;;;;::::1;;28792:9;28804:44;28818:5;28825:10;28837;28804:13;:44::i;:::-;28792:56;;28863:4;28859:301;;;28884:17;28931:5;28914:23;;;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;28914:23:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28904:34;;;;;;28884:54;;6452:66;28970:9;;28957;:22;28953:196;;;29000:5;:31:::0;;-1:-1:-1;;;;;;29000:31:0::1;;-1:-1:-1::0;;;;;29000:31:0;::::1;;;::::0;;28953:196:::1;;;6341:66;29057:22:::0;::::1;29053:96;;;29100:5;;;;;;;;;-1:-1:-1::0;;;;;29100:5:0::1;-1:-1:-1::0;;;;;29100:21:0::1;;29122:10;29100:33;;;;;;;;;;;;;-1:-1:-1::0;;;;;29100:33:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29053:96;28859:301;;2740:1;28604:563:::0;;;:::o;29930:143::-;7192:40;-1:-1:-1;;;;;;;;;;;7221:10:0;7192:17;:40::i;:::-;7184:87;;;;-1:-1:-1;;;7184:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30018:7:::1;::::0;30003:33:::1;::::0;30027:8;;30018:7;30003:33:::1;::::0;;;::::1;30047:7;:18:::0;29930:143::o;29464:66::-;25460:41;6230:66;25490:10;25460:17;:41::i;:::-;25452:73;;;;;-1:-1:-1;;;25452:73:0;;;;;;;;;;;;-1:-1:-1;;;25452:73:0;;;;;;;;;;;;;;;29512:10:::1;:8;:10::i;:::-;29464:66::o:0;12385:171::-;12447:4;7192:40;-1:-1:-1;;;;;;;;;;;7221:10:0;7192:17;:40::i;:::-;7184:87;;;;-1:-1:-1;;;7184:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12464:20:::1;12475:8;12464:10;:20::i;:::-;12500:26;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;12544:4:0::1;7282:1;12385:171:::0;;;:::o;24159:22::-;;;;:::o;2093:86::-;2164:7;;;;2093:86;:::o;24436:40::-;;;;;;;;;;;;;;;:::o;29394:62::-;25460:41;6230:66;25490:10;25460:17;:41::i;:::-;25452:73;;;;;-1:-1:-1;;;25452:73:0;;;;;;;;;;;;-1:-1:-1;;;25452:73:0;;;;;;;;;;;;;;;29440:8:::1;:6;:8::i;25792:350::-:0;25913:7;;25900:9;:20;;25892:61;;;;;-1:-1:-1;;;25892:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25968:7;;:12;25964:77;;26005:5;;26021:7;;25997:32;;-1:-1:-1;;;;;26005:5:0;;;;25997:32;;;;;26021:7;26005:5;25997:32;26005:5;25997:32;26021:7;26005:5;25997:32;;;;;;;;;;;;;;;;;;;;;25964:77;26070:10;-1:-1:-1;;;;;26056:78:0;;26094:7;;26082:9;:19;26103:14;26119:5;26126:7;;26056:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26056:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25792:350;;:::o;10764:931::-;10852:4;7192:40;-1:-1:-1;;;;;;;;;;;7221:10:0;7192:17;:40::i;:::-;7184:87;;;;-1:-1:-1;;;7184:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10869:17:::1;10889:19;10902:5;10889:12;:19::i;:::-;10869:39:::0;-1:-1:-1;6341:66:0::1;10927:22:::0;::::1;::::0;::::1;::::0;:48:::1;;-1:-1:-1::0;6452:66:0::1;10953:22:::0;::::1;;10927:48;10919:84;;;::::0;;-1:-1:-1;;;10919:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10919:84:0;;;;;;;;;;;;;::::1;;11022:40;11040:9;11051:10;11022:17;:40::i;:::-;11014:87;;;;-1:-1:-1::0;;;11014:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;11118:22:0;::::1;11114:137;;;11196:15;;11163:30;11183:9;11163:19;:30::i;:::-;:48;11155:96;;;;-1:-1:-1::0;;;11155:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11264:16;11325:5;11332:10;11293:50;;;;;;-1:-1:-1::0;;;11293:50:0::1;;::::0;::::1;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;11293:50:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;11293:50:0::1;;;;;;;;;;;;;;;;;;;;;;;11283:61;;;;;;11264:80;;11355:36;11370:8;11380:10;11355:14;:36::i;:::-;11439:15;;11406:29;11426:8;11406:19;:29::i;:::-;:48;11402:263;;11471:43;11492:9;11503:10;11471:20;:43::i;:::-;11534:58;11562:5;11569:10;11581;11534:58;;;;;;;;;;-1:-1:-1::0;;;;;11534:58:0::1;;;;;;-1:-1:-1::0;;;;;11534:58:0::1;;;;;;;;;;;;;;;;-1:-1:-1::0;;;11534:58:0::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11607:20;11618:8;11607:10;:20::i;:::-;11649:4;11642:11;;;;;;11402:263;11682:5;11675:12;;;;7282:1;10764:931:::0;;;;:::o;29175:97::-;29258:5;;;;;-1:-1:-1;;;;;29258:5:0;;29175:97::o;29280:106::-;29328:7;29355:5;;;;;;;;;-1:-1:-1;;;;;29355:5:0;-1:-1:-1;;;;;29355:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29355:23:0;;-1:-1:-1;29280:106:0;:::o;8251:190::-;8320:16;8349:17;8369:19;8382:5;8369:12;:19::i;:::-;8349:39;;8406:27;8423:9;8406:16;:27::i;:::-;8399:34;8251:190;-1:-1:-1;;;8251:190:0:o;29733:189::-;25322:43;-1:-1:-1;;;;;;;;;;;25354:10:0;25322:17;:43::i;:::-;25314:77;;;;;-1:-1:-1;;;25314:77:0;;;;;;;;;;;;-1:-1:-1;;;25314:77:0;;;;;;;;;;;;;;;29878:36:::1;::::0;;;;::::1;::::0;;;;;;::::1;;;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;29852:23:0;::::1;-1:-1:-1::0;29852:23:0;;;:16:::1;:23:::0;;;;;;:62;;;;29878:36;;29852:23;;:62:::1;::::0;:23;;:62:::1;::::0;::::1;:::i;24372:57::-:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24372:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24372:57:0;;;;;;;-1:-1:-1;;24372:57:0;;;:::o;11703:674::-;11790:4;7192:40;-1:-1:-1;;;;;;;;;;;7221:10:0;7192:17;:40::i;:::-;7184:87;;;;-1:-1:-1;;;7184:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:17:::1;11827:19;11840:5;11827:12;:19::i;:::-;11807:39:::0;-1:-1:-1;6341:66:0::1;11865:22:::0;::::1;::::0;::::1;::::0;:48:::1;;-1:-1:-1::0;6452:66:0::1;11891:22:::0;::::1;;11865:48;11857:84;;;::::0;;-1:-1:-1;;;11857:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11857:84:0;;;;;;;;;;;;;::::1;;11954:16;12014:5;12021:10;11983:49;;;;;;-1:-1:-1::0;;;11983:49:0::1;;::::0;::::1;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;11983:49:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;11983:49:0::1;;;;;;;;;;;;;;;;;;;;;;;11973:60;;;;;;11954:79;;12044:36;12059:8;12069:10;12044:14;:36::i;:::-;12128:15;;12095:29;12115:8;12095:19;:29::i;:::-;:48;12091:256;;12160:37;12175:9;12186:10;12160:14;:37::i;:::-;12217:57;12244:5;12251:10;12263;12217:57;;;;;;;;;;-1:-1:-1::0;;;;;12217:57:0::1;;;;;;-1:-1:-1::0;;;;;12217:57:0::1;;;;;;;;;;;;;;;;-1:-1:-1::0;;;12217:57:0::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;26629:979:::0;26808:4;25322:43;-1:-1:-1;;;;;;;;;;;25354:10:0;25322:17;:43::i;:::-;25314:77;;;;;-1:-1:-1;;;25314:77:0;;;;;;;;;;;;-1:-1:-1;;;25314:77:0;;;;;;;;;;;;;;;2419:8:::1;:6;:8::i;:::-;2418:9;2410:38;;;::::0;;-1:-1:-1;;;2410:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;2410:38:0;;;;;;;;;;;;;::::1;;26787:5:::2;25617:1;25608:6;:10;25600:44;;;::::0;;-1:-1:-1;;;25600:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;25600:44:0;;;;;;;;;;;;;::::2;;26863:5:::3;26838:21;:30;;26830:73;;;::::0;;-1:-1:-1;;;26830:73:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;26962:2;26966:5;26973;26945:34;;;;;;-1:-1:-1::0;;;;;26945:34:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;26945:34:0;;;;::::3;::::0;;::::3;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26934:47;;;;;;26922:8;:59;26914:96;;;::::0;;-1:-1:-1;;;26914:96:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;26914:96:0;;;;;;;;;;;;;::::3;;27030:18;::::0;;;:8:::3;:18;::::0;;;;;::::3;;27029:19;27021:56;;;::::0;;-1:-1:-1;;;27021:56:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;27021:56:0;;;;;;;;;;;;;::::3;;27105:5;::::0;27123:20:::3;::::0;;-1:-1:-1;;;27123:20:0;;;;27088:14:::3;::::0;27105:5:::3;::::0;::::3;-1:-1:-1::0;;;;;27105:5:0::3;::::0;:17:::3;::::0;:5;;27123:18:::3;::::0;:20:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;27105:5;27123:20;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;27123:20:0;27167:18:::3;::::0;;27105:81:::3;::::0;;-1:-1:-1;;;;;;27105:81:0::3;::::0;;;;;;;;::::3;::::0;;;;;;;;;;27155:10:::3;27105:81:::0;;;;;;;;;;;;;;;27123:20:::3;::::0;27105:81;;;;;;;-1:-1:-1;27105:81:0;;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;27105:81:0;27213:5:::3;::::0;:22:::3;::::0;;-1:-1:-1;;;27213:22:0;;;;27105:81;;-1:-1:-1;27213:5:0::3;::::0;;::::3;-1:-1:-1::0;;;;;27213:5:0::3;::::0;:20:::3;::::0;:22:::3;::::0;;::::3;::::0;27105:81:::3;::::0;27213:22;;;;;;;;:5;:22;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;27213:22:0;27203:32;::::3;27199:380;;;27275:2;-1:-1:-1::0;;;;;27257:35:0::3;;27279:5;27286;27257:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::3;::::0;;;::::3;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27199:380;;;27324:5;;;;;;;;;-1:-1:-1::0;;;;;27324:5:0::3;-1:-1:-1::0;;;;;27324:14:0::3;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;27324:16:0;27314:26;::::3;27310:269;;;27380:2;-1:-1:-1::0;;;;;27362:35:0::3;;27384:5;27391;27362:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::3;::::0;;;::::3;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27436:2;-1:-1:-1::0;;;;;27417:36:0::3;;27440:5;27447;27417:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::3;::::0;;;::::3;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27468:18;::::0;-1:-1:-1;;;;;27468:11:0;::::3;::::0;:18;::::3;;;::::0;27480:5;;27468:18:::3;::::0;;;27480:5;27468:11;:18;::::3;;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;27501:18:0::3;::::0;;;:8:::3;:18;::::0;;;;;:25;;27522:4:::3;-1:-1:-1::0;;27501:25:0;;::::3;;::::0;;27541:5:::3;::::0;:26;;-1:-1:-1;;;27541:26:0;;::::3;::::0;::::3;::::0;;;;;27501:25:::3;27541:5:::0;;::::3;-1:-1:-1::0;;;;;27541:5:0::3;::::0;:16:::3;::::0;:26;;;;;;;;;;;27501:18;27541:5;:26;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;27310:269;-1:-1:-1::0;27596:4:0::3;::::0;26629:979;-1:-1:-1;;;;;;26629:979:0:o;26150:471::-;26275:4;26313:7;;26300:9;:20;26292:58;;;;;-1:-1:-1;;;26292:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26365:7;;:12;26361:77;;26402:5;;26418:7;;26394:32;;-1:-1:-1;;;;;26402:5:0;;;;26394:32;;;;;26418:7;26402:5;26394:32;26402:5;26394:32;26418:7;26402:5;26394:32;;;;;;;;;;;;;;;;;;;;;26361:77;26450:8;26461:44;26479:6;26487:10;26499:5;26461:17;:44::i;:::-;26450:55;;26553:6;-1:-1:-1;;;;;26521:71:0;26534:10;-1:-1:-1;;;;;26521:71:0;;26546:5;26561:14;26577:5;26584:7;;26521:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26521:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26610:3;26150:471;-1:-1:-1;;;;;26150:471:0:o;8449:101::-;8527:15;;8449:101;:::o;8673:1183::-;8767:4;7192:40;-1:-1:-1;;;;;;;;;;;7221:10:0;7192:17;:40::i;:::-;7184:87;;;;-1:-1:-1;;;7184:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8784:17:::1;8804:19;8817:5;8804:12;:19::i;:::-;8784:39:::0;-1:-1:-1;;;;;;;;;;;;8843:25:0;::::1;::::0;8842:55:::1;;-1:-1:-1::0;;;;;;;;;;;;8874:22:0;::::1;8842:55;8834:91;;;::::0;;-1:-1:-1;;;8834:91:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8834:91:0;;;;;;;;;;;;;::::1;;8938:16;9004:5;9011:11;8967:56;;;;;;-1:-1:-1::0;;;8967:56:0::1;;::::0;::::1;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;8967:56:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;8967:56:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;8967:56:0::1;::::0;;;;;;;;;::::1;::::0;;8957:67;;;::::1;::::0;;;;;-1:-1:-1;9035:36:0::1;::::0;-1:-1:-1;8957:67:0;;-1:-1:-1;9060:10:0::1;9035:14;:36::i;:::-;9121:15;;9088:29;9108:8;9088:19;:29::i;:::-;:48;9084:743;;9153:20;9164:8;9153:10;:20::i;:::-;9188:19;-1:-1:-1::0;;;;;;;;;;;9230:22:0;::::1;9226:494;;;9315:11;9281:30;9301:9;9281:19;:30::i;:::-;:45;;9273:93;;;;-1:-1:-1::0;;;9273:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;9399:15:0::1;::::0;;9433:29;;;;9226:494:::1;;;-1:-1:-1::0;;;;;;;;;;;9501:25:0;::::1;9497:223;;;-1:-1:-1::0;9561:18:0::1;::::0;;9598:32;;;;9497:223:::1;;;9671:33;::::0;;-1:-1:-1;;;9671:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9671:33:0;;;;;;;;;;;;;::::1;9497:223;9739:76;9783:5;9790:11;9803;9739:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;9739:76:0::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9084:743;;-1:-1:-1::0;9844:4:0::1;::::0;8673:1183;-1:-1:-1;;;;8673:1183:0:o;30081:133::-;7192:40;-1:-1:-1;;;;;;;;;;;7221:10:0;7192:17;:40::i;:::-;7184:87;;;;-1:-1:-1;;;7184:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30167:5:::1;::::0;30150:31:::1;::::0;-1:-1:-1;;;;;30150:31:0;;::::1;::::0;30167:5:::1;::::0;30150:31:::1;::::0;30167:5:::1;::::0;30150:31:::1;30192:5;:14:::0;;-1:-1:-1;;;;;;30192:14:0::1;-1:-1:-1::0;;;;;30192:14:0;;;::::1;::::0;;;::::1;::::0;;30081:133::o;24308:57::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24308:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3569:296;3653:4;;3670:165;3694:14;;;;:9;:14;;;;;:24;;:31;3690:35;;3670:165;;;3751:14;;;;:9;:14;;;;;:24;;:27;;-1:-1:-1;;;;;3751:42:0;;;:24;3776:1;;3751:27;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3751:27:0;:42;3747:76;;;3819:4;3812:11;;;;;3747:76;3727:3;;3670:165;;;-1:-1:-1;3852:5:0;;3569:296;-1:-1:-1;;;3569:296:0:o;31173:923::-;-1:-1:-1;;;;;31356:23:0;;31263:4;31356:23;;;:16;:23;;;;;31350:46;31263:4;;31310:25;;31350:46;-1:-1:-1;;31350:46:0;;;;;;;;;;;31346:601;;31454:65;;;-1:-1:-1;;;;;31454:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31454:65:0;-1:-1:-1;;;31454:65:0;;;31443:77;;;;:10;;;;:77;;;;31454:65;31443:77;;31454:65;31443:77;;;;;;;;;;-1:-1:-1;;31443:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31418:102:0;;-1:-1:-1;31418:102:0;-1:-1:-1;31346:601:0;;;31562:30;;:::i;:::-;-1:-1:-1;;;;;31595:23:0;;;;;;:16;:23;;;;;;;;;31562:56;;;;;;;;;;;-1:-1:-1;;31562:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31595:23;;31562:56;;31595:23;;31562:56;;;31595:23;31562:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31562:56:0;;;-1:-1:-1;;31562:56:0;;;;;;;;;;;;;;;31637:22;;;31562:56;;-1:-1:-1;31633:303:0;;;31705:5;-1:-1:-1;;;;;31705:10:0;31740:9;:18;;;31760:6;31768:3;31716:56;;;;;;;;;;;-1:-1:-1;;;;;31716:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31716:56:0;;;;;;;;;;;;;;;;-1:-1:-1;;31716:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31716:56:0;-1:-1:-1;;;;;;31716:56:0;;;;;;;;;31705:68;;;;;-1:-1:-1;31705:68:0;;-1:-1:-1;31705:68:0;-1:-1:-1;31705:68:0;;31716:56;31705:68;;;;;;;;;;-1:-1:-1;;31705:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31680:93:0;;-1:-1:-1;31680:93:0;-1:-1:-1;31633:303:0;;;31852:5;-1:-1:-1;;;;;31852:10:0;31887:9;:18;;;31907:3;31912:6;31863:56;;;;;;-1:-1:-1;;;;;31863:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31863:56:0;;;;;;;;;;;;;;;;-1:-1:-1;;31863:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31863:56:0;-1:-1:-1;;;;;;31863:56:0;;;;;;;;;31852:68;;;;;-1:-1:-1;31852:68:0;;-1:-1:-1;31852:68:0;-1:-1:-1;31852:68:0;;31863:56;31852:68;;;;;;;;;;-1:-1:-1;;31852:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31827:93:0;;-1:-1:-1;31827:93:0;-1:-1:-1;31633:303:0;31346:601;;31967:6;:72;;;;-1:-1:-1;31978:19:0;;:24;;:60;;;32017:12;32006:32;;;;;;;;;;;;;;;-1:-1:-1;32006:32:0;31978:60;31959:107;;;;;-1:-1:-1;;;31959:107:0;;;;;;;;;;;;-1:-1:-1;;;31959:107:0;;;;;;;;;;;;;;;-1:-1:-1;32084:4:0;;31173:923;-1:-1:-1;;;;;31173:923:0:o;9864:636::-;9976:4;7192:40;-1:-1:-1;;;;;;;;;;;7221:10:0;7192:17;:40::i;:::-;7184:87;;;;-1:-1:-1;;;7184:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9993:17:::1;10013:19;10026:5;10013:12;:19::i;:::-;9993:39;;10043:16;10106:5;10113:10;10125;10072:64;;;;;;-1:-1:-1::0;;;10072:64:0::1;;::::0;::::1;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;10072:64:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10072:64:0::1;;;;;;;;-1:-1:-1::0;;;;;10072:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;10062:75;;;;;;10043:94;;10148:36;10163:8;10173:10;10148:14;:36::i;:::-;10232:15;;10199:29;10219:8;10199:19;:29::i;:::-;:48;10195:275;;10264:53;10283:9;10294:10;10306;10264:18;:53::i;:::-;10337:60;10367:5;10374:10;10386;10337:60;;;;;;;;;;-1:-1:-1::0;;;;;10337:60:0::1;;;;;;-1:-1:-1::0;;;;;10337:60:0::1;;;;;;;;;;;;;;;;-1:-1:-1::0;;;10337:60:0::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10412:20;10423:8;10412:10;:20::i;:::-;10454:4;10447:11;;;;;;10195:275;-1:-1:-1::0;10487:5:0::1;::::0;9864:636;-1:-1:-1;;;;;9864:636:0:o;3152:120::-;2696:8;:6;:8::i;:::-;2688:41;;;;;-1:-1:-1;;;2688:41:0;;;;;;;;;;;;-1:-1:-1;;;2688:41:0;;;;;;;;;;;;;;;3211:7:::1;:15:::0;;-1:-1:-1;;3211:15:0::1;::::0;;3242:22:::1;3251:12;:10;:12::i;:::-;3242:22;::::0;;-1:-1:-1;;;;;3242:22:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;3152:120::o:0;5402:82::-;5462:14;;;;:9;:14;;;;;;;5455:21;;;;;;;;;5462:14;5455:21;;;;5462:14;5455:21;:::i;:::-;;;5402:82;:::o;2893:118::-;2419:8;:6;:8::i;:::-;2418:9;2410:38;;;;;-1:-1:-1;;;2410:38:0;;;;;;;;;;;;-1:-1:-1;;;2410:38:0;;;;;;;;;;;;;;;2953:7:::1;:14:::0;;-1:-1:-1;;2953:14:0::1;2963:4;2953:14;::::0;;2983:20:::1;2990:12;:10;:12::i;10508:248::-:0;10573:7;10593:17;10640:5;10623:23;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10623:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10613:34;;;;;;10593:54;;10666:25;10681:9;10666:14;:25::i;:::-;10658:63;;;;;-1:-1:-1;;;10658:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4210:131;4275:7;4302:14;;;:9;:14;;;;;:24;;:31;;4210:131::o;4532:318::-;4619:35;4637:3;4642:11;4619:17;:35::i;:::-;4618:36;4610:76;;;;;-1:-1:-1;;;4610:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4739:17;;;4705:14;;;:9;:14;;;;;;:24;;:31;:51;4697:92;;;;;-1:-1:-1;;;4697:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4800:14;;;;:9;:14;;;;;;;:24;;:42;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4800:42:0;-1:-1:-1;;;;;4800:42:0;;;;;;;;;4532:318::o;4967:427::-;5056:9;5051:336;5075:14;;;;:9;:14;;;;;:24;;:31;5071:35;;5051:336;;;5132:14;;;;:9;:14;;;;;:24;;:27;;-1:-1:-1;;;;;5132:42:0;;;:24;5157:1;;5132:27;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5132:27:0;:42;5128:248;;;5225:14;;;;:9;:14;;;;;:24;;5250:31;;-1:-1:-1;;5250:35:0;;;5225:61;;;;;;;;;;;;;;;;;;5195:14;;;5225:61;5195:14;;;;;;;:24;;:27;;-1:-1:-1;;;;;5225:61:0;;;;5220:1;;5195:27;;;;;;;;;;;;;;;;;;:91;;-1:-1:-1;;;;;;5195:91:0;-1:-1:-1;;;;;5195:91:0;;;;;;;;;;;5305:14;;;-1:-1:-1;5305:14:0;;;;;;:24;;:30;;;;;;;;;;;;;;;;-1:-1:-1;;5305:30:0;;;;;-1:-1:-1;;;;;;5305:30:0;;;;;;-1:-1:-1;5354:7:0;;5128:248;5108:3;;5051:336;;4967:427;;;:::o;3873:130::-;3971:14;;;;:9;:14;;;;;;;;;:24;;3964:31;;;;;;;;;;;;;;;;;3935:16;;3964:31;;;3971:24;3964:31;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3964:31:0;;;;;;;;;;;;;;;;;;;;;;;3873:130;;;:::o;30222:943::-;-1:-1:-1;;;;;30406:22:0;;30313:4;30406:22;;;:15;:22;;;;;30400:45;30313:4;;30360:25;;30400:45;-1:-1:-1;;30400:45:0;;;;;;;;;;;30396:623;;30503:85;;;-1:-1:-1;;;;;30503:85:0;;;;;;;30575:4;30503:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30503:85:0;-1:-1:-1;;;30503:85:0;;;30492:97;;;;:10;;;;:97;;;;30503:85;30492:97;;30503:85;30492:97;;;;;;;;;;-1:-1:-1;;30492:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30467:122:0;;-1:-1:-1;30467:122:0;-1:-1:-1;30396:623:0;;;30631:30;;:::i;:::-;-1:-1:-1;;;;;30664:22:0;;;;;;:15;:22;;;;;;;;;30631:55;;;;;;;;;;;-1:-1:-1;;30631:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30664:22;;30631:55;;30664:22;;30631:55;;;30664:22;30631:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30631:55:0;;;-1:-1:-1;;30631:55:0;;;;;;;;;;;;;;;30705:22;;;30631:55;;-1:-1:-1;30701:307:0;;;30773:5;-1:-1:-1;;;;;30773:10:0;30808:9;:18;;;30828:6;30836:5;30784:58;;;;;;;;;;;-1:-1:-1;;;;;30784:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30784:58:0;;;;;;;;;;;;;;;;-1:-1:-1;;30784:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30784:58:0;-1:-1:-1;;;;;;30784:58:0;;;;;;;;;30773:70;;;;;-1:-1:-1;30773:70:0;;-1:-1:-1;30773:70:0;-1:-1:-1;30773:70:0;;30784:58;30773:70;;;;;;;;;;-1:-1:-1;;30773:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30748:95:0;;-1:-1:-1;30748:95:0;-1:-1:-1;30701:307:0;;;30922:5;-1:-1:-1;;;;;30922:10:0;30957:9;:18;;;30977:5;30984:6;30933:58;;;;;;-1:-1:-1;;;;;30933:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30933:58:0;;;;;;;;;;;;;;;;-1:-1:-1;;30933:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30933:58:0;-1:-1:-1;;;;;;30933:58:0;;;;;;;;;30922:70;;;;;-1:-1:-1;30922:70:0;;-1:-1:-1;30922:70:0;-1:-1:-1;30922:70:0;;30933:58;30922:70;;;;;;;;;;-1:-1:-1;;30922:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30897:95:0;;-1:-1:-1;30897:95:0;-1:-1:-1;30701:307:0;30396:623;;31037:6;:72;;;;-1:-1:-1;31048:19:0;;:24;;:60;;;31087:12;31076:32;;;;;;;;;;;;;;;-1:-1:-1;31076:32:0;31048:60;31029:106;;;;;-1:-1:-1;;;31029:106:0;;;;;;;;;;;;-1:-1:-1;;;31029:106:0;;;;;;;;;;;;;;5492:355;5604:9;5599:241;5623:14;;;;:9;:14;;;;;:24;;:31;5619:35;;5599:241;;;5680:14;;;;:9;:14;;;;;:24;;:27;;-1:-1:-1;;;;;5680:42:0;;;:24;5705:1;;5680:27;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5680:27:0;:42;5676:153;;;5743:14;;;;:9;:14;;;;;:24;;:27;;5773:15;;5743:24;5768:1;;5743:27;;;;;;;;;;;;;;:45;;;;;-1:-1:-1;;;;;5743:45:0;;;;;-1:-1:-1;;;;;5743:45:0;;;;;;5807:7;;;5676:153;5656:3;;5599:241;;667:106;755:10;667:106;:::o;8026:217::-;8087:4;;8104:108;8128:14;:21;8124:25;;8104:108;;;8194:5;8173:14;8188:1;8173:17;;;;;;;;;;;;;;;;:26;8169:43;;;8208:4;8201:11;;;;;8169:43;8151:3;;8104:108;;;-1:-1:-1;8230:5:0;;8026:217;-1:-1:-1;;8026:217:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://4cc2b3fe807b742ed23bfa25d80efe6c88d9e53210798af5defd60e46614d1cd
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.