This nametag was submitted by Kleros Curate.
Overview
ETH Balance
0.027886086245650612 ETH
ETH Value
$108.83 (@ $3,902.71/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 385,675 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x76a9099a | 128934346 | 37 mins ago | IN | 0.000703862516646 ETH | 0.00000322225 | ||||
0x76a9099a | 128933948 | 50 mins ago | IN | 0.000201534143361 ETH | 0.000002780031 | ||||
0x76a9099a | 128933948 | 50 mins ago | IN | 0.000201534143361 ETH | 0.000002754454 | ||||
0xca23bb4c | 128933046 | 1 hr ago | IN | 1.000201534143361 ETH | 0.000001760815 | ||||
0x76a9099a | 128932865 | 1 hr ago | IN | 0.000201534143361 ETH | 0.000002141409 | ||||
0x76a9099a | 128932225 | 1 hr ago | IN | 0.000201534143361 ETH | 0.000004021883 | ||||
0x76a9099a | 128931951 | 1 hr ago | IN | 0.000201534143361 ETH | 0.000001366468 | ||||
0x76a9099a | 128931863 | 1 hr ago | IN | 0.000201534143361 ETH | 0.000001525945 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.00000133639 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001336392 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001336392 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001336392 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.00000133639 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.00000133639 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001336392 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001336392 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001336392 | ||||
0xca23bb4c | 128931347 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001336392 | ||||
0xca23bb4c | 128931328 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001179328 | ||||
0xca23bb4c | 128931326 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001179328 | ||||
0xca23bb4c | 128931326 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001179328 | ||||
0xca23bb4c | 128931326 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001179326 | ||||
0xca23bb4c | 128931326 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001179326 | ||||
0xca23bb4c | 128931326 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001179328 | ||||
0xca23bb4c | 128931326 | 2 hrs ago | IN | 0.006227675311907 ETH | 0.000001179328 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
128934346 | 37 mins ago | 0.000703862516646 ETH | ||||
128933948 | 50 mins ago | 0.000201534143361 ETH | ||||
128933948 | 50 mins ago | 0.000201534143361 ETH | ||||
128933642 | 1 hr ago | 0.00019896222209 ETH | ||||
128933642 | 1 hr ago | 0.00019896222209 ETH | ||||
128933046 | 1 hr ago | 0.000201534143361 ETH | ||||
128933046 | 1 hr ago | 1 ETH | ||||
128932865 | 1 hr ago | 0.000201534143361 ETH | ||||
128932225 | 1 hr ago | 0.000201534143361 ETH | ||||
128931951 | 1 hr ago | 0.000201534143361 ETH | ||||
128931863 | 1 hr ago | 0.000201534143361 ETH | ||||
128931347 | 2 hrs ago | 0.000227675311907 ETH | ||||
128931347 | 2 hrs ago | 0.006 ETH | ||||
128931347 | 2 hrs ago | 0.000227675311907 ETH | ||||
128931347 | 2 hrs ago | 0.006 ETH | ||||
128931347 | 2 hrs ago | 0.000227675311907 ETH | ||||
128931347 | 2 hrs ago | 0.006 ETH | ||||
128931347 | 2 hrs ago | 0.000227675311907 ETH | ||||
128931347 | 2 hrs ago | 0.006 ETH | ||||
128931347 | 2 hrs ago | 0.000227675311907 ETH | ||||
128931347 | 2 hrs ago | 0.006 ETH | ||||
128931347 | 2 hrs ago | 0.000227675311907 ETH | ||||
128931347 | 2 hrs ago | 0.006 ETH | ||||
128931347 | 2 hrs ago | 0.000227675311907 ETH | ||||
128931347 | 2 hrs ago | 0.006 ETH |
Loading...
Loading
Contract Name:
TokenBridge
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.15; import "./ReentrancyGuard.sol"; import "./SafeERC20.sol"; import "./NonblockingLzApp.sol"; import "./LzLib.sol"; import "./IWETH.sol"; import "./ITokenBridge.sol"; contract TokenBridge is ITokenBridge, NonblockingLzApp, ReentrancyGuard { using SafeERC20 for IERC20; uint public constant BP_DENOMINATOR = 10000; uint8 public constant SHARED_DECIMALS = 6; uint16 public aptosChainId; uint public bridgeFeeBP; mapping(address => uint64) public tvlSDs; // token address => tvl mapping(address => bool) public supportedTokens; mapping(address => bool) public pausedTokens; // token address => paused mapping(address => uint) public ld2sdRates; // token address => rate address public weth; bool public useCustomAdapterParams; bool public globalPaused; bool public emergencyWithdrawEnabled; uint public emergencyWithdrawTime; modifier whenNotPaused(address _token) { require(!globalPaused && !pausedTokens[_token], "TokenBridge: paused"); _; } modifier emergencyWithdrawUnlocked() { require(emergencyWithdrawEnabled && block.timestamp >= emergencyWithdrawTime, "TokenBridge: emergency withdraw locked"); _; } constructor( address _layerZeroEndpoint, uint16 _aptosChainId ) NonblockingLzApp(_layerZeroEndpoint) { aptosChainId = _aptosChainId; } function sendToAptos( address _token, bytes32 _toAddress, uint _amountLD, LzLib.CallParams calldata _callParams, bytes calldata _adapterParams ) external payable override whenNotPaused(_token) nonReentrant { require(supportedTokens[_token], "TokenBridge: token is not supported"); // lock token _amountLD = _removeDust(_token, _amountLD); _amountLD = _lockTokenFrom(_token, msg.sender, _amountLD); // add tvl uint64 amountSD = _LDtoSD(_token, _amountLD); require(amountSD > 0, "TokenBridge: amountSD must be greater than 0"); tvlSDs[_token] += amountSD; // send to aptos _sendToken(_token, _toAddress, amountSD, _callParams, _adapterParams, msg.value); emit Send(_token, msg.sender, _toAddress, _amountLD); } function sendETHToAptos( bytes32 _toAddress, uint _amountLD, LzLib.CallParams calldata _callParams, bytes calldata _adapterParams ) external payable override whenNotPaused(weth) nonReentrant { address _weth = weth; // save gas require(_weth != address(0) && supportedTokens[_weth], "TokenBridge: ETH is not supported"); _amountLD = _removeDust(_weth, _amountLD); require(_amountLD > 0, "TokenBridge: amount must be greater than 0"); require(msg.value >= _amountLD, "TokenBridge: fee not enough"); // wrap eth and add tvl IWETH(_weth).deposit{value: _amountLD}(); uint64 amountSD = _LDtoSD(_weth, _amountLD); tvlSDs[_weth] += amountSD; // send to aptos _sendToken(_weth, _toAddress, amountSD, _callParams, _adapterParams, msg.value - _amountLD); emit Send(address(0), msg.sender, _toAddress, _amountLD); } function quoteForSend(LzLib.CallParams calldata _callParams, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee) { _checkAdapterParams(_adapterParams); bytes memory payload = _encodeSendPayload(address(0), bytes32(0), 0); bool payInZRO = _callParams.zroPaymentAddress != address(0); return lzEndpoint.estimateFees(aptosChainId, address(this), payload, payInZRO, _adapterParams); } // ---------------------- owner functions ---------------------- function registerToken(address _token) external onlyOwner { require(_token != address(0), "TokenBridge: invalid token address"); require(!supportedTokens[_token], "TokenBridge: token already registered"); uint8 localDecimals = _tokenDecimals(_token); require( localDecimals >= SHARED_DECIMALS, "TokenBridge: decimals must be >= SHARED_DECIMALS" ); supportedTokens[_token] = true; ld2sdRates[_token] = 10**(localDecimals - SHARED_DECIMALS); emit RegisterToken(_token); } function setBridgeFeeBP(uint _bridgeFeeBP) external onlyOwner { require(_bridgeFeeBP <= BP_DENOMINATOR, "TokenBridge: bridge fee > 100%"); bridgeFeeBP = _bridgeFeeBP; emit SetBridgeBP(_bridgeFeeBP); } function setWETH(address _weth) external onlyOwner { require(_weth != address(0), "TokenBridge: invalid token address"); weth = _weth; emit SetWETH(_weth); } function setGlobalPause(bool _paused) external onlyOwner { globalPaused = _paused; emit SetGlobalPause(_paused); } function setTokenPause(address _token, bool _paused) external onlyOwner { pausedTokens[_token] = _paused; emit SetTokenPause(_token, _paused); } function setAptosChainId(uint16 _aptosChainId) external onlyOwner { aptosChainId = _aptosChainId; emit SetAptosChainId(_aptosChainId); } function setUseCustomAdapterParams(bool _useCustomAdapterParams) external onlyOwner { useCustomAdapterParams = _useCustomAdapterParams; emit SetUseCustomAdapterParams(_useCustomAdapterParams); } function withdrawFee( address _token, address _to, uint _amountLD ) public onlyOwner { uint feeLD = accruedFeeLD(_token); require(_amountLD <= feeLD, "TokenBridge: fee not enough"); IERC20(_token).safeTransfer(_to, _amountLD); emit WithdrawFee(_token, _to, _amountLD); } function withdrawTVL( address _token, address _to, uint64 _amountSD ) public onlyOwner emergencyWithdrawUnlocked { tvlSDs[_token] -= _amountSD; uint amountLD = _SDtoLD(_token, _amountSD); IERC20(_token).safeTransfer(_to, amountLD); emit WithdrawTVL(_token, _to, amountLD); } function withdrawEmergency(address _token, address _to) external onlyOwner { // modifier redundant for extra safety withdrawFee(_token, _to, accruedFeeLD(_token)); withdrawTVL(_token, _to, tvlSDs[_token]); } function enableEmergencyWithdraw(bool enabled) external onlyOwner { emergencyWithdrawEnabled = enabled; emergencyWithdrawTime = enabled ? block.timestamp + 1 weeks : 0; // overrides existing lock time emit EnableEmergencyWithdraw(enabled, emergencyWithdrawTime); } // override the renounce ownership inherited by zeppelin ownable function renounceOwnership() public override onlyOwner {} // receive ETH from WETH receive() external payable {} function accruedFeeLD(address _token) public view returns (uint) { uint tvlLD = _SDtoLD(_token, tvlSDs[_token]); return IERC20(_token).balanceOf(address(this)) - tvlLD; } // ---------------------- internal functions ---------------------- function _nonblockingLzReceive( uint16 _srcChainId, bytes memory, uint64, bytes memory _payload ) internal override { require(_srcChainId == aptosChainId, "TokenBridge: invalid source chain id"); (address token, address to, uint64 amountSD, bool unwrap) = _decodeReceivePayload(_payload); require(!globalPaused && !pausedTokens[token], "TokenBridge: paused"); require(supportedTokens[token], "TokenBridge: token is not supported"); // sub tvl uint64 tvlSD = tvlSDs[token]; require(tvlSD >= amountSD, "TokenBridge: insufficient liquidity"); tvlSDs[token] = tvlSD - amountSD; // pay fee uint amountLD = _SDtoLD(token, amountSD); (amountLD, ) = bridgeFeeBP > 0 ? _payFee(amountLD) : (amountLD, 0); // redeem token to receiver if (token == weth && unwrap) { _redeemETHTo(weth, payable(to), amountLD); emit Receive(address(0), to, amountLD); } else { to = to == address(0) ? address(0xdEaD) : to; // avoid failure in safeTransfer() IERC20(token).safeTransfer(to, amountLD); emit Receive(token, to, amountLD); } } function _redeemETHTo( address _weth, address payable _to, uint _amountLD ) internal { IWETH(_weth).withdraw(_amountLD); _to.transfer(_amountLD); } function _lockTokenFrom( address _token, address _from, uint _amountLD ) internal returns (uint) { // support token with transfer fee uint balanceBefore = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransferFrom(_from, address(this), _amountLD); uint balanceAfter = IERC20(_token).balanceOf(address(this)); return balanceAfter - balanceBefore; } function _tokenDecimals(address _token) internal view returns (uint8) { (bool success, bytes memory data) = _token.staticcall( abi.encodeWithSignature("decimals()") ); require(success, "TokenBridge: failed to get token decimals"); return abi.decode(data, (uint8)); } function _payFee(uint _amountLD) internal view returns (uint amountAfterFee, uint fee) { fee = (_amountLD * bridgeFeeBP) / BP_DENOMINATOR; amountAfterFee = _amountLD - fee; } function _sendToken( address _token, bytes32 _toAddress, uint64 _amountSD, LzLib.CallParams calldata _callParams, bytes calldata _adapterParams, uint _fee ) internal { _checkAdapterParams(_adapterParams); bytes memory payload = _encodeSendPayload(_token, _toAddress, _amountSD); _lzSend( aptosChainId, payload, _callParams.refundAddress, _callParams.zroPaymentAddress, _adapterParams, _fee ); } // send payload: packet type(1) + remote token(32) + receiver(32) + amount(8) function _encodeSendPayload( address _token, bytes32 _toAddress, uint64 _amountSD ) internal pure returns (bytes memory) { bytes32 tokenBytes32 = LzLib.addressToBytes32(_token); return abi.encodePacked(uint8(PacketType.SEND_TO_APTOS), tokenBytes32, _toAddress, _amountSD); } // receive payload: packet type(1) + remote token(32) + receiver(32) + amount(8) + unwrap flag(1) function _decodeReceivePayload(bytes memory _payload) internal pure returns ( address token, address to, uint64 amountSD, bool unwrap ) { require(_payload.length == 74, "TokenBridge: invalid payload length"); PacketType packetType = PacketType(uint8(_payload[0])); require(packetType == PacketType.RECEIVE_FROM_APTOS, "TokenBridge: unknown packet type"); assembly { token := mload(add(_payload, 33)) to := mload(add(_payload, 65)) amountSD := mload(add(_payload, 73)) } unwrap = uint8(_payload[73]) == 1; } function _checkAdapterParams(bytes calldata _adapterParams) internal view { if (useCustomAdapterParams) { _checkGasLimit(aptosChainId, uint16(PacketType.SEND_TO_APTOS), _adapterParams, 0); } else { require(_adapterParams.length == 0, "TokenBridge: _adapterParams must be empty."); } } function _SDtoLD(address _token, uint64 _amountSD) internal view returns (uint) { return _amountSD * ld2sdRates[_token]; } function _LDtoSD(address _token, uint _amountLD) internal view returns (uint64) { uint amountSD = _amountLD / ld2sdRates[_token]; require(amountSD <= type(uint64).max, "TokenBridge: amountSD overflow"); return uint64(amountSD); } function _removeDust(address _token, uint _amountLD) internal view returns (uint) { return _SDtoLD(_token, _LDtoSD(_token, _amountLD)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: Unlicense /* * @title Solidity Bytes Arrays Utils * @author Gonçalo Sá <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ pragma solidity >=0.8.0 <0.9.0; library BytesLib { function concat( bytes memory _preBytes, bytes memory _postBytes ) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore(0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. )) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes.slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes.slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore( sc, add( and( fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ), and(mload(mc), mask) ) ) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) { require(_bytes.length >= _start + 1 , "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) { require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) { require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) { require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) { require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) { require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) { require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage( bytes storage _preBytes, bytes memory _postBytes ) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes.slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^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 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.7.6; library ExcessivelySafeCall { uint256 constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeCall( address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := call( _gas, // gas _target, // recipient 0, // ether value add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeStaticCall( address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal view returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := staticcall( _gas, // gas _target, // recipient add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /** * @notice Swaps function selectors in encoded contract calls * @dev Allows reuse of encoded calldata for functions with identical * argument types but different names. It simply swaps out the first 4 bytes * for the new selector. This function modifies memory in place, and should * only be used with caution. * @param _newSelector The new 4-byte selector * @param _buf The encoded contract args */ function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure { require(_buf.length >= 4); uint256 _mask = LOW_28_MASK; assembly { // load the first word of let _word := mload(add(_buf, 0x20)) // mask out the top 4 bytes // /x _word := and(_word, _mask) _word := or(_newSelector, _word) mstore(add(_buf, 0x20), _word) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./ILayerZeroUserApplicationConfig.sol"; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.6.0; pragma experimental ABIEncoderV2; import "./LzLib.sol"; interface ITokenBridge { enum PacketType { SEND_TO_APTOS, RECEIVE_FROM_APTOS } function sendToAptos( address _token, bytes32 _toAddress, uint _amountLD, LzLib.CallParams calldata _callParams, bytes calldata _adapterParams ) external payable; function sendETHToAptos( bytes32 _toAddress, uint _amountLD, LzLib.CallParams calldata _callParams, bytes calldata _adapterParams ) external payable; function quoteForSend(LzLib.CallParams calldata _callParams, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); event Send(address indexed token, address indexed from, bytes32 indexed to, uint amountLD); event Receive(address indexed token, address indexed to, uint amountLD); event RegisterToken(address token); event SetBridgeBP(uint bridgeFeeBP); event SetWETH(address weth); event SetGlobalPause(bool paused); event SetTokenPause(address token, bool paused); event SetLocalChainId(uint16 localChainId); event SetAptosChainId(uint16 aptosChainId); event SetUseCustomAdapterParams(bool useCustomAdapterParams); event WithdrawFee(address indexed token, address to, uint amountLD); event WithdrawTVL(address indexed token, address to, uint amountLD); event EnableEmergencyWithdraw(bool enabled, uint unlockTime); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; function approve(address to, uint value) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Ownable.sol"; import "./ILayerZeroReceiver.sol"; import "./ILayerZeroUserApplicationConfig.sol"; import "./ILayerZeroEndpoint.sol"; import "./BytesLib.sol"; /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { using BytesLib for bytes; ILayerZeroEndpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup; address public precrime; event SetPrecrime(address precrime); event SetTrustedRemote(uint16 _remoteChainId, bytes _path); event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress); event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas); constructor(address _endpoint) { lzEndpoint = ILayerZeroEndpoint(_endpoint); } function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override { // lzReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller"); bytes memory trustedRemote = trustedRemoteLookup[_srcChainId]; // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require(_srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract"); _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); } function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual { uint providedGasLimit = _getGasLimit(_adapterParams); uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas; require(minGasLimit > 0, "LzApp: minGasLimit not set"); require(providedGasLimit >= minGasLimit, "LzApp: gas limit is too low"); } function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) { require(_adapterParams.length >= 34, "LzApp: invalid adapterParams"); assembly { gasLimit := mload(add(_adapterParams, 34)) } } //---------------------------UserApplication config---------------------------------------- function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) { return lzEndpoint.getConfig(_version, _chainId, address(this), _configType); } // generic config for LayerZero user Application function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // _path = abi.encodePacked(remoteAddress, localAddress) // this function set the trusted path for the cross-chain communication function setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external onlyOwner { trustedRemoteLookup[_srcChainId] = _path; emit SetTrustedRemote(_srcChainId, _path); } function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner { trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this)); emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress); } function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) { bytes memory path = trustedRemoteLookup[_remoteChainId]; require(path.length != 0, "LzApp: no trusted path record"); return path.slice(0, path.length - 20); // the last 20 bytes should be address(this) } function setPrecrime(address _precrime) external onlyOwner { precrime = _precrime; emit SetPrecrime(_precrime); } function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner { require(_minGas > 0, "LzApp: invalid minGas"); minDstGasLookup[_dstChainId][_packetType] = _minGas; emit SetMinDstGas(_dstChainId, _packetType, _minGas); } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.6.0; pragma experimental ABIEncoderV2; library LzLib { // LayerZero communication struct CallParams { address payable refundAddress; address zroPaymentAddress; } //--------------------------------------------------------------------------- // Address type handling struct AirdropParams { uint airdropAmount; bytes32 airdropAddress; } function buildAdapterParams(LzLib.AirdropParams memory _airdropParams, uint _uaGasLimit) internal pure returns (bytes memory adapterParams) { if (_airdropParams.airdropAmount == 0 && _airdropParams.airdropAddress == bytes32(0x0)) { adapterParams = buildDefaultAdapterParams(_uaGasLimit); } else { adapterParams = buildAirdropAdapterParams(_uaGasLimit, _airdropParams); } } // Build Adapter Params function buildDefaultAdapterParams(uint _uaGas) internal pure returns (bytes memory) { // txType 1 // bytes [2 32 ] // fields [txType extraGas] return abi.encodePacked(uint16(1), _uaGas); } function buildAirdropAdapterParams(uint _uaGas, AirdropParams memory _params) internal pure returns (bytes memory) { require(_params.airdropAmount > 0, "Airdrop amount must be greater than 0"); require(_params.airdropAddress != bytes32(0x0), "Airdrop address must be set"); // txType 2 // bytes [2 32 32 bytes[] ] // fields [txType extraGas dstNativeAmt dstNativeAddress] return abi.encodePacked(uint16(2), _uaGas, _params.airdropAmount, _params.airdropAddress); } function getGasLimit(bytes memory _adapterParams) internal pure returns (uint gasLimit) { require(_adapterParams.length == 34 || _adapterParams.length > 66, "Invalid adapterParams"); assembly { gasLimit := mload(add(_adapterParams, 34)) } } // Decode Adapter Params function decodeAdapterParams(bytes memory _adapterParams) internal pure returns (uint16 txType, uint uaGas, uint airdropAmount, address payable airdropAddress) { require(_adapterParams.length == 34 || _adapterParams.length > 66, "Invalid adapterParams"); assembly { txType := mload(add(_adapterParams, 2)) uaGas := mload(add(_adapterParams, 34)) } require(txType == 1 || txType == 2, "Unsupported txType"); require(uaGas > 0, "Gas too low"); if (txType == 2) { assembly { airdropAmount := mload(add(_adapterParams, 66)) airdropAddress := mload(add(_adapterParams, 86)) } } } //--------------------------------------------------------------------------- // Address type handling // TODO: testing function bytes32ToAddress(bytes32 _bytes32Address) internal pure returns (address _address) { require(bytes12(_bytes32Address) == bytes12(0), "Invalid address"); // first 12 bytes should be empty return address(uint160(uint(_bytes32Address))); } function addressToBytes32(address _address) internal pure returns (bytes32 _bytes32Address) { return bytes32(uint(uint160(_address))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./LzApp.sol"; import "./ExcessivelySafeCall.sol"; /* * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingLzApp is LzApp { using ExcessivelySafeCall for address; constructor(address _endpoint) LzApp(_endpoint) {} mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason); event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash); // overriding the virtual function in LzReceiver function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload)); // try-catch all errors/exceptions if (!success) { failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, reason); } } function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual { // only internal transaction require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp"); _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message"); require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./draft-IERC20Permit.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_layerZeroEndpoint","type":"address"},{"internalType":"uint16","name":"_aptosChainId","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"EnableEmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"}],"name":"Receive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"RegisterToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"bytes32","name":"to","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"}],"name":"Send","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"aptosChainId","type":"uint16"}],"name":"SetAptosChainId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bridgeFeeBP","type":"uint256"}],"name":"SetBridgeBP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"SetGlobalPause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"localChainId","type":"uint16"}],"name":"SetLocalChainId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"SetTokenPause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"useCustomAdapterParams","type":"bool"}],"name":"SetUseCustomAdapterParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"weth","type":"address"}],"name":"SetWETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"}],"name":"WithdrawFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"}],"name":"WithdrawTVL","type":"event"},{"inputs":[],"name":"BP_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARED_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"accruedFeeLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aptosChainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeFeeBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdrawEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdrawTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableEmergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ld2sdRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"}],"internalType":"struct LzLib.CallParams","name":"_callParams","type":"tuple"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"quoteForSend","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amountLD","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"}],"internalType":"struct LzLib.CallParams","name":"_callParams","type":"tuple"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendETHToAptos","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amountLD","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"}],"internalType":"struct LzLib.CallParams","name":"_callParams","type":"tuple"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendToAptos","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_aptosChainId","type":"uint16"}],"name":"setAptosChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bridgeFeeBP","type":"uint256"}],"name":"setBridgeFeeBP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setGlobalPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setTokenPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"setUseCustomAdapterParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"name":"setWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supportedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tvlSDs","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useCustomAdapterParams","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amountLD","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint64","name":"_amountSD","type":"uint64"}],"name":"withdrawTVL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162004b8738038062004b878339810160408190526200003491620000c0565b8180620000413362000070565b6001600160a01b03166080525060016005556006805461ffff191661ffff929092169190911790555062000110565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060408385031215620000d457600080fd5b82516001600160a01b0381168114620000ec57600080fd5b602084015190925061ffff811681146200010557600080fd5b809150509250929050565b608051614a23620001646000396000818161081501528181610af201528181610d6c015281816110e00152818161121c015281816113160152818161219c0152818161273301526139b00152614a236000f3fe60806040526004361061032b5760003560e01c806393f26a4c116101a5578063cb8d3b1f116100ec578063e3179c3e11610095578063ed629c5c1161006f578063ed629c5c146109c3578063ee7a4596146109e4578063f2fde38b14610a14578063f5ecbdbc14610a3457600080fd5b8063e3179c3e14610933578063eab45d9c14610983578063eb8d72b7146109a357600080fd5b8063d71e409e116100c6578063d71e409e146108dd578063de9b9488146108fd578063df2a5b3b1461091357600080fd5b8063cb8d3b1f1461088a578063cbed8b9c146108aa578063d1deba1f146108ca57600080fd5b8063a6c3d1651161014e578063baf3292d11610128578063baf3292d14610837578063c21f511414610857578063ca23bb4c1461087757600080fd5b8063a6c3d165146107cd578063abe685cd146107ed578063b353aaa71461080357600080fd5b8063971679641161017f57806397167964146107665780639f38369a1461078d578063a2f27ae0146107ad57600080fd5b806393f26a4c14610706578063950c8a741461072657806395e2c1681461074657600080fd5b80635747e69f1161027457806369a6b3db1161021d57806376a9099a116101f757806376a9099a146106705780638cfd8f5c146106835780638da5cb5b146106bb57806392cc13c5146106d957600080fd5b806369a6b3db1461060e578063715018a61461062e5780637533d7881461064357600080fd5b806361a552dc1161024e57806361a552dc1461059d57806366ad5c8a146105be57806368c4ac26146105de57600080fd5b80635747e69f1461050d5780635b769f3c1461052e5780635b8c41e61461054e57600080fd5b806325a9f792116102d65780633fc8cef3116102b05780633fc8cef31461048057806342d65a8d146104b8578063468b9668146104d857600080fd5b806325a9f792146103f95780632db88ecf146104225780633d8b38f61461045057600080fd5b806309824a801161030757806309824a80146103995780631095b6d7146103b957806310ddb137146103d957600080fd5b80620d5900146103375780621d35671461035957806307e0db171461037957600080fd5b3661033257005b600080fd5b34801561034357600080fd5b50610357610352366004613c18565b610a54565b005b34801561036557600080fd5b50610357610374366004613ca9565b610aef565b34801561038557600080fd5b50610357610394366004613d3d565b610d32565b3480156103a557600080fd5b506103576103b4366004613d6d565b610dd4565b3480156103c557600080fd5b506103576103d4366004613d8a565b610fe0565b3480156103e557600080fd5b506103576103f4366004613d3d565b6110a6565b34801561040557600080fd5b5061040f60075481565b6040519081526020015b60405180910390f35b34801561042e57600080fd5b5060065461043d9061ffff1681565b60405161ffff9091168152602001610419565b34801561045c57600080fd5b5061047061046b366004613dcb565b611117565b6040519015158152602001610419565b34801561048c57600080fd5b50600c546104a0906001600160a01b031681565b6040516001600160a01b039091168152602001610419565b3480156104c457600080fd5b506103576104d3366004613dcb565b6111e4565b3480156104e457600080fd5b506104f86104f3366004613e36565b611283565b60408051928352602083019190915201610419565b34801561051957600080fd5b50600c5461047090600160b01b900460ff1681565b34801561053a57600080fd5b50610357610549366004613d6d565b6113aa565b34801561055a57600080fd5b5061040f610569366004613ee0565b6004602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b3480156105a957600080fd5b50600c5461047090600160a81b900460ff1681565b3480156105ca57600080fd5b506103576105d9366004613ca9565b61146e565b3480156105ea57600080fd5b506104706105f9366004613d6d565b60096020526000908152604090205460ff1681565b34801561061a57600080fd5b50610357610629366004613f8f565b611561565b34801561063a57600080fd5b506103576115d1565b34801561064f57600080fd5b5061066361065e366004613d3d565b6115db565b6040516104199190614004565b61035761067e366004614017565b611675565b34801561068f57600080fd5b5061040f61069e366004614080565b600260209081526000928352604080842090915290825290205481565b3480156106c757600080fd5b506000546001600160a01b03166104a0565b3480156106e557600080fd5b5061040f6106f4366004613d6d565b600b6020526000908152604090205481565b34801561071257600080fd5b506103576107213660046140b3565b61192c565b34801561073257600080fd5b506003546104a0906001600160a01b031681565b34801561075257600080fd5b506103576107613660046140ec565b611976565b34801561077257600080fd5b5061077b600681565b60405160ff9091168152602001610419565b34801561079957600080fd5b506106636107a8366004613d3d565b611ac8565b3480156107b957600080fd5b5061040f6107c8366004613d6d565b611bd7565b3480156107d957600080fd5b506103576107e8366004613dcb565b611c7e565b3480156107f957600080fd5b5061040f61271081565b34801561080f57600080fd5b506104a07f000000000000000000000000000000000000000000000000000000000000000081565b34801561084357600080fd5b50610357610852366004613d6d565b611d07565b34801561086357600080fd5b50610357610872366004613d3d565b611d6a565b61035761088536600461412a565b611db6565b34801561089657600080fd5b506103576108a5366004614193565b612100565b3480156108b657600080fd5b506103576108c53660046141c1565b612164565b6103576108d8366004613ca9565b612212565b3480156108e957600080fd5b506103576108f8366004613f8f565b612444565b34801561090957600080fd5b5061040f600d5481565b34801561091f57600080fd5b5061035761092e366004614213565b6124d5565b34801561093f57600080fd5b5061096a61094e366004613d6d565b60086020526000908152604090205467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610419565b34801561098f57600080fd5b5061035761099e366004613f8f565b61258f565b3480156109af57600080fd5b506103576109be366004613dcb565b6125ff565b3480156109cf57600080fd5b50600c5461047090600160a01b900460ff1681565b3480156109f057600080fd5b506104706109ff366004613d6d565b600a6020526000908152604090205460ff1681565b348015610a2057600080fd5b50610357610a2f366004613d6d565b612659565b348015610a4057600080fd5b50610663610a4f36600461424f565b6126e9565b610a5c6127b3565b612710811115610ab35760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e4272696467653a2062726964676520666565203e2031303025000060448201526064015b60405180910390fd5b60078190556040518181527f9a749c8193bfd56b2b2a05c0bd18fbb0f69801a3fd6576c40b90537fd0fc3854906020015b60405180910390a150565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610b675760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c657200006044820152606401610aaa565b61ffff861660009081526001602052604081208054610b859061429c565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb19061429c565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b50505050509050805186869050148015610c19575060008151115b8015610c41575080516020820120604051610c3790889088906142d0565b6040518091039020145b610cb35760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610aaa565b610d298787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061280d92505050565b50505050505050565b610d3a6127b3565b6040517f07e0db1700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b5050505050565b610ddc6127b3565b6001600160a01b038116610e3d5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e4272696467653a20696e76616c696420746f6b656e206164647265604482015261737360f01b6064820152608401610aaa565b6001600160a01b03811660009081526009602052604090205460ff1615610ecc5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e4272696467653a20746f6b656e20616c726561647920726567697360448201527f74657265640000000000000000000000000000000000000000000000000000006064820152608401610aaa565b6000610ed782612930565b9050600660ff82161015610f535760405162461bcd60e51b815260206004820152603060248201527f546f6b656e4272696467653a20646563696d616c73206d757374206265203e3d60448201527f205348415245445f444543494d414c53000000000000000000000000000000006064820152608401610aaa565b6001600160a01b0382166000908152600960205260409020805460ff19166001179055610f816006826142f6565b610f8c90600a6143fd565b6001600160a01b0383166000818152600b602090815260409182902093909355519081527ff7fe8023cb2e36bde1d59a88ac5763a8c11be6d25e6819f71bb7e23e5bf0dc1691015b60405180910390a15050565b610fe86127b3565b6000610ff384611bd7565b9050808211156110455760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e4272696467653a20666565206e6f7420656e6f75676800000000006044820152606401610aaa565b6110596001600160a01b0385168484612a63565b604080516001600160a01b038581168252602082018590528616917ff15a0a3784dea9b4fe33bc98e2450745e262d310237b2868ea8ef56967ff3ecb91015b60405180910390a250505050565b6110ae6127b3565b6040517f10ddb13700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610d9f565b61ffff8316600090815260016020526040812080548291906111389061429c565b80601f01602080910402602001604051908101604052809291908181526020018280546111649061429c565b80156111b15780601f10611186576101008083540402835291602001916111b1565b820191906000526020600020905b81548152906001019060200180831161119457829003601f168201915b5050505050905083836040516111c89291906142d0565b60405180910390208180519060200120149150505b9392505050565b6111ec6127b3565b6040517f42d65a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d9061125590869086908690600401614435565b600060405180830381600087803b15801561126f57600080fd5b505af1158015610d29573d6000803e3d6000fd5b6000806112908484612afc565b6040805160006020820181905260218201819052604182018190526061820181905282518083036049018152606990920190925290506000806112d96040890160208a01613d6d565b6006546040517f40a7bb100000000000000000000000000000000000000000000000000000000081526001600160a01b03928316939093141593507f0000000000000000000000000000000000000000000000000000000000000000909116916340a7bb109161135c9161ffff909116903090879087908d908d90600401614453565b6040805180830381865afa158015611378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139c91906144a7565b935093505050935093915050565b6113b26127b3565b6001600160a01b0381166114135760405162461bcd60e51b815260206004820152602260248201527f546f6b656e4272696467653a20696e76616c696420746f6b656e206164647265604482015261737360f01b6064820152608401610aaa565b600c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fe390bcec6614d6b1f8ae47a4d9d46531ce328e3d293ecd6ddd015cb01eff030090602001610ae4565b3330146114e35760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560448201527f204c7a41707000000000000000000000000000000000000000000000000000006064820152608401610aaa565b6115598686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250612bcb92505050565b505050505050565b6115696127b3565b600c8054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f5362d4bd13945e8d116b90d83a7050fa61ceb02bb79bfae783377adb46916d9490610ae490831515815260200190565b6115d96127b3565b565b600160205260009081526040902080546115f49061429c565b80601f01602080910402602001604051908101604052809291908181526020018280546116209061429c565b801561166d5780601f106116425761010080835404028352916020019161166d565b820191906000526020600020905b81548152906001019060200180831161165057829003601f168201915b505050505081565b600c548690600160a81b900460ff161580156116aa57506001600160a01b0381166000908152600a602052604090205460ff16155b6116f65760405162461bcd60e51b815260206004820152601360248201527f546f6b656e4272696467653a20706175736564000000000000000000000000006044820152606401610aaa565b6002600554036117485760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610aaa565b60026005556001600160a01b03871660009081526009602052604090205460ff166117c15760405162461bcd60e51b815260206004820152602360248201527f546f6b656e4272696467653a20746f6b656e206973206e6f7420737570706f726044820152621d195960ea1b6064820152608401610aaa565b6117cb8786612f64565b94506117d8873387612f82565b945060006117e68887613087565b905060008167ffffffffffffffff16116118685760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e4272696467653a20616d6f756e745344206d75737420626520677260448201527f6561746572207468616e203000000000000000000000000000000000000000006064820152608401610aaa565b6001600160a01b0388166000908152600860205260408120805483929061189a90849067ffffffffffffffff166144cb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506118cf88888388888834613106565b86336001600160a01b0316896001600160a01b03167fbe6ff12fec5087498d44bc85f1a83235a630944a1e2d5a7938afe810370a58678960405161191591815260200190565b60405180910390a450506001600555505050505050565b6119346127b3565b61194282826103d485611bd7565b6001600160a01b038216600090815260086020526040902054611972908390839067ffffffffffffffff16611976565b5050565b61197e6127b3565b600c54600160b01b900460ff1680156119995750600d544210155b611a0b5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e4272696467653a20656d657267656e63792077697468647261772060448201527f6c6f636b656400000000000000000000000000000000000000000000000000006064820152608401610aaa565b6001600160a01b03831660009081526008602052604081208054839290611a3d90849067ffffffffffffffff166144f7565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000611a6f84836131e5565b9050611a856001600160a01b0385168483612a63565b604080516001600160a01b038581168252602082018490528616917f49507695f37b729944475cf3388760a14760fef784b7ab5ca8863a5f3f8be6bd9101611098565b61ffff8116600090815260016020526040812080546060929190611aeb9061429c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b179061429c565b8015611b645780601f10611b3957610100808354040283529160200191611b64565b820191906000526020600020905b815481529060010190602001808311611b4757829003601f168201915b505050505090508051600003611bbc5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610aaa565b6111dd600060148351611bcf9190614520565b839190613212565b6001600160a01b0381166000908152600860205260408120548190611c0790849067ffffffffffffffff166131e5565b6040516370a0823160e01b815230600482015290915081906001600160a01b038516906370a0823190602401602060405180830381865afa158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c749190614537565b6111dd9190614520565b611c866127b3565b818130604051602001611c9b93929190614550565b60408051601f1981840301815291815261ffff8516600090815260016020522090611cc690826145bc565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611cfa93929190614435565b60405180910390a1505050565b611d0f6127b3565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90602001610ae4565b611d726127b3565b6006805461ffff191661ffff83169081179091556040519081527f6a9ea26cc7efedf0df6fd048e06f3de4be1a978bb5d440277147c76e1c0eb75a90602001610ae4565b600c546001600160a01b03811690600160a81b900460ff16158015611df457506001600160a01b0381166000908152600a602052604090205460ff16155b611e405760405162461bcd60e51b815260206004820152601360248201527f546f6b656e4272696467653a20706175736564000000000000000000000000006044820152606401610aaa565b600260055403611e925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610aaa565b6002600555600c546001600160a01b03168015801590611eca57506001600160a01b03811660009081526009602052604090205460ff165b611f205760405162461bcd60e51b815260206004820152602160248201527f546f6b656e4272696467653a20455448206973206e6f7420737570706f7274656044820152601960fa1b6064820152608401610aaa565b611f2a8187612f64565b955060008611611fa25760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e4272696467653a20616d6f756e74206d757374206265206772656160448201527f746572207468616e2030000000000000000000000000000000000000000000006064820152608401610aaa565b85341015611ff25760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e4272696467653a20666565206e6f7420656e6f75676800000000006044820152606401610aaa565b806001600160a01b031663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b15801561202d57600080fd5b505af1158015612041573d6000803e3d6000fd5b505050505060006120528288613087565b6001600160a01b03831660009081526008602052604081208054929350839290919061208990849067ffffffffffffffff166144cb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506120c98289838989898d346120c49190614520565b613106565b604051878152889033906000907fbe6ff12fec5087498d44bc85f1a83235a630944a1e2d5a7938afe810370a586790602001611915565b6121086127b3565b6001600160a01b0382166000818152600a6020908152604091829020805460ff19168515159081179091558251938452908301527fb1656bd3b50ddb6b12ef259c86e9cb359952b53c4403cfb5a83e23c515a35e229101610fd4565b61216c6127b3565b6040517fcbed8b9c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906121d9908890889088908890889060040161467c565b600060405180830381600087803b1580156121f357600080fd5b505af1158015612207573d6000803e3d6000fd5b505050505050505050565b61ffff8616600090815260046020526040808220905161223590889088906142d0565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020549050806122d05760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201527f61676500000000000000000000000000000000000000000000000000000000006064820152608401610aaa565b8083836040516122e19291906142d0565b6040518091039020146123405760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610aaa565b61ffff8716600090815260046020526040808220905161236390899089906142d0565b908152604080516020928190038301812067ffffffffffffffff8916600090815290845282902093909355601f880182900482028301820190528682526123fc918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250612bcb92505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e587878787856040516124339594939291906146aa565b60405180910390a150505050505050565b61244c6127b3565b600c80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16600160b01b831515021790558061248a576000612497565b6124974262093a806146e6565b600d81905560408051831515815260208101929092527f27a37fc51e6c5d14309bbed3a54787c8788223b5d9cd5fe10605661665dd84159101610ae4565b6124dd6127b3565b6000811161252d5760405162461bcd60e51b815260206004820152601560248201527f4c7a4170703a20696e76616c6964206d696e47617300000000000000000000006044820152606401610aaa565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611cfa565b6125976127b3565b600c8054821515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a490610ae490831515815260200190565b6126076127b3565b61ffff831660009081526001602052604090206126258284836146fe565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611cfa93929190614435565b6126616127b3565b6001600160a01b0381166126dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610aaa565b6126e68161333a565b50565b6040517ff5ecbdbc00000000000000000000000000000000000000000000000000000000815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612782573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127aa91908101906147be565b95945050505050565b6000546001600160a01b031633146115d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aaa565b6000806128885a60966366ad5c8a60e01b89898989604051602401612835949392919061482c565b60408051601f198184030181529190526020810180516001600160e01b03167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915230929190613397565b9150915081611559578280519060200120600460008861ffff1661ffff168152602001908152602001600020866040516128c2919061486b565b90815260408051918290036020908101832067ffffffffffffffff89166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906129209088908890889088908790614887565b60405180910390a1505050505050565b60408051600481526024810182526020810180516001600160e01b03167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b0386169161298f919061486b565b600060405180830381855afa9150503d80600081146129ca576040519150601f19603f3d011682016040523d82523d6000602084013e6129cf565b606091505b509150915081612a475760405162461bcd60e51b815260206004820152602960248201527f546f6b656e4272696467653a206661696c656420746f2067657420746f6b656e60448201527f20646563696d616c7300000000000000000000000000000000000000000000006064820152608401610aaa565b80806020019051810190612a5b91906148e6565b949350505050565b6040516001600160a01b038316602482015260448101829052612af79084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613422565b505050565b600c54600160a01b900460ff1615612b57576006546119729061ffff16600084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250613507915050565b80156119725760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e4272696467653a205f61646170746572506172616d73206d75737460448201527f20626520656d7074792e000000000000000000000000000000000000000000006064820152608401610aaa565b60065461ffff858116911614612c485760405162461bcd60e51b8152602060048201526024808201527f546f6b656e4272696467653a20696e76616c696420736f75726365206368616960448201527f6e206964000000000000000000000000000000000000000000000000000000006064820152608401610aaa565b600080600080612c57856135e6565b600c5493975091955093509150600160a81b900460ff16158015612c9457506001600160a01b0384166000908152600a602052604090205460ff16155b612ce05760405162461bcd60e51b815260206004820152601360248201527f546f6b656e4272696467653a20706175736564000000000000000000000000006044820152606401610aaa565b6001600160a01b03841660009081526009602052604090205460ff16612d545760405162461bcd60e51b815260206004820152602360248201527f546f6b656e4272696467653a20746f6b656e206973206e6f7420737570706f726044820152621d195960ea1b6064820152608401610aaa565b6001600160a01b03841660009081526008602052604090205467ffffffffffffffff908116908316811015612df15760405162461bcd60e51b815260206004820152602360248201527f546f6b656e4272696467653a20696e73756666696369656e74206c697175696460448201527f69747900000000000000000000000000000000000000000000000000000000006064820152608401610aaa565b612dfb83826144f7565b6001600160a01b0386166000908152600860205260408120805467ffffffffffffffff191667ffffffffffffffff9390931692909217909155612e3e86856131e5565b9050600060075411612e5257806000612e5b565b612e5b8161373a565b50600c549091506001600160a01b038781169116148015612e795750825b15612edb57600c54612e95906001600160a01b0316868361376b565b6040518181526001600160a01b038616906000907ffd19781f43410d9594fd4c02dd1d98dbe99099cbd222d5851a6e183c468d33ca9060200160405180910390a3612f58565b6001600160a01b03851615612ef05784612ef4565b61dead5b9450612f0a6001600160a01b0387168683612a63565b846001600160a01b0316866001600160a01b03167ffd19781f43410d9594fd4c02dd1d98dbe99099cbd222d5851a6e183c468d33ca83604051612f4f91815260200190565b60405180910390a35b50505050505050505050565b6000612f7983612f748585613087565b6131e5565b90505b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612fcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fef9190614537565b90506130066001600160a01b03861685308661381a565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa15801561304d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130719190614537565b905061307d8282614520565b9695505050505050565b6001600160a01b0382166000908152600b602052604081205481906130ac908461491f565b905067ffffffffffffffff811115612f795760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e4272696467653a20616d6f756e745344206f766572666c6f7700006044820152606401610aaa565b6131108383612afc565b604080516000602082018190526001600160a01b038a1660218301526041820189905260c088901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660618301528251808303604901815260699092019092526006549091506131db9061ffff168261318d6020890189613d6d565b61319d60408a0160208b01613d6d565b88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a925061386b915050565b5050505050505050565b6001600160a01b0382166000908152600b6020526040812054612f799067ffffffffffffffff8416614941565b60608161322081601f6146e6565b101561326e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610aaa565b61327882846146e6565b845110156132c85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610aaa565b6060821580156132e75760405191506000825260208201604052613331565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613320578051835260209283019201613308565b5050858452601f01601f1916604052505b50949350505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000606060008060008661ffff1667ffffffffffffffff8111156133bd576133bd613e71565b6040519080825280601f01601f1916602001820160405280156133e7576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115613409578692505b828152826000602083013e909890975095505050505050565b6000613477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a2c9092919063ffffffff16565b805190915015612af757808060200190518101906134959190614960565b612af75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610aaa565b600061351283613a3b565b61ffff8087166000908152600260209081526040808320938916835292905290812054919250906135449084906146e6565b9050600081116135965760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610aaa565b808210156115595760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610aaa565b6000806000808451604a146136635760405162461bcd60e51b815260206004820152602360248201527f546f6b656e4272696467653a20696e76616c6964207061796c6f6164206c656e60448201527f67746800000000000000000000000000000000000000000000000000000000006064820152608401610aaa565b6000856000815181106136785761367861497d565b016020015160f81c600181111561369157613691614909565b905060018160018111156136a7576136a7614909565b146136f45760405162461bcd60e51b815260206004820181905260248201527f546f6b656e4272696467653a20756e6b6e6f776e207061636b657420747970656044820152606401610aaa565b6021860151945060418601519350604986015192508560498151811061371c5761371c61497d565b602001015160f81c60f81b60f81c60ff166001149150509193509193565b6000806127106007548461374e9190614941565b613758919061491f565b90506137648184614520565b9150915091565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290526001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b1580156137c657600080fd5b505af11580156137da573d6000803e3d6000fd5b50506040516001600160a01b038516925083156108fc02915083906000818181858888f19350505050158015613814573d6000803e3d6000fd5b50505050565b6040516001600160a01b03808516602483015283166044820152606481018290526138149085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612aa8565b61ffff8616600090815260016020526040812080546138899061429c565b80601f01602080910402602001604051908101604052809291908181526020018280546138b59061429c565b80156139025780601f106138d757610100808354040283529160200191613902565b820191906000526020600020905b8154815290600101906020018083116138e557829003601f168201915b5050505050905080516000036139805760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201527f61207472757374656420736f75726365000000000000000000000000000000006064820152608401610aaa565b6040517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c58031009084906139f1908b9086908c908c908c908c90600401614993565b6000604051808303818588803b158015613a0a57600080fd5b505af1158015613a1e573d6000803e3d6000fd5b505050505050505050505050565b6060612a5b8484600085613a97565b6000602282511015613a8f5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610aaa565b506022015190565b606082471015613b0f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610aaa565b6001600160a01b0385163b613b665760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aaa565b600080866001600160a01b03168587604051613b82919061486b565b60006040518083038185875af1925050503d8060008114613bbf576040519150601f19603f3d011682016040523d82523d6000602084013e613bc4565b606091505b5091509150613bd4828286613bdf565b979650505050505050565b60608315613bee5750816111dd565b825115613bfe5782518084602001fd5b8160405162461bcd60e51b8152600401610aaa9190614004565b600060208284031215613c2a57600080fd5b5035919050565b803561ffff81168114613c4357600080fd5b919050565b60008083601f840112613c5a57600080fd5b50813567ffffffffffffffff811115613c7257600080fd5b602083019150836020828501011115613c8a57600080fd5b9250929050565b803567ffffffffffffffff81168114613c4357600080fd5b60008060008060008060808789031215613cc257600080fd5b613ccb87613c31565b9550602087013567ffffffffffffffff80821115613ce857600080fd5b613cf48a838b01613c48565b9097509550859150613d0860408a01613c91565b94506060890135915080821115613d1e57600080fd5b50613d2b89828a01613c48565b979a9699509497509295939492505050565b600060208284031215613d4f57600080fd5b612f7982613c31565b6001600160a01b03811681146126e657600080fd5b600060208284031215613d7f57600080fd5b8135612f7981613d58565b600080600060608486031215613d9f57600080fd5b8335613daa81613d58565b92506020840135613dba81613d58565b929592945050506040919091013590565b600080600060408486031215613de057600080fd5b613de984613c31565b9250602084013567ffffffffffffffff811115613e0557600080fd5b613e1186828701613c48565b9497909650939450505050565b600060408284031215613e3057600080fd5b50919050565b600080600060608486031215613e4b57600080fd5b613e558585613e1e565b9250604084013567ffffffffffffffff811115613e0557600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613eb057613eb0613e71565b604052919050565b600067ffffffffffffffff821115613ed257613ed2613e71565b50601f01601f191660200190565b600080600060608486031215613ef557600080fd5b613efe84613c31565b9250602084013567ffffffffffffffff811115613f1a57600080fd5b8401601f81018613613f2b57600080fd5b8035613f3e613f3982613eb8565b613e87565b818152876020838501011115613f5357600080fd5b81602084016020830137600060208383010152809450505050613f7860408501613c91565b90509250925092565b80151581146126e657600080fd5b600060208284031215613fa157600080fd5b8135612f7981613f81565b60005b83811015613fc7578181015183820152602001613faf565b838111156138145750506000910152565b60008151808452613ff0816020860160208601613fac565b601f01601f19169290920160200192915050565b602081526000612f796020830184613fd8565b60008060008060008060c0878903121561403057600080fd5b863561403b81613d58565b955060208701359450604087013593506140588860608901613e1e565b925060a087013567ffffffffffffffff81111561407457600080fd5b613d2b89828a01613c48565b6000806040838503121561409357600080fd5b61409c83613c31565b91506140aa60208401613c31565b90509250929050565b600080604083850312156140c657600080fd5b82356140d181613d58565b915060208301356140e181613d58565b809150509250929050565b60008060006060848603121561410157600080fd5b833561410c81613d58565b9250602084013561411c81613d58565b9150613f7860408501613c91565b600080600080600060a0868803121561414257600080fd5b853594506020860135935061415a8760408801613e1e565b9250608086013567ffffffffffffffff81111561417657600080fd5b61418288828901613c48565b969995985093965092949392505050565b600080604083850312156141a657600080fd5b82356141b181613d58565b915060208301356140e181613f81565b6000806000806000608086880312156141d957600080fd5b6141e286613c31565b94506141f060208701613c31565b935060408601359250606086013567ffffffffffffffff81111561417657600080fd5b60008060006060848603121561422857600080fd5b61423184613c31565b925061423f60208501613c31565b9150604084013590509250925092565b6000806000806080858703121561426557600080fd5b61426e85613c31565b935061427c60208601613c31565b9250604085013561428c81613d58565b9396929550929360600135925050565b600181811c908216806142b057607f821691505b602082108103613e3057634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff841680821015614310576143106142e0565b90039392505050565b600181815b8085111561435457816000190482111561433a5761433a6142e0565b8085161561434757918102915b93841c939080029061431e565b509250929050565b60008261436b57506001612f7c565b8161437857506000612f7c565b816001811461438e5760028114614398576143b4565b6001915050612f7c565b60ff8411156143a9576143a96142e0565b50506001821b612f7c565b5060208310610133831016604e8410600b84101617156143d7575081810a612f7c565b6143e18383614319565b80600019048211156143f5576143f56142e0565b029392505050565b6000612f7960ff84168361435c565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff841681526040602082015260006127aa60408301848661440c565b61ffff871681526001600160a01b038616602082015260a06040820152600061447f60a0830187613fd8565b8515156060840152828103608084015261449a81858761440c565b9998505050505050505050565b600080604083850312156144ba57600080fd5b505080516020909101519092909150565b600067ffffffffffffffff8083168185168083038211156144ee576144ee6142e0565b01949350505050565b600067ffffffffffffffff83811690831681811015614518576145186142e0565b039392505050565b600082821015614532576145326142e0565b500390565b60006020828403121561454957600080fd5b5051919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f821115612af757600081815260208120601f850160051c8101602086101561459d5750805b601f850160051c820191505b81811015611559578281556001016145a9565b815167ffffffffffffffff8111156145d6576145d6613e71565b6145ea816145e4845461429c565b84614576565b602080601f83116001811461461f57600084156146075750858301515b600019600386901b1c1916600185901b178555611559565b600085815260208120601f198616915b8281101561464e5788860151825594840194600190910190840161462f565b508582101561466c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff808816835280871660208401525084604083015260806060830152613bd460808301848661440c565b61ffff861681526080602082015260006146c860808301868861440c565b67ffffffffffffffff94909416604083015250606001529392505050565b600082198211156146f9576146f96142e0565b500190565b67ffffffffffffffff83111561471657614716613e71565b61472a83614724835461429c565b83614576565b6000601f84116001811461475e57600085156147465750838201355b600019600387901b1c1916600186901b178355610dcd565b600083815260209020601f19861690835b8281101561478f578685013582556020948501946001909201910161476f565b50868210156147ac5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000602082840312156147d057600080fd5b815167ffffffffffffffff8111156147e757600080fd5b8201601f810184136147f857600080fd5b8051614806613f3982613eb8565b81815285602083850101111561481b57600080fd5b6127aa826020830160208601613fac565b61ffff851681526080602082015260006148496080830186613fd8565b67ffffffffffffffff851660408401528281036060840152613bd48185613fd8565b6000825161487d818460208701613fac565b9190910192915050565b61ffff8616815260a0602082015260006148a460a0830187613fd8565b67ffffffffffffffff8616604084015282810360608401526148c68186613fd8565b905082810360808401526148da8185613fd8565b98975050505050505050565b6000602082840312156148f857600080fd5b815160ff81168114612f7957600080fd5b634e487b7160e01b600052602160045260246000fd5b60008261493c57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561495b5761495b6142e0565b500290565b60006020828403121561497257600080fd5b8151612f7981613f81565b634e487b7160e01b600052603260045260246000fd5b61ffff8716815260c0602082015260006149b060c0830188613fd8565b82810360408401526149c28188613fd8565b6001600160a01b0387811660608601528616608085015283810360a0850152905061449a8185613fd856fea26469706673582212207e627899a6ccdd0f8de8e25cd4ab72f6102844709371ea2bdb3c25b0c444336f64736f6c634300080f00330000000000000000000000003c2269811836af69497e5f486a85d7316753cf62000000000000000000000000000000000000000000000000000000000000006c
Deployed Bytecode
0x60806040526004361061032b5760003560e01c806393f26a4c116101a5578063cb8d3b1f116100ec578063e3179c3e11610095578063ed629c5c1161006f578063ed629c5c146109c3578063ee7a4596146109e4578063f2fde38b14610a14578063f5ecbdbc14610a3457600080fd5b8063e3179c3e14610933578063eab45d9c14610983578063eb8d72b7146109a357600080fd5b8063d71e409e116100c6578063d71e409e146108dd578063de9b9488146108fd578063df2a5b3b1461091357600080fd5b8063cb8d3b1f1461088a578063cbed8b9c146108aa578063d1deba1f146108ca57600080fd5b8063a6c3d1651161014e578063baf3292d11610128578063baf3292d14610837578063c21f511414610857578063ca23bb4c1461087757600080fd5b8063a6c3d165146107cd578063abe685cd146107ed578063b353aaa71461080357600080fd5b8063971679641161017f57806397167964146107665780639f38369a1461078d578063a2f27ae0146107ad57600080fd5b806393f26a4c14610706578063950c8a741461072657806395e2c1681461074657600080fd5b80635747e69f1161027457806369a6b3db1161021d57806376a9099a116101f757806376a9099a146106705780638cfd8f5c146106835780638da5cb5b146106bb57806392cc13c5146106d957600080fd5b806369a6b3db1461060e578063715018a61461062e5780637533d7881461064357600080fd5b806361a552dc1161024e57806361a552dc1461059d57806366ad5c8a146105be57806368c4ac26146105de57600080fd5b80635747e69f1461050d5780635b769f3c1461052e5780635b8c41e61461054e57600080fd5b806325a9f792116102d65780633fc8cef3116102b05780633fc8cef31461048057806342d65a8d146104b8578063468b9668146104d857600080fd5b806325a9f792146103f95780632db88ecf146104225780633d8b38f61461045057600080fd5b806309824a801161030757806309824a80146103995780631095b6d7146103b957806310ddb137146103d957600080fd5b80620d5900146103375780621d35671461035957806307e0db171461037957600080fd5b3661033257005b600080fd5b34801561034357600080fd5b50610357610352366004613c18565b610a54565b005b34801561036557600080fd5b50610357610374366004613ca9565b610aef565b34801561038557600080fd5b50610357610394366004613d3d565b610d32565b3480156103a557600080fd5b506103576103b4366004613d6d565b610dd4565b3480156103c557600080fd5b506103576103d4366004613d8a565b610fe0565b3480156103e557600080fd5b506103576103f4366004613d3d565b6110a6565b34801561040557600080fd5b5061040f60075481565b6040519081526020015b60405180910390f35b34801561042e57600080fd5b5060065461043d9061ffff1681565b60405161ffff9091168152602001610419565b34801561045c57600080fd5b5061047061046b366004613dcb565b611117565b6040519015158152602001610419565b34801561048c57600080fd5b50600c546104a0906001600160a01b031681565b6040516001600160a01b039091168152602001610419565b3480156104c457600080fd5b506103576104d3366004613dcb565b6111e4565b3480156104e457600080fd5b506104f86104f3366004613e36565b611283565b60408051928352602083019190915201610419565b34801561051957600080fd5b50600c5461047090600160b01b900460ff1681565b34801561053a57600080fd5b50610357610549366004613d6d565b6113aa565b34801561055a57600080fd5b5061040f610569366004613ee0565b6004602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b3480156105a957600080fd5b50600c5461047090600160a81b900460ff1681565b3480156105ca57600080fd5b506103576105d9366004613ca9565b61146e565b3480156105ea57600080fd5b506104706105f9366004613d6d565b60096020526000908152604090205460ff1681565b34801561061a57600080fd5b50610357610629366004613f8f565b611561565b34801561063a57600080fd5b506103576115d1565b34801561064f57600080fd5b5061066361065e366004613d3d565b6115db565b6040516104199190614004565b61035761067e366004614017565b611675565b34801561068f57600080fd5b5061040f61069e366004614080565b600260209081526000928352604080842090915290825290205481565b3480156106c757600080fd5b506000546001600160a01b03166104a0565b3480156106e557600080fd5b5061040f6106f4366004613d6d565b600b6020526000908152604090205481565b34801561071257600080fd5b506103576107213660046140b3565b61192c565b34801561073257600080fd5b506003546104a0906001600160a01b031681565b34801561075257600080fd5b506103576107613660046140ec565b611976565b34801561077257600080fd5b5061077b600681565b60405160ff9091168152602001610419565b34801561079957600080fd5b506106636107a8366004613d3d565b611ac8565b3480156107b957600080fd5b5061040f6107c8366004613d6d565b611bd7565b3480156107d957600080fd5b506103576107e8366004613dcb565b611c7e565b3480156107f957600080fd5b5061040f61271081565b34801561080f57600080fd5b506104a07f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6281565b34801561084357600080fd5b50610357610852366004613d6d565b611d07565b34801561086357600080fd5b50610357610872366004613d3d565b611d6a565b61035761088536600461412a565b611db6565b34801561089657600080fd5b506103576108a5366004614193565b612100565b3480156108b657600080fd5b506103576108c53660046141c1565b612164565b6103576108d8366004613ca9565b612212565b3480156108e957600080fd5b506103576108f8366004613f8f565b612444565b34801561090957600080fd5b5061040f600d5481565b34801561091f57600080fd5b5061035761092e366004614213565b6124d5565b34801561093f57600080fd5b5061096a61094e366004613d6d565b60086020526000908152604090205467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610419565b34801561098f57600080fd5b5061035761099e366004613f8f565b61258f565b3480156109af57600080fd5b506103576109be366004613dcb565b6125ff565b3480156109cf57600080fd5b50600c5461047090600160a01b900460ff1681565b3480156109f057600080fd5b506104706109ff366004613d6d565b600a6020526000908152604090205460ff1681565b348015610a2057600080fd5b50610357610a2f366004613d6d565b612659565b348015610a4057600080fd5b50610663610a4f36600461424f565b6126e9565b610a5c6127b3565b612710811115610ab35760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e4272696467653a2062726964676520666565203e2031303025000060448201526064015b60405180910390fd5b60078190556040518181527f9a749c8193bfd56b2b2a05c0bd18fbb0f69801a3fd6576c40b90537fd0fc3854906020015b60405180910390a150565b337f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b031614610b675760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c657200006044820152606401610aaa565b61ffff861660009081526001602052604081208054610b859061429c565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb19061429c565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b50505050509050805186869050148015610c19575060008151115b8015610c41575080516020820120604051610c3790889088906142d0565b6040518091039020145b610cb35760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610aaa565b610d298787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061280d92505050565b50505050505050565b610d3a6127b3565b6040517f07e0db1700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b5050505050565b610ddc6127b3565b6001600160a01b038116610e3d5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e4272696467653a20696e76616c696420746f6b656e206164647265604482015261737360f01b6064820152608401610aaa565b6001600160a01b03811660009081526009602052604090205460ff1615610ecc5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e4272696467653a20746f6b656e20616c726561647920726567697360448201527f74657265640000000000000000000000000000000000000000000000000000006064820152608401610aaa565b6000610ed782612930565b9050600660ff82161015610f535760405162461bcd60e51b815260206004820152603060248201527f546f6b656e4272696467653a20646563696d616c73206d757374206265203e3d60448201527f205348415245445f444543494d414c53000000000000000000000000000000006064820152608401610aaa565b6001600160a01b0382166000908152600960205260409020805460ff19166001179055610f816006826142f6565b610f8c90600a6143fd565b6001600160a01b0383166000818152600b602090815260409182902093909355519081527ff7fe8023cb2e36bde1d59a88ac5763a8c11be6d25e6819f71bb7e23e5bf0dc1691015b60405180910390a15050565b610fe86127b3565b6000610ff384611bd7565b9050808211156110455760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e4272696467653a20666565206e6f7420656e6f75676800000000006044820152606401610aaa565b6110596001600160a01b0385168484612a63565b604080516001600160a01b038581168252602082018590528616917ff15a0a3784dea9b4fe33bc98e2450745e262d310237b2868ea8ef56967ff3ecb91015b60405180910390a250505050565b6110ae6127b3565b6040517f10ddb13700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316906310ddb13790602401610d9f565b61ffff8316600090815260016020526040812080548291906111389061429c565b80601f01602080910402602001604051908101604052809291908181526020018280546111649061429c565b80156111b15780601f10611186576101008083540402835291602001916111b1565b820191906000526020600020905b81548152906001019060200180831161119457829003601f168201915b5050505050905083836040516111c89291906142d0565b60405180910390208180519060200120149150505b9392505050565b6111ec6127b3565b6040517f42d65a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906342d65a8d9061125590869086908690600401614435565b600060405180830381600087803b15801561126f57600080fd5b505af1158015610d29573d6000803e3d6000fd5b6000806112908484612afc565b6040805160006020820181905260218201819052604182018190526061820181905282518083036049018152606990920190925290506000806112d96040890160208a01613d6d565b6006546040517f40a7bb100000000000000000000000000000000000000000000000000000000081526001600160a01b03928316939093141593507f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62909116916340a7bb109161135c9161ffff909116903090879087908d908d90600401614453565b6040805180830381865afa158015611378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139c91906144a7565b935093505050935093915050565b6113b26127b3565b6001600160a01b0381166114135760405162461bcd60e51b815260206004820152602260248201527f546f6b656e4272696467653a20696e76616c696420746f6b656e206164647265604482015261737360f01b6064820152608401610aaa565b600c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fe390bcec6614d6b1f8ae47a4d9d46531ce328e3d293ecd6ddd015cb01eff030090602001610ae4565b3330146114e35760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560448201527f204c7a41707000000000000000000000000000000000000000000000000000006064820152608401610aaa565b6115598686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250612bcb92505050565b505050505050565b6115696127b3565b600c8054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f5362d4bd13945e8d116b90d83a7050fa61ceb02bb79bfae783377adb46916d9490610ae490831515815260200190565b6115d96127b3565b565b600160205260009081526040902080546115f49061429c565b80601f01602080910402602001604051908101604052809291908181526020018280546116209061429c565b801561166d5780601f106116425761010080835404028352916020019161166d565b820191906000526020600020905b81548152906001019060200180831161165057829003601f168201915b505050505081565b600c548690600160a81b900460ff161580156116aa57506001600160a01b0381166000908152600a602052604090205460ff16155b6116f65760405162461bcd60e51b815260206004820152601360248201527f546f6b656e4272696467653a20706175736564000000000000000000000000006044820152606401610aaa565b6002600554036117485760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610aaa565b60026005556001600160a01b03871660009081526009602052604090205460ff166117c15760405162461bcd60e51b815260206004820152602360248201527f546f6b656e4272696467653a20746f6b656e206973206e6f7420737570706f726044820152621d195960ea1b6064820152608401610aaa565b6117cb8786612f64565b94506117d8873387612f82565b945060006117e68887613087565b905060008167ffffffffffffffff16116118685760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e4272696467653a20616d6f756e745344206d75737420626520677260448201527f6561746572207468616e203000000000000000000000000000000000000000006064820152608401610aaa565b6001600160a01b0388166000908152600860205260408120805483929061189a90849067ffffffffffffffff166144cb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506118cf88888388888834613106565b86336001600160a01b0316896001600160a01b03167fbe6ff12fec5087498d44bc85f1a83235a630944a1e2d5a7938afe810370a58678960405161191591815260200190565b60405180910390a450506001600555505050505050565b6119346127b3565b61194282826103d485611bd7565b6001600160a01b038216600090815260086020526040902054611972908390839067ffffffffffffffff16611976565b5050565b61197e6127b3565b600c54600160b01b900460ff1680156119995750600d544210155b611a0b5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e4272696467653a20656d657267656e63792077697468647261772060448201527f6c6f636b656400000000000000000000000000000000000000000000000000006064820152608401610aaa565b6001600160a01b03831660009081526008602052604081208054839290611a3d90849067ffffffffffffffff166144f7565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000611a6f84836131e5565b9050611a856001600160a01b0385168483612a63565b604080516001600160a01b038581168252602082018490528616917f49507695f37b729944475cf3388760a14760fef784b7ab5ca8863a5f3f8be6bd9101611098565b61ffff8116600090815260016020526040812080546060929190611aeb9061429c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b179061429c565b8015611b645780601f10611b3957610100808354040283529160200191611b64565b820191906000526020600020905b815481529060010190602001808311611b4757829003601f168201915b505050505090508051600003611bbc5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610aaa565b6111dd600060148351611bcf9190614520565b839190613212565b6001600160a01b0381166000908152600860205260408120548190611c0790849067ffffffffffffffff166131e5565b6040516370a0823160e01b815230600482015290915081906001600160a01b038516906370a0823190602401602060405180830381865afa158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c749190614537565b6111dd9190614520565b611c866127b3565b818130604051602001611c9b93929190614550565b60408051601f1981840301815291815261ffff8516600090815260016020522090611cc690826145bc565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611cfa93929190614435565b60405180910390a1505050565b611d0f6127b3565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90602001610ae4565b611d726127b3565b6006805461ffff191661ffff83169081179091556040519081527f6a9ea26cc7efedf0df6fd048e06f3de4be1a978bb5d440277147c76e1c0eb75a90602001610ae4565b600c546001600160a01b03811690600160a81b900460ff16158015611df457506001600160a01b0381166000908152600a602052604090205460ff16155b611e405760405162461bcd60e51b815260206004820152601360248201527f546f6b656e4272696467653a20706175736564000000000000000000000000006044820152606401610aaa565b600260055403611e925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610aaa565b6002600555600c546001600160a01b03168015801590611eca57506001600160a01b03811660009081526009602052604090205460ff165b611f205760405162461bcd60e51b815260206004820152602160248201527f546f6b656e4272696467653a20455448206973206e6f7420737570706f7274656044820152601960fa1b6064820152608401610aaa565b611f2a8187612f64565b955060008611611fa25760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e4272696467653a20616d6f756e74206d757374206265206772656160448201527f746572207468616e2030000000000000000000000000000000000000000000006064820152608401610aaa565b85341015611ff25760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e4272696467653a20666565206e6f7420656e6f75676800000000006044820152606401610aaa565b806001600160a01b031663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b15801561202d57600080fd5b505af1158015612041573d6000803e3d6000fd5b505050505060006120528288613087565b6001600160a01b03831660009081526008602052604081208054929350839290919061208990849067ffffffffffffffff166144cb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506120c98289838989898d346120c49190614520565b613106565b604051878152889033906000907fbe6ff12fec5087498d44bc85f1a83235a630944a1e2d5a7938afe810370a586790602001611915565b6121086127b3565b6001600160a01b0382166000818152600a6020908152604091829020805460ff19168515159081179091558251938452908301527fb1656bd3b50ddb6b12ef259c86e9cb359952b53c4403cfb5a83e23c515a35e229101610fd4565b61216c6127b3565b6040517fcbed8b9c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169063cbed8b9c906121d9908890889088908890889060040161467c565b600060405180830381600087803b1580156121f357600080fd5b505af1158015612207573d6000803e3d6000fd5b505050505050505050565b61ffff8616600090815260046020526040808220905161223590889088906142d0565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020549050806122d05760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201527f61676500000000000000000000000000000000000000000000000000000000006064820152608401610aaa565b8083836040516122e19291906142d0565b6040518091039020146123405760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610aaa565b61ffff8716600090815260046020526040808220905161236390899089906142d0565b908152604080516020928190038301812067ffffffffffffffff8916600090815290845282902093909355601f880182900482028301820190528682526123fc918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250612bcb92505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e587878787856040516124339594939291906146aa565b60405180910390a150505050505050565b61244c6127b3565b600c80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16600160b01b831515021790558061248a576000612497565b6124974262093a806146e6565b600d81905560408051831515815260208101929092527f27a37fc51e6c5d14309bbed3a54787c8788223b5d9cd5fe10605661665dd84159101610ae4565b6124dd6127b3565b6000811161252d5760405162461bcd60e51b815260206004820152601560248201527f4c7a4170703a20696e76616c6964206d696e47617300000000000000000000006044820152606401610aaa565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611cfa565b6125976127b3565b600c8054821515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a490610ae490831515815260200190565b6126076127b3565b61ffff831660009081526001602052604090206126258284836146fe565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611cfa93929190614435565b6126616127b3565b6001600160a01b0381166126dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610aaa565b6126e68161333a565b50565b6040517ff5ecbdbc00000000000000000000000000000000000000000000000000000000815261ffff808616600483015284166024820152306044820152606481018290526060907f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612782573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127aa91908101906147be565b95945050505050565b6000546001600160a01b031633146115d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aaa565b6000806128885a60966366ad5c8a60e01b89898989604051602401612835949392919061482c565b60408051601f198184030181529190526020810180516001600160e01b03167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915230929190613397565b9150915081611559578280519060200120600460008861ffff1661ffff168152602001908152602001600020866040516128c2919061486b565b90815260408051918290036020908101832067ffffffffffffffff89166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906129209088908890889088908790614887565b60405180910390a1505050505050565b60408051600481526024810182526020810180516001600160e01b03167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b0386169161298f919061486b565b600060405180830381855afa9150503d80600081146129ca576040519150601f19603f3d011682016040523d82523d6000602084013e6129cf565b606091505b509150915081612a475760405162461bcd60e51b815260206004820152602960248201527f546f6b656e4272696467653a206661696c656420746f2067657420746f6b656e60448201527f20646563696d616c7300000000000000000000000000000000000000000000006064820152608401610aaa565b80806020019051810190612a5b91906148e6565b949350505050565b6040516001600160a01b038316602482015260448101829052612af79084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613422565b505050565b600c54600160a01b900460ff1615612b57576006546119729061ffff16600084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250613507915050565b80156119725760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e4272696467653a205f61646170746572506172616d73206d75737460448201527f20626520656d7074792e000000000000000000000000000000000000000000006064820152608401610aaa565b60065461ffff858116911614612c485760405162461bcd60e51b8152602060048201526024808201527f546f6b656e4272696467653a20696e76616c696420736f75726365206368616960448201527f6e206964000000000000000000000000000000000000000000000000000000006064820152608401610aaa565b600080600080612c57856135e6565b600c5493975091955093509150600160a81b900460ff16158015612c9457506001600160a01b0384166000908152600a602052604090205460ff16155b612ce05760405162461bcd60e51b815260206004820152601360248201527f546f6b656e4272696467653a20706175736564000000000000000000000000006044820152606401610aaa565b6001600160a01b03841660009081526009602052604090205460ff16612d545760405162461bcd60e51b815260206004820152602360248201527f546f6b656e4272696467653a20746f6b656e206973206e6f7420737570706f726044820152621d195960ea1b6064820152608401610aaa565b6001600160a01b03841660009081526008602052604090205467ffffffffffffffff908116908316811015612df15760405162461bcd60e51b815260206004820152602360248201527f546f6b656e4272696467653a20696e73756666696369656e74206c697175696460448201527f69747900000000000000000000000000000000000000000000000000000000006064820152608401610aaa565b612dfb83826144f7565b6001600160a01b0386166000908152600860205260408120805467ffffffffffffffff191667ffffffffffffffff9390931692909217909155612e3e86856131e5565b9050600060075411612e5257806000612e5b565b612e5b8161373a565b50600c549091506001600160a01b038781169116148015612e795750825b15612edb57600c54612e95906001600160a01b0316868361376b565b6040518181526001600160a01b038616906000907ffd19781f43410d9594fd4c02dd1d98dbe99099cbd222d5851a6e183c468d33ca9060200160405180910390a3612f58565b6001600160a01b03851615612ef05784612ef4565b61dead5b9450612f0a6001600160a01b0387168683612a63565b846001600160a01b0316866001600160a01b03167ffd19781f43410d9594fd4c02dd1d98dbe99099cbd222d5851a6e183c468d33ca83604051612f4f91815260200190565b60405180910390a35b50505050505050505050565b6000612f7983612f748585613087565b6131e5565b90505b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612fcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fef9190614537565b90506130066001600160a01b03861685308661381a565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa15801561304d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130719190614537565b905061307d8282614520565b9695505050505050565b6001600160a01b0382166000908152600b602052604081205481906130ac908461491f565b905067ffffffffffffffff811115612f795760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e4272696467653a20616d6f756e745344206f766572666c6f7700006044820152606401610aaa565b6131108383612afc565b604080516000602082018190526001600160a01b038a1660218301526041820189905260c088901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660618301528251808303604901815260699092019092526006549091506131db9061ffff168261318d6020890189613d6d565b61319d60408a0160208b01613d6d565b88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a925061386b915050565b5050505050505050565b6001600160a01b0382166000908152600b6020526040812054612f799067ffffffffffffffff8416614941565b60608161322081601f6146e6565b101561326e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610aaa565b61327882846146e6565b845110156132c85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610aaa565b6060821580156132e75760405191506000825260208201604052613331565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613320578051835260209283019201613308565b5050858452601f01601f1916604052505b50949350505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000606060008060008661ffff1667ffffffffffffffff8111156133bd576133bd613e71565b6040519080825280601f01601f1916602001820160405280156133e7576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115613409578692505b828152826000602083013e909890975095505050505050565b6000613477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a2c9092919063ffffffff16565b805190915015612af757808060200190518101906134959190614960565b612af75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610aaa565b600061351283613a3b565b61ffff8087166000908152600260209081526040808320938916835292905290812054919250906135449084906146e6565b9050600081116135965760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610aaa565b808210156115595760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610aaa565b6000806000808451604a146136635760405162461bcd60e51b815260206004820152602360248201527f546f6b656e4272696467653a20696e76616c6964207061796c6f6164206c656e60448201527f67746800000000000000000000000000000000000000000000000000000000006064820152608401610aaa565b6000856000815181106136785761367861497d565b016020015160f81c600181111561369157613691614909565b905060018160018111156136a7576136a7614909565b146136f45760405162461bcd60e51b815260206004820181905260248201527f546f6b656e4272696467653a20756e6b6e6f776e207061636b657420747970656044820152606401610aaa565b6021860151945060418601519350604986015192508560498151811061371c5761371c61497d565b602001015160f81c60f81b60f81c60ff166001149150509193509193565b6000806127106007548461374e9190614941565b613758919061491f565b90506137648184614520565b9150915091565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290526001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b1580156137c657600080fd5b505af11580156137da573d6000803e3d6000fd5b50506040516001600160a01b038516925083156108fc02915083906000818181858888f19350505050158015613814573d6000803e3d6000fd5b50505050565b6040516001600160a01b03808516602483015283166044820152606481018290526138149085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612aa8565b61ffff8616600090815260016020526040812080546138899061429c565b80601f01602080910402602001604051908101604052809291908181526020018280546138b59061429c565b80156139025780601f106138d757610100808354040283529160200191613902565b820191906000526020600020905b8154815290600101906020018083116138e557829003601f168201915b5050505050905080516000036139805760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201527f61207472757374656420736f75726365000000000000000000000000000000006064820152608401610aaa565b6040517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169063c58031009084906139f1908b9086908c908c908c908c90600401614993565b6000604051808303818588803b158015613a0a57600080fd5b505af1158015613a1e573d6000803e3d6000fd5b505050505050505050505050565b6060612a5b8484600085613a97565b6000602282511015613a8f5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610aaa565b506022015190565b606082471015613b0f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610aaa565b6001600160a01b0385163b613b665760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aaa565b600080866001600160a01b03168587604051613b82919061486b565b60006040518083038185875af1925050503d8060008114613bbf576040519150601f19603f3d011682016040523d82523d6000602084013e613bc4565b606091505b5091509150613bd4828286613bdf565b979650505050505050565b60608315613bee5750816111dd565b825115613bfe5782518084602001fd5b8160405162461bcd60e51b8152600401610aaa9190614004565b600060208284031215613c2a57600080fd5b5035919050565b803561ffff81168114613c4357600080fd5b919050565b60008083601f840112613c5a57600080fd5b50813567ffffffffffffffff811115613c7257600080fd5b602083019150836020828501011115613c8a57600080fd5b9250929050565b803567ffffffffffffffff81168114613c4357600080fd5b60008060008060008060808789031215613cc257600080fd5b613ccb87613c31565b9550602087013567ffffffffffffffff80821115613ce857600080fd5b613cf48a838b01613c48565b9097509550859150613d0860408a01613c91565b94506060890135915080821115613d1e57600080fd5b50613d2b89828a01613c48565b979a9699509497509295939492505050565b600060208284031215613d4f57600080fd5b612f7982613c31565b6001600160a01b03811681146126e657600080fd5b600060208284031215613d7f57600080fd5b8135612f7981613d58565b600080600060608486031215613d9f57600080fd5b8335613daa81613d58565b92506020840135613dba81613d58565b929592945050506040919091013590565b600080600060408486031215613de057600080fd5b613de984613c31565b9250602084013567ffffffffffffffff811115613e0557600080fd5b613e1186828701613c48565b9497909650939450505050565b600060408284031215613e3057600080fd5b50919050565b600080600060608486031215613e4b57600080fd5b613e558585613e1e565b9250604084013567ffffffffffffffff811115613e0557600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613eb057613eb0613e71565b604052919050565b600067ffffffffffffffff821115613ed257613ed2613e71565b50601f01601f191660200190565b600080600060608486031215613ef557600080fd5b613efe84613c31565b9250602084013567ffffffffffffffff811115613f1a57600080fd5b8401601f81018613613f2b57600080fd5b8035613f3e613f3982613eb8565b613e87565b818152876020838501011115613f5357600080fd5b81602084016020830137600060208383010152809450505050613f7860408501613c91565b90509250925092565b80151581146126e657600080fd5b600060208284031215613fa157600080fd5b8135612f7981613f81565b60005b83811015613fc7578181015183820152602001613faf565b838111156138145750506000910152565b60008151808452613ff0816020860160208601613fac565b601f01601f19169290920160200192915050565b602081526000612f796020830184613fd8565b60008060008060008060c0878903121561403057600080fd5b863561403b81613d58565b955060208701359450604087013593506140588860608901613e1e565b925060a087013567ffffffffffffffff81111561407457600080fd5b613d2b89828a01613c48565b6000806040838503121561409357600080fd5b61409c83613c31565b91506140aa60208401613c31565b90509250929050565b600080604083850312156140c657600080fd5b82356140d181613d58565b915060208301356140e181613d58565b809150509250929050565b60008060006060848603121561410157600080fd5b833561410c81613d58565b9250602084013561411c81613d58565b9150613f7860408501613c91565b600080600080600060a0868803121561414257600080fd5b853594506020860135935061415a8760408801613e1e565b9250608086013567ffffffffffffffff81111561417657600080fd5b61418288828901613c48565b969995985093965092949392505050565b600080604083850312156141a657600080fd5b82356141b181613d58565b915060208301356140e181613f81565b6000806000806000608086880312156141d957600080fd5b6141e286613c31565b94506141f060208701613c31565b935060408601359250606086013567ffffffffffffffff81111561417657600080fd5b60008060006060848603121561422857600080fd5b61423184613c31565b925061423f60208501613c31565b9150604084013590509250925092565b6000806000806080858703121561426557600080fd5b61426e85613c31565b935061427c60208601613c31565b9250604085013561428c81613d58565b9396929550929360600135925050565b600181811c908216806142b057607f821691505b602082108103613e3057634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff841680821015614310576143106142e0565b90039392505050565b600181815b8085111561435457816000190482111561433a5761433a6142e0565b8085161561434757918102915b93841c939080029061431e565b509250929050565b60008261436b57506001612f7c565b8161437857506000612f7c565b816001811461438e5760028114614398576143b4565b6001915050612f7c565b60ff8411156143a9576143a96142e0565b50506001821b612f7c565b5060208310610133831016604e8410600b84101617156143d7575081810a612f7c565b6143e18383614319565b80600019048211156143f5576143f56142e0565b029392505050565b6000612f7960ff84168361435c565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff841681526040602082015260006127aa60408301848661440c565b61ffff871681526001600160a01b038616602082015260a06040820152600061447f60a0830187613fd8565b8515156060840152828103608084015261449a81858761440c565b9998505050505050505050565b600080604083850312156144ba57600080fd5b505080516020909101519092909150565b600067ffffffffffffffff8083168185168083038211156144ee576144ee6142e0565b01949350505050565b600067ffffffffffffffff83811690831681811015614518576145186142e0565b039392505050565b600082821015614532576145326142e0565b500390565b60006020828403121561454957600080fd5b5051919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f821115612af757600081815260208120601f850160051c8101602086101561459d5750805b601f850160051c820191505b81811015611559578281556001016145a9565b815167ffffffffffffffff8111156145d6576145d6613e71565b6145ea816145e4845461429c565b84614576565b602080601f83116001811461461f57600084156146075750858301515b600019600386901b1c1916600185901b178555611559565b600085815260208120601f198616915b8281101561464e5788860151825594840194600190910190840161462f565b508582101561466c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff808816835280871660208401525084604083015260806060830152613bd460808301848661440c565b61ffff861681526080602082015260006146c860808301868861440c565b67ffffffffffffffff94909416604083015250606001529392505050565b600082198211156146f9576146f96142e0565b500190565b67ffffffffffffffff83111561471657614716613e71565b61472a83614724835461429c565b83614576565b6000601f84116001811461475e57600085156147465750838201355b600019600387901b1c1916600186901b178355610dcd565b600083815260209020601f19861690835b8281101561478f578685013582556020948501946001909201910161476f565b50868210156147ac5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000602082840312156147d057600080fd5b815167ffffffffffffffff8111156147e757600080fd5b8201601f810184136147f857600080fd5b8051614806613f3982613eb8565b81815285602083850101111561481b57600080fd5b6127aa826020830160208601613fac565b61ffff851681526080602082015260006148496080830186613fd8565b67ffffffffffffffff851660408401528281036060840152613bd48185613fd8565b6000825161487d818460208701613fac565b9190910192915050565b61ffff8616815260a0602082015260006148a460a0830187613fd8565b67ffffffffffffffff8616604084015282810360608401526148c68186613fd8565b905082810360808401526148da8185613fd8565b98975050505050505050565b6000602082840312156148f857600080fd5b815160ff81168114612f7957600080fd5b634e487b7160e01b600052602160045260246000fd5b60008261493c57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561495b5761495b6142e0565b500290565b60006020828403121561497257600080fd5b8151612f7981613f81565b634e487b7160e01b600052603260045260246000fd5b61ffff8716815260c0602082015260006149b060c0830188613fd8565b82810360408401526149c28188613fd8565b6001600160a01b0387811660608601528616608085015283810360a0850152905061449a8185613fd856fea26469706673582212207e627899a6ccdd0f8de8e25cd4ab72f6102844709371ea2bdb3c25b0c444336f64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62000000000000000000000000000000000000000000000000000000000000006c
-----Decoded View---------------
Arg [0] : _layerZeroEndpoint (address): 0x3c2269811836af69497E5F486A85D7316753cf62
Arg [1] : _aptosChainId (uint16): 108
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
Arg [1] : 000000000000000000000000000000000000000000000000000000000000006c
Deployed Bytecode Sourcemap
229:12026:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4388:228;;;;;;;;;;-1:-1:-1;4388:228:16;;;;;:::i;:::-;;:::i;:::-;;964:753:10;;;;;;;;;;-1:-1:-1;964:753:10;;;;;:::i;:::-;;:::i;3763:121::-;;;;;;;;;;-1:-1:-1;3763:121:10;;;;;:::i;:::-;;:::i;3819:563:16:-;;;;;;;;;;-1:-1:-1;3819:563:16;;;;;:::i;:::-;;:::i;5505:335::-;;;;;;;;;;-1:-1:-1;5505:335:16;;;;;:::i;:::-;;:::i;3890:127:10:-;;;;;;;;;;-1:-1:-1;3890:127:10;;;;;:::i;:::-;;:::i;470:23:16:-;;;;;;;;;;;;;;;;;;;2965:25:18;;;2953:2;2938:18;470:23:16;;;;;;;;437:26;;;;;;;;;;-1:-1:-1;437:26:16;;;;;;;;;;;3175:6:18;3163:19;;;3145:38;;3133:2;3118:18;437:26:16;3001:188:18;5673:247:10;;;;;;;;;;-1:-1:-1;5673:247:10;;;;;:::i;:::-;;:::i;:::-;;;3845:14:18;;3838:22;3820:41;;3808:2;3793:18;5673:247:10;3680:187:18;773:19:16;;;;;;;;;;-1:-1:-1;773:19:16;;;;-1:-1:-1;;;;;773:19:16;;;;;;-1:-1:-1;;;;;4036:55:18;;;4018:74;;4006:2;3991:18;773:19:16;3872:226:18;4023:176:10;;;;;;;;;;-1:-1:-1;4023:176:10;;;;;:::i;:::-;;:::i;3257:487:16:-;;;;;;;;;;-1:-1:-1;3257:487:16;;;;;:::i;:::-;;:::i;:::-;;;;4986:25:18;;;5042:2;5027:18;;5020:34;;;;4959:18;3257:487:16;4812:248:18;869:36:16;;;;;;;;;;-1:-1:-1;869:36:16;;;;-1:-1:-1;;;869:36:16;;;;;;4622:185;;;;;;;;;;-1:-1:-1;4622:185:16;;;;;:::i;:::-;;:::i;611:85:12:-;;;;;;;;;;-1:-1:-1;611:85:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;839:24:16;;;;;;;;;;-1:-1:-1;839:24:16;;;;-1:-1:-1;;;839:24:16;;;;;;1571:342:12;;;;;;;;;;-1:-1:-1;1571:342:12;;;;;:::i;:::-;;:::i;570:47:16:-;;;;;;;;;;-1:-1:-1;570:47:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;4813:134;;;;;;;;;;-1:-1:-1;4813:134:16;;;;;:::i;:::-;;:::i;6799:57::-;;;;;;;;;;;;;:::i;449:51:10:-;;;;;;;;;;-1:-1:-1;449:51:10;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1456:847:16:-;;;;;;:::i;:::-;;:::i;506:65:10:-;;;;;;;;;;-1:-1:-1;506:65:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1194:85:13;;;;;;;;;;-1:-1:-1;1240:7:13;1266:6;-1:-1:-1;;;;;1266:6:13;1194:85;;700:42:16;;;;;;;;;;-1:-1:-1;700:42:16;;;;;:::i;:::-;;;;;;;;;;;;;;6191:235;;;;;;;;;;-1:-1:-1;6191:235:16;;;;;:::i;:::-;;:::i;577:23:10:-;;;;;;;;;;-1:-1:-1;577:23:10;;;;-1:-1:-1;;;;;577:23:10;;;5846:339:16;;;;;;;;;;-1:-1:-1;5846:339:16;;;;;:::i;:::-;;:::i;389:41::-;;;;;;;;;;;;429:1;389:41;;;;;9953:4:18;9941:17;;;9923:36;;9911:2;9896:18;389:41:16;9781:184:18;4827:326:10;;;;;;;;;;-1:-1:-1;4827:326:10;;;;;:::i;:::-;;:::i;6926:190:16:-;;;;;;;;;;-1:-1:-1;6926:190:16;;;;;:::i;:::-;;:::i;4543:278:10:-;;;;;;;;;;-1:-1:-1;4543:278:10;;;;;:::i;:::-;;:::i;340:43:16:-;;;;;;;;;;;;378:5;340:43;;397:46:10;;;;;;;;;;;;;;;5159:133;;;;;;;;;;-1:-1:-1;5159:133:10;;;;;:::i;:::-;;:::i;5123:156:16:-;;;;;;;;;;-1:-1:-1;5123:156:16;;;;;:::i;:::-;;:::i;2309:942::-;;;;;;:::i;:::-;;:::i;4953:164::-;;;;;;;;;;-1:-1:-1;4953:164:16;;;;;:::i;:::-;;:::i;3555:202:10:-;;;;;;;;;;-1:-1:-1;3555:202:10;;;;;:::i;:::-;;:::i;2094:757:12:-;;;;;;:::i;:::-;;:::i;6432:292:16:-;;;;;;;;;;-1:-1:-1;6432:292:16;;;;;:::i;:::-;;:::i;911:33::-;;;;;;;;;;;;;;;;5298:280:10;;;;;;;;;;-1:-1:-1;5298:280:10;;;;;:::i;:::-;;:::i;500:40:16:-;;;;;;;;;;-1:-1:-1;500:40:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12428:18:18;12416:31;;;12398:50;;12386:2;12371:18;500:40:16;12254:200:18;5285:214:16;;;;;;;;;;-1:-1:-1;5285:214:16;;;;;:::i;:::-;;:::i;4342:195:10:-;;;;;;;;;;-1:-1:-1;4342:195:10;;;;;:::i;:::-;;:::i;799:34:16:-;;;;;;;;;;-1:-1:-1;799:34:16;;;;-1:-1:-1;;;799:34:16;;;;;;623:44;;;;;;;;;;-1:-1:-1;623:44:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;2074:198:13;;;;;;;;;;-1:-1:-1;2074:198:13;;;;;:::i;:::-;;:::i;3287:209:10:-;;;;;;;;;;-1:-1:-1;3287:209:10;;;;;:::i;:::-;;:::i;4388:228:16:-;1087:13:13;:11;:13::i;:::-;378:5:16::1;4468:12;:30;;4460:73;;;::::0;-1:-1:-1;;;4460:73:16;;13126:2:18;4460:73:16::1;::::0;::::1;13108:21:18::0;13165:2;13145:18;;;13138:30;13204:32;13184:18;;;13177:60;13254:18;;4460:73:16::1;;;;;;;;;4543:11;:26:::0;;;4584:25:::1;::::0;2965::18;;;4584::16::1;::::0;2953:2:18;2938:18;4584:25:16::1;;;;;;;;4388:228:::0;:::o;964:753:10:-;719:10:2;1202::10;-1:-1:-1;;;;;1178:35:10;;1170:78;;;;-1:-1:-1;;;1170:78:10;;13485:2:18;1170:78:10;;;13467:21:18;13524:2;13504:18;;;13497:30;13563:32;13543:18;;;13536:60;13613:18;;1170:78:10;13283:354:18;1170:78:10;1288:32;;;1259:26;1288:32;;;:19;:32;;;;;1259:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1492:13;:20;1470:11;;:18;;:42;:70;;;;;1539:1;1516:13;:20;:24;1470:70;:124;;;;-1:-1:-1;1570:24:10;;;;;;1544:22;;;;1554:11;;;;1544:22;:::i;:::-;;;;;;;;:50;1470:124;1462:175;;;;-1:-1:-1;;;1462:175:10;;14562:2:18;1462:175:10;;;14544:21:18;14601:2;14581:18;;;14574:30;14640:34;14620:18;;;14613:62;14711:8;14691:18;;;14684:36;14737:19;;1462:175:10;14360:402:18;1462:175:10;1648:62;1667:11;1680;;1648:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1648:62:10;;;;;;;;;;;;;;;;;;;;;;1693:6;;-1:-1:-1;1648:62:10;-1:-1:-1;1701:8:10;;;;;;1648:62;;1701:8;;;;1648:62;;;;;;;;;-1:-1:-1;1648:18:10;;-1:-1:-1;;;1648:62:10:i;:::-;1095:622;964:753;;;;;;:::o;3763:121::-;1087:13:13;:11;:13::i;:::-;3842:35:10::1;::::0;;;;3175:6:18;3163:19;;3842:35:10::1;::::0;::::1;3145:38:18::0;3842:10:10::1;-1:-1:-1::0;;;;;3842:25:10::1;::::0;::::1;::::0;3118:18:18;;3842:35:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3763:121:::0;:::o;3819:563:16:-;1087:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;3895:20:16;::::1;3887:67;;;::::0;-1:-1:-1;;;3887:67:16;;14969:2:18;3887:67:16::1;::::0;::::1;14951:21:18::0;15008:2;14988:18;;;14981:30;15047:34;15027:18;;;15020:62;-1:-1:-1;;;15098:18:18;;;15091:32;15140:19;;3887:67:16::1;14767:398:18::0;3887:67:16::1;-1:-1:-1::0;;;;;3973:23:16;::::1;;::::0;;;:15:::1;:23;::::0;;;;;::::1;;3972:24;3964:74;;;::::0;-1:-1:-1;;;3964:74:16;;15372:2:18;3964:74:16::1;::::0;::::1;15354:21:18::0;15411:2;15391:18;;;15384:30;15450:34;15430:18;;;15423:62;15521:7;15501:18;;;15494:35;15546:19;;3964:74:16::1;15170:401:18::0;3964:74:16::1;4049:19;4071:22;4086:6;4071:14;:22::i;:::-;4049:44:::0;-1:-1:-1;429:1:16::1;4124:32;::::0;::::1;;;4103:127;;;::::0;-1:-1:-1;;;4103:127:16;;15778:2:18;4103:127:16::1;::::0;::::1;15760:21:18::0;15817:2;15797:18;;;15790:30;15856:34;15836:18;;;15829:62;15927:18;15907;;;15900:46;15963:19;;4103:127:16::1;15576:412:18::0;4103:127:16::1;-1:-1:-1::0;;;;;4241:23:16;::::1;;::::0;;;:15:::1;:23;::::0;;;;:30;;-1:-1:-1;;4241:30:16::1;4267:4;4241:30;::::0;;4307:31:::1;429:1;4307:13:::0;:31:::1;:::i;:::-;4302:37;::::0;:2:::1;:37;:::i;:::-;-1:-1:-1::0;;;;;4281:18:16;::::1;;::::0;;;:10:::1;:18;::::0;;;;;;;;:58;;;;4354:21;4018:74:18;;;4354:21:16::1;::::0;3991:18:18;4354:21:16::1;;;;;;;;3877:505;3819:563:::0;:::o;5505:335::-;1087:13:13;:11;:13::i;:::-;5628:10:16::1;5641:20;5654:6;5641:12;:20::i;:::-;5628:33;;5692:5;5679:9;:18;;5671:58;;;::::0;-1:-1:-1;;;5671:58:16;;17967:2:18;5671:58:16::1;::::0;::::1;17949:21:18::0;18006:2;17986:18;;;17979:30;18045:29;18025:18;;;18018:57;18092:18;;5671:58:16::1;17765:351:18::0;5671:58:16::1;5740:43;-1:-1:-1::0;;;;;5740:27:16;::::1;5768:3:::0;5773:9;5740:27:::1;:43::i;:::-;5798:35;::::0;;-1:-1:-1;;;;;18313:55:18;;;18295:74;;18400:2;18385:18;;18378:34;;;5798:35:16;::::1;::::0;::::1;::::0;18268:18:18;5798:35:16::1;;;;;;;;5618:222;5505:335:::0;;;:::o;3890:127:10:-;1087:13:13;:11;:13::i;:::-;3972:38:10::1;::::0;;;;3175:6:18;3163:19;;3972:38:10::1;::::0;::::1;3145::18::0;3972:10:10::1;-1:-1:-1::0;;;;;3972:28:10::1;::::0;::::1;::::0;3118:18:18;;3972:38:10::1;3001:188:18::0;5673:247:10;5814:32;;;5769:4;5814:32;;;:19;:32;;;;;5785:61;;5769:4;;5814:32;5785:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5901:11;;5891:22;;;;;;;:::i;:::-;;;;;;;;5873:13;5863:24;;;;;;:50;5856:57;;;5673:247;;;;;;:::o;4023:176::-;1087:13:13;:11;:13::i;:::-;4137:55:10::1;::::0;;;;-1:-1:-1;;;;;4137:10:10::1;:29;::::0;::::1;::::0;:55:::1;::::0;4167:11;;4180;;;;4137:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;3257:487:16::0;3396:14;3412:11;3439:35;3459:14;;3439:19;:35::i;:::-;10474:86;;;3484:20;10474:86;;;36218:102:18;;;36336:11;;;36329:27;;;36372:12;;;36365:28;;;36409:12;;;36402:111;;;10474:86:16;;;;;;;;;36529:12:18;;;;10474:86:16;;;3484:68;-1:-1:-1;3562:13:16;;3578:29;;;;;;;;:::i;:::-;3674:12;;3650:87;;;;;-1:-1:-1;;;;;3578:43:16;;;;;;;;;-1:-1:-1;3650:10:16;:23;;;;;;:87;;3674:12;;;;;3696:4;;3703:7;;3578:43;;3722:14;;;;3650:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3631:106;;;;;;3257:487;;;;;;:::o;4622:185::-;1087:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;4691:19:16;::::1;4683:66;;;::::0;-1:-1:-1;;;4683:66:16;;14969:2:18;4683:66:16::1;::::0;::::1;14951:21:18::0;15008:2;14988:18;;;14981:30;15047:34;15027:18;;;15020:62;-1:-1:-1;;;15098:18:18;;;15091:32;15140:19;;4683:66:16::1;14767:398:18::0;4683:66:16::1;4759:4;:12:::0;;-1:-1:-1;;4759:12:16::1;-1:-1:-1::0;;;;;4759:12:16;::::1;::::0;;::::1;::::0;;;4786:14:::1;::::0;4018:74:18;;;4786:14:16::1;::::0;4006:2:18;3991:18;4786:14:16::1;3872:226:18::0;1571:342:12;719:10:2;1783:4:12;1759:29;1751:80;;;;-1:-1:-1;;;1751:80:12;;20172:2:18;1751:80:12;;;20154:21:18;20211:2;20191:18;;;20184:30;20250:34;20230:18;;;20223:62;20321:8;20301:18;;;20294:36;20347:19;;1751:80:12;19970:402:18;1751:80:12;1841:65;1863:11;1876;;1841:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1841:65:12;;;;;;;;;;;;;;;;;;;;;;1889:6;;-1:-1:-1;1841:65:12;-1:-1:-1;1897:8:12;;;;;;1841:65;;1897:8;;;;1841:65;;;;;;;;;-1:-1:-1;1841:21:12;;-1:-1:-1;;;1841:65:12:i;:::-;1571:342;;;;;;:::o;4813:134:16:-;1087:13:13;:11;:13::i;:::-;4880:12:16::1;:22:::0;;;::::1;;-1:-1:-1::0;;;4880:22:16::1;::::0;;;::::1;;::::0;;4917:23:::1;::::0;::::1;::::0;::::1;::::0;4895:7;3845:14:18;3838:22;3820:41;;3808:2;3793:18;;3680:187;6799:57:16;1087:13:13;:11;:13::i;:::-;6799:57:16:o;449:51:10:-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1456:847:16:-;1009:12;;1685:6;;-1:-1:-1;;;1009:12:16;;;;1008:13;:38;;;;-1:-1:-1;;;;;;1026:20:16;;;;;;:12;:20;;;;;;;;1025:21;1008:38;1000:70;;;;-1:-1:-1;;;1000:70:16;;20579:2:18;1000:70:16;;;20561:21:18;20618:2;20598:18;;;20591:30;20657:21;20637:18;;;20630:49;20696:18;;1000:70:16;20377:343:18;1000:70:16;1744:1:14::1;2325:7;;:19:::0;2317:63:::1;;;::::0;-1:-1:-1;;;2317:63:14;;20927:2:18;2317:63:14::1;::::0;::::1;20909:21:18::0;20966:2;20946:18;;;20939:30;21005:33;20985:18;;;20978:61;21056:18;;2317:63:14::1;20725:355:18::0;2317:63:14::1;1744:1;2455:7;:18:::0;-1:-1:-1;;;;;1724:23:16;::::2;;::::0;;;:15:::2;:23;::::0;;;;;::::2;;1716:71;;;::::0;-1:-1:-1;;;1716:71:16;;21287:2:18;1716:71:16::2;::::0;::::2;21269:21:18::0;21326:2;21306:18;;;21299:30;21365:34;21345:18;;;21338:62;-1:-1:-1;;;21416:18:18;;;21409:33;21459:19;;1716:71:16::2;21085:399:18::0;1716:71:16::2;1832:30;1844:6;1852:9;1832:11;:30::i;:::-;1820:42;;1884:45;1899:6;1907:10;1919:9;1884:14;:45::i;:::-;1872:57;;1959:15;1977:26;1985:6;1993:9;1977:7;:26::i;:::-;1959:44;;2032:1;2021:8;:12;;;2013:69;;;::::0;-1:-1:-1;;;2013:69:16;;21691:2:18;2013:69:16::2;::::0;::::2;21673:21:18::0;21730:2;21710:18;;;21703:30;21769:34;21749:18;;;21742:62;21840:14;21820:18;;;21813:42;21872:19;;2013:69:16::2;21489:408:18::0;2013:69:16::2;-1:-1:-1::0;;;;;2092:14:16;::::2;;::::0;;;:6:::2;:14;::::0;;;;:26;;2110:8;;2092:14;:26:::2;::::0;2110:8;;2092:26:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2154:80;2165:6;2173:10;2185:8;2195:11;2208:14;;2224:9;2154:10;:80::i;:::-;2274:10;2262;-1:-1:-1::0;;;;;2249:47:16::2;2254:6;-1:-1:-1::0;;;;;2249:47:16::2;;2286:9;2249:47;;;;2965:25:18::0;;2953:2;2938:18;;2819:177;2249:47:16::2;;;;;;;;-1:-1:-1::0;;1701:1:14::1;2628:7;:22:::0;-1:-1:-1;;;;;;1456:847:16:o;6191:235::-;1087:13:13;:11;:13::i;:::-;6323:46:16::1;6335:6;6343:3;6348:20;6361:6;6348:12;:20::i;6323:46::-;-1:-1:-1::0;;;;;6404:14:16;::::1;;::::0;;;:6:::1;:14;::::0;;;;;6379:40:::1;::::0;6391:6;;6399:3;;6404:14:::1;;6379:11;:40::i;:::-;6191:235:::0;;:::o;5846:339::-;1087:13:13;:11;:13::i;:::-;1149:24:16::1;::::0;-1:-1:-1;;;1149:24:16;::::1;;;:68:::0;::::1;;;;1196:21;;1177:15;:40;;1149:68;1141:119;;;::::0;-1:-1:-1;;;1141:119:16;;22345:2:18;1141:119:16::1;::::0;::::1;22327:21:18::0;22384:2;22364:18;;;22357:30;22423:34;22403:18;;;22396:62;22494:8;22474:18;;;22467:36;22520:19;;1141:119:16::1;22143:402:18::0;1141:119:16::1;-1:-1:-1::0;;;;;5997:14:16;::::2;;::::0;;;:6:::2;:14;::::0;;;;:27;;6015:9;;5997:14;:27:::2;::::0;6015:9;;5997:27:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6035:13;6051:26;6059:6;6067:9;6051:7;:26::i;:::-;6035:42:::0;-1:-1:-1;6087:42:16::2;-1:-1:-1::0;;;;;6087:27:16;::::2;6115:3:::0;6035:42;6087:27:::2;:42::i;:::-;6144:34;::::0;;-1:-1:-1;;;;;18313:55:18;;;18295:74;;18400:2;18385:18;;18378:34;;;6144::16;::::2;::::0;::::2;::::0;18268:18:18;6144:34:16::2;18121:297:18::0;4827:326:10;4950:35;;;4930:17;4950:35;;;:19;:35;;;;;4930:55;;4906:12;;4930:17;4950:35;4930:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5003:4;:11;5018:1;5003:16;4995:58;;;;-1:-1:-1;;;4995:58:10;;22986:2:18;4995:58:10;;;22968:21:18;23025:2;23005:18;;;22998:30;23064:31;23044:18;;;23037:59;23113:18;;4995:58:10;22784:353:18;4995:58:10;5070:31;5081:1;5098:2;5084:4;:11;:16;;;;:::i;:::-;5070:4;;:31;:10;:31::i;6926:190:16:-;-1:-1:-1;;;;;7030:14:16;;6985:4;7030:14;;;:6;:14;;;;;;6985:4;;7014:31;;7022:6;;7030:14;;7014:7;:31::i;:::-;7062:39;;-1:-1:-1;;;7062:39:16;;7095:4;7062:39;;;4018:74:18;7001:44:16;;-1:-1:-1;7001:44:16;;-1:-1:-1;;;;;7062:24:16;;;;;3991:18:18;;7062:39:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;4543:278:10:-;1087:13:13;:11;:13::i;:::-;4714:14:10::1;;4738:4;4697:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;4697:47:10;;::::1;::::0;;;;;;4659:35:::1;::::0;::::1;;::::0;;;:19:::1;4697:47;4659:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;4759:55;4783:14;4799;;4759:55;;;;;;;;:::i;:::-;;;;;;;;4543:278:::0;;;:::o;5159:133::-;1087:13:13;:11;:13::i;:::-;5228:8:10::1;:20:::0;;-1:-1:-1;;5228:20:10::1;-1:-1:-1::0;;;;;5228:20:10;::::1;::::0;;::::1;::::0;;;5263:22:::1;::::0;4018:74:18;;;5263:22:10::1;::::0;4006:2:18;3991:18;5263:22:10::1;3872:226:18::0;5123:156:16;1087:13:13;:11;:13::i;:::-;5199:12:16::1;:28:::0;;-1:-1:-1;;5199:28:16::1;;::::0;::::1;::::0;;::::1;::::0;;;5242:30:::1;::::0;3145:38:18;;;5242:30:16::1;::::0;3133:2:18;3118:18;5242:30:16::1;3001:188:18::0;2309:942:16;2517:4;;-1:-1:-1;;;;;2517:4:16;;;-1:-1:-1;;;1009:12:16;;;;1008:13;:38;;;;-1:-1:-1;;;;;;1026:20:16;;;;;;:12;:20;;;;;;;;1025:21;1008:38;1000:70;;;;-1:-1:-1;;;1000:70:16;;20579:2:18;1000:70:16;;;20561:21:18;20618:2;20598:18;;;20591:30;20657:21;20637:18;;;20630:49;20696:18;;1000:70:16;20377:343:18;1000:70:16;1744:1:14::1;2325:7;;:19:::0;2317:63:::1;;;::::0;-1:-1:-1;;;2317:63:14;;20927:2:18;2317:63:14::1;::::0;::::1;20909:21:18::0;20966:2;20946:18;;;20939:30;21005:33;20985:18;;;20978:61;21056:18;;2317:63:14::1;20725:355:18::0;2317:63:14::1;1744:1;2455:7;:18:::0;2562:4:16::2;::::0;-1:-1:-1;;;;;2562:4:16::2;2596:19:::0;;;::::2;::::0;:45:::2;;-1:-1:-1::0;;;;;;2619:22:16;::::2;;::::0;;;:15:::2;:22;::::0;;;;;::::2;;2596:45;2588:91;;;::::0;-1:-1:-1;;;2588:91:16;;26226:2:18;2588:91:16::2;::::0;::::2;26208:21:18::0;26265:2;26245:18;;;26238:30;26304:34;26284:18;;;26277:62;-1:-1:-1;;;26355:18:18;;;26348:31;26396:19;;2588:91:16::2;26024:397:18::0;2588:91:16::2;2701:29;2713:5;2720:9;2701:11;:29::i;:::-;2689:41;;2760:1;2748:9;:13;2740:68;;;::::0;-1:-1:-1;;;2740:68:16;;26628:2:18;2740:68:16::2;::::0;::::2;26610:21:18::0;26667:2;26647:18;;;26640:30;26706:34;26686:18;;;26679:62;26777:12;26757:18;;;26750:40;26807:19;;2740:68:16::2;26426:406:18::0;2740:68:16::2;2839:9;2826;:22;;2818:62;;;::::0;-1:-1:-1;;;2818:62:16;;17967:2:18;2818:62:16::2;::::0;::::2;17949:21:18::0;18006:2;17986:18;;;17979:30;18045:29;18025:18;;;18018:57;18092:18;;2818:62:16::2;17765:351:18::0;2818:62:16::2;2929:5;-1:-1:-1::0;;;;;2923:20:16::2;;2951:9;2923:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;2973:15;2991:25;2999:5;3006:9;2991:7;:25::i;:::-;-1:-1:-1::0;;;;;3026:13:16;::::2;;::::0;;;:6:::2;:13;::::0;;;;:25;;2973:43;;-1:-1:-1;2973:43:16;;3026:13;;;:25:::2;::::0;2973:43;;3026:25:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3087:91;3098:5;3105:10;3117:8;3127:11;3140:14;;3168:9;3156;:21;;;;:::i;:::-;3087:10;:91::i;:::-;3193:51;::::0;2965:25:18;;;3222:10:16;;3210::::2;::::0;3206:1:::2;::::0;3193:51:::2;::::0;2953:2:18;2938:18;3193:51:16::2;2819:177:18::0;4953:164:16;1087:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;5035:20:16;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;;:30;;-1:-1:-1;;5035:30:16::1;::::0;::::1;;::::0;;::::1;::::0;;;5080;;27005:74:18;;;27095:18;;;27088:50;5080:30:16::1;::::0;26978:18:18;5080:30:16::1;26837:307:18::0;3555:202:10;1087:13:13;:11;:13::i;:::-;3688:62:10::1;::::0;;;;-1:-1:-1;;;;;3688:10:10::1;:20;::::0;::::1;::::0;:62:::1;::::0;3709:8;;3719;;3729:11;;3742:7;;;;3688:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3555:202:::0;;;;;:::o;2094:757:12:-;2303:27;;;2281:19;2303:27;;;:14;:27;;;;;;:40;;;;2331:11;;;;2303:40;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;-1:-1:-1;2303:48:12;2361:73;;;;-1:-1:-1;;;2361:73:12;;27854:2:18;2361:73:12;;;27836:21:18;27893:2;27873:18;;;27866:30;27932:34;27912:18;;;27905:62;28003:5;27983:18;;;27976:33;28026:19;;2361:73:12;27652:399:18;2361:73:12;2475:11;2462:8;;2452:19;;;;;;;:::i;:::-;;;;;;;;:34;2444:80;;;;-1:-1:-1;;;2444:80:12;;28258:2:18;2444:80:12;;;28240:21:18;28297:2;28277:18;;;28270:30;28336:34;28316:18;;;28309:62;-1:-1:-1;;;28387:18:18;;;28380:31;28428:19;;2444:80:12;28056:397:18;2444:80:12;2570:27;;;2629:1;2570:27;;;:14;:27;;;;;;:40;;;;2598:11;;;;2570:40;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;:61;;;;2698:65;;;;;;;;;;;;;;;;;;;2720:11;;2733;;2698:65;;;;;;2733:11;2698:65;;2733:11;2698:65;;;;;;;;;-1:-1:-1;;2698:65:12;;;;;;;;;;;;;;;;;;;;;;2746:6;;-1:-1:-1;2698:65:12;-1:-1:-1;2754:8:12;;;;;;2698:65;;2754:8;;;;2698:65;;;;;;;;;-1:-1:-1;2698:21:12;;-1:-1:-1;;;2698:65:12:i;:::-;2778:66;2798:11;2811;;2824:6;2832:11;2778:66;;;;;;;;;;:::i;:::-;;;;;;;;2227:624;2094:757;;;;;;:::o;6432:292:16:-;1087:13:13;:11;:13::i;:::-;6508:24:16::1;:34:::0;;;::::1;-1:-1:-1::0;;;6508:34:16;::::1;;;;::::0;;;6576:39:::1;;6614:1;6576:39;;;6586:25;:15;6604:7;6586:25;:::i;:::-;6552:21;:63:::0;;;6662:55:::1;::::0;;29282:14:18;;29275:22;29257:41;;29329:2;29314:18;;29307:34;;;;6662:55:16::1;::::0;29230:18:18;6662:55:16::1;29089:258:18::0;5298:280:10;1087:13:13;:11;:13::i;:::-;5421:1:10::1;5411:7;:11;5403:45;;;::::0;-1:-1:-1;;;5403:45:10;;29554:2:18;5403:45:10::1;::::0;::::1;29536:21:18::0;29593:2;29573:18;;;29566:30;29632:23;29612:18;;;29605:51;29673:18;;5403:45:10::1;29352:345:18::0;5403:45:10::1;5458:28;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;5524:47;;29925:34:18;;;29975:18;;29968:43;;;;30027:18;;;30020:34;;;5524:47:10::1;::::0;29888:2:18;29873:18;5524:47:10::1;29702:358:18::0;5285:214:16;1087:13:13;:11;:13::i;:::-;5379:22:16::1;:48:::0;;;::::1;;-1:-1:-1::0;;;5379:48:16::1;::::0;;;::::1;;::::0;;5442:50:::1;::::0;::::1;::::0;::::1;::::0;5404:23;3845:14:18;3838:22;3820:41;;3808:2;3793:18;;3680:187;4342:195:10;1087:13:13;:11;:13::i;:::-;4439:32:10::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:40:::1;4474:5:::0;;4439:32;:40:::1;:::i;:::-;;4494:36;4511:11;4524:5;;4494:36;;;;;;;;:::i;2074:198:13:-:0;1087:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:13;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:13;;31474:2:18;2154:73:13::1;::::0;::::1;31456:21:18::0;31513:2;31493:18;;;31486:30;31552:34;31532:18;;;31525:62;31623:8;31603:18;;;31596:36;31649:19;;2154:73:13::1;31272:402:18::0;2154:73:13::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;3287:209:10:-;3421:68;;;;;31916:6:18;31949:15;;;3421:68:10;;;31931:34:18;32001:15;;31981:18;;;31974:43;3470:4:10;32033:18:18;;;32026:83;32125:18;;;32118:34;;;3390:12:10;;3421:10;-1:-1:-1;;;;;3421:20:10;;;;31878:19:18;;3421:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3421:68:10;;;;;;;;;;;;:::i;:::-;3414:75;3287:209;-1:-1:-1;;;;;3287:209:10:o;1352:130:13:-;1240:7;1266:6;-1:-1:-1;;;;;1266:6:13;719:10:2;1415:23:13;1407:68;;;;-1:-1:-1;;;1407:68:13;;33004:2:18;1407:68:13;;;32986:21:18;;;33023:18;;;33016:30;33082:34;33062:18;;;33055:62;33134:18;;1407:68:13;32802:356:18;974:591:12;1123:12;1137:19;1160:153;1194:9;1205:3;1233:34;;;1269:11;1282;1295:6;1303:8;1210:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1210:102:12;;;;;;;;;;;;;;-1:-1:-1;;;;;1210:102:12;;;;;;;;;;;;1168:4;;1160:153;;:33;:153::i;:::-;1122:191;;;;1371:7;1366:193;;1455:8;1445:19;;;;;;1394:14;:27;1409:11;1394:27;;;;;;;;;;;;;;;1422:11;1394:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:48;;;;;;;;;;:70;;;;1483:65;;;;1497:11;;1510;;1435:6;;1531:8;;1541:6;;1483:65;:::i;:::-;;;;;;;;1112:453;;974:591;;;;:::o;9071:314:16:-;9218:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9218:37:16;;;;;9187:78;;9134:5;;;;;;-1:-1:-1;;;;;9187:17:16;;;:78;;9218:37;9187:78;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9151:114;;;;9283:7;9275:61;;;;-1:-1:-1;;;9275:61:16;;34925:2:18;9275:61:16;;;34907:21:18;34964:2;34944:18;;;34937:30;35003:34;34983:18;;;34976:62;35074:11;35054:18;;;35047:39;35103:19;;9275:61:16;34723:405:18;9275:61:16;9364:4;9353:25;;;;;;;;;;;;:::i;:::-;9346:32;9071:314;-1:-1:-1;;;;9071:314:16:o;737:205:15:-;876:58;;-1:-1:-1;;;;;18313:55:18;;876:58:15;;;18295:74:18;18385:18;;;18378:34;;;849:86:15;;869:5;;899:23;;18268:18:18;;876:58:15;;;;-1:-1:-1;;876:58:15;;;;;;;;;;;;;;-1:-1:-1;;;;;876:58:15;;;;;;;;;;;;849:19;:86::i;:::-;737:205;;;:::o;11359:336:16:-;11447:22;;-1:-1:-1;;;11447:22:16;;;;11443:246;;;11500:12;;11485:81;;11500:12;;;11548:14;;11485:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11485:81:16;-1:-1:-1;11485:14:16;;-1:-1:-1;;11485:81:16:i;11443:246::-;11605:26;;11597:81;;;;-1:-1:-1;;;11597:81:16;;35802:2:18;11597:81:16;;;35784:21:18;35841:2;35821:18;;;35814:30;35880:34;35860:18;;;35853:62;35951:12;35931:18;;;35924:40;35981:19;;11597:81:16;35600:406:18;7194:1231:16;7379:12;;;7364:27;;;7379:12;;7364:27;7356:76;;;;-1:-1:-1;;;7356:76:16;;36754:2:18;7356:76:16;;;36736:21:18;36793:2;36773:18;;;36766:30;36832:34;36812:18;;;36805:62;36903:6;36883:18;;;36876:34;36927:19;;7356:76:16;36552:400:18;7356:76:16;7444:13;7459:10;7471:15;7488:11;7503:31;7525:8;7503:21;:31::i;:::-;7553:12;;7443:91;;-1:-1:-1;7443:91:16;;-1:-1:-1;7443:91:16;-1:-1:-1;7443:91:16;-1:-1:-1;;;;7553:12:16;;;;7552:13;:37;;;;-1:-1:-1;;;;;;7570:19:16;;;;;;:12;:19;;;;;;;;7569:20;7552:37;7544:69;;;;-1:-1:-1;;;7544:69:16;;20579:2:18;7544:69:16;;;20561:21:18;20618:2;20598:18;;;20591:30;20657:21;20637:18;;;20630:49;20696:18;;7544:69:16;20377:343:18;7544:69:16;-1:-1:-1;;;;;7631:22:16;;;;;;:15;:22;;;;;;;;7623:70;;;;-1:-1:-1;;;7623:70:16;;21287:2:18;7623:70:16;;;21269:21:18;21326:2;21306:18;;;21299:30;21365:34;21345:18;;;21338:62;-1:-1:-1;;;21416:18:18;;;21409:33;21459:19;;7623:70:16;21085:399:18;7623:70:16;-1:-1:-1;;;;;7738:13:16;;7723:12;7738:13;;;:6;:13;;;;;;;;;;;7769:17;;;;;7761:65;;;;-1:-1:-1;;;7761:65:16;;37159:2:18;7761:65:16;;;37141:21:18;37198:2;37178:18;;;37171:30;37237:34;37217:18;;;37210:62;37308:5;37288:18;;;37281:33;37331:19;;7761:65:16;36957:399:18;7761:65:16;7852:16;7860:8;7852:5;:16;:::i;:::-;-1:-1:-1;;;;;7836:13:16;;;;;;:6;:13;;;;;:32;;-1:-1:-1;;7836:32:16;;;;;;;;;;;;;7914:24;7836:13;7929:8;7914:7;:24::i;:::-;7898:40;;7977:1;7963:11;;:15;:51;;8002:8;8012:1;7963:51;;;7981:17;7989:8;7981:7;:17::i;:::-;-1:-1:-1;8074:4:16;;7948:66;;-1:-1:-1;;;;;;8065:13:16;;;8074:4;;8065:13;:23;;;;;8082:6;8065:23;8061:358;;;8117:4;;8104:41;;-1:-1:-1;;;;;8117:4:16;8131:2;8136:8;8104:12;:41::i;:::-;8164:33;;2965:25:18;;;-1:-1:-1;;;;;8164:33:16;;;8180:1;;8164:33;;2953:2:18;2938:18;8164:33:16;;;;;;;8061:358;;;-1:-1:-1;;;;;8233:16:16;;;:39;;8270:2;8233:39;;;8260:6;8233:39;8228:44;-1:-1:-1;8321:40:16;-1:-1:-1;;;;;8321:26:16;;8228:44;8352:8;8321:26;:40::i;:::-;8395:2;-1:-1:-1;;;;;8380:28:16;8388:5;-1:-1:-1;;;;;8380:28:16;;8399:8;8380:28;;;;2965:25:18;;2953:2;2938:18;;2819:177;8380:28:16;;;;;;;;8061:358;7346:1079;;;;;;7194:1231;;;;:::o;12104:149::-;12180:4;12203:43;12211:6;12219:26;12227:6;12235:9;12219:7;:26::i;:::-;12203:7;:43::i;:::-;12196:50;;12104:149;;;;;:::o;8632:433::-;8831:39;;-1:-1:-1;;;8831:39:16;;8864:4;8831:39;;;4018:74:18;8751:4:16;;;;-1:-1:-1;;;;;8831:24:16;;;;;3991:18:18;;8831:39:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8810:60;-1:-1:-1;8880:64:16;-1:-1:-1;;;;;8880:31:16;;8912:5;8927:4;8934:9;8880:31;:64::i;:::-;8974:39;;-1:-1:-1;;;8974:39:16;;9007:4;8974:39;;;4018:74:18;8954:17:16;;-1:-1:-1;;;;;8974:24:16;;;;;3991:18:18;;8974:39:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8954:59;-1:-1:-1;9030:28:16;9045:13;8954:59;9030:28;:::i;:::-;9023:35;8632:433;-1:-1:-1;;;;;;8632:433:16:o;11841:257::-;-1:-1:-1;;;;;11959:18:16;;11913:6;11959:18;;;:10;:18;;;;;;11913:6;;11947:30;;:9;:30;:::i;:::-;11931:46;-1:-1:-1;12007:16:16;11995:28;;;11987:71;;;;-1:-1:-1;;;11987:71:16;;37842:2:18;11987:71:16;;;37824:21:18;37881:2;37861:18;;;37854:30;37920:32;37900:18;;;37893:60;37970:18;;11987:71:16;37640:354:18;9591:554:16;9819:35;9839:14;;9819:19;:35::i;:::-;10474:86;;;9864:20;10474:86;;;36218:102:18;;;-1:-1:-1;;;;;3277:23:11;;36336:11:18;;;36329:27;36372:12;;;36365:28;;;36431:3;36427:16;;;36445:66;36423:89;36409:12;;;36402:111;10474:86:16;;;;;;;;;36529:12:18;;;;10474:86:16;;;9967:12;;9864:72;;-1:-1:-1;9946:192:16;;9967:12;;9864:72;10014:25;;;;:11;:25;:::i;:::-;10053:29;;;;;;;;:::i;:::-;10096:14;;9946:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10124:4:16;;-1:-1:-1;9946:7:16;;-1:-1:-1;;9946:192:16:i;:::-;9809:336;9591:554;;;;;;;:::o;11701:134::-;-1:-1:-1;;;;;11810:18:16;;11775:4;11810:18;;;:10;:18;;;;;;11798:30;;;;;;:::i;8865:2712:1:-;8999:12;9051:7;9035:12;9051:7;9045:2;9035:12;:::i;:::-;:23;;9027:50;;;;-1:-1:-1;;;9027:50:1;;38634:2:18;9027:50:1;;;38616:21:18;38673:2;38653:18;;;38646:30;38712:16;38692:18;;;38685:44;38746:18;;9027:50:1;38432:338:18;9027:50:1;9112:16;9121:7;9112:6;:16;:::i;:::-;9095:6;:13;:33;;9087:63;;;;-1:-1:-1;;;9087:63:1;;38977:2:18;9087:63:1;;;38959:21:18;39016:2;38996:18;;;38989:30;39055:19;39035:18;;;39028:47;39092:18;;9087:63:1;38775:341:18;9087:63:1;9161:22;9224:15;;9252:1895;;;;11288:4;11282:11;11269:24;;11466:1;11455:9;11448:20;11514:4;11503:9;11499:20;11493:4;11486:34;9217:2317;;9252:1895;9426:4;9420:11;9407:24;;10053:2;10044:7;10040:16;10419:9;10412:17;10406:4;10402:28;10390:9;10379;10375:25;10371:60;10467:7;10463:2;10459:16;10711:6;10697:9;10690:17;10684:4;10680:28;10668:9;10660:6;10656:22;10652:57;10648:70;10493:417;10744:3;10740:2;10737:11;10493:417;;;10882:9;;10871:21;;10785:4;10777:13;;;;10817;10493:417;;;-1:-1:-1;;10928:26:1;;;11128:2;11111:11;-1:-1:-1;;11107:25:1;11101:4;11094:39;-1:-1:-1;9217:2317:1;-1:-1:-1;11561:9:1;8865:2712;-1:-1:-1;;;;8865:2712:1:o;2426:187:13:-;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:13;;;-1:-1:-1;;2534:17:13;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;1118:1240:3:-;1275:4;1281:12;1341:15;1366:13;1389:24;1426:8;1416:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1416:19:3;;1389:46;;1904:1;1879;1846:9;1840:16;1812:4;1801:9;1797:20;1767:1;1733:7;1708:4;1690:239;1678:251;;1992:16;1981:27;;2036:8;2027:7;2024:21;2021:76;;;2075:8;2064:19;;2021:76;2178:7;2165:11;2158:28;2294:7;2291:1;2284:4;2271:11;2267:22;2252:50;2329:8;;;;-1:-1:-1;1118:1240:3;-1:-1:-1;;;;;;1118:1240:3:o;3721:706:15:-;4140:23;4166:69;4194:4;4166:69;;;;;;;;;;;;;;;;;4174:5;-1:-1:-1;;;;;4166:27:15;;;:69;;;;;:::i;:::-;4249:17;;4140:95;;-1:-1:-1;4249:21:15;4245:176;;4344:10;4333:30;;;;;;;;;;;;:::i;:::-;4325:85;;;;-1:-1:-1;;;4325:85:15;;39573:2:18;4325:85:15;;;39555:21:18;39612:2;39592:18;;;39585:30;39651:34;39631:18;;;39624:62;39722:12;39702:18;;;39695:40;39752:19;;4325:85:15;39371:406:18;2498:415:10;2633:21;2657:28;2670:14;2657:12;:28::i;:::-;2714;;;;2695:16;2714:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;;;2633:52;;-1:-1:-1;2695:16:10;2714:47;;2752:9;;2714:47;:::i;:::-;2695:66;;2793:1;2779:11;:15;2771:54;;;;-1:-1:-1;;;2771:54:10;;39984:2:18;2771:54:10;;;39966:21:18;40023:2;40003:18;;;39996:30;40062:28;40042:18;;;40035:56;40108:18;;2771:54:10;39782:350:18;2771:54:10;2863:11;2843:16;:31;;2835:71;;;;-1:-1:-1;;;2835:71:10;;40339:2:18;2835:71:10;;;40321:21:18;40378:2;40358:18;;;40351:30;40417:29;40397:18;;;40390:57;40464:18;;2835:71:10;40137:351:18;10675:678:16;10789:13;10816:10;10840:15;10869:11;10913:8;:15;10932:2;10913:21;10905:69;;;;-1:-1:-1;;;10905:69:16;;40695:2:18;10905:69:16;;;40677:21:18;40734:2;40714:18;;;40707:30;40773:34;40753:18;;;40746:62;40844:5;40824:18;;;40817:33;40867:19;;10905:69:16;40493:399:18;10905:69:16;10984:21;11025:8;11034:1;11025:11;;;;;;;;:::i;:::-;;;;;;;11008:30;;;;;;;;:::i;:::-;10984:54;-1:-1:-1;11070:29:16;11056:10;:43;;;;;;;;:::i;:::-;;11048:88;;;;-1:-1:-1;;;11048:88:16;;41288:2:18;11048:88:16;;;41270:21:18;;;41307:18;;;41300:30;41366:34;41346:18;;;41339:62;41418:18;;11048:88:16;41086:356:18;11048:88:16;11198:2;11188:8;11184:17;11178:24;11169:33;;11241:2;11231:8;11227:17;11221:24;11215:30;;11290:2;11280:8;11276:17;11270:24;11258:36;;11328:8;11337:2;11328:12;;;;;;;;:::i;:::-;;;;;;;;;11322:19;;:24;;11345:1;11322:24;11313:33;;10895:458;10675:678;;;;;:::o;9391:194::-;9447:19;9468:8;378:5;9507:11;;9495:9;:23;;;;:::i;:::-;9494:42;;;;:::i;:::-;9488:48;-1:-1:-1;9563:15:16;9488:48;9563:9;:15;:::i;:::-;9546:32;;9391:194;;;:::o;8431:195::-;8554:32;;;;;;;;2965:25:18;;;-1:-1:-1;;;;;8554:21:16;;;;;2938:18:18;;8554:32:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8596:23:16;;-1:-1:-1;;;;;8596:12:16;;;-1:-1:-1;8596:23:16;;;;;-1:-1:-1;8609:9:16;;8596:23;;;;8609:9;8596:12;:23;;;;;;;;;;;;;;;;;;;;;8431:195;;;:::o;948:241:15:-;1113:68;;-1:-1:-1;;;;;41728:15:18;;;1113:68:15;;;41710:34:18;41780:15;;41760:18;;;41753:43;41812:18;;;41805:34;;;1086:96:15;;1106:5;;1136:27;;41622:18:18;;1113:68:15;41447:398:18;2001:491:10;2223:32;;;2194:26;2223:32;;;:19;:32;;;;;2194:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2273:13;:20;2297:1;2273:25;2265:86;;;;-1:-1:-1;;;2265:86:10;;42052:2:18;2265:86:10;;;42034:21:18;42091:2;42071:18;;;42064:30;42130:34;42110:18;;;42103:62;42201:18;42181;;;42174:46;42237:19;;2265:86:10;41850:412:18;2265:86:10;2361:124;;;;;-1:-1:-1;;;;;2361:10:10;:15;;;;2384:10;;2361:124;;2396:11;;2409:13;;2424:8;;2434:14;;2450:18;;2470:14;;2361:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2184:308;2001:491;;;;;;:::o;3861:223:0:-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;2919:266:10:-;3001:13;3059:2;3034:14;:21;:27;;3026:68;;;;-1:-1:-1;;;3026:68:10;;43334:2:18;3026:68:10;;;43316:21:18;43373:2;43353:18;;;43346:30;43412;43392:18;;;43385:58;43460:18;;3026:68:10;43132:352:18;3026:68:10;-1:-1:-1;3165:2:10;3145:23;3139:30;;2919:266::o;4948:499:0:-;5113:12;5170:5;5145:21;:30;;5137:81;;;;-1:-1:-1;;;5137:81:0;;43691:2:18;5137:81:0;;;43673:21:18;43730:2;43710:18;;;43703:30;43769:34;43749:18;;;43742:62;43840:8;43820:18;;;43813:36;43866:19;;5137:81:0;43489:402:18;5137:81:0;-1:-1:-1;;;;;1465:19:0;;;5228:60;;;;-1:-1:-1;;;5228:60:0;;44098:2:18;5228:60:0;;;44080:21:18;44137:2;44117:18;;;44110:30;44176:31;44156:18;;;44149:59;44225:18;;5228:60:0;43896:353:18;5228:60:0;5300:12;5314:23;5341:6;-1:-1:-1;;;;;5341:11:0;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;4948:499;-1:-1:-1;;;;;;;4948:499:0:o;7561:742::-;7707:12;7735:7;7731:566;;;-1:-1:-1;7765:10:0;7758:17;;7731:566;7876:17;;:21;7872:415;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;7872:415;8259:12;8252:20;;-1:-1:-1;;;8252:20:0;;;;;;;;:::i;14:180:18:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:18;;14:180;-1:-1:-1;14:180:18:o;199:159::-;266:20;;326:6;315:18;;305:29;;295:57;;348:1;345;338:12;295:57;199:159;;;:::o;363:347::-;414:8;424:6;478:3;471:4;463:6;459:17;455:27;445:55;;496:1;493;486:12;445:55;-1:-1:-1;519:20:18;;562:18;551:30;;548:50;;;594:1;591;584:12;548:50;631:4;623:6;619:17;607:29;;683:3;676:4;667:6;659;655:19;651:30;648:39;645:59;;;700:1;697;690:12;645:59;363:347;;;;;:::o;715:171::-;782:20;;842:18;831:30;;821:41;;811:69;;876:1;873;866:12;891:862;997:6;1005;1013;1021;1029;1037;1090:3;1078:9;1069:7;1065:23;1061:33;1058:53;;;1107:1;1104;1097:12;1058:53;1130:28;1148:9;1130:28;:::i;:::-;1120:38;;1209:2;1198:9;1194:18;1181:32;1232:18;1273:2;1265:6;1262:14;1259:34;;;1289:1;1286;1279:12;1259:34;1328:58;1378:7;1369:6;1358:9;1354:22;1328:58;:::i;:::-;1405:8;;-1:-1:-1;1302:84:18;-1:-1:-1;1302:84:18;;-1:-1:-1;1459:37:18;1492:2;1477:18;;1459:37;:::i;:::-;1449:47;;1549:2;1538:9;1534:18;1521:32;1505:48;;1578:2;1568:8;1565:16;1562:36;;;1594:1;1591;1584:12;1562:36;;1633:60;1685:7;1674:8;1663:9;1659:24;1633:60;:::i;:::-;891:862;;;;-1:-1:-1;891:862:18;;-1:-1:-1;891:862:18;;1712:8;;891:862;-1:-1:-1;;;891:862:18:o;1758:184::-;1816:6;1869:2;1857:9;1848:7;1844:23;1840:32;1837:52;;;1885:1;1882;1875:12;1837:52;1908:28;1926:9;1908:28;:::i;1947:154::-;-1:-1:-1;;;;;2026:5:18;2022:54;2015:5;2012:65;2002:93;;2091:1;2088;2081:12;2106:247;2165:6;2218:2;2206:9;2197:7;2193:23;2189:32;2186:52;;;2234:1;2231;2224:12;2186:52;2273:9;2260:23;2292:31;2317:5;2292:31;:::i;2358:456::-;2435:6;2443;2451;2504:2;2492:9;2483:7;2479:23;2475:32;2472:52;;;2520:1;2517;2510:12;2472:52;2559:9;2546:23;2578:31;2603:5;2578:31;:::i;:::-;2628:5;-1:-1:-1;2685:2:18;2670:18;;2657:32;2698:33;2657:32;2698:33;:::i;:::-;2358:456;;2750:7;;-1:-1:-1;;;2804:2:18;2789:18;;;;2776:32;;2358:456::o;3194:481::-;3272:6;3280;3288;3341:2;3329:9;3320:7;3316:23;3312:32;3309:52;;;3357:1;3354;3347:12;3309:52;3380:28;3398:9;3380:28;:::i;:::-;3370:38;;3459:2;3448:9;3444:18;3431:32;3486:18;3478:6;3475:30;3472:50;;;3518:1;3515;3508:12;3472:50;3557:58;3607:7;3598:6;3587:9;3583:22;3557:58;:::i;:::-;3194:481;;3634:8;;-1:-1:-1;3531:84:18;;-1:-1:-1;;;;3194:481:18:o;4103:158::-;4166:5;4211:2;4202:6;4197:3;4193:16;4189:25;4186:45;;;4227:1;4224;4217:12;4186:45;-1:-1:-1;4249:6:18;4103:158;-1:-1:-1;4103:158:18:o;4266:541::-;4375:6;4383;4391;4444:2;4432:9;4423:7;4419:23;4415:32;4412:52;;;4460:1;4457;4450:12;4412:52;4483:57;4532:7;4521:9;4483:57;:::i;:::-;4473:67;;4591:2;4580:9;4576:18;4563:32;4618:18;4610:6;4607:30;4604:50;;;4650:1;4647;4640:12;5065:184;-1:-1:-1;;;5114:1:18;5107:88;5214:4;5211:1;5204:15;5238:4;5235:1;5228:15;5254:275;5325:2;5319:9;5390:2;5371:13;;-1:-1:-1;;5367:27:18;5355:40;;5425:18;5410:34;;5446:22;;;5407:62;5404:88;;;5472:18;;:::i;:::-;5508:2;5501:22;5254:275;;-1:-1:-1;5254:275:18:o;5534:186::-;5582:4;5615:18;5607:6;5604:30;5601:56;;;5637:18;;:::i;:::-;-1:-1:-1;5703:2:18;5682:15;-1:-1:-1;;5678:29:18;5709:4;5674:40;;5534:186::o;5725:815::-;5809:6;5817;5825;5878:2;5866:9;5857:7;5853:23;5849:32;5846:52;;;5894:1;5891;5884:12;5846:52;5917:28;5935:9;5917:28;:::i;:::-;5907:38;;5996:2;5985:9;5981:18;5968:32;6023:18;6015:6;6012:30;6009:50;;;6055:1;6052;6045:12;6009:50;6078:22;;6131:4;6123:13;;6119:27;-1:-1:-1;6109:55:18;;6160:1;6157;6150:12;6109:55;6196:2;6183:16;6221:48;6237:31;6265:2;6237:31;:::i;:::-;6221:48;:::i;:::-;6292:2;6285:5;6278:17;6332:7;6327:2;6322;6318;6314:11;6310:20;6307:33;6304:53;;;6353:1;6350;6343:12;6304:53;6408:2;6403;6399;6395:11;6390:2;6383:5;6379:14;6366:45;6452:1;6447:2;6442;6435:5;6431:14;6427:23;6420:34;6473:5;6463:15;;;;;6497:37;6530:2;6519:9;6515:18;6497:37;:::i;:::-;6487:47;;5725:815;;;;;:::o;6727:118::-;6813:5;6806:13;6799:21;6792:5;6789:32;6779:60;;6835:1;6832;6825:12;6850:241;6906:6;6959:2;6947:9;6938:7;6934:23;6930:32;6927:52;;;6975:1;6972;6965:12;6927:52;7014:9;7001:23;7033:28;7055:5;7033:28;:::i;7096:258::-;7168:1;7178:113;7192:6;7189:1;7186:13;7178:113;;;7268:11;;;7262:18;7249:11;;;7242:39;7214:2;7207:10;7178:113;;;7309:6;7306:1;7303:13;7300:48;;;-1:-1:-1;;7344:1:18;7326:16;;7319:27;7096:258::o;7359:257::-;7400:3;7438:5;7432:12;7465:6;7460:3;7453:19;7481:63;7537:6;7530:4;7525:3;7521:14;7514:4;7507:5;7503:16;7481:63;:::i;:::-;7598:2;7577:15;-1:-1:-1;;7573:29:18;7564:39;;;;7605:4;7560:50;;7359:257;-1:-1:-1;;7359:257:18:o;7621:217::-;7768:2;7757:9;7750:21;7731:4;7788:44;7828:2;7817:9;7813:18;7805:6;7788:44;:::i;7843:814::-;7979:6;7987;7995;8003;8011;8019;8072:3;8060:9;8051:7;8047:23;8043:33;8040:53;;;8089:1;8086;8079:12;8040:53;8128:9;8115:23;8147:31;8172:5;8147:31;:::i;:::-;8197:5;-1:-1:-1;8249:2:18;8234:18;;8221:32;;-1:-1:-1;8300:2:18;8285:18;;8272:32;;-1:-1:-1;8323:66:18;8381:7;8376:2;8361:18;;8323:66;:::i;:::-;8313:76;;8440:3;8429:9;8425:19;8412:33;8468:18;8460:6;8457:30;8454:50;;;8500:1;8497;8490:12;8454:50;8539:58;8589:7;8580:6;8569:9;8565:22;8539:58;:::i;8662:256::-;8728:6;8736;8789:2;8777:9;8768:7;8764:23;8760:32;8757:52;;;8805:1;8802;8795:12;8757:52;8828:28;8846:9;8828:28;:::i;:::-;8818:38;;8875:37;8908:2;8897:9;8893:18;8875:37;:::i;:::-;8865:47;;8662:256;;;;;:::o;8923:388::-;8991:6;8999;9052:2;9040:9;9031:7;9027:23;9023:32;9020:52;;;9068:1;9065;9058:12;9020:52;9107:9;9094:23;9126:31;9151:5;9126:31;:::i;:::-;9176:5;-1:-1:-1;9233:2:18;9218:18;;9205:32;9246:33;9205:32;9246:33;:::i;:::-;9298:7;9288:17;;;8923:388;;;;;:::o;9316:460::-;9392:6;9400;9408;9461:2;9449:9;9440:7;9436:23;9432:32;9429:52;;;9477:1;9474;9467:12;9429:52;9516:9;9503:23;9535:31;9560:5;9535:31;:::i;:::-;9585:5;-1:-1:-1;9642:2:18;9627:18;;9614:32;9655:33;9614:32;9655:33;:::i;:::-;9707:7;-1:-1:-1;9733:37:18;9766:2;9751:18;;9733:37;:::i;10227:679::-;10354:6;10362;10370;10378;10386;10439:3;10427:9;10418:7;10414:23;10410:33;10407:53;;;10456:1;10453;10446:12;10407:53;10492:9;10479:23;10469:33;;10549:2;10538:9;10534:18;10521:32;10511:42;;10572:66;10630:7;10625:2;10614:9;10610:18;10572:66;:::i;:::-;10562:76;;10689:3;10678:9;10674:19;10661:33;10717:18;10709:6;10706:30;10703:50;;;10749:1;10746;10739:12;10703:50;10788:58;10838:7;10829:6;10818:9;10814:22;10788:58;:::i;:::-;10227:679;;;;-1:-1:-1;10227:679:18;;-1:-1:-1;10865:8:18;;10762:84;10227:679;-1:-1:-1;;;10227:679:18:o;10911:382::-;10976:6;10984;11037:2;11025:9;11016:7;11012:23;11008:32;11005:52;;;11053:1;11050;11043:12;11005:52;11092:9;11079:23;11111:31;11136:5;11111:31;:::i;:::-;11161:5;-1:-1:-1;11218:2:18;11203:18;;11190:32;11231:30;11190:32;11231:30;:::i;11298:622::-;11393:6;11401;11409;11417;11425;11478:3;11466:9;11457:7;11453:23;11449:33;11446:53;;;11495:1;11492;11485:12;11446:53;11518:28;11536:9;11518:28;:::i;:::-;11508:38;;11565:37;11598:2;11587:9;11583:18;11565:37;:::i;:::-;11555:47;;11649:2;11638:9;11634:18;11621:32;11611:42;;11704:2;11693:9;11689:18;11676:32;11731:18;11723:6;11720:30;11717:50;;;11763:1;11760;11753:12;11925:324;12000:6;12008;12016;12069:2;12057:9;12048:7;12044:23;12040:32;12037:52;;;12085:1;12082;12075:12;12037:52;12108:28;12126:9;12108:28;:::i;:::-;12098:38;;12155:37;12188:2;12177:9;12173:18;12155:37;:::i;:::-;12145:47;;12239:2;12228:9;12224:18;12211:32;12201:42;;11925:324;;;;;:::o;12459:460::-;12543:6;12551;12559;12567;12620:3;12608:9;12599:7;12595:23;12591:33;12588:53;;;12637:1;12634;12627:12;12588:53;12660:28;12678:9;12660:28;:::i;:::-;12650:38;;12707:37;12740:2;12729:9;12725:18;12707:37;:::i;:::-;12697:47;;12794:2;12783:9;12779:18;12766:32;12807:31;12832:5;12807:31;:::i;:::-;12459:460;;;;-1:-1:-1;12857:5:18;;12909:2;12894:18;12881:32;;-1:-1:-1;;12459:460:18:o;13642:437::-;13721:1;13717:12;;;;13764;;;13785:61;;13839:4;13831:6;13827:17;13817:27;;13785:61;13892:2;13884:6;13881:14;13861:18;13858:38;13855:218;;-1:-1:-1;;;13926:1:18;13919:88;14030:4;14027:1;14020:15;14058:4;14055:1;14048:15;14084:271;14267:6;14259;14254:3;14241:33;14223:3;14293:16;;14318:13;;;14293:16;14084:271;-1:-1:-1;14084:271:18:o;15993:184::-;-1:-1:-1;;;16042:1:18;16035:88;16142:4;16139:1;16132:15;16166:4;16163:1;16156:15;16182:195;16220:4;16257;16254:1;16250:12;16289:4;16286:1;16282:12;16314:3;16309;16306:12;16303:38;;;16321:18;;:::i;:::-;16358:13;;;16182:195;-1:-1:-1;;;16182:195:18:o;16382:422::-;16471:1;16514:5;16471:1;16528:270;16549:7;16539:8;16536:21;16528:270;;;16608:4;16604:1;16600:6;16596:17;16590:4;16587:27;16584:53;;;16617:18;;:::i;:::-;16667:7;16657:8;16653:22;16650:55;;;16687:16;;;;16650:55;16766:22;;;;16726:15;;;;16528:270;;;16532:3;16382:422;;;;;:::o;16809:806::-;16858:5;16888:8;16878:80;;-1:-1:-1;16929:1:18;16943:5;;16878:80;16977:4;16967:76;;-1:-1:-1;17014:1:18;17028:5;;16967:76;17059:4;17077:1;17072:59;;;;17145:1;17140:130;;;;17052:218;;17072:59;17102:1;17093:10;;17116:5;;;17140:130;17177:3;17167:8;17164:17;17161:43;;;17184:18;;:::i;:::-;-1:-1:-1;;17240:1:18;17226:16;;17255:5;;17052:218;;17354:2;17344:8;17341:16;17335:3;17329:4;17326:13;17322:36;17316:2;17306:8;17303:16;17298:2;17292:4;17289:12;17285:35;17282:77;17279:159;;;-1:-1:-1;17391:19:18;;;17423:5;;17279:159;17470:34;17495:8;17489:4;17470:34;:::i;:::-;17540:6;17536:1;17532:6;17528:19;17519:7;17516:32;17513:58;;;17551:18;;:::i;:::-;17589:20;;16809:806;-1:-1:-1;;;16809:806:18:o;17620:140::-;17678:5;17707:47;17748:4;17738:8;17734:19;17728:4;17707:47;:::i;18423:266::-;18511:6;18506:3;18499:19;18563:6;18556:5;18549:4;18544:3;18540:14;18527:43;-1:-1:-1;18615:1:18;18590:16;;;18608:4;18586:27;;;18579:38;;;;18671:2;18650:15;;;-1:-1:-1;;18646:29:18;18637:39;;;18633:50;;18423:266::o;18694:326::-;18889:6;18881;18877:19;18866:9;18859:38;18933:2;18928;18917:9;18913:18;18906:30;18840:4;18953:61;19010:2;18999:9;18995:18;18987:6;18979;18953:61;:::i;19025:690::-;19316:6;19308;19304:19;19293:9;19286:38;-1:-1:-1;;;;;19364:6:18;19360:55;19355:2;19344:9;19340:18;19333:83;19452:3;19447:2;19436:9;19432:18;19425:31;19267:4;19479:45;19519:3;19508:9;19504:19;19496:6;19479:45;:::i;:::-;19574:6;19567:14;19560:22;19555:2;19544:9;19540:18;19533:50;19632:9;19624:6;19620:22;19614:3;19603:9;19599:19;19592:51;19660:49;19702:6;19694;19686;19660:49;:::i;:::-;19652:57;19025:690;-1:-1:-1;;;;;;;;;19025:690:18:o;19720:245::-;19799:6;19807;19860:2;19848:9;19839:7;19835:23;19831:32;19828:52;;;19876:1;19873;19866:12;19828:52;-1:-1:-1;;19899:16:18;;19955:2;19940:18;;;19934:25;19899:16;;19934:25;;-1:-1:-1;19720:245:18:o;21902:236::-;21941:3;21969:18;22014:2;22011:1;22007:10;22044:2;22041:1;22037:10;22075:3;22071:2;22067:12;22062:3;22059:21;22056:47;;;22083:18;;:::i;:::-;22119:13;;21902:236;-1:-1:-1;;;;21902:236:18:o;22550:229::-;22589:4;22618:18;22686:10;;;;22656;;22708:12;;;22705:38;;;22723:18;;:::i;:::-;22760:13;;22550:229;-1:-1:-1;;;22550:229:18:o;23142:125::-;23182:4;23210:1;23207;23204:8;23201:34;;;23215:18;;:::i;:::-;-1:-1:-1;23252:9:18;;23142:125::o;23272:184::-;23342:6;23395:2;23383:9;23374:7;23370:23;23366:32;23363:52;;;23411:1;23408;23401:12;23363:52;-1:-1:-1;23434:16:18;;23272:184;-1:-1:-1;23272:184:18:o;23461:360::-;23672:6;23664;23659:3;23646:33;23742:2;23738:15;;;;-1:-1:-1;;23734:53:18;23698:16;;23723:65;;;23812:2;23804:11;;23461:360;-1:-1:-1;23461:360:18:o;23951:544::-;24052:2;24047:3;24044:11;24041:448;;;24088:1;24113:5;24109:2;24102:17;24158:4;24154:2;24144:19;24228:2;24216:10;24212:19;24209:1;24205:27;24199:4;24195:38;24264:4;24252:10;24249:20;24246:47;;;-1:-1:-1;24287:4:18;24246:47;24342:2;24337:3;24333:12;24330:1;24326:20;24320:4;24316:31;24306:41;;24397:82;24415:2;24408:5;24405:13;24397:82;;;24460:17;;;24441:1;24430:13;24397:82;;24671:1348;24795:3;24789:10;24822:18;24814:6;24811:30;24808:56;;;24844:18;;:::i;:::-;24873:96;24962:6;24922:38;24954:4;24948:11;24922:38;:::i;:::-;24916:4;24873:96;:::i;:::-;25024:4;;25088:2;25077:14;;25105:1;25100:662;;;;25806:1;25823:6;25820:89;;;-1:-1:-1;25875:19:18;;;25869:26;25820:89;-1:-1:-1;;24628:1:18;24624:11;;;24620:24;24616:29;24606:40;24652:1;24648:11;;;24603:57;25922:81;;25070:943;;25100:662;23898:1;23891:14;;;23935:4;23922:18;;-1:-1:-1;;25136:20:18;;;25253:236;25267:7;25264:1;25261:14;25253:236;;;25356:19;;;25350:26;25335:42;;25448:27;;;;25416:1;25404:14;;;;25283:19;;25253:236;;;25257:3;25517:6;25508:7;25505:19;25502:201;;;25578:19;;;25572:26;-1:-1:-1;;25661:1:18;25657:14;;;25673:3;25653:24;25649:37;25645:42;25630:58;25615:74;;25502:201;-1:-1:-1;;;;;25749:1:18;25733:14;;;25729:22;25716:36;;-1:-1:-1;24671:1348:18:o;27149:498::-;27349:4;27378:6;27423:2;27415:6;27411:15;27400:9;27393:34;27475:2;27467:6;27463:15;27458:2;27447:9;27443:18;27436:43;;27515:6;27510:2;27499:9;27495:18;27488:34;27558:3;27553:2;27542:9;27538:18;27531:31;27579:62;27636:3;27625:9;27621:19;27613:6;27605;27579:62;:::i;28458:493::-;28707:6;28699;28695:19;28684:9;28677:38;28751:3;28746:2;28735:9;28731:18;28724:31;28658:4;28772:62;28829:3;28818:9;28814:19;28806:6;28798;28772:62;:::i;:::-;28882:18;28870:31;;;;28865:2;28850:18;;28843:59;-1:-1:-1;28933:2:18;28918:18;28911:34;28764:70;28458:493;-1:-1:-1;;;28458:493:18:o;28956:128::-;28996:3;29027:1;29023:6;29020:1;29017:13;29014:39;;;29033:18;;:::i;:::-;-1:-1:-1;29069:9:18;;28956:128::o;30065:1202::-;30187:18;30182:3;30179:27;30176:53;;;30209:18;;:::i;:::-;30238:93;30327:3;30287:38;30319:4;30313:11;30287:38;:::i;:::-;30281:4;30238:93;:::i;:::-;30357:1;30382:2;30377:3;30374:11;30399:1;30394:615;;;;31053:1;31070:3;31067:93;;;-1:-1:-1;31126:19:18;;;31113:33;31067:93;-1:-1:-1;;24628:1:18;24624:11;;;24620:24;24616:29;24606:40;24652:1;24648:11;;;24603:57;31173:78;;30367:894;;30394:615;23898:1;23891:14;;;23935:4;23922:18;;-1:-1:-1;;30430:17:18;;;30530:9;30552:229;30566:7;30563:1;30560:14;30552:229;;;30655:19;;;30642:33;30627:49;;30762:4;30747:20;;;;30715:1;30703:14;;;;30582:12;30552:229;;;30556:3;30809;30800:7;30797:16;30794:159;;;30933:1;30929:6;30923:3;30917;30914:1;30910:11;30906:21;30902:34;30898:39;30885:9;30880:3;30876:19;30863:33;30859:79;30851:6;30844:95;30794:159;;;30996:1;30990:3;30987:1;30983:11;30979:19;30973:4;30966:33;30367:894;;30065:1202;;;:::o;32163:634::-;32242:6;32295:2;32283:9;32274:7;32270:23;32266:32;32263:52;;;32311:1;32308;32301:12;32263:52;32344:9;32338:16;32377:18;32369:6;32366:30;32363:50;;;32409:1;32406;32399:12;32363:50;32432:22;;32485:4;32477:13;;32473:27;-1:-1:-1;32463:55:18;;32514:1;32511;32504:12;32463:55;32543:2;32537:9;32568:48;32584:31;32612:2;32584:31;:::i;32568:48::-;32639:2;32632:5;32625:17;32679:7;32674:2;32669;32665;32661:11;32657:20;32654:33;32651:53;;;32700:1;32697;32690:12;32651:53;32713:54;32764:2;32759;32752:5;32748:14;32743:2;32739;32735:11;32713:54;:::i;33163:555::-;33420:6;33412;33408:19;33397:9;33390:38;33464:3;33459:2;33448:9;33444:18;33437:31;33371:4;33491:45;33531:3;33520:9;33516:19;33508:6;33491:45;:::i;:::-;33584:18;33576:6;33572:31;33567:2;33556:9;33552:18;33545:59;33652:9;33644:6;33640:22;33635:2;33624:9;33620:18;33613:50;33680:32;33705:6;33697;33680:32;:::i;33723:274::-;33852:3;33890:6;33884:13;33906:53;33952:6;33947:3;33940:4;33932:6;33928:17;33906:53;:::i;:::-;33975:16;;;;;33723:274;-1:-1:-1;;33723:274:18:o;34002:716::-;34305:6;34297;34293:19;34282:9;34275:38;34349:3;34344:2;34333:9;34329:18;34322:31;34256:4;34376:45;34416:3;34405:9;34401:19;34393:6;34376:45;:::i;:::-;34469:18;34461:6;34457:31;34452:2;34441:9;34437:18;34430:59;34537:9;34529:6;34525:22;34520:2;34509:9;34505:18;34498:50;34571:32;34596:6;34588;34571:32;:::i;:::-;34557:46;;34652:9;34644:6;34640:22;34634:3;34623:9;34619:19;34612:51;34680:32;34705:6;34697;34680:32;:::i;:::-;34672:40;34002:716;-1:-1:-1;;;;;;;;34002:716:18:o;35133:273::-;35201:6;35254:2;35242:9;35233:7;35229:23;35225:32;35222:52;;;35270:1;35267;35260:12;35222:52;35302:9;35296:16;35352:4;35345:5;35341:16;35334:5;35331:27;35321:55;;35372:1;35369;35362:12;35411:184;-1:-1:-1;;;35460:1:18;35453:88;35560:4;35557:1;35550:15;35584:4;35581:1;35574:15;37361:274;37401:1;37427;37417:189;;-1:-1:-1;;;37459:1:18;37452:88;37563:4;37560:1;37553:15;37591:4;37588:1;37581:15;37417:189;-1:-1:-1;37620:9:18;;37361:274::o;38259:168::-;38299:7;38365:1;38361;38357:6;38353:14;38350:1;38347:21;38342:1;38335:9;38328:17;38324:45;38321:71;;;38372:18;;:::i;:::-;-1:-1:-1;38412:9:18;;38259:168::o;39121:245::-;39188:6;39241:2;39229:9;39220:7;39216:23;39212:32;39209:52;;;39257:1;39254;39247:12;39209:52;39289:9;39283:16;39308:28;39330:5;39308:28;:::i;40897:184::-;-1:-1:-1;;;40946:1:18;40939:88;41046:4;41043:1;41036:15;41070:4;41067:1;41060:15;42267:860;42616:6;42608;42604:19;42593:9;42586:38;42660:3;42655:2;42644:9;42640:18;42633:31;42567:4;42687:45;42727:3;42716:9;42712:19;42704:6;42687:45;:::i;:::-;42780:9;42772:6;42768:22;42763:2;42752:9;42748:18;42741:50;42814:32;42839:6;42831;42814:32;:::i;:::-;-1:-1:-1;;;;;42943:15:18;;;42938:2;42923:18;;42916:43;42996:15;;42990:3;42975:19;;42968:44;43049:22;;;43043:3;43028:19;;43021:51;42800:46;-1:-1:-1;43089:32:18;42800:46;43106:6;43089:32;:::i
Swarm Source
ipfs://7e627899a6ccdd0f8de8e25cd4ab72f6102844709371ea2bdb3c25b0c444336f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
OP | 72.37% | $3,902.23 | 4,099.7145 | $15,998,028.97 | |
OP | 27.63% | $0.99906 | 6,112,609.5949 | $6,106,863.74 | |
OP | Ether (ETH) | <0.01% | $3,902.71 | 0.0279 | $108.83 |
ETH | <0.01% | $3,901.95 | 0.0226 | $88.32 | |
ARB | <0.01% | $3,901.96 | 0.00855232 | $33.37 | |
AVAX | <0.01% | $52.82 | 0.4603 | $24.31 | |
LINEA | <0.01% | $3,901.95 | 0.00082393 | $3.21 | |
BASE | <0.01% | $3,902.37 | 0.00068466 | $2.67 | |
OPBNB | <0.01% | $727.68 | 0.00119198 | $0.867385 | |
ZKSYNC | <0.01% | $3,901.95 | 0.00013724 | $0.535501 | |
BSC | <0.01% | $727.74 | 0.00041074 | $0.298908 |
[ Download: CSV Export ]
[ Download: CSV Export ]
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.