Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LEARNoft
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-11-12 */ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.7.6; library ExcessivelySafeCall { uint 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, uint _gas, uint16 _maxCopy, bytes memory _calldata ) internal returns (bool, bytes memory) { // set up for assembly call uint _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, uint _gas, uint16 _maxCopy, bytes memory _calldata ) internal view returns (bool, bytes memory) { // set up for assembly call uint _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); uint _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) } } } // File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/libraries/BytesLib.sol /* * @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, uint _start, uint _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, uint _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, uint _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, uint _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, uint _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, uint _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, uint _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, uint _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, uint _start) internal pure returns (uint) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint _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; } } // File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/lzApp/interfaces/ILayerZeroUserApplicationConfig.sol 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; } // File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/lzApp/interfaces/ILayerZeroEndpoint.sol pragma solidity >=0.5.0; 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); } // File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/lzApp/interfaces/ILayerZeroReceiver.sol 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; } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/token/oft/v1/interfaces/IOFTCore.sol pragma solidity >=0.5.0; /** * @dev Interface of the IOFT core standard */ interface IOFTCore is IERC165 { /** * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) * _dstChainId - L0 defined chain id to send tokens too * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain * _amount - amount of the tokens to transfer * _useZro - indicates to use zro to pay L0 fees * _adapterParam - flexible bytes array to indicate messaging adapter services in L0 */ function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); /** * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from` * `_from` the owner of token * `_dstChainId` the destination chain identifier * `_toAddress` can be any size depending on the `dstChainId`. * `_amount` the quantity of tokens in wei * `_refundAddress` the address LayerZero refunds if too much message fee is sent * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParams` is a flexible bytes array to indicate messaging adapter services */ function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; /** * @dev returns the circulating amount of tokens on current chain */ function circulatingSupply() external view returns (uint); /** * @dev returns the address of the ERC20 token */ function token() external view returns (address); /** * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`) * `_nonce` is the outbound nonce */ event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes _toAddress, uint _amount); /** * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain. * `_nonce` is the inbound nonce. */ event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount); event SetUseCustomAdapterParams(bool _useCustomAdapterParams); } // File: @openzeppelin/contracts/utils/Context.sol // 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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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); } } // File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/lzApp/LzApp.sol pragma solidity ^0.8.0; /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { using BytesLib for bytes; // ua can not send payload larger than this by default, but it can be changed by the ua owner uint public constant DEFAULT_PAYLOAD_SIZE_LIMIT = 10000; ILayerZeroEndpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup; mapping(uint16 => uint) public payloadSizeLimitLookup; 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"); _checkPayloadSize(_dstChainId, _payload.length); 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]; require(minGasLimit > 0, "LzApp: minGasLimit not set"); require(providedGasLimit >= minGasLimit + _extraGas, "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)) } } function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual { uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId]; if (payloadSizeLimit == 0) { // use default if not set payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT; } require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large"); } //---------------------------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 _remoteChainId, bytes calldata _path) external onlyOwner { trustedRemoteLookup[_remoteChainId] = _path; emit SetTrustedRemote(_remoteChainId, _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 { minDstGasLookup[_dstChainId][_packetType] = _minGas; emit SetMinDstGas(_dstChainId, _packetType, _minGas); } // if the size is 0, it means default size limit function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner { payloadSizeLimitLookup[_dstChainId] = _size; } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } } // File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/lzApp/NonblockingLzApp.sol pragma solidity ^0.8.0; /* * 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) ); if (!success) { _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason); } } function _storeFailedMessage( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason ) internal virtual { 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); } } // File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/token/oft/v1/OFTCore.sol pragma solidity ^0.8.0; abstract contract OFTCore is NonblockingLzApp, ERC165, IOFTCore { using BytesLib for bytes; uint public constant NO_EXTRA_GAS = 0; // packet type uint16 public constant PT_SEND = 0; bool public useCustomAdapterParams; constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {} function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IOFTCore).interfaceId || super.supportsInterface(interfaceId); } function estimateSendFee( uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams ) public view virtual override returns (uint nativeFee, uint zroFee) { // mock the payload for sendFrom() bytes memory payload = abi.encode(PT_SEND, _toAddress, _amount); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function sendFrom( address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) public payable virtual override { _send(_from, _dstChainId, _toAddress, _amount, _refundAddress, _zroPaymentAddress, _adapterParams); } function setUseCustomAdapterParams(bool _useCustomAdapterParams) public virtual onlyOwner { useCustomAdapterParams = _useCustomAdapterParams; emit SetUseCustomAdapterParams(_useCustomAdapterParams); } function _nonblockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual override { uint16 packetType; assembly { packetType := mload(add(_payload, 32)) } if (packetType == PT_SEND) { _sendAck(_srcChainId, _srcAddress, _nonce, _payload); } else { revert("OFTCore: unknown packet type"); } } function _send( address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams ) internal virtual { _checkAdapterParams(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); uint amount = _debitFrom(_from, _dstChainId, _toAddress, _amount); bytes memory lzPayload = abi.encode(PT_SEND, _toAddress, amount); _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); emit SendToChain(_dstChainId, _from, _toAddress, amount); } function _sendAck( uint16 _srcChainId, bytes memory, uint64, bytes memory _payload ) internal virtual { (, bytes memory toAddressBytes, uint amount) = abi.decode(_payload, (uint16, bytes, uint)); address to = toAddressBytes.toAddress(0); amount = _creditTo(_srcChainId, to, amount); emit ReceiveFromChain(_srcChainId, to, amount); } function _checkAdapterParams( uint16 _dstChainId, uint16 _pkType, bytes memory _adapterParams, uint _extraGas ) internal virtual { if (useCustomAdapterParams) { _checkGasLimit(_dstChainId, _pkType, _adapterParams, _extraGas); } else { require(_adapterParams.length == 0, "OFTCore: _adapterParams must be empty."); } } function _debitFrom( address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount ) internal virtual returns (uint); function _creditTo( uint16 _srcChainId, address _toAddress, uint _amount ) internal virtual returns (uint); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // 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); } // File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/token/oft/v1/interfaces/IOFT.sol pragma solidity >=0.5.0; /** * @dev Interface of the OFT standard */ interface IOFT is IOFTCore, IERC20 { } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: LEARNoft.sol pragma solidity ^0.8.0; // override decimal() function is needed contract LEARNoft is OFTCore, ERC20, IOFT { constructor( string memory _name, string memory _symbol, address _lzEndpoint ) ERC20(_name, _symbol) OFTCore(_lzEndpoint) Ownable(msg.sender) {} function supportsInterface(bytes4 interfaceId) public view virtual override(OFTCore, IERC165) returns (bool) { return interfaceId == type(IOFT).interfaceId || interfaceId == type(IERC20).interfaceId || super.supportsInterface(interfaceId); } function token() public view virtual override returns (address) { return address(this); } function circulatingSupply() public view virtual override returns (uint) { return totalSupply(); } function _debitFrom( address _from, uint16, bytes memory, uint _amount ) internal virtual override returns (uint) { address spender = _msgSender(); if (_from != spender) _spendAllowance(_from, spender, _amount); _burn(_from, _amount); return _amount; } function _creditTo( uint16, address _toAddress, uint _amount ) internal virtual override returns (uint) { _mint(_toAddress, _amount); return _amount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_lzEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","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":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","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":"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":[],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","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":"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":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","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":"uint16","name":"_remoteChainId","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":[],"name":"useCustomAdapterParams","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405234801561000f575f80fd5b50604051615d98380380615d9883398181016040528101906100319190610380565b8282828080335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a7575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009e9190610417565b60405180910390fd5b6100b68161011860201b60201c565b508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050505081600a90816100fd919061063d565b5080600b908161010d919061063d565b50505050505061070c565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610238826101f2565b810181811067ffffffffffffffff8211171561025757610256610202565b5b80604052505050565b5f6102696101d9565b9050610275828261022f565b919050565b5f67ffffffffffffffff82111561029457610293610202565b5b61029d826101f2565b9050602081019050919050565b8281835e5f83830152505050565b5f6102ca6102c58461027a565b610260565b9050828152602081018484840111156102e6576102e56101ee565b5b6102f18482856102aa565b509392505050565b5f82601f83011261030d5761030c6101ea565b5b815161031d8482602086016102b8565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61034f82610326565b9050919050565b61035f81610345565b8114610369575f80fd5b50565b5f8151905061037a81610356565b92915050565b5f805f60608486031215610397576103966101e2565b5b5f84015167ffffffffffffffff8111156103b4576103b36101e6565b5b6103c0868287016102f9565b935050602084015167ffffffffffffffff8111156103e1576103e06101e6565b5b6103ed868287016102f9565b92505060406103fe8682870161036c565b9150509250925092565b61041181610345565b82525050565b5f60208201905061042a5f830184610408565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061047e57607f821691505b6020821081036104915761049061043a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104f37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104b8565b6104fd86836104b8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61054161053c61053784610515565b61051e565b610515565b9050919050565b5f819050919050565b61055a83610527565b61056e61056682610548565b8484546104c4565b825550505050565b5f90565b610582610576565b61058d818484610551565b505050565b5b818110156105b0576105a55f8261057a565b600181019050610593565b5050565b601f8211156105f5576105c681610497565b6105cf846104a9565b810160208510156105de578190505b6105f26105ea856104a9565b830182610592565b50505b505050565b5f82821c905092915050565b5f6106155f19846008026105fa565b1980831691505092915050565b5f61062d8383610606565b9150826002028217905092915050565b61064682610430565b67ffffffffffffffff81111561065f5761065e610202565b5b6106698254610467565b6106748282856105b4565b5f60209050601f8311600181146106a5575f8415610693578287015190505b61069d8582610622565b865550610704565b601f1984166106b386610497565b5f5b828110156106da578489015182556001820191506020850194506020810190506106b5565b868310156106f757848901516106f3601f891682610606565b8355505b6001600288020188555050505b505050505050565b60805161563c61075c5f395f8181610aaf01528181610e5601528181610f330152818161101e015281816111fa015281816118bc0152818161197001528181611e9e0152612c4e015261563c5ff3fe608060405260043610610270575f3560e01c80637533d7881161014e578063baf3292d116100c0578063eab45d9c11610079578063eab45d9c146109a5578063eb8d72b7146109cd578063ed629c5c146109f5578063f2fde38b14610a1f578063f5ecbdbc14610a47578063fc0c546a14610a8357610270565b8063baf3292d146108ab578063c4461834146108d3578063cbed8b9c146108fd578063d1deba1f14610925578063dd62ed3e14610941578063df2a5b3b1461097d57610270565b806395d89b411161011257806395d89b411461077b5780639f38369a146107a5578063a457c2d7146107e1578063a6c3d1651461081d578063a9059cbb14610845578063b353aaa71461088157610270565b80637533d788146106855780638cfd8f5c146106c15780638da5cb5b146106fd5780639358928b14610727578063950c8a741461075157610270565b806339509351116101e75780634c42899a116101ab5780634c42899a1461058957806351905636146105b35780635b8c41e6146105cf57806366ad5c8a1461060b57806370a0823114610633578063715018a61461066f57610270565b806339509351146104835780633d8b38f6146104bf5780633f1f4fa4146104fb57806342d65a8d14610537578063447705151461055f57610270565b80630df37483116102395780630df374831461036657806310ddb1371461038e57806318160ddd146103b657806323b872dd146103e05780632a205e3d1461041c578063313ce5671461045957610270565b80621d35671461027457806301ffc9a71461029c57806306fdde03146102d857806307e0db1714610302578063095ea7b31461032a575b5f80fd5b34801561027f575f80fd5b5061029a600480360381019061029591906133b2565b610aad565b005b3480156102a7575f80fd5b506102c260048036038101906102bd91906134aa565b610cfb565b6040516102cf91906134ef565b60405180910390f35b3480156102e3575f80fd5b506102ec610dbc565b6040516102f99190613578565b60405180910390f35b34801561030d575f80fd5b5061032860048036038101906103239190613598565b610e4c565b005b348015610335575f80fd5b50610350600480360381019061034b9190613650565b610edd565b60405161035d91906134ef565b60405180910390f35b348015610371575f80fd5b5061038c6004803603810190610387919061368e565b610eff565b005b348015610399575f80fd5b506103b460048036038101906103af9190613598565b610f29565b005b3480156103c1575f80fd5b506103ca610fba565b6040516103d791906136db565b60405180910390f35b3480156103eb575f80fd5b50610406600480360381019061040191906136f4565b610fc3565b60405161041391906134ef565b60405180910390f35b348015610427575f80fd5b50610442600480360381019061043d919061376e565b610ff1565b604051610450929190613825565b60405180910390f35b348015610464575f80fd5b5061046d6110ce565b60405161047a9190613867565b60405180910390f35b34801561048e575f80fd5b506104a960048036038101906104a49190613650565b6110d6565b6040516104b691906134ef565b60405180910390f35b3480156104ca575f80fd5b506104e560048036038101906104e09190613880565b61110c565b6040516104f291906134ef565b60405180910390f35b348015610506575f80fd5b50610521600480360381019061051c9190613598565b6111db565b60405161052e91906136db565b60405180910390f35b348015610542575f80fd5b5061055d60048036038101906105589190613880565b6111f0565b005b34801561056a575f80fd5b50610573611287565b60405161058091906136db565b60405180910390f35b348015610594575f80fd5b5061059d61128b565b6040516105aa91906138ec565b60405180910390f35b6105cd60048036038101906105c89190613940565b61128f565b005b3480156105da575f80fd5b506105f560048036038101906105f09190613b44565b61132f565b6040516106029190613bc8565b60405180910390f35b348015610616575f80fd5b50610631600480360381019061062c91906133b2565b611372565b005b34801561063e575f80fd5b5061065960048036038101906106549190613be1565b611481565b60405161066691906136db565b60405180910390f35b34801561067a575f80fd5b506106836114c7565b005b348015610690575f80fd5b506106ab60048036038101906106a69190613598565b6114da565b6040516106b89190613c5e565b60405180910390f35b3480156106cc575f80fd5b506106e760048036038101906106e29190613c7e565b611575565b6040516106f491906136db565b60405180910390f35b348015610708575f80fd5b50610711611595565b60405161071e9190613ccb565b60405180910390f35b348015610732575f80fd5b5061073b6115bc565b60405161074891906136db565b60405180910390f35b34801561075c575f80fd5b506107656115ca565b6040516107729190613ccb565b60405180910390f35b348015610786575f80fd5b5061078f6115ef565b60405161079c9190613578565b60405180910390f35b3480156107b0575f80fd5b506107cb60048036038101906107c69190613598565b61167f565b6040516107d89190613c5e565b60405180910390f35b3480156107ec575f80fd5b5061080760048036038101906108029190613650565b611791565b60405161081491906134ef565b60405180910390f35b348015610828575f80fd5b50610843600480360381019061083e9190613880565b611806565b005b348015610850575f80fd5b5061086b60048036038101906108669190613650565b611898565b60405161087891906134ef565b60405180910390f35b34801561088c575f80fd5b506108956118ba565b6040516108a29190613d3f565b60405180910390f35b3480156108b6575f80fd5b506108d160048036038101906108cc9190613be1565b6118de565b005b3480156108de575f80fd5b506108e7611960565b6040516108f491906136db565b60405180910390f35b348015610908575f80fd5b50610923600480360381019061091e9190613d58565b611966565b005b61093f600480360381019061093a91906133b2565b611a03565b005b34801561094c575f80fd5b5061096760048036038101906109629190613ddc565b611c39565b60405161097491906136db565b60405180910390f35b348015610988575f80fd5b506109a3600480360381019061099e9190613e1a565b611cbb565b005b3480156109b0575f80fd5b506109cb60048036038101906109c69190613e6a565b611d38565b005b3480156109d8575f80fd5b506109f360048036038101906109ee9190613880565b611d93565b005b348015610a00575f80fd5b50610a09611e04565b604051610a1691906134ef565b60405180910390f35b348015610a2a575f80fd5b50610a456004803603810190610a409190613be1565b611e16565b005b348015610a52575f80fd5b50610a6d6004803603810190610a689190613e95565b611e9a565b604051610a7a9190613c5e565b60405180910390f35b348015610a8e575f80fd5b50610a97611f47565b604051610aa49190613ccb565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610aec611f4e565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990613f43565b60405180910390fd5b5f60015f8861ffff1661ffff1681526020019081526020015f208054610b6790613f8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9390613f8e565b8015610bde5780601f10610bb557610100808354040283529160200191610bde565b820191905f5260205f20905b815481529060010190602001808311610bc157829003601f168201915b50505050509050805186869050148015610bf857505f8151115b8015610c21575080805190602001208686604051610c17929190613fec565b6040518091039020145b610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790614074565b60405180910390fd5b610cf28787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611f55565b50505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610da557507f36372b07000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610db55750610db48261201f565b5b9050919050565b6060600a8054610dcb90613f8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610df790613f8e565b8015610e425780601f10610e1957610100808354040283529160200191610e42565b820191905f5260205f20905b815481529060010190602001808311610e2557829003601f168201915b5050505050905090565b610e54612098565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610ead91906138ec565b5f604051808303815f87803b158015610ec4575f80fd5b505af1158015610ed6573d5f803e3d5ffd5b5050505050565b5f80610ee7611f4e565b9050610ef481858561211f565b600191505092915050565b610f07612098565b8060035f8461ffff1661ffff1681526020019081526020015f20819055505050565b610f31612098565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610f8a91906138ec565b5f604051808303815f87803b158015610fa1575f80fd5b505af1158015610fb3573d5f803e3d5ffd5b5050505050565b5f600954905090565b5f80610fcd611f4e565b9050610fda8582856122e2565b610fe585858561236d565b60019150509392505050565b5f805f8089898960405160200161100b94939291906140be565b60405160208183030381529060405290507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340a7bb108b30848a8a8a6040518763ffffffff1660e01b815260040161107f969594939291906140fc565b6040805180830381865afa158015611099573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bd9190614171565b925092505097509795505050505050565b5f6012905090565b5f806110e0611f4e565b90506111018185856110f28589611c39565b6110fc91906141dc565b61211f565b600191505092915050565b5f8060015f8661ffff1661ffff1681526020019081526020015f20805461113290613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461115e90613f8e565b80156111a95780601f10611180576101008083540402835291602001916111a9565b820191905f5260205f20905b81548152906001019060200180831161118c57829003601f168201915b5050505050905083836040516111c0929190613fec565b60405180910390208180519060200120149150509392505050565b6003602052805f5260405f205f915090505481565b6111f8612098565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b81526004016112559392919061420f565b5f604051808303815f87803b15801561126c575f80fd5b505af115801561127e573d5f803e3d5ffd5b50505050505050565b5f81565b5f81565b611324898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505088888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506125e5565b505050505050505050565b6005602052825f5260405f2082805160208101820180518482526020830160208501208183528095505050505050602052805f5260405f205f9250925050505481565b3073ffffffffffffffffffffffffffffffffffffffff16611391611f4e565b73ffffffffffffffffffffffffffffffffffffffff16146113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de906142af565b60405180910390fd5b6114798686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612695565b505050505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6114cf612098565b6114d85f6126ff565b565b6001602052805f5260405f205f9150905080546114f690613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461152290613f8e565b801561156d5780601f106115445761010080835404028352916020019161156d565b820191905f5260205f20905b81548152906001019060200180831161155057829003601f168201915b505050505081565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6115c5610fba565b905090565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b80546115fe90613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461162a90613f8e565b80156116755780601f1061164c57610100808354040283529160200191611675565b820191905f5260205f20905b81548152906001019060200180831161165857829003601f168201915b5050505050905090565b60605f60015f8461ffff1661ffff1681526020019081526020015f2080546116a690613f8e565b80601f01602080910402602001604051908101604052809291908181526020018280546116d290613f8e565b801561171d5780601f106116f45761010080835404028352916020019161171d565b820191905f5260205f20905b81548152906001019060200180831161170057829003601f168201915b505050505090505f815103611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90614317565b60405180910390fd5b6117895f601483516117799190614335565b836127c09092919063ffffffff16565b915050919050565b5f8061179b611f4e565b90505f6117a88286611c39565b9050838110156117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e4906143d8565b60405180910390fd5b6117fa828686840361211f565b60019250505092915050565b61180e612098565b8181306040516020016118239392919061443b565b60405160208183030381529060405260015f8561ffff1661ffff1681526020019081526020015f20908161185791906145f8565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161188b9392919061420f565b60405180910390a1505050565b5f806118a2611f4e565b90506118af81858561236d565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6118e6612098565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b816040516119559190613ccb565b60405180910390a150565b61271081565b61196e612098565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016119cf9594939291906146c7565b5f604051808303815f87803b1580156119e6575f80fd5b505af11580156119f8573d5f803e3d5ffd5b505050505050505050565b5f60055f8861ffff1661ffff1681526020019081526020015f208686604051611a2d929190613fec565b90815260200160405180910390205f8567ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205490505f801b8103611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90614783565b60405180910390fd5b808383604051611ab6929190613fec565b604051809103902014611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590614811565b60405180910390fd5b5f801b60055f8961ffff1661ffff1681526020019081526020015f208787604051611b2a929190613fec565b90815260200160405180910390205f8667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f2081905550611bf18787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612695565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611c2895949392919061483e565b60405180910390a150505050505050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611cc3612098565b8060025f8561ffff1661ffff1681526020019081526020015f205f8461ffff1661ffff1681526020019081526020015f20819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0838383604051611d2b9392919061488a565b60405180910390a1505050565b611d40612098565b8060065f6101000a81548160ff0219169083151502179055507f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a481604051611d8891906134ef565b60405180910390a150565b611d9b612098565b818160015f8661ffff1661ffff1681526020019081526020015f209182611dc39291906148c9565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611df79392919061420f565b60405180910390a1505050565b60065f9054906101000a900460ff1681565b611e1e612098565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e8e575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611e859190613ccb565b60405180910390fd5b611e97816126ff565b50565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401611efb9493929190614996565b5f60405180830381865afa158015611f15573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f3d9190614a47565b9050949350505050565b5f30905090565b5f33905090565b5f806120005a60966366ad5c8a60e01b89898989604051602401611f7c9493929190614a8e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff166128dc909392919063ffffffff16565b915091508161201757612016868686868561296e565b5b505050505050565b5f7f14e4ceea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612091575061209082612a18565b5b9050919050565b6120a0611f4e565b73ffffffffffffffffffffffffffffffffffffffff166120be611595565b73ffffffffffffffffffffffffffffffffffffffff161461211d576120e1611f4e565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121149190613ccb565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361218d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218490614b4f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f290614bdd565b60405180910390fd5b8060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516122d591906136db565b60405180910390a3505050565b5f6122ed8484611c39565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146123675781811015612359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235090614c45565b60405180910390fd5b612366848484840361211f565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d290614cd3565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244090614d61565b60405180910390fd5b612454838383612a81565b5f60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf90614def565b60405180910390fd5b81810360075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461256891906141dc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125cc91906136db565b60405180910390a36125df848484612a86565b50505050565b6125f1865f835f612a8b565b5f6125fe88888888612afa565b90505f80878360405160200161261693929190614e0d565b6040516020818303038152906040529050612635888287878734612b5b565b8873ffffffffffffffffffffffffffffffffffffffff168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08985604051612682929190614e49565b60405180910390a3505050505050505050565b5f602082015190505f61ffff168161ffff16036126bd576126b885858585612ce7565b6126f8565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef90614ec1565b60405180910390fd5b5050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606081601f836127d091906141dc565b1015612811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280890614f29565b60405180910390fd5b818361281d91906141dc565b84511015612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790614f91565b60405180910390fd5b606082155f811461287f5760405191505f8252602082016040526128d0565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156128bd57805183526020830192506020810190506128a0565b50868552601f19601f8301166040525050505b50809150509392505050565b5f60605f805f8661ffff1667ffffffffffffffff811115612900576128ff613a20565b5b6040519080825280601f01601f1916602001820160405280156129325781602001600182028036833780820191505090505b5090505f808751602089015f8d8df191503d925086831115612952578692505b828152825f602083013e81819450945050505094509492505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f208560405161299d9190614fdf565b90815260200160405180910390205f8567ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f20819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c8585858585604051612a09959493929190614ff5565b60405180910390a15050505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b505050565b60065f9054906101000a900460ff1615612ab057612aab84848484612d81565b612af4565b5f825114612af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aea906150cb565b60405180910390fd5b5b50505050565b5f80612b04611f4e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612b4557612b448682856122e2565b5b612b4f8684612e59565b82915050949350505050565b5f60015f8861ffff1661ffff1681526020019081526020015f208054612b8090613f8e565b80601f0160208091040260200160405190810160405280929190818152602001828054612bac90613f8e565b8015612bf75780601f10612bce57610100808354040283529160200191612bf7565b820191905f5260205f20905b815481529060010190602001808311612bda57829003601f168201915b505050505090505f815103612c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3890615159565b60405180910390fd5b612c4c878751613027565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b8152600401612cb096959493929190615186565b5f604051808303818588803b158015612cc7575f80fd5b505af1158015612cd9573d5f803e3d5ffd5b505050505050505050505050565b5f8082806020019051810190612cfd919061520e565b92509250505f612d165f8461309990919063ffffffff16565b9050612d2387828461310d565b91508073ffffffffffffffffffffffffffffffffffffffff168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf84604051612d7091906136db565b60405180910390a350505050505050565b5f612d8b83613122565b90505f60025f8761ffff1661ffff1681526020019081526020015f205f8661ffff1661ffff1681526020019081526020015f205490505f8111612e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfa906152c4565b60405180910390fd5b8281612e0f91906141dc565b821015612e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e489061532c565b60405180910390fd5b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebe906153ba565b60405180910390fd5b612ed2825f83612a81565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4d90615448565b60405180910390fd5b81810360075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160095f828254612fab9190614335565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161300f91906136db565b60405180910390a3613022835f84612a86565b505050565b5f60035f8461ffff1661ffff1681526020019081526020015f205490505f81036130515761271090505b80821115613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308b906154b0565b60405180910390fd5b505050565b5f6014826130a791906141dc565b835110156130ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e190615518565b60405180910390fd5b5f6c01000000000000000000000000836020860101510490508091505092915050565b5f6131188383613174565b8190509392505050565b5f602282511015613168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315f90615580565b60405180910390fd5b60228201519050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d9906155e8565b60405180910390fd5b6131ed5f8383612a81565b8060095f8282546131fe91906141dc565b925050819055508060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461325191906141dc565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516132b591906136db565b60405180910390a36132c85f8383612a86565b5050565b5f604051905090565b5f80fd5b5f80fd5b5f61ffff82169050919050565b6132f3816132dd565b81146132fd575f80fd5b50565b5f8135905061330e816132ea565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261333557613334613314565b5b8235905067ffffffffffffffff81111561335257613351613318565b5b60208301915083600182028301111561336e5761336d61331c565b5b9250929050565b5f67ffffffffffffffff82169050919050565b61339181613375565b811461339b575f80fd5b50565b5f813590506133ac81613388565b92915050565b5f805f805f80608087890312156133cc576133cb6132d5565b5b5f6133d989828a01613300565b965050602087013567ffffffffffffffff8111156133fa576133f96132d9565b5b61340689828a01613320565b9550955050604061341989828a0161339e565b935050606087013567ffffffffffffffff81111561343a576134396132d9565b5b61344689828a01613320565b92509250509295509295509295565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61348981613455565b8114613493575f80fd5b50565b5f813590506134a481613480565b92915050565b5f602082840312156134bf576134be6132d5565b5b5f6134cc84828501613496565b91505092915050565b5f8115159050919050565b6134e9816134d5565b82525050565b5f6020820190506135025f8301846134e0565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61354a82613508565b6135548185613512565b9350613564818560208601613522565b61356d81613530565b840191505092915050565b5f6020820190508181035f8301526135908184613540565b905092915050565b5f602082840312156135ad576135ac6132d5565b5b5f6135ba84828501613300565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6135ec826135c3565b9050919050565b6135fc816135e2565b8114613606575f80fd5b50565b5f81359050613617816135f3565b92915050565b5f819050919050565b61362f8161361d565b8114613639575f80fd5b50565b5f8135905061364a81613626565b92915050565b5f8060408385031215613666576136656132d5565b5b5f61367385828601613609565b92505060206136848582860161363c565b9150509250929050565b5f80604083850312156136a4576136a36132d5565b5b5f6136b185828601613300565b92505060206136c28582860161363c565b9150509250929050565b6136d58161361d565b82525050565b5f6020820190506136ee5f8301846136cc565b92915050565b5f805f6060848603121561370b5761370a6132d5565b5b5f61371886828701613609565b935050602061372986828701613609565b925050604061373a8682870161363c565b9150509250925092565b61374d816134d5565b8114613757575f80fd5b50565b5f8135905061376881613744565b92915050565b5f805f805f805f60a0888a031215613789576137886132d5565b5b5f6137968a828b01613300565b975050602088013567ffffffffffffffff8111156137b7576137b66132d9565b5b6137c38a828b01613320565b965096505060406137d68a828b0161363c565b94505060606137e78a828b0161375a565b935050608088013567ffffffffffffffff811115613808576138076132d9565b5b6138148a828b01613320565b925092505092959891949750929550565b5f6040820190506138385f8301856136cc565b61384560208301846136cc565b9392505050565b5f60ff82169050919050565b6138618161384c565b82525050565b5f60208201905061387a5f830184613858565b92915050565b5f805f60408486031215613897576138966132d5565b5b5f6138a486828701613300565b935050602084013567ffffffffffffffff8111156138c5576138c46132d9565b5b6138d186828701613320565b92509250509250925092565b6138e6816132dd565b82525050565b5f6020820190506138ff5f8301846138dd565b92915050565b5f61390f826135c3565b9050919050565b61391f81613905565b8114613929575f80fd5b50565b5f8135905061393a81613916565b92915050565b5f805f805f805f805f60e08a8c03121561395d5761395c6132d5565b5b5f61396a8c828d01613609565b995050602061397b8c828d01613300565b98505060408a013567ffffffffffffffff81111561399c5761399b6132d9565b5b6139a88c828d01613320565b975097505060606139bb8c828d0161363c565b95505060806139cc8c828d0161392c565b94505060a06139dd8c828d01613609565b93505060c08a013567ffffffffffffffff8111156139fe576139fd6132d9565b5b613a0a8c828d01613320565b92509250509295985092959850929598565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613a5682613530565b810181811067ffffffffffffffff82111715613a7557613a74613a20565b5b80604052505050565b5f613a876132cc565b9050613a938282613a4d565b919050565b5f67ffffffffffffffff821115613ab257613ab1613a20565b5b613abb82613530565b9050602081019050919050565b828183375f83830152505050565b5f613ae8613ae384613a98565b613a7e565b905082815260208101848484011115613b0457613b03613a1c565b5b613b0f848285613ac8565b509392505050565b5f82601f830112613b2b57613b2a613314565b5b8135613b3b848260208601613ad6565b91505092915050565b5f805f60608486031215613b5b57613b5a6132d5565b5b5f613b6886828701613300565b935050602084013567ffffffffffffffff811115613b8957613b886132d9565b5b613b9586828701613b17565b9250506040613ba68682870161339e565b9150509250925092565b5f819050919050565b613bc281613bb0565b82525050565b5f602082019050613bdb5f830184613bb9565b92915050565b5f60208284031215613bf657613bf56132d5565b5b5f613c0384828501613609565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f613c3082613c0c565b613c3a8185613c16565b9350613c4a818560208601613522565b613c5381613530565b840191505092915050565b5f6020820190508181035f830152613c768184613c26565b905092915050565b5f8060408385031215613c9457613c936132d5565b5b5f613ca185828601613300565b9250506020613cb285828601613300565b9150509250929050565b613cc5816135e2565b82525050565b5f602082019050613cde5f830184613cbc565b92915050565b5f819050919050565b5f613d07613d02613cfd846135c3565b613ce4565b6135c3565b9050919050565b5f613d1882613ced565b9050919050565b5f613d2982613d0e565b9050919050565b613d3981613d1f565b82525050565b5f602082019050613d525f830184613d30565b92915050565b5f805f805f60808688031215613d7157613d706132d5565b5b5f613d7e88828901613300565b9550506020613d8f88828901613300565b9450506040613da08882890161363c565b935050606086013567ffffffffffffffff811115613dc157613dc06132d9565b5b613dcd88828901613320565b92509250509295509295909350565b5f8060408385031215613df257613df16132d5565b5b5f613dff85828601613609565b9250506020613e1085828601613609565b9150509250929050565b5f805f60608486031215613e3157613e306132d5565b5b5f613e3e86828701613300565b9350506020613e4f86828701613300565b9250506040613e608682870161363c565b9150509250925092565b5f60208284031215613e7f57613e7e6132d5565b5b5f613e8c8482850161375a565b91505092915050565b5f805f8060808587031215613ead57613eac6132d5565b5b5f613eba87828801613300565b9450506020613ecb87828801613300565b9350506040613edc87828801613609565b9250506060613eed8782880161363c565b91505092959194509250565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c657200005f82015250565b5f613f2d601e83613512565b9150613f3882613ef9565b602082019050919050565b5f6020820190508181035f830152613f5a81613f21565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613fa557607f821691505b602082108103613fb857613fb7613f61565b5b50919050565b5f81905092915050565b5f613fd38385613fbe565b9350613fe0838584613ac8565b82840190509392505050565b5f613ff8828486613fc8565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f61405e602683613512565b915061406982614004565b604082019050919050565b5f6020820190508181035f83015261408b81614052565b9050919050565b5f61409d8385613c16565b93506140aa838584613ac8565b6140b383613530565b840190509392505050565b5f6060820190506140d15f8301876138dd565b81810360208301526140e4818587614092565b90506140f360408301846136cc565b95945050505050565b5f60a08201905061410f5f8301896138dd565b61411c6020830188613cbc565b818103604083015261412e8187613c26565b905061413d60608301866134e0565b8181036080830152614150818486614092565b9050979650505050505050565b5f8151905061416b81613626565b92915050565b5f8060408385031215614187576141866132d5565b5b5f6141948582860161415d565b92505060206141a58582860161415d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141e68261361d565b91506141f18361361d565b9250828201905080821115614209576142086141af565b5b92915050565b5f6040820190506142225f8301866138dd565b8181036020830152614235818486614092565b9050949350505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062655f8201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b5f614299602683613512565b91506142a48261423f565b604082019050919050565b5f6020820190508181035f8301526142c68161428d565b9050919050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f72640000005f82015250565b5f614301601d83613512565b915061430c826142cd565b602082019050919050565b5f6020820190508181035f83015261432e816142f5565b9050919050565b5f61433f8261361d565b915061434a8361361d565b9250828203905081811115614362576143616141af565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6143c2602583613512565b91506143cd82614368565b604082019050919050565b5f6020820190508181035f8301526143ef816143b6565b9050919050565b5f8160601b9050919050565b5f61440c826143f6565b9050919050565b5f61441d82614402565b9050919050565b614435614430826135e2565b614413565b82525050565b5f614447828587613fc8565b91506144538284614424565b601482019150819050949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026144c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614485565b6144ca8683614485565b95508019841693508086168417925050509392505050565b5f6144fc6144f76144f28461361d565b613ce4565b61361d565b9050919050565b5f819050919050565b614515836144e2565b61452961452182614503565b848454614491565b825550505050565b5f90565b61453d614531565b61454881848461450c565b505050565b5b8181101561456b576145605f82614535565b60018101905061454e565b5050565b601f8211156145b05761458181614464565b61458a84614476565b81016020851015614599578190505b6145ad6145a585614476565b83018261454d565b50505b505050565b5f82821c905092915050565b5f6145d05f19846008026145b5565b1980831691505092915050565b5f6145e883836145c1565b9150826002028217905092915050565b61460182613c0c565b67ffffffffffffffff81111561461a57614619613a20565b5b6146248254613f8e565b61462f82828561456f565b5f60209050601f831160018114614660575f841561464e578287015190505b61465885826145dd565b8655506146bf565b601f19841661466e86614464565b5f5b8281101561469557848901518255600182019150602085019450602081019050614670565b868310156146b257848901516146ae601f8916826145c1565b8355505b6001600288020188555050505b505050505050565b5f6080820190506146da5f8301886138dd565b6146e760208301876138dd565b6146f460408301866136cc565b8181036060830152614707818486614092565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d6573735f8201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b5f61476d602383613512565b915061477882614713565b604082019050919050565b5f6020820190508181035f83015261479a81614761565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f615f8201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b5f6147fb602183613512565b9150614806826147a1565b604082019050919050565b5f6020820190508181035f830152614828816147ef565b9050919050565b61483881613375565b82525050565b5f6080820190506148515f8301886138dd565b8181036020830152614864818688614092565b9050614873604083018561482f565b6148806060830184613bb9565b9695505050505050565b5f60608201905061489d5f8301866138dd565b6148aa60208301856138dd565b6148b760408301846136cc565b949350505050565b5f82905092915050565b6148d383836148bf565b67ffffffffffffffff8111156148ec576148eb613a20565b5b6148f68254613f8e565b61490182828561456f565b5f601f83116001811461492e575f841561491c578287013590505b61492685826145dd565b86555061498d565b601f19841661493c86614464565b5f5b828110156149635784890135825560018201915060208501945060208101905061493e565b86831015614980578489013561497c601f8916826145c1565b8355505b6001600288020188555050505b50505050505050565b5f6080820190506149a95f8301876138dd565b6149b660208301866138dd565b6149c36040830185613cbc565b6149d060608301846136cc565b95945050505050565b5f6149eb6149e684613a98565b613a7e565b905082815260208101848484011115614a0757614a06613a1c565b5b614a12848285613522565b509392505050565b5f82601f830112614a2e57614a2d613314565b5b8151614a3e8482602086016149d9565b91505092915050565b5f60208284031215614a5c57614a5b6132d5565b5b5f82015167ffffffffffffffff811115614a7957614a786132d9565b5b614a8584828501614a1a565b91505092915050565b5f608082019050614aa15f8301876138dd565b8181036020830152614ab38186613c26565b9050614ac2604083018561482f565b8181036060830152614ad48184613c26565b905095945050505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614b39602483613512565b9150614b4482614adf565b604082019050919050565b5f6020820190508181035f830152614b6681614b2d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f614bc7602283613512565b9150614bd282614b6d565b604082019050919050565b5f6020820190508181035f830152614bf481614bbb565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f614c2f601d83613512565b9150614c3a82614bfb565b602082019050919050565b5f6020820190508181035f830152614c5c81614c23565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614cbd602583613512565b9150614cc882614c63565b604082019050919050565b5f6020820190508181035f830152614cea81614cb1565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614d4b602383613512565b9150614d5682614cf1565b604082019050919050565b5f6020820190508181035f830152614d7881614d3f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614dd9602683613512565b9150614de482614d7f565b604082019050919050565b5f6020820190508181035f830152614e0681614dcd565b9050919050565b5f606082019050614e205f8301866138dd565b8181036020830152614e328185613c26565b9050614e4160408301846136cc565b949350505050565b5f6040820190508181035f830152614e618185613c26565b9050614e7060208301846136cc565b9392505050565b7f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000005f82015250565b5f614eab601c83613512565b9150614eb682614e77565b602082019050919050565b5f6020820190508181035f830152614ed881614e9f565b9050919050565b7f736c6963655f6f766572666c6f770000000000000000000000000000000000005f82015250565b5f614f13600e83613512565b9150614f1e82614edf565b602082019050919050565b5f6020820190508181035f830152614f4081614f07565b9050919050565b7f736c6963655f6f75744f66426f756e64730000000000000000000000000000005f82015250565b5f614f7b601183613512565b9150614f8682614f47565b602082019050919050565b5f6020820190508181035f830152614fa881614f6f565b9050919050565b5f614fb982613c0c565b614fc38185613fbe565b9350614fd3818560208601613522565b80840191505092915050565b5f614fea8284614faf565b915081905092915050565b5f60a0820190506150085f8301886138dd565b818103602083015261501a8187613c26565b9050615029604083018661482f565b818103606083015261503b8185613c26565b9050818103608083015261504f8184613c26565b90509695505050505050565b7f4f4654436f72653a205f61646170746572506172616d73206d757374206265205f8201527f656d7074792e0000000000000000000000000000000000000000000000000000602082015250565b5f6150b5602683613512565b91506150c08261505b565b604082019050919050565b5f6020820190508181035f8301526150e2816150a9565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f74205f8201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b5f615143603083613512565b915061514e826150e9565b604082019050919050565b5f6020820190508181035f83015261517081615137565b9050919050565b61518081613905565b82525050565b5f60c0820190506151995f8301896138dd565b81810360208301526151ab8188613c26565b905081810360408301526151bf8187613c26565b90506151ce6060830186615177565b6151db6080830185613cbc565b81810360a08301526151ed8184613c26565b9050979650505050505050565b5f81519050615208816132ea565b92915050565b5f805f60608486031215615225576152246132d5565b5b5f615232868287016151fa565b935050602084015167ffffffffffffffff811115615253576152526132d9565b5b61525f86828701614a1a565b92505060406152708682870161415d565b9150509250925092565b7f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000005f82015250565b5f6152ae601a83613512565b91506152b98261527a565b602082019050919050565b5f6020820190508181035f8301526152db816152a2565b9050919050565b7f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000005f82015250565b5f615316601b83613512565b9150615321826152e2565b602082019050919050565b5f6020820190508181035f8301526153438161530a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6153a4602183613512565b91506153af8261534a565b604082019050919050565b5f6020820190508181035f8301526153d181615398565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f615432602283613512565b915061543d826153d8565b604082019050919050565b5f6020820190508181035f83015261545f81615426565b9050919050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267655f82015250565b5f61549a602083613512565b91506154a582615466565b602082019050919050565b5f6020820190508181035f8301526154c78161548e565b9050919050565b7f746f416464726573735f6f75744f66426f756e647300000000000000000000005f82015250565b5f615502601583613512565b915061550d826154ce565b602082019050919050565b5f6020820190508181035f83015261552f816154f6565b9050919050565b7f4c7a4170703a20696e76616c69642061646170746572506172616d73000000005f82015250565b5f61556a601c83613512565b915061557582615536565b602082019050919050565b5f6020820190508181035f8301526155978161555e565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6155d2601f83613512565b91506155dd8261559e565b602082019050919050565b5f6020820190508181035f8301526155ff816155c6565b905091905056fea264697066735822122048a15146ea5aac39a426bdc0e6b8c1f4b8fdb8015bee85c2fd931ea24fbcfd6664736f6c63430008190033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b000000000000000000000000000000000000000000000000000000000000000a4c4541524e746f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054c4541524e000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405260043610610270575f3560e01c80637533d7881161014e578063baf3292d116100c0578063eab45d9c11610079578063eab45d9c146109a5578063eb8d72b7146109cd578063ed629c5c146109f5578063f2fde38b14610a1f578063f5ecbdbc14610a47578063fc0c546a14610a8357610270565b8063baf3292d146108ab578063c4461834146108d3578063cbed8b9c146108fd578063d1deba1f14610925578063dd62ed3e14610941578063df2a5b3b1461097d57610270565b806395d89b411161011257806395d89b411461077b5780639f38369a146107a5578063a457c2d7146107e1578063a6c3d1651461081d578063a9059cbb14610845578063b353aaa71461088157610270565b80637533d788146106855780638cfd8f5c146106c15780638da5cb5b146106fd5780639358928b14610727578063950c8a741461075157610270565b806339509351116101e75780634c42899a116101ab5780634c42899a1461058957806351905636146105b35780635b8c41e6146105cf57806366ad5c8a1461060b57806370a0823114610633578063715018a61461066f57610270565b806339509351146104835780633d8b38f6146104bf5780633f1f4fa4146104fb57806342d65a8d14610537578063447705151461055f57610270565b80630df37483116102395780630df374831461036657806310ddb1371461038e57806318160ddd146103b657806323b872dd146103e05780632a205e3d1461041c578063313ce5671461045957610270565b80621d35671461027457806301ffc9a71461029c57806306fdde03146102d857806307e0db1714610302578063095ea7b31461032a575b5f80fd5b34801561027f575f80fd5b5061029a600480360381019061029591906133b2565b610aad565b005b3480156102a7575f80fd5b506102c260048036038101906102bd91906134aa565b610cfb565b6040516102cf91906134ef565b60405180910390f35b3480156102e3575f80fd5b506102ec610dbc565b6040516102f99190613578565b60405180910390f35b34801561030d575f80fd5b5061032860048036038101906103239190613598565b610e4c565b005b348015610335575f80fd5b50610350600480360381019061034b9190613650565b610edd565b60405161035d91906134ef565b60405180910390f35b348015610371575f80fd5b5061038c6004803603810190610387919061368e565b610eff565b005b348015610399575f80fd5b506103b460048036038101906103af9190613598565b610f29565b005b3480156103c1575f80fd5b506103ca610fba565b6040516103d791906136db565b60405180910390f35b3480156103eb575f80fd5b50610406600480360381019061040191906136f4565b610fc3565b60405161041391906134ef565b60405180910390f35b348015610427575f80fd5b50610442600480360381019061043d919061376e565b610ff1565b604051610450929190613825565b60405180910390f35b348015610464575f80fd5b5061046d6110ce565b60405161047a9190613867565b60405180910390f35b34801561048e575f80fd5b506104a960048036038101906104a49190613650565b6110d6565b6040516104b691906134ef565b60405180910390f35b3480156104ca575f80fd5b506104e560048036038101906104e09190613880565b61110c565b6040516104f291906134ef565b60405180910390f35b348015610506575f80fd5b50610521600480360381019061051c9190613598565b6111db565b60405161052e91906136db565b60405180910390f35b348015610542575f80fd5b5061055d60048036038101906105589190613880565b6111f0565b005b34801561056a575f80fd5b50610573611287565b60405161058091906136db565b60405180910390f35b348015610594575f80fd5b5061059d61128b565b6040516105aa91906138ec565b60405180910390f35b6105cd60048036038101906105c89190613940565b61128f565b005b3480156105da575f80fd5b506105f560048036038101906105f09190613b44565b61132f565b6040516106029190613bc8565b60405180910390f35b348015610616575f80fd5b50610631600480360381019061062c91906133b2565b611372565b005b34801561063e575f80fd5b5061065960048036038101906106549190613be1565b611481565b60405161066691906136db565b60405180910390f35b34801561067a575f80fd5b506106836114c7565b005b348015610690575f80fd5b506106ab60048036038101906106a69190613598565b6114da565b6040516106b89190613c5e565b60405180910390f35b3480156106cc575f80fd5b506106e760048036038101906106e29190613c7e565b611575565b6040516106f491906136db565b60405180910390f35b348015610708575f80fd5b50610711611595565b60405161071e9190613ccb565b60405180910390f35b348015610732575f80fd5b5061073b6115bc565b60405161074891906136db565b60405180910390f35b34801561075c575f80fd5b506107656115ca565b6040516107729190613ccb565b60405180910390f35b348015610786575f80fd5b5061078f6115ef565b60405161079c9190613578565b60405180910390f35b3480156107b0575f80fd5b506107cb60048036038101906107c69190613598565b61167f565b6040516107d89190613c5e565b60405180910390f35b3480156107ec575f80fd5b5061080760048036038101906108029190613650565b611791565b60405161081491906134ef565b60405180910390f35b348015610828575f80fd5b50610843600480360381019061083e9190613880565b611806565b005b348015610850575f80fd5b5061086b60048036038101906108669190613650565b611898565b60405161087891906134ef565b60405180910390f35b34801561088c575f80fd5b506108956118ba565b6040516108a29190613d3f565b60405180910390f35b3480156108b6575f80fd5b506108d160048036038101906108cc9190613be1565b6118de565b005b3480156108de575f80fd5b506108e7611960565b6040516108f491906136db565b60405180910390f35b348015610908575f80fd5b50610923600480360381019061091e9190613d58565b611966565b005b61093f600480360381019061093a91906133b2565b611a03565b005b34801561094c575f80fd5b5061096760048036038101906109629190613ddc565b611c39565b60405161097491906136db565b60405180910390f35b348015610988575f80fd5b506109a3600480360381019061099e9190613e1a565b611cbb565b005b3480156109b0575f80fd5b506109cb60048036038101906109c69190613e6a565b611d38565b005b3480156109d8575f80fd5b506109f360048036038101906109ee9190613880565b611d93565b005b348015610a00575f80fd5b50610a09611e04565b604051610a1691906134ef565b60405180910390f35b348015610a2a575f80fd5b50610a456004803603810190610a409190613be1565b611e16565b005b348015610a52575f80fd5b50610a6d6004803603810190610a689190613e95565b611e9a565b604051610a7a9190613c5e565b60405180910390f35b348015610a8e575f80fd5b50610a97611f47565b604051610aa49190613ccb565b60405180910390f35b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff16610aec611f4e565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990613f43565b60405180910390fd5b5f60015f8861ffff1661ffff1681526020019081526020015f208054610b6790613f8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9390613f8e565b8015610bde5780601f10610bb557610100808354040283529160200191610bde565b820191905f5260205f20905b815481529060010190602001808311610bc157829003601f168201915b50505050509050805186869050148015610bf857505f8151115b8015610c21575080805190602001208686604051610c17929190613fec565b6040518091039020145b610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790614074565b60405180910390fd5b610cf28787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611f55565b50505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610da557507f36372b07000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610db55750610db48261201f565b5b9050919050565b6060600a8054610dcb90613f8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610df790613f8e565b8015610e425780601f10610e1957610100808354040283529160200191610e42565b820191905f5260205f20905b815481529060010190602001808311610e2557829003601f168201915b5050505050905090565b610e54612098565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610ead91906138ec565b5f604051808303815f87803b158015610ec4575f80fd5b505af1158015610ed6573d5f803e3d5ffd5b5050505050565b5f80610ee7611f4e565b9050610ef481858561211f565b600191505092915050565b610f07612098565b8060035f8461ffff1661ffff1681526020019081526020015f20819055505050565b610f31612098565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610f8a91906138ec565b5f604051808303815f87803b158015610fa1575f80fd5b505af1158015610fb3573d5f803e3d5ffd5b5050505050565b5f600954905090565b5f80610fcd611f4e565b9050610fda8582856122e2565b610fe585858561236d565b60019150509392505050565b5f805f8089898960405160200161100b94939291906140be565b60405160208183030381529060405290507f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff166340a7bb108b30848a8a8a6040518763ffffffff1660e01b815260040161107f969594939291906140fc565b6040805180830381865afa158015611099573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bd9190614171565b925092505097509795505050505050565b5f6012905090565b5f806110e0611f4e565b90506111018185856110f28589611c39565b6110fc91906141dc565b61211f565b600191505092915050565b5f8060015f8661ffff1661ffff1681526020019081526020015f20805461113290613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461115e90613f8e565b80156111a95780601f10611180576101008083540402835291602001916111a9565b820191905f5260205f20905b81548152906001019060200180831161118c57829003601f168201915b5050505050905083836040516111c0929190613fec565b60405180910390208180519060200120149150509392505050565b6003602052805f5260405f205f915090505481565b6111f8612098565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b81526004016112559392919061420f565b5f604051808303815f87803b15801561126c575f80fd5b505af115801561127e573d5f803e3d5ffd5b50505050505050565b5f81565b5f81565b611324898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505088888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506125e5565b505050505050505050565b6005602052825f5260405f2082805160208101820180518482526020830160208501208183528095505050505050602052805f5260405f205f9250925050505481565b3073ffffffffffffffffffffffffffffffffffffffff16611391611f4e565b73ffffffffffffffffffffffffffffffffffffffff16146113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de906142af565b60405180910390fd5b6114798686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612695565b505050505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6114cf612098565b6114d85f6126ff565b565b6001602052805f5260405f205f9150905080546114f690613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461152290613f8e565b801561156d5780601f106115445761010080835404028352916020019161156d565b820191905f5260205f20905b81548152906001019060200180831161155057829003601f168201915b505050505081565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6115c5610fba565b905090565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b80546115fe90613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461162a90613f8e565b80156116755780601f1061164c57610100808354040283529160200191611675565b820191905f5260205f20905b81548152906001019060200180831161165857829003601f168201915b5050505050905090565b60605f60015f8461ffff1661ffff1681526020019081526020015f2080546116a690613f8e565b80601f01602080910402602001604051908101604052809291908181526020018280546116d290613f8e565b801561171d5780601f106116f45761010080835404028352916020019161171d565b820191905f5260205f20905b81548152906001019060200180831161170057829003601f168201915b505050505090505f815103611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90614317565b60405180910390fd5b6117895f601483516117799190614335565b836127c09092919063ffffffff16565b915050919050565b5f8061179b611f4e565b90505f6117a88286611c39565b9050838110156117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e4906143d8565b60405180910390fd5b6117fa828686840361211f565b60019250505092915050565b61180e612098565b8181306040516020016118239392919061443b565b60405160208183030381529060405260015f8561ffff1661ffff1681526020019081526020015f20908161185791906145f8565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161188b9392919061420f565b60405180910390a1505050565b5f806118a2611f4e565b90506118af81858561236d565b600191505092915050565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b81565b6118e6612098565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b816040516119559190613ccb565b60405180910390a150565b61271081565b61196e612098565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016119cf9594939291906146c7565b5f604051808303815f87803b1580156119e6575f80fd5b505af11580156119f8573d5f803e3d5ffd5b505050505050505050565b5f60055f8861ffff1661ffff1681526020019081526020015f208686604051611a2d929190613fec565b90815260200160405180910390205f8567ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205490505f801b8103611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90614783565b60405180910390fd5b808383604051611ab6929190613fec565b604051809103902014611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590614811565b60405180910390fd5b5f801b60055f8961ffff1661ffff1681526020019081526020015f208787604051611b2a929190613fec565b90815260200160405180910390205f8667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f2081905550611bf18787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612695565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611c2895949392919061483e565b60405180910390a150505050505050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611cc3612098565b8060025f8561ffff1661ffff1681526020019081526020015f205f8461ffff1661ffff1681526020019081526020015f20819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0838383604051611d2b9392919061488a565b60405180910390a1505050565b611d40612098565b8060065f6101000a81548160ff0219169083151502179055507f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a481604051611d8891906134ef565b60405180910390a150565b611d9b612098565b818160015f8661ffff1661ffff1681526020019081526020015f209182611dc39291906148c9565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611df79392919061420f565b60405180910390a1505050565b60065f9054906101000a900460ff1681565b611e1e612098565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e8e575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611e859190613ccb565b60405180910390fd5b611e97816126ff565b50565b60607f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401611efb9493929190614996565b5f60405180830381865afa158015611f15573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f3d9190614a47565b9050949350505050565b5f30905090565b5f33905090565b5f806120005a60966366ad5c8a60e01b89898989604051602401611f7c9493929190614a8e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff166128dc909392919063ffffffff16565b915091508161201757612016868686868561296e565b5b505050505050565b5f7f14e4ceea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612091575061209082612a18565b5b9050919050565b6120a0611f4e565b73ffffffffffffffffffffffffffffffffffffffff166120be611595565b73ffffffffffffffffffffffffffffffffffffffff161461211d576120e1611f4e565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121149190613ccb565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361218d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218490614b4f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f290614bdd565b60405180910390fd5b8060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516122d591906136db565b60405180910390a3505050565b5f6122ed8484611c39565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146123675781811015612359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235090614c45565b60405180910390fd5b612366848484840361211f565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d290614cd3565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244090614d61565b60405180910390fd5b612454838383612a81565b5f60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf90614def565b60405180910390fd5b81810360075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461256891906141dc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125cc91906136db565b60405180910390a36125df848484612a86565b50505050565b6125f1865f835f612a8b565b5f6125fe88888888612afa565b90505f80878360405160200161261693929190614e0d565b6040516020818303038152906040529050612635888287878734612b5b565b8873ffffffffffffffffffffffffffffffffffffffff168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08985604051612682929190614e49565b60405180910390a3505050505050505050565b5f602082015190505f61ffff168161ffff16036126bd576126b885858585612ce7565b6126f8565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef90614ec1565b60405180910390fd5b5050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606081601f836127d091906141dc565b1015612811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280890614f29565b60405180910390fd5b818361281d91906141dc565b84511015612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790614f91565b60405180910390fd5b606082155f811461287f5760405191505f8252602082016040526128d0565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156128bd57805183526020830192506020810190506128a0565b50868552601f19601f8301166040525050505b50809150509392505050565b5f60605f805f8661ffff1667ffffffffffffffff811115612900576128ff613a20565b5b6040519080825280601f01601f1916602001820160405280156129325781602001600182028036833780820191505090505b5090505f808751602089015f8d8df191503d925086831115612952578692505b828152825f602083013e81819450945050505094509492505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f208560405161299d9190614fdf565b90815260200160405180910390205f8567ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f20819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c8585858585604051612a09959493929190614ff5565b60405180910390a15050505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b505050565b60065f9054906101000a900460ff1615612ab057612aab84848484612d81565b612af4565b5f825114612af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aea906150cb565b60405180910390fd5b5b50505050565b5f80612b04611f4e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612b4557612b448682856122e2565b5b612b4f8684612e59565b82915050949350505050565b5f60015f8861ffff1661ffff1681526020019081526020015f208054612b8090613f8e565b80601f0160208091040260200160405190810160405280929190818152602001828054612bac90613f8e565b8015612bf75780601f10612bce57610100808354040283529160200191612bf7565b820191905f5260205f20905b815481529060010190602001808311612bda57829003601f168201915b505050505090505f815103612c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3890615159565b60405180910390fd5b612c4c878751613027565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b73ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b8152600401612cb096959493929190615186565b5f604051808303818588803b158015612cc7575f80fd5b505af1158015612cd9573d5f803e3d5ffd5b505050505050505050505050565b5f8082806020019051810190612cfd919061520e565b92509250505f612d165f8461309990919063ffffffff16565b9050612d2387828461310d565b91508073ffffffffffffffffffffffffffffffffffffffff168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf84604051612d7091906136db565b60405180910390a350505050505050565b5f612d8b83613122565b90505f60025f8761ffff1661ffff1681526020019081526020015f205f8661ffff1661ffff1681526020019081526020015f205490505f8111612e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfa906152c4565b60405180910390fd5b8281612e0f91906141dc565b821015612e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e489061532c565b60405180910390fd5b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebe906153ba565b60405180910390fd5b612ed2825f83612a81565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4d90615448565b60405180910390fd5b81810360075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160095f828254612fab9190614335565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161300f91906136db565b60405180910390a3613022835f84612a86565b505050565b5f60035f8461ffff1661ffff1681526020019081526020015f205490505f81036130515761271090505b80821115613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308b906154b0565b60405180910390fd5b505050565b5f6014826130a791906141dc565b835110156130ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e190615518565b60405180910390fd5b5f6c01000000000000000000000000836020860101510490508091505092915050565b5f6131188383613174565b8190509392505050565b5f602282511015613168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315f90615580565b60405180910390fd5b60228201519050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d9906155e8565b60405180910390fd5b6131ed5f8383612a81565b8060095f8282546131fe91906141dc565b925050819055508060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461325191906141dc565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516132b591906136db565b60405180910390a36132c85f8383612a86565b5050565b5f604051905090565b5f80fd5b5f80fd5b5f61ffff82169050919050565b6132f3816132dd565b81146132fd575f80fd5b50565b5f8135905061330e816132ea565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261333557613334613314565b5b8235905067ffffffffffffffff81111561335257613351613318565b5b60208301915083600182028301111561336e5761336d61331c565b5b9250929050565b5f67ffffffffffffffff82169050919050565b61339181613375565b811461339b575f80fd5b50565b5f813590506133ac81613388565b92915050565b5f805f805f80608087890312156133cc576133cb6132d5565b5b5f6133d989828a01613300565b965050602087013567ffffffffffffffff8111156133fa576133f96132d9565b5b61340689828a01613320565b9550955050604061341989828a0161339e565b935050606087013567ffffffffffffffff81111561343a576134396132d9565b5b61344689828a01613320565b92509250509295509295509295565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61348981613455565b8114613493575f80fd5b50565b5f813590506134a481613480565b92915050565b5f602082840312156134bf576134be6132d5565b5b5f6134cc84828501613496565b91505092915050565b5f8115159050919050565b6134e9816134d5565b82525050565b5f6020820190506135025f8301846134e0565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61354a82613508565b6135548185613512565b9350613564818560208601613522565b61356d81613530565b840191505092915050565b5f6020820190508181035f8301526135908184613540565b905092915050565b5f602082840312156135ad576135ac6132d5565b5b5f6135ba84828501613300565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6135ec826135c3565b9050919050565b6135fc816135e2565b8114613606575f80fd5b50565b5f81359050613617816135f3565b92915050565b5f819050919050565b61362f8161361d565b8114613639575f80fd5b50565b5f8135905061364a81613626565b92915050565b5f8060408385031215613666576136656132d5565b5b5f61367385828601613609565b92505060206136848582860161363c565b9150509250929050565b5f80604083850312156136a4576136a36132d5565b5b5f6136b185828601613300565b92505060206136c28582860161363c565b9150509250929050565b6136d58161361d565b82525050565b5f6020820190506136ee5f8301846136cc565b92915050565b5f805f6060848603121561370b5761370a6132d5565b5b5f61371886828701613609565b935050602061372986828701613609565b925050604061373a8682870161363c565b9150509250925092565b61374d816134d5565b8114613757575f80fd5b50565b5f8135905061376881613744565b92915050565b5f805f805f805f60a0888a031215613789576137886132d5565b5b5f6137968a828b01613300565b975050602088013567ffffffffffffffff8111156137b7576137b66132d9565b5b6137c38a828b01613320565b965096505060406137d68a828b0161363c565b94505060606137e78a828b0161375a565b935050608088013567ffffffffffffffff811115613808576138076132d9565b5b6138148a828b01613320565b925092505092959891949750929550565b5f6040820190506138385f8301856136cc565b61384560208301846136cc565b9392505050565b5f60ff82169050919050565b6138618161384c565b82525050565b5f60208201905061387a5f830184613858565b92915050565b5f805f60408486031215613897576138966132d5565b5b5f6138a486828701613300565b935050602084013567ffffffffffffffff8111156138c5576138c46132d9565b5b6138d186828701613320565b92509250509250925092565b6138e6816132dd565b82525050565b5f6020820190506138ff5f8301846138dd565b92915050565b5f61390f826135c3565b9050919050565b61391f81613905565b8114613929575f80fd5b50565b5f8135905061393a81613916565b92915050565b5f805f805f805f805f60e08a8c03121561395d5761395c6132d5565b5b5f61396a8c828d01613609565b995050602061397b8c828d01613300565b98505060408a013567ffffffffffffffff81111561399c5761399b6132d9565b5b6139a88c828d01613320565b975097505060606139bb8c828d0161363c565b95505060806139cc8c828d0161392c565b94505060a06139dd8c828d01613609565b93505060c08a013567ffffffffffffffff8111156139fe576139fd6132d9565b5b613a0a8c828d01613320565b92509250509295985092959850929598565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613a5682613530565b810181811067ffffffffffffffff82111715613a7557613a74613a20565b5b80604052505050565b5f613a876132cc565b9050613a938282613a4d565b919050565b5f67ffffffffffffffff821115613ab257613ab1613a20565b5b613abb82613530565b9050602081019050919050565b828183375f83830152505050565b5f613ae8613ae384613a98565b613a7e565b905082815260208101848484011115613b0457613b03613a1c565b5b613b0f848285613ac8565b509392505050565b5f82601f830112613b2b57613b2a613314565b5b8135613b3b848260208601613ad6565b91505092915050565b5f805f60608486031215613b5b57613b5a6132d5565b5b5f613b6886828701613300565b935050602084013567ffffffffffffffff811115613b8957613b886132d9565b5b613b9586828701613b17565b9250506040613ba68682870161339e565b9150509250925092565b5f819050919050565b613bc281613bb0565b82525050565b5f602082019050613bdb5f830184613bb9565b92915050565b5f60208284031215613bf657613bf56132d5565b5b5f613c0384828501613609565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f613c3082613c0c565b613c3a8185613c16565b9350613c4a818560208601613522565b613c5381613530565b840191505092915050565b5f6020820190508181035f830152613c768184613c26565b905092915050565b5f8060408385031215613c9457613c936132d5565b5b5f613ca185828601613300565b9250506020613cb285828601613300565b9150509250929050565b613cc5816135e2565b82525050565b5f602082019050613cde5f830184613cbc565b92915050565b5f819050919050565b5f613d07613d02613cfd846135c3565b613ce4565b6135c3565b9050919050565b5f613d1882613ced565b9050919050565b5f613d2982613d0e565b9050919050565b613d3981613d1f565b82525050565b5f602082019050613d525f830184613d30565b92915050565b5f805f805f60808688031215613d7157613d706132d5565b5b5f613d7e88828901613300565b9550506020613d8f88828901613300565b9450506040613da08882890161363c565b935050606086013567ffffffffffffffff811115613dc157613dc06132d9565b5b613dcd88828901613320565b92509250509295509295909350565b5f8060408385031215613df257613df16132d5565b5b5f613dff85828601613609565b9250506020613e1085828601613609565b9150509250929050565b5f805f60608486031215613e3157613e306132d5565b5b5f613e3e86828701613300565b9350506020613e4f86828701613300565b9250506040613e608682870161363c565b9150509250925092565b5f60208284031215613e7f57613e7e6132d5565b5b5f613e8c8482850161375a565b91505092915050565b5f805f8060808587031215613ead57613eac6132d5565b5b5f613eba87828801613300565b9450506020613ecb87828801613300565b9350506040613edc87828801613609565b9250506060613eed8782880161363c565b91505092959194509250565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c657200005f82015250565b5f613f2d601e83613512565b9150613f3882613ef9565b602082019050919050565b5f6020820190508181035f830152613f5a81613f21565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613fa557607f821691505b602082108103613fb857613fb7613f61565b5b50919050565b5f81905092915050565b5f613fd38385613fbe565b9350613fe0838584613ac8565b82840190509392505050565b5f613ff8828486613fc8565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f61405e602683613512565b915061406982614004565b604082019050919050565b5f6020820190508181035f83015261408b81614052565b9050919050565b5f61409d8385613c16565b93506140aa838584613ac8565b6140b383613530565b840190509392505050565b5f6060820190506140d15f8301876138dd565b81810360208301526140e4818587614092565b90506140f360408301846136cc565b95945050505050565b5f60a08201905061410f5f8301896138dd565b61411c6020830188613cbc565b818103604083015261412e8187613c26565b905061413d60608301866134e0565b8181036080830152614150818486614092565b9050979650505050505050565b5f8151905061416b81613626565b92915050565b5f8060408385031215614187576141866132d5565b5b5f6141948582860161415d565b92505060206141a58582860161415d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141e68261361d565b91506141f18361361d565b9250828201905080821115614209576142086141af565b5b92915050565b5f6040820190506142225f8301866138dd565b8181036020830152614235818486614092565b9050949350505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062655f8201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b5f614299602683613512565b91506142a48261423f565b604082019050919050565b5f6020820190508181035f8301526142c68161428d565b9050919050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f72640000005f82015250565b5f614301601d83613512565b915061430c826142cd565b602082019050919050565b5f6020820190508181035f83015261432e816142f5565b9050919050565b5f61433f8261361d565b915061434a8361361d565b9250828203905081811115614362576143616141af565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6143c2602583613512565b91506143cd82614368565b604082019050919050565b5f6020820190508181035f8301526143ef816143b6565b9050919050565b5f8160601b9050919050565b5f61440c826143f6565b9050919050565b5f61441d82614402565b9050919050565b614435614430826135e2565b614413565b82525050565b5f614447828587613fc8565b91506144538284614424565b601482019150819050949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026144c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614485565b6144ca8683614485565b95508019841693508086168417925050509392505050565b5f6144fc6144f76144f28461361d565b613ce4565b61361d565b9050919050565b5f819050919050565b614515836144e2565b61452961452182614503565b848454614491565b825550505050565b5f90565b61453d614531565b61454881848461450c565b505050565b5b8181101561456b576145605f82614535565b60018101905061454e565b5050565b601f8211156145b05761458181614464565b61458a84614476565b81016020851015614599578190505b6145ad6145a585614476565b83018261454d565b50505b505050565b5f82821c905092915050565b5f6145d05f19846008026145b5565b1980831691505092915050565b5f6145e883836145c1565b9150826002028217905092915050565b61460182613c0c565b67ffffffffffffffff81111561461a57614619613a20565b5b6146248254613f8e565b61462f82828561456f565b5f60209050601f831160018114614660575f841561464e578287015190505b61465885826145dd565b8655506146bf565b601f19841661466e86614464565b5f5b8281101561469557848901518255600182019150602085019450602081019050614670565b868310156146b257848901516146ae601f8916826145c1565b8355505b6001600288020188555050505b505050505050565b5f6080820190506146da5f8301886138dd565b6146e760208301876138dd565b6146f460408301866136cc565b8181036060830152614707818486614092565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d6573735f8201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b5f61476d602383613512565b915061477882614713565b604082019050919050565b5f6020820190508181035f83015261479a81614761565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f615f8201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b5f6147fb602183613512565b9150614806826147a1565b604082019050919050565b5f6020820190508181035f830152614828816147ef565b9050919050565b61483881613375565b82525050565b5f6080820190506148515f8301886138dd565b8181036020830152614864818688614092565b9050614873604083018561482f565b6148806060830184613bb9565b9695505050505050565b5f60608201905061489d5f8301866138dd565b6148aa60208301856138dd565b6148b760408301846136cc565b949350505050565b5f82905092915050565b6148d383836148bf565b67ffffffffffffffff8111156148ec576148eb613a20565b5b6148f68254613f8e565b61490182828561456f565b5f601f83116001811461492e575f841561491c578287013590505b61492685826145dd565b86555061498d565b601f19841661493c86614464565b5f5b828110156149635784890135825560018201915060208501945060208101905061493e565b86831015614980578489013561497c601f8916826145c1565b8355505b6001600288020188555050505b50505050505050565b5f6080820190506149a95f8301876138dd565b6149b660208301866138dd565b6149c36040830185613cbc565b6149d060608301846136cc565b95945050505050565b5f6149eb6149e684613a98565b613a7e565b905082815260208101848484011115614a0757614a06613a1c565b5b614a12848285613522565b509392505050565b5f82601f830112614a2e57614a2d613314565b5b8151614a3e8482602086016149d9565b91505092915050565b5f60208284031215614a5c57614a5b6132d5565b5b5f82015167ffffffffffffffff811115614a7957614a786132d9565b5b614a8584828501614a1a565b91505092915050565b5f608082019050614aa15f8301876138dd565b8181036020830152614ab38186613c26565b9050614ac2604083018561482f565b8181036060830152614ad48184613c26565b905095945050505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614b39602483613512565b9150614b4482614adf565b604082019050919050565b5f6020820190508181035f830152614b6681614b2d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f614bc7602283613512565b9150614bd282614b6d565b604082019050919050565b5f6020820190508181035f830152614bf481614bbb565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f614c2f601d83613512565b9150614c3a82614bfb565b602082019050919050565b5f6020820190508181035f830152614c5c81614c23565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614cbd602583613512565b9150614cc882614c63565b604082019050919050565b5f6020820190508181035f830152614cea81614cb1565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614d4b602383613512565b9150614d5682614cf1565b604082019050919050565b5f6020820190508181035f830152614d7881614d3f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614dd9602683613512565b9150614de482614d7f565b604082019050919050565b5f6020820190508181035f830152614e0681614dcd565b9050919050565b5f606082019050614e205f8301866138dd565b8181036020830152614e328185613c26565b9050614e4160408301846136cc565b949350505050565b5f6040820190508181035f830152614e618185613c26565b9050614e7060208301846136cc565b9392505050565b7f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000005f82015250565b5f614eab601c83613512565b9150614eb682614e77565b602082019050919050565b5f6020820190508181035f830152614ed881614e9f565b9050919050565b7f736c6963655f6f766572666c6f770000000000000000000000000000000000005f82015250565b5f614f13600e83613512565b9150614f1e82614edf565b602082019050919050565b5f6020820190508181035f830152614f4081614f07565b9050919050565b7f736c6963655f6f75744f66426f756e64730000000000000000000000000000005f82015250565b5f614f7b601183613512565b9150614f8682614f47565b602082019050919050565b5f6020820190508181035f830152614fa881614f6f565b9050919050565b5f614fb982613c0c565b614fc38185613fbe565b9350614fd3818560208601613522565b80840191505092915050565b5f614fea8284614faf565b915081905092915050565b5f60a0820190506150085f8301886138dd565b818103602083015261501a8187613c26565b9050615029604083018661482f565b818103606083015261503b8185613c26565b9050818103608083015261504f8184613c26565b90509695505050505050565b7f4f4654436f72653a205f61646170746572506172616d73206d757374206265205f8201527f656d7074792e0000000000000000000000000000000000000000000000000000602082015250565b5f6150b5602683613512565b91506150c08261505b565b604082019050919050565b5f6020820190508181035f8301526150e2816150a9565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f74205f8201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b5f615143603083613512565b915061514e826150e9565b604082019050919050565b5f6020820190508181035f83015261517081615137565b9050919050565b61518081613905565b82525050565b5f60c0820190506151995f8301896138dd565b81810360208301526151ab8188613c26565b905081810360408301526151bf8187613c26565b90506151ce6060830186615177565b6151db6080830185613cbc565b81810360a08301526151ed8184613c26565b9050979650505050505050565b5f81519050615208816132ea565b92915050565b5f805f60608486031215615225576152246132d5565b5b5f615232868287016151fa565b935050602084015167ffffffffffffffff811115615253576152526132d9565b5b61525f86828701614a1a565b92505060406152708682870161415d565b9150509250925092565b7f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000005f82015250565b5f6152ae601a83613512565b91506152b98261527a565b602082019050919050565b5f6020820190508181035f8301526152db816152a2565b9050919050565b7f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000005f82015250565b5f615316601b83613512565b9150615321826152e2565b602082019050919050565b5f6020820190508181035f8301526153438161530a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6153a4602183613512565b91506153af8261534a565b604082019050919050565b5f6020820190508181035f8301526153d181615398565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f615432602283613512565b915061543d826153d8565b604082019050919050565b5f6020820190508181035f83015261545f81615426565b9050919050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267655f82015250565b5f61549a602083613512565b91506154a582615466565b602082019050919050565b5f6020820190508181035f8301526154c78161548e565b9050919050565b7f746f416464726573735f6f75744f66426f756e647300000000000000000000005f82015250565b5f615502601583613512565b915061550d826154ce565b602082019050919050565b5f6020820190508181035f83015261552f816154f6565b9050919050565b7f4c7a4170703a20696e76616c69642061646170746572506172616d73000000005f82015250565b5f61556a601c83613512565b915061557582615536565b602082019050919050565b5f6020820190508181035f8301526155978161555e565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6155d2601f83613512565b91506155dd8261559e565b602082019050919050565b5f6020820190508181035f8301526155ff816155c6565b905091905056fea264697066735822122048a15146ea5aac39a426bdc0e6b8c1f4b8fdb8015bee85c2fd931ea24fbcfd6664736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b000000000000000000000000000000000000000000000000000000000000000a4c4541524e746f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054c4541524e000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): LEARNtoken
Arg [1] : _symbol (string): LEARN
Arg [2] : _lzEndpoint (address): 0x6F475642a6e85809B1c36Fa62763669b1b48DD5B
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 4c4541524e746f6b656e00000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 4c4541524e000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
73735:1279:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43221:842;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73969:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62853:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46845:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65204:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48748:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46976:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63973:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65985:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53351:479;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;63815:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66689:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48988:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42763:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47113:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52903:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52969:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53838:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49895:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51218:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64144:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41263:103;;;;;;;;;;;;;:::i;:::-;;42633:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42691:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40588:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74343:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42823:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63072:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47942:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67430:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47653:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64477:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42580:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48280:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42516:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46590:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51836:810;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64733:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48424:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54250:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47438:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53012:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41521:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46274:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74232:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43221:842;43504:10;43480:35;;:12;:10;:12::i;:::-;:35;;;43472:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;43563:26;43592:19;:32;43612:11;43592:32;;;;;;;;;;;;;;;43563:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43812:13;:20;43790:11;;:18;;:42;:70;;;;;43859:1;43836:13;:20;:24;43790:70;:124;;;;;43900:13;43890:24;;;;;;43874:11;;43864:22;;;;;;;:::i;:::-;;;;;;;;:50;43790:124;43768:212;;;;;;;;;;;;:::i;:::-;;;;;;;;;43993:62;44012:11;44025;;43993:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44038:6;44046:8;;43993:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:62::i;:::-;43395:668;43221:842;;;;;;:::o;73969:255::-;74072:4;74111:22;74096:37;;;:11;:37;;;;:80;;;;74152:24;74137:39;;;:11;:39;;;;74096:80;:120;;;;74180:36;74204:11;74180:23;:36::i;:::-;74096:120;74089:127;;73969:255;;;:::o;62853:100::-;62907:13;62940:5;62933:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62853:100;:::o;46845:123::-;40474:13;:11;:13::i;:::-;46925:10:::1;:25;;;46951:8;46925:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46845:123:::0;:::o;65204:201::-;65287:4;65304:13;65320:12;:10;:12::i;:::-;65304:28;;65343:32;65352:5;65359:7;65368:6;65343:8;:32::i;:::-;65393:4;65386:11;;;65204:201;;;;:::o;48748:142::-;40474:13;:11;:13::i;:::-;48877:5:::1;48839:22;:35;48862:11;48839:35;;;;;;;;;;;;;;;:43;;;;48748:142:::0;;:::o;46976:129::-;40474:13;:11;:13::i;:::-;47059:10:::1;:28;;;47088:8;47059:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46976:129:::0;:::o;63973:108::-;64034:7;64061:12;;64054:19;;63973:108;:::o;65985:295::-;66116:4;66133:15;66151:12;:10;:12::i;:::-;66133:30;;66174:38;66190:4;66196:7;66205:6;66174:15;:38::i;:::-;66223:27;66233:4;66239:2;66243:6;66223:9;:27::i;:::-;66268:4;66261:11;;;65985:295;;;;;:::o;53351:479::-;53572:14;53588:11;53656:20;53002:1;53699:10;;53711:7;53679:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53656:63;;53737:10;:23;;;53761:11;53782:4;53789:7;53798;53807:14;;53737:85;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53730:92;;;;;53351:479;;;;;;;;;;:::o;63815:93::-;63873:5;63898:2;63891:9;;63815:93;:::o;66689:238::-;66777:4;66794:13;66810:12;:10;:12::i;:::-;66794:28;;66833:64;66842:5;66849:7;66886:10;66858:25;66868:5;66875:7;66858:9;:25::i;:::-;:38;;;;:::i;:::-;66833:8;:64::i;:::-;66915:4;66908:11;;;66689:238;;;;:::o;48988:250::-;49084:4;49101:26;49130:19;:32;49150:11;49130:32;;;;;;;;;;;;;;;49101:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49218:11;;49208:22;;;;;;;:::i;:::-;;;;;;;;49190:13;49180:24;;;;;;:50;49173:57;;;48988:250;;;;;:::o;42763:53::-;;;;;;;;;;;;;;;;;:::o;47113:178::-;40474:13;:11;:13::i;:::-;47228:10:::1;:29;;;47258:11;47271;;47228:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47113:178:::0;;;:::o;52903:37::-;52939:1;52903:37;:::o;52969:34::-;53002:1;52969:34;:::o;53838:404::-;54136:98;54142:5;54149:11;54162:10;;54136:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54174:7;54183:14;54199:18;54219:14;;54136:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:98::i;:::-;53838:404;;;;;;;;;:::o;49895:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51218:389::-;51475:4;51451:29;;:12;:10;:12::i;:::-;:29;;;51443:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51534:65;51556:11;51569;;51534:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51582:6;51590:8;;51534:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:65::i;:::-;51218:389;;;;;;:::o;64144:127::-;64218:7;64245:9;:18;64255:7;64245:18;;;;;;;;;;;;;;;;64238:25;;64144:127;;;:::o;41263:103::-;40474:13;:11;:13::i;:::-;41328:30:::1;41355:1;41328:18;:30::i;:::-;41263:103::o:0;42633:51::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42691:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40588:87::-;40634:7;40661:6;;;;;;;;;;;40654:13;;40588:87;:::o;74343:112::-;74410:4;74434:13;:11;:13::i;:::-;74427:20;;74343:112;:::o;42823:23::-;;;;;;;;;;;;;:::o;63072:104::-;63128:13;63161:7;63154:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63072:104;:::o;47942:330::-;48021:12;48046:17;48066:19;:35;48086:14;48066:35;;;;;;;;;;;;;;;48046:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48135:1;48120:4;:11;:16;48112:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48188:31;48199:1;48216:2;48202:4;:11;:16;;;;:::i;:::-;48188:4;:10;;:31;;;;;:::i;:::-;48181:38;;;47942:330;;;:::o;67430:436::-;67523:4;67540:13;67556:12;:10;:12::i;:::-;67540:28;;67579:24;67606:25;67616:5;67623:7;67606:9;:25::i;:::-;67579:52;;67670:15;67650:16;:35;;67642:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;67763:60;67772:5;67779:7;67807:15;67788:16;:34;67763:8;:60::i;:::-;67854:4;67847:11;;;;67430:436;;;;:::o;47653:281::-;40474:13;:11;:13::i;:::-;47825:14:::1;;47849:4;47808:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47770:19;:35;47790:14;47770:35;;;;;;;;;;;;;;;:85;;;;;;:::i;:::-;;47871:55;47895:14;47911;;47871:55;;;;;;;;:::i;:::-;;;;;;;;47653:281:::0;;;:::o;64477:193::-;64556:4;64573:13;64589:12;:10;:12::i;:::-;64573:28;;64612;64622:5;64629:2;64633:6;64612:9;:28::i;:::-;64658:4;64651:11;;;64477:193;;;;:::o;42580:46::-;;;:::o;48280:136::-;40474:13;:11;:13::i;:::-;48361:9:::1;48350:8;;:20;;;;;;;;;;;;;;;;;;48386:22;48398:9;48386:22;;;;;;:::i;:::-;;;;;;;;48280:136:::0;:::o;42516:55::-;42566:5;42516:55;:::o;46590:247::-;40474:13;:11;:13::i;:::-;46767:10:::1;:20;;;46788:8;46798;46808:11;46821:7;;46767:62;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46590:247:::0;;;;;:::o;51836:810::-;52068:19;52090:14;:27;52105:11;52090:27;;;;;;;;;;;;;;;52118:11;;52090:40;;;;;;;:::i;:::-;;;;;;;;;;;;;:48;52131:6;52090:48;;;;;;;;;;;;;;;;52068:70;;52180:1;52172:10;;52157:11;:25;52149:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52264:11;52251:8;;52241:19;;;;;;;:::i;:::-;;;;;;;;:34;52233:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;52420:1;52412:10;;52361:14;:27;52376:11;52361:27;;;;;;;;;;;;;;;52389:11;;52361:40;;;;;;;:::i;:::-;;;;;;;;;;;;;:48;52402:6;52361:48;;;;;;;;;;;;;;;:61;;;;52491:65;52513:11;52526;;52491:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52539:6;52547:8;;52491:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:65::i;:::-;52572:66;52592:11;52605;;52618:6;52626:11;52572:66;;;;;;;;;;:::i;:::-;;;;;;;;52012:634;51836:810;;;;;;:::o;64733:151::-;64822:7;64849:11;:18;64861:5;64849:18;;;;;;;;;;;;;;;:27;64868:7;64849:27;;;;;;;;;;;;;;;;64842:34;;64733:151;;;;:::o;48424:262::-;40474:13;:11;:13::i;:::-;48608:7:::1;48564:15;:28;48580:11;48564:28;;;;;;;;;;;;;;;:41;48593:11;48564:41;;;;;;;;;;;;;;;:51;;;;48631:47;48644:11;48657;48670:7;48631:47;;;;;;;;:::i;:::-;;;;;;;;48424:262:::0;;;:::o;54250:223::-;40474:13;:11;:13::i;:::-;54376:23:::1;54351:22;;:48;;;;;;;;;;;;;;;;;;54415:50;54441:23;54415:50;;;;;;:::i;:::-;;;;;;;;54250:223:::0;:::o;47438:207::-;40474:13;:11;:13::i;:::-;47577:5:::1;;47539:19;:35;47559:14;47539:35;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;47598:39;47615:14;47631:5;;47598:39;;;;;;;;:::i;:::-;;;;;;;;47438:207:::0;;;:::o;53012:34::-;;;;;;;;;;;;;:::o;41521:220::-;40474:13;:11;:13::i;:::-;41626:1:::1;41606:22;;:8;:22;;::::0;41602:93:::1;;41680:1;41652:31;;;;;;;;;;;:::i;:::-;;;;;;;;41602:93;41705:28;41724:8;41705:18;:28::i;:::-;41521:220:::0;:::o;46274:254::-;46420:12;46452:10;:20;;;46473:8;46483;46501:4;46508:11;46452:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46445:75;;46274:254;;;;;;:::o;74232:103::-;74287:7;74322:4;74307:20;;74232:103;:::o;38704:98::-;38757:7;38784:10;38777:17;;38704:98;:::o;50264:563::-;50457:12;50471:19;50494:203;50542:9;50566:3;50607:34;;;50643:11;50656;50669:6;50677:8;50584:102;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50502:4;50494:33;;;;:203;;;;;;:::i;:::-;50456:241;;;;50713:7;50708:112;;50737:71;50757:11;50770;50783:6;50791:8;50801:6;50737:19;:71::i;:::-;50708:112;50445:382;;50264:563;;;;:::o;53128:215::-;53230:4;53269:26;53254:41;;;:11;:41;;;;:81;;;;53299:36;53323:11;53299:23;:36::i;:::-;53254:81;53247:88;;53128:215;;;:::o;40753:166::-;40824:12;:10;:12::i;:::-;40813:23;;:7;:5;:7::i;:::-;:23;;;40809:103;;40887:12;:10;:12::i;:::-;40860:40;;;;;;;;;;;:::i;:::-;;;;;;;;40809:103;40753:166::o;71055:380::-;71208:1;71191:19;;:5;:19;;;71183:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71289:1;71270:21;;:7;:21;;;71262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71373:6;71343:11;:18;71355:5;71343:18;;;;;;;;;;;;;;;:27;71362:7;71343:27;;;;;;;;;;;;;;;:36;;;;71411:7;71395:32;;71404:5;71395:32;;;71420:6;71395:32;;;;;;:::i;:::-;;;;;;;;71055:380;;;:::o;71726:453::-;71861:24;71888:25;71898:5;71905:7;71888:9;:25::i;:::-;71861:52;;71948:17;71928:16;:37;71924:248;;72010:6;71990:16;:26;;71982:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72094:51;72103:5;72110:7;72138:6;72119:16;:25;72094:8;:51::i;:::-;71924:248;71850:329;71726:453;;;:::o;68336:671::-;68483:1;68467:18;;:4;:18;;;68459:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68560:1;68546:16;;:2;:16;;;68538:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;68615:38;68636:4;68642:2;68646:6;68615:20;:38::i;:::-;68666:19;68688:9;:15;68698:4;68688:15;;;;;;;;;;;;;;;;68666:37;;68737:6;68722:11;:21;;68714:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;68854:6;68840:11;:20;68822:9;:15;68832:4;68822:15;;;;;;;;;;;;;;;:38;;;;68899:6;68882:9;:13;68892:2;68882:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;68938:2;68923:26;;68932:4;68923:26;;;68942:6;68923:26;;;;;;:::i;:::-;;;;;;;;68962:37;68982:4;68988:2;68992:6;68962:19;:37::i;:::-;68448:559;68336:671;;;:::o;54981:684::-;55257:71;55277:11;53002:1;55299:14;52939:1;55257:19;:71::i;:::-;55341:11;55355:51;55366:5;55373:11;55386:10;55398:7;55355:10;:51::i;:::-;55341:65;;55419:22;53002:1;55464:10;55476:6;55444:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55419:64;;55494:94;55502:11;55515:9;55526:14;55542:18;55562:14;55578:9;55494:7;:94::i;:::-;55631:5;55606:51;;55618:11;55606:51;;;55638:10;55650:6;55606:51;;;;;;;:::i;:::-;;;;;;;;55246:419;;54981:684;;;;;;;:::o;54481:492::-;54676:17;54762:2;54752:8;54748:17;54742:24;54728:38;;53002:1;54793:21;;:10;:21;;;54789:177;;54831:52;54840:11;54853;54866:6;54874:8;54831;:52::i;:::-;54789:177;;;54916:38;;;;;;;;;;:::i;:::-;;;;;;;;54789:177;54665:308;54481:492;;;;:::o;41901:191::-;41975:16;41994:6;;;;;;;;;;;41975:25;;42020:8;42011:6;;:17;;;;;;;;;;;;;;;;;;42075:8;42044:40;;42065:8;42044:40;;;;;;;;;;;;41964:128;41901:191;:::o;15130:2833::-;15250:12;15299:7;15293:2;15283:7;:12;;;;:::i;:::-;:23;;15275:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;15370:7;15361:6;:16;;;;:::i;:::-;15344:6;:13;:33;;15336:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;15412:22;15485:7;15478:15;15512:1;15507:2005;;;;17656:4;17650:11;17637:24;;17845:1;17834:9;17827:20;17895:4;17884:9;17880:20;17874:4;17867:34;15471:2445;;15507:2005;15692:4;15686:11;15673:24;;16361:2;16352:7;16348:16;16749:9;16742:17;16736:4;16732:28;16720:9;16709;16705:25;16701:60;16798:7;16794:2;16790:16;17055:6;17041:9;17034:17;17028:4;17024:28;17012:9;17004:6;17000:22;16996:57;16992:70;16826:434;17089:3;17085:2;17082:11;16826:434;;;17237:2;17231:9;17227:2;17220:21;17131:4;17127:2;17123:13;17117:19;;17172:4;17168:2;17164:13;17158:19;;16826:434;;;16830:251;17298:7;17287:9;17280:26;17492:2;17488:7;17483:2;17479;17475:11;17471:25;17465:4;17458:39;15514:1998;;;15471:2445;;17946:9;17939:16;;;15130:2833;;;;;:::o;1127:1309::-;1286:4;1292:12;1354;1377:13;1401:24;1438:8;1428:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1401:46;;1957:1;1927;1889:9;1883:16;1850:4;1839:9;1835:20;1800:1;1761:7;1731:4;1708:275;1696:287;;2052:16;2041:27;;2097:8;2088:7;2085:21;2082:78;;;2137:8;2126:19;;2082:78;2247:7;2234:11;2227:28;2369:7;2366:1;2359:4;2346:11;2342:22;2327:50;2406:8;2416:11;2398:30;;;;;;;1127:1309;;;;;;;:::o;50835:375::-;51111:8;51101:19;;;;;;51050:14;:27;51065:11;51050:27;;;;;;;;;;;;;;;51078:11;51050:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;51091:6;51050:48;;;;;;;;;;;;;;;:70;;;;51136:66;51150:11;51163;51176:6;51184:8;51194:7;51136:66;;;;;;;;;;:::i;:::-;;;;;;;;50835:375;;;;;:::o;35275:157::-;35360:4;35399:25;35384:40;;;:11;:40;;;;35377:47;;35275:157;;;:::o;72779:125::-;;;;:::o;73508:124::-;;;;:::o;56099:416::-;56284:22;;;;;;;;;;;56280:228;;;56323:63;56338:11;56351:7;56360:14;56376:9;56323:14;:63::i;:::-;56280:228;;;56452:1;56427:14;:21;:26;56419:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56280:228;56099:416;;;;:::o;74463:334::-;74612:4;74629:15;74647:12;:10;:12::i;:::-;74629:30;;74683:7;74674:16;;:5;:16;;;74670:62;;74692:40;74708:5;74715:7;74724;74692:15;:40::i;:::-;74670:62;74743:21;74749:5;74756:7;74743:5;:21::i;:::-;74782:7;74775:14;;;74463:334;;;;;;:::o;44395:614::-;44650:26;44679:19;:32;44699:11;44679:32;;;;;;;;;;;;;;;44650:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44754:1;44730:13;:20;:25;44722:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;44819:47;44837:11;44850:8;:15;44819:17;:47::i;:::-;44877:10;:15;;;44900:10;44912:11;44925:13;44940:8;44950:14;44966:18;44986:14;44877:124;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44639:370;44395:614;;;;;;:::o;55673:418::-;55830:27;55859:11;55885:8;55874:43;;;;;;;;;;;;:::i;:::-;55827:90;;;;;55930:10;55943:27;55968:1;55943:14;:24;;:27;;;;:::i;:::-;55930:40;;55992:34;56002:11;56015:2;56019:6;55992:9;:34::i;:::-;55983:43;;56072:2;56042:41;;56059:11;56042:41;;;56076:6;56042:41;;;;;;:::i;:::-;;;;;;;;55816:275;;;55673:418;;;;:::o;45017:463::-;45196:21;45220:28;45233:14;45220:12;:28::i;:::-;45196:52;;45259:16;45278:15;:28;45294:11;45278:28;;;;;;;;;;;;;;;:35;45307:5;45278:35;;;;;;;;;;;;;;;;45259:54;;45346:1;45332:11;:15;45324:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;45431:9;45417:11;:23;;;;:::i;:::-;45397:16;:43;;45389:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;45185:295;;45017:463;;;;:::o;70026:591::-;70129:1;70110:21;;:7;:21;;;70102:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;70182:49;70203:7;70220:1;70224:6;70182:20;:49::i;:::-;70244:22;70269:9;:18;70279:7;70269:18;;;;;;;;;;;;;;;;70244:43;;70324:6;70306:14;:24;;70298:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;70443:6;70426:14;:23;70405:9;:18;70415:7;70405:18;;;;;;;;;;;;;;;:44;;;;70487:6;70471:12;;:22;;;;;;;:::i;:::-;;;;;;;;70537:1;70511:37;;70520:7;70511:37;;;70541:6;70511:37;;;;;;:::i;:::-;;;;;;;;70561:48;70581:7;70598:1;70602:6;70561:19;:48::i;:::-;70091:526;70026:591;;:::o;45767:402::-;45866:21;45890:22;:35;45913:11;45890:35;;;;;;;;;;;;;;;;45866:59;;45960:1;45940:16;:21;45936:138;;42566:5;46017:45;;45936:138;46108:16;46092:12;:32;;46084:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;45855:314;45767:402;;:::o;17971:360::-;18047:7;18101:2;18092:6;:11;;;;:::i;:::-;18075:6;:13;:28;;18067:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;18140:19;18254:27;18244:6;18237:4;18229:6;18225:17;18221:30;18215:37;18211:71;18196:86;;18312:11;18305:18;;;17971:360;;;;:::o;74805:206::-;74935:4;74952:26;74958:10;74970:7;74952:5;:26::i;:::-;74996:7;74989:14;;74805:206;;;;;:::o;45488:271::-;45570:13;45629:2;45604:14;:21;:27;;45596:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45737:2;45721:14;45717:23;45711:30;45699:42;;45488:271;;;:::o;69294:399::-;69397:1;69378:21;;:7;:21;;;69370:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;69448:49;69477:1;69481:7;69490:6;69448:20;:49::i;:::-;69526:6;69510:12;;:22;;;;;;;:::i;:::-;;;;;;;;69565:6;69543:9;:18;69553:7;69543:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;69608:7;69587:37;;69604:1;69587:37;;;69617:6;69587:37;;;;;;:::i;:::-;;;;;;;;69637:48;69665:1;69669:7;69678:6;69637:19;:48::i;:::-;69294:399;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:89;370:7;410:6;403:5;399:18;388:29;;334:89;;;:::o;429:120::-;501:23;518:5;501:23;:::i;:::-;494:5;491:34;481:62;;539:1;536;529:12;481:62;429:120;:::o;555:137::-;600:5;638:6;625:20;616:29;;654:32;680:5;654:32;:::i;:::-;555:137;;;;:::o;698:117::-;807:1;804;797:12;821:117;930:1;927;920:12;944:117;1053:1;1050;1043:12;1080:552;1137:8;1147:6;1197:3;1190:4;1182:6;1178:17;1174:27;1164:122;;1205:79;;:::i;:::-;1164:122;1318:6;1305:20;1295:30;;1348:18;1340:6;1337:30;1334:117;;;1370:79;;:::i;:::-;1334:117;1484:4;1476:6;1472:17;1460:29;;1538:3;1530:4;1522:6;1518:17;1508:8;1504:32;1501:41;1498:128;;;1545:79;;:::i;:::-;1498:128;1080:552;;;;;:::o;1638:101::-;1674:7;1714:18;1707:5;1703:30;1692:41;;1638:101;;;:::o;1745:120::-;1817:23;1834:5;1817:23;:::i;:::-;1810:5;1807:34;1797:62;;1855:1;1852;1845:12;1797:62;1745:120;:::o;1871:137::-;1916:5;1954:6;1941:20;1932:29;;1970:32;1996:5;1970:32;:::i;:::-;1871:137;;;;:::o;2014:1157::-;2120:6;2128;2136;2144;2152;2160;2209:3;2197:9;2188:7;2184:23;2180:33;2177:120;;;2216:79;;:::i;:::-;2177:120;2336:1;2361:52;2405:7;2396:6;2385:9;2381:22;2361:52;:::i;:::-;2351:62;;2307:116;2490:2;2479:9;2475:18;2462:32;2521:18;2513:6;2510:30;2507:117;;;2543:79;;:::i;:::-;2507:117;2656:64;2712:7;2703:6;2692:9;2688:22;2656:64;:::i;:::-;2638:82;;;;2433:297;2769:2;2795:52;2839:7;2830:6;2819:9;2815:22;2795:52;:::i;:::-;2785:62;;2740:117;2924:2;2913:9;2909:18;2896:32;2955:18;2947:6;2944:30;2941:117;;;2977:79;;:::i;:::-;2941:117;3090:64;3146:7;3137:6;3126:9;3122:22;3090:64;:::i;:::-;3072:82;;;;2867:297;2014:1157;;;;;;;;:::o;3177:149::-;3213:7;3253:66;3246:5;3242:78;3231:89;;3177:149;;;:::o;3332:120::-;3404:23;3421:5;3404:23;:::i;:::-;3397:5;3394:34;3384:62;;3442:1;3439;3432:12;3384:62;3332:120;:::o;3458:137::-;3503:5;3541:6;3528:20;3519:29;;3557:32;3583:5;3557:32;:::i;:::-;3458:137;;;;:::o;3601:327::-;3659:6;3708:2;3696:9;3687:7;3683:23;3679:32;3676:119;;;3714:79;;:::i;:::-;3676:119;3834:1;3859:52;3903:7;3894:6;3883:9;3879:22;3859:52;:::i;:::-;3849:62;;3805:116;3601:327;;;;:::o;3934:90::-;3968:7;4011:5;4004:13;3997:21;3986:32;;3934:90;;;:::o;4030:109::-;4111:21;4126:5;4111:21;:::i;:::-;4106:3;4099:34;4030:109;;:::o;4145:210::-;4232:4;4270:2;4259:9;4255:18;4247:26;;4283:65;4345:1;4334:9;4330:17;4321:6;4283:65;:::i;:::-;4145:210;;;;:::o;4361:99::-;4413:6;4447:5;4441:12;4431:22;;4361:99;;;:::o;4466:169::-;4550:11;4584:6;4579:3;4572:19;4624:4;4619:3;4615:14;4600:29;;4466:169;;;;:::o;4641:139::-;4730:6;4725:3;4720;4714:23;4771:1;4762:6;4757:3;4753:16;4746:27;4641:139;;;:::o;4786:102::-;4827:6;4878:2;4874:7;4869:2;4862:5;4858:14;4854:28;4844:38;;4786:102;;;:::o;4894:377::-;4982:3;5010:39;5043:5;5010:39;:::i;:::-;5065:71;5129:6;5124:3;5065:71;:::i;:::-;5058:78;;5145:65;5203:6;5198:3;5191:4;5184:5;5180:16;5145:65;:::i;:::-;5235:29;5257:6;5235:29;:::i;:::-;5230:3;5226:39;5219:46;;4986:285;4894:377;;;;:::o;5277:313::-;5390:4;5428:2;5417:9;5413:18;5405:26;;5477:9;5471:4;5467:20;5463:1;5452:9;5448:17;5441:47;5505:78;5578:4;5569:6;5505:78;:::i;:::-;5497:86;;5277:313;;;;:::o;5596:327::-;5654:6;5703:2;5691:9;5682:7;5678:23;5674:32;5671:119;;;5709:79;;:::i;:::-;5671:119;5829:1;5854:52;5898:7;5889:6;5878:9;5874:22;5854:52;:::i;:::-;5844:62;;5800:116;5596:327;;;;:::o;5929:126::-;5966:7;6006:42;5999:5;5995:54;5984:65;;5929:126;;;:::o;6061:96::-;6098:7;6127:24;6145:5;6127:24;:::i;:::-;6116:35;;6061:96;;;:::o;6163:122::-;6236:24;6254:5;6236:24;:::i;:::-;6229:5;6226:35;6216:63;;6275:1;6272;6265:12;6216:63;6163:122;:::o;6291:139::-;6337:5;6375:6;6362:20;6353:29;;6391:33;6418:5;6391:33;:::i;:::-;6291:139;;;;:::o;6436:77::-;6473:7;6502:5;6491:16;;6436:77;;;:::o;6519:122::-;6592:24;6610:5;6592:24;:::i;:::-;6585:5;6582:35;6572:63;;6631:1;6628;6621:12;6572:63;6519:122;:::o;6647:139::-;6693:5;6731:6;6718:20;6709:29;;6747:33;6774:5;6747:33;:::i;:::-;6647:139;;;;:::o;6792:474::-;6860:6;6868;6917:2;6905:9;6896:7;6892:23;6888:32;6885:119;;;6923:79;;:::i;:::-;6885:119;7043:1;7068:53;7113:7;7104:6;7093:9;7089:22;7068:53;:::i;:::-;7058:63;;7014:117;7170:2;7196:53;7241:7;7232:6;7221:9;7217:22;7196:53;:::i;:::-;7186:63;;7141:118;6792:474;;;;;:::o;7272:472::-;7339:6;7347;7396:2;7384:9;7375:7;7371:23;7367:32;7364:119;;;7402:79;;:::i;:::-;7364:119;7522:1;7547:52;7591:7;7582:6;7571:9;7567:22;7547:52;:::i;:::-;7537:62;;7493:116;7648:2;7674:53;7719:7;7710:6;7699:9;7695:22;7674:53;:::i;:::-;7664:63;;7619:118;7272:472;;;;;:::o;7750:118::-;7837:24;7855:5;7837:24;:::i;:::-;7832:3;7825:37;7750:118;;:::o;7874:222::-;7967:4;8005:2;7994:9;7990:18;7982:26;;8018:71;8086:1;8075:9;8071:17;8062:6;8018:71;:::i;:::-;7874:222;;;;:::o;8102:619::-;8179:6;8187;8195;8244:2;8232:9;8223:7;8219:23;8215:32;8212:119;;;8250:79;;:::i;:::-;8212:119;8370:1;8395:53;8440:7;8431:6;8420:9;8416:22;8395:53;:::i;:::-;8385:63;;8341:117;8497:2;8523:53;8568:7;8559:6;8548:9;8544:22;8523:53;:::i;:::-;8513:63;;8468:118;8625:2;8651:53;8696:7;8687:6;8676:9;8672:22;8651:53;:::i;:::-;8641:63;;8596:118;8102:619;;;;;:::o;8727:116::-;8797:21;8812:5;8797:21;:::i;:::-;8790:5;8787:32;8777:60;;8833:1;8830;8823:12;8777:60;8727:116;:::o;8849:133::-;8892:5;8930:6;8917:20;8908:29;;8946:30;8970:5;8946:30;:::i;:::-;8849:133;;;;:::o;8988:1299::-;9101:6;9109;9117;9125;9133;9141;9149;9198:3;9186:9;9177:7;9173:23;9169:33;9166:120;;;9205:79;;:::i;:::-;9166:120;9325:1;9350:52;9394:7;9385:6;9374:9;9370:22;9350:52;:::i;:::-;9340:62;;9296:116;9479:2;9468:9;9464:18;9451:32;9510:18;9502:6;9499:30;9496:117;;;9532:79;;:::i;:::-;9496:117;9645:64;9701:7;9692:6;9681:9;9677:22;9645:64;:::i;:::-;9627:82;;;;9422:297;9758:2;9784:53;9829:7;9820:6;9809:9;9805:22;9784:53;:::i;:::-;9774:63;;9729:118;9886:2;9912:50;9954:7;9945:6;9934:9;9930:22;9912:50;:::i;:::-;9902:60;;9857:115;10039:3;10028:9;10024:19;10011:33;10071:18;10063:6;10060:30;10057:117;;;10093:79;;:::i;:::-;10057:117;10206:64;10262:7;10253:6;10242:9;10238:22;10206:64;:::i;:::-;10188:82;;;;9982:298;8988:1299;;;;;;;;;;:::o;10293:332::-;10414:4;10452:2;10441:9;10437:18;10429:26;;10465:71;10533:1;10522:9;10518:17;10509:6;10465:71;:::i;:::-;10546:72;10614:2;10603:9;10599:18;10590:6;10546:72;:::i;:::-;10293:332;;;;;:::o;10631:86::-;10666:7;10706:4;10699:5;10695:16;10684:27;;10631:86;;;:::o;10723:112::-;10806:22;10822:5;10806:22;:::i;:::-;10801:3;10794:35;10723:112;;:::o;10841:214::-;10930:4;10968:2;10957:9;10953:18;10945:26;;10981:67;11045:1;11034:9;11030:17;11021:6;10981:67;:::i;:::-;10841:214;;;;:::o;11061:670::-;11139:6;11147;11155;11204:2;11192:9;11183:7;11179:23;11175:32;11172:119;;;11210:79;;:::i;:::-;11172:119;11330:1;11355:52;11399:7;11390:6;11379:9;11375:22;11355:52;:::i;:::-;11345:62;;11301:116;11484:2;11473:9;11469:18;11456:32;11515:18;11507:6;11504:30;11501:117;;;11537:79;;:::i;:::-;11501:117;11650:64;11706:7;11697:6;11686:9;11682:22;11650:64;:::i;:::-;11632:82;;;;11427:297;11061:670;;;;;:::o;11737:115::-;11822:23;11839:5;11822:23;:::i;:::-;11817:3;11810:36;11737:115;;:::o;11858:218::-;11949:4;11987:2;11976:9;11972:18;11964:26;;12000:69;12066:1;12055:9;12051:17;12042:6;12000:69;:::i;:::-;11858:218;;;;:::o;12082:104::-;12127:7;12156:24;12174:5;12156:24;:::i;:::-;12145:35;;12082:104;;;:::o;12192:138::-;12273:32;12299:5;12273:32;:::i;:::-;12266:5;12263:43;12253:71;;12320:1;12317;12310:12;12253:71;12192:138;:::o;12336:155::-;12390:5;12428:6;12415:20;12406:29;;12444:41;12479:5;12444:41;:::i;:::-;12336:155;;;;:::o;12497:1613::-;12639:6;12647;12655;12663;12671;12679;12687;12695;12703;12752:3;12740:9;12731:7;12727:23;12723:33;12720:120;;;12759:79;;:::i;:::-;12720:120;12879:1;12904:53;12949:7;12940:6;12929:9;12925:22;12904:53;:::i;:::-;12894:63;;12850:117;13006:2;13032:52;13076:7;13067:6;13056:9;13052:22;13032:52;:::i;:::-;13022:62;;12977:117;13161:2;13150:9;13146:18;13133:32;13192:18;13184:6;13181:30;13178:117;;;13214:79;;:::i;:::-;13178:117;13327:64;13383:7;13374:6;13363:9;13359:22;13327:64;:::i;:::-;13309:82;;;;13104:297;13440:2;13466:53;13511:7;13502:6;13491:9;13487:22;13466:53;:::i;:::-;13456:63;;13411:118;13568:3;13595:61;13648:7;13639:6;13628:9;13624:22;13595:61;:::i;:::-;13585:71;;13539:127;13705:3;13732:53;13777:7;13768:6;13757:9;13753:22;13732:53;:::i;:::-;13722:63;;13676:119;13862:3;13851:9;13847:19;13834:33;13894:18;13886:6;13883:30;13880:117;;;13916:79;;:::i;:::-;13880:117;14029:64;14085:7;14076:6;14065:9;14061:22;14029:64;:::i;:::-;14011:82;;;;13805:298;12497:1613;;;;;;;;;;;:::o;14116:117::-;14225:1;14222;14215:12;14239:180;14287:77;14284:1;14277:88;14384:4;14381:1;14374:15;14408:4;14405:1;14398:15;14425:281;14508:27;14530:4;14508:27;:::i;:::-;14500:6;14496:40;14638:6;14626:10;14623:22;14602:18;14590:10;14587:34;14584:62;14581:88;;;14649:18;;:::i;:::-;14581:88;14689:10;14685:2;14678:22;14468:238;14425:281;;:::o;14712:129::-;14746:6;14773:20;;:::i;:::-;14763:30;;14802:33;14830:4;14822:6;14802:33;:::i;:::-;14712:129;;;:::o;14847:307::-;14908:4;14998:18;14990:6;14987:30;14984:56;;;15020:18;;:::i;:::-;14984:56;15058:29;15080:6;15058:29;:::i;:::-;15050:37;;15142:4;15136;15132:15;15124:23;;14847:307;;;:::o;15160:148::-;15258:6;15253:3;15248;15235:30;15299:1;15290:6;15285:3;15281:16;15274:27;15160:148;;;:::o;15314:423::-;15391:5;15416:65;15432:48;15473:6;15432:48;:::i;:::-;15416:65;:::i;:::-;15407:74;;15504:6;15497:5;15490:21;15542:4;15535:5;15531:16;15580:3;15571:6;15566:3;15562:16;15559:25;15556:112;;;15587:79;;:::i;:::-;15556:112;15677:54;15724:6;15719:3;15714;15677:54;:::i;:::-;15397:340;15314:423;;;;;:::o;15756:338::-;15811:5;15860:3;15853:4;15845:6;15841:17;15837:27;15827:122;;15868:79;;:::i;:::-;15827:122;15985:6;15972:20;16010:78;16084:3;16076:6;16069:4;16061:6;16057:17;16010:78;:::i;:::-;16001:87;;15817:277;15756:338;;;;:::o;16100:793::-;16184:6;16192;16200;16249:2;16237:9;16228:7;16224:23;16220:32;16217:119;;;16255:79;;:::i;:::-;16217:119;16375:1;16400:52;16444:7;16435:6;16424:9;16420:22;16400:52;:::i;:::-;16390:62;;16346:116;16529:2;16518:9;16514:18;16501:32;16560:18;16552:6;16549:30;16546:117;;;16582:79;;:::i;:::-;16546:117;16687:62;16741:7;16732:6;16721:9;16717:22;16687:62;:::i;:::-;16677:72;;16472:287;16798:2;16824:52;16868:7;16859:6;16848:9;16844:22;16824:52;:::i;:::-;16814:62;;16769:117;16100:793;;;;;:::o;16899:77::-;16936:7;16965:5;16954:16;;16899:77;;;:::o;16982:118::-;17069:24;17087:5;17069:24;:::i;:::-;17064:3;17057:37;16982:118;;:::o;17106:222::-;17199:4;17237:2;17226:9;17222:18;17214:26;;17250:71;17318:1;17307:9;17303:17;17294:6;17250:71;:::i;:::-;17106:222;;;;:::o;17334:329::-;17393:6;17442:2;17430:9;17421:7;17417:23;17413:32;17410:119;;;17448:79;;:::i;:::-;17410:119;17568:1;17593:53;17638:7;17629:6;17618:9;17614:22;17593:53;:::i;:::-;17583:63;;17539:117;17334:329;;;;:::o;17669:98::-;17720:6;17754:5;17748:12;17738:22;;17669:98;;;:::o;17773:168::-;17856:11;17890:6;17885:3;17878:19;17930:4;17925:3;17921:14;17906:29;;17773:168;;;;:::o;17947:373::-;18033:3;18061:38;18093:5;18061:38;:::i;:::-;18115:70;18178:6;18173:3;18115:70;:::i;:::-;18108:77;;18194:65;18252:6;18247:3;18240:4;18233:5;18229:16;18194:65;:::i;:::-;18284:29;18306:6;18284:29;:::i;:::-;18279:3;18275:39;18268:46;;18037:283;17947:373;;;;:::o;18326:309::-;18437:4;18475:2;18464:9;18460:18;18452:26;;18524:9;18518:4;18514:20;18510:1;18499:9;18495:17;18488:47;18552:76;18623:4;18614:6;18552:76;:::i;:::-;18544:84;;18326:309;;;;:::o;18641:470::-;18707:6;18715;18764:2;18752:9;18743:7;18739:23;18735:32;18732:119;;;18770:79;;:::i;:::-;18732:119;18890:1;18915:52;18959:7;18950:6;18939:9;18935:22;18915:52;:::i;:::-;18905:62;;18861:116;19016:2;19042:52;19086:7;19077:6;19066:9;19062:22;19042:52;:::i;:::-;19032:62;;18987:117;18641:470;;;;;:::o;19117:118::-;19204:24;19222:5;19204:24;:::i;:::-;19199:3;19192:37;19117:118;;:::o;19241:222::-;19334:4;19372:2;19361:9;19357:18;19349:26;;19385:71;19453:1;19442:9;19438:17;19429:6;19385:71;:::i;:::-;19241:222;;;;:::o;19469:60::-;19497:3;19518:5;19511:12;;19469:60;;;:::o;19535:142::-;19585:9;19618:53;19636:34;19645:24;19663:5;19645:24;:::i;:::-;19636:34;:::i;:::-;19618:53;:::i;:::-;19605:66;;19535:142;;;:::o;19683:126::-;19733:9;19766:37;19797:5;19766:37;:::i;:::-;19753:50;;19683:126;;;:::o;19815:152::-;19891:9;19924:37;19955:5;19924:37;:::i;:::-;19911:50;;19815:152;;;:::o;19973:183::-;20086:63;20143:5;20086:63;:::i;:::-;20081:3;20074:76;19973:183;;:::o;20162:274::-;20281:4;20319:2;20308:9;20304:18;20296:26;;20332:97;20426:1;20415:9;20411:17;20402:6;20332:97;:::i;:::-;20162:274;;;;:::o;20442:959::-;20537:6;20545;20553;20561;20569;20618:3;20606:9;20597:7;20593:23;20589:33;20586:120;;;20625:79;;:::i;:::-;20586:120;20745:1;20770:52;20814:7;20805:6;20794:9;20790:22;20770:52;:::i;:::-;20760:62;;20716:116;20871:2;20897:52;20941:7;20932:6;20921:9;20917:22;20897:52;:::i;:::-;20887:62;;20842:117;20998:2;21024:53;21069:7;21060:6;21049:9;21045:22;21024:53;:::i;:::-;21014:63;;20969:118;21154:2;21143:9;21139:18;21126:32;21185:18;21177:6;21174:30;21171:117;;;21207:79;;:::i;:::-;21171:117;21320:64;21376:7;21367:6;21356:9;21352:22;21320:64;:::i;:::-;21302:82;;;;21097:297;20442:959;;;;;;;;:::o;21407:474::-;21475:6;21483;21532:2;21520:9;21511:7;21507:23;21503:32;21500:119;;;21538:79;;:::i;:::-;21500:119;21658:1;21683:53;21728:7;21719:6;21708:9;21704:22;21683:53;:::i;:::-;21673:63;;21629:117;21785:2;21811:53;21856:7;21847:6;21836:9;21832:22;21811:53;:::i;:::-;21801:63;;21756:118;21407:474;;;;;:::o;21887:615::-;21962:6;21970;21978;22027:2;22015:9;22006:7;22002:23;21998:32;21995:119;;;22033:79;;:::i;:::-;21995:119;22153:1;22178:52;22222:7;22213:6;22202:9;22198:22;22178:52;:::i;:::-;22168:62;;22124:116;22279:2;22305:52;22349:7;22340:6;22329:9;22325:22;22305:52;:::i;:::-;22295:62;;22250:117;22406:2;22432:53;22477:7;22468:6;22457:9;22453:22;22432:53;:::i;:::-;22422:63;;22377:118;21887:615;;;;;:::o;22508:323::-;22564:6;22613:2;22601:9;22592:7;22588:23;22584:32;22581:119;;;22619:79;;:::i;:::-;22581:119;22739:1;22764:50;22806:7;22797:6;22786:9;22782:22;22764:50;:::i;:::-;22754:60;;22710:114;22508:323;;;;:::o;22837:761::-;22921:6;22929;22937;22945;22994:3;22982:9;22973:7;22969:23;22965:33;22962:120;;;23001:79;;:::i;:::-;22962:120;23121:1;23146:52;23190:7;23181:6;23170:9;23166:22;23146:52;:::i;:::-;23136:62;;23092:116;23247:2;23273:52;23317:7;23308:6;23297:9;23293:22;23273:52;:::i;:::-;23263:62;;23218:117;23374:2;23400:53;23445:7;23436:6;23425:9;23421:22;23400:53;:::i;:::-;23390:63;;23345:118;23502:2;23528:53;23573:7;23564:6;23553:9;23549:22;23528:53;:::i;:::-;23518:63;;23473:118;22837:761;;;;;;;:::o;23604:180::-;23744:32;23740:1;23732:6;23728:14;23721:56;23604:180;:::o;23790:366::-;23932:3;23953:67;24017:2;24012:3;23953:67;:::i;:::-;23946:74;;24029:93;24118:3;24029:93;:::i;:::-;24147:2;24142:3;24138:12;24131:19;;23790:366;;;:::o;24162:419::-;24328:4;24366:2;24355:9;24351:18;24343:26;;24415:9;24409:4;24405:20;24401:1;24390:9;24386:17;24379:47;24443:131;24569:4;24443:131;:::i;:::-;24435:139;;24162:419;;;:::o;24587:180::-;24635:77;24632:1;24625:88;24732:4;24729:1;24722:15;24756:4;24753:1;24746:15;24773:320;24817:6;24854:1;24848:4;24844:12;24834:22;;24901:1;24895:4;24891:12;24922:18;24912:81;;24978:4;24970:6;24966:17;24956:27;;24912:81;25040:2;25032:6;25029:14;25009:18;25006:38;25003:84;;25059:18;;:::i;:::-;25003:84;24824:269;24773:320;;;:::o;25099:147::-;25200:11;25237:3;25222:18;;25099:147;;;;:::o;25274:327::-;25388:3;25409:88;25490:6;25485:3;25409:88;:::i;:::-;25402:95;;25507:56;25556:6;25551:3;25544:5;25507:56;:::i;:::-;25588:6;25583:3;25579:16;25572:23;;25274:327;;;;;:::o;25607:291::-;25747:3;25769:103;25868:3;25859:6;25851;25769:103;:::i;:::-;25762:110;;25889:3;25882:10;;25607:291;;;;;:::o;25904:225::-;26044:34;26040:1;26032:6;26028:14;26021:58;26113:8;26108:2;26100:6;26096:15;26089:33;25904:225;:::o;26135:366::-;26277:3;26298:67;26362:2;26357:3;26298:67;:::i;:::-;26291:74;;26374:93;26463:3;26374:93;:::i;:::-;26492:2;26487:3;26483:12;26476:19;;26135:366;;;:::o;26507:419::-;26673:4;26711:2;26700:9;26696:18;26688:26;;26760:9;26754:4;26750:20;26746:1;26735:9;26731:17;26724:47;26788:131;26914:4;26788:131;:::i;:::-;26780:139;;26507:419;;;:::o;26954:314::-;27050:3;27071:70;27134:6;27129:3;27071:70;:::i;:::-;27064:77;;27151:56;27200:6;27195:3;27188:5;27151:56;:::i;:::-;27232:29;27254:6;27232:29;:::i;:::-;27227:3;27223:39;27216:46;;26954:314;;;;;:::o;27274:545::-;27449:4;27487:2;27476:9;27472:18;27464:26;;27500:69;27566:1;27555:9;27551:17;27542:6;27500:69;:::i;:::-;27616:9;27610:4;27606:20;27601:2;27590:9;27586:18;27579:48;27644:86;27725:4;27716:6;27708;27644:86;:::i;:::-;27636:94;;27740:72;27808:2;27797:9;27793:18;27784:6;27740:72;:::i;:::-;27274:545;;;;;;;:::o;27825:842::-;28068:4;28106:3;28095:9;28091:19;28083:27;;28120:69;28186:1;28175:9;28171:17;28162:6;28120:69;:::i;:::-;28199:72;28267:2;28256:9;28252:18;28243:6;28199:72;:::i;:::-;28318:9;28312:4;28308:20;28303:2;28292:9;28288:18;28281:48;28346:76;28417:4;28408:6;28346:76;:::i;:::-;28338:84;;28432:66;28494:2;28483:9;28479:18;28470:6;28432:66;:::i;:::-;28546:9;28540:4;28536:20;28530:3;28519:9;28515:19;28508:49;28574:86;28655:4;28646:6;28638;28574:86;:::i;:::-;28566:94;;27825:842;;;;;;;;;:::o;28673:143::-;28730:5;28761:6;28755:13;28746:22;;28777:33;28804:5;28777:33;:::i;:::-;28673:143;;;;:::o;28822:507::-;28901:6;28909;28958:2;28946:9;28937:7;28933:23;28929:32;28926:119;;;28964:79;;:::i;:::-;28926:119;29084:1;29109:64;29165:7;29156:6;29145:9;29141:22;29109:64;:::i;:::-;29099:74;;29055:128;29222:2;29248:64;29304:7;29295:6;29284:9;29280:22;29248:64;:::i;:::-;29238:74;;29193:129;28822:507;;;;;:::o;29335:180::-;29383:77;29380:1;29373:88;29480:4;29477:1;29470:15;29504:4;29501:1;29494:15;29521:191;29561:3;29580:20;29598:1;29580:20;:::i;:::-;29575:25;;29614:20;29632:1;29614:20;:::i;:::-;29609:25;;29657:1;29654;29650:9;29643:16;;29678:3;29675:1;29672:10;29669:36;;;29685:18;;:::i;:::-;29669:36;29521:191;;;;:::o;29718:435::-;29865:4;29903:2;29892:9;29888:18;29880:26;;29916:69;29982:1;29971:9;29967:17;29958:6;29916:69;:::i;:::-;30032:9;30026:4;30022:20;30017:2;30006:9;30002:18;29995:48;30060:86;30141:4;30132:6;30124;30060:86;:::i;:::-;30052:94;;29718:435;;;;;;:::o;30159:225::-;30299:34;30295:1;30287:6;30283:14;30276:58;30368:8;30363:2;30355:6;30351:15;30344:33;30159:225;:::o;30390:366::-;30532:3;30553:67;30617:2;30612:3;30553:67;:::i;:::-;30546:74;;30629:93;30718:3;30629:93;:::i;:::-;30747:2;30742:3;30738:12;30731:19;;30390:366;;;:::o;30762:419::-;30928:4;30966:2;30955:9;30951:18;30943:26;;31015:9;31009:4;31005:20;31001:1;30990:9;30986:17;30979:47;31043:131;31169:4;31043:131;:::i;:::-;31035:139;;30762:419;;;:::o;31187:179::-;31327:31;31323:1;31315:6;31311:14;31304:55;31187:179;:::o;31372:366::-;31514:3;31535:67;31599:2;31594:3;31535:67;:::i;:::-;31528:74;;31611:93;31700:3;31611:93;:::i;:::-;31729:2;31724:3;31720:12;31713:19;;31372:366;;;:::o;31744:419::-;31910:4;31948:2;31937:9;31933:18;31925:26;;31997:9;31991:4;31987:20;31983:1;31972:9;31968:17;31961:47;32025:131;32151:4;32025:131;:::i;:::-;32017:139;;31744:419;;;:::o;32169:194::-;32209:4;32229:20;32247:1;32229:20;:::i;:::-;32224:25;;32263:20;32281:1;32263:20;:::i;:::-;32258:25;;32307:1;32304;32300:9;32292:17;;32331:1;32325:4;32322:11;32319:37;;;32336:18;;:::i;:::-;32319:37;32169:194;;;;:::o;32369:224::-;32509:34;32505:1;32497:6;32493:14;32486:58;32578:7;32573:2;32565:6;32561:15;32554:32;32369:224;:::o;32599:366::-;32741:3;32762:67;32826:2;32821:3;32762:67;:::i;:::-;32755:74;;32838:93;32927:3;32838:93;:::i;:::-;32956:2;32951:3;32947:12;32940:19;;32599:366;;;:::o;32971:419::-;33137:4;33175:2;33164:9;33160:18;33152:26;;33224:9;33218:4;33214:20;33210:1;33199:9;33195:17;33188:47;33252:131;33378:4;33252:131;:::i;:::-;33244:139;;32971:419;;;:::o;33396:94::-;33429:8;33477:5;33473:2;33469:14;33448:35;;33396:94;;;:::o;33496:::-;33535:7;33564:20;33578:5;33564:20;:::i;:::-;33553:31;;33496:94;;;:::o;33596:100::-;33635:7;33664:26;33684:5;33664:26;:::i;:::-;33653:37;;33596:100;;;:::o;33702:157::-;33807:45;33827:24;33845:5;33827:24;:::i;:::-;33807:45;:::i;:::-;33802:3;33795:58;33702:157;;:::o;33865:432::-;34033:3;34055:103;34154:3;34145:6;34137;34055:103;:::i;:::-;34048:110;;34168:75;34239:3;34230:6;34168:75;:::i;:::-;34268:2;34263:3;34259:12;34252:19;;34288:3;34281:10;;33865:432;;;;;;:::o;34303:140::-;34351:4;34374:3;34366:11;;34397:3;34394:1;34387:14;34431:4;34428:1;34418:18;34410:26;;34303:140;;;:::o;34449:93::-;34486:6;34533:2;34528;34521:5;34517:14;34513:23;34503:33;;34449:93;;;:::o;34548:107::-;34592:8;34642:5;34636:4;34632:16;34611:37;;34548:107;;;;:::o;34661:393::-;34730:6;34780:1;34768:10;34764:18;34803:97;34833:66;34822:9;34803:97;:::i;:::-;34921:39;34951:8;34940:9;34921:39;:::i;:::-;34909:51;;34993:4;34989:9;34982:5;34978:21;34969:30;;35042:4;35032:8;35028:19;35021:5;35018:30;35008:40;;34737:317;;34661:393;;;;;:::o;35060:142::-;35110:9;35143:53;35161:34;35170:24;35188:5;35170:24;:::i;:::-;35161:34;:::i;:::-;35143:53;:::i;:::-;35130:66;;35060:142;;;:::o;35208:75::-;35251:3;35272:5;35265:12;;35208:75;;;:::o;35289:269::-;35399:39;35430:7;35399:39;:::i;:::-;35460:91;35509:41;35533:16;35509:41;:::i;:::-;35501:6;35494:4;35488:11;35460:91;:::i;:::-;35454:4;35447:105;35365:193;35289:269;;;:::o;35564:73::-;35609:3;35564:73;:::o;35643:189::-;35720:32;;:::i;:::-;35761:65;35819:6;35811;35805:4;35761:65;:::i;:::-;35696:136;35643:189;;:::o;35838:186::-;35898:120;35915:3;35908:5;35905:14;35898:120;;;35969:39;36006:1;35999:5;35969:39;:::i;:::-;35942:1;35935:5;35931:13;35922:22;;35898:120;;;35838:186;;:::o;36030:541::-;36130:2;36125:3;36122:11;36119:445;;;36164:37;36195:5;36164:37;:::i;:::-;36247:29;36265:10;36247:29;:::i;:::-;36237:8;36233:44;36430:2;36418:10;36415:18;36412:49;;;36451:8;36436:23;;36412:49;36474:80;36530:22;36548:3;36530:22;:::i;:::-;36520:8;36516:37;36503:11;36474:80;:::i;:::-;36134:430;;36119:445;36030:541;;;:::o;36577:117::-;36631:8;36681:5;36675:4;36671:16;36650:37;;36577:117;;;;:::o;36700:169::-;36744:6;36777:51;36825:1;36821:6;36813:5;36810:1;36806:13;36777:51;:::i;:::-;36773:56;36858:4;36852;36848:15;36838:25;;36751:118;36700:169;;;;:::o;36874:295::-;36950:4;37096:29;37121:3;37115:4;37096:29;:::i;:::-;37088:37;;37158:3;37155:1;37151:11;37145:4;37142:21;37134:29;;36874:295;;;;:::o;37174:1390::-;37289:36;37321:3;37289:36;:::i;:::-;37390:18;37382:6;37379:30;37376:56;;;37412:18;;:::i;:::-;37376:56;37456:38;37488:4;37482:11;37456:38;:::i;:::-;37541:66;37600:6;37592;37586:4;37541:66;:::i;:::-;37634:1;37658:4;37645:17;;37690:2;37682:6;37679:14;37707:1;37702:617;;;;38363:1;38380:6;38377:77;;;38429:9;38424:3;38420:19;38414:26;38405:35;;38377:77;38480:67;38540:6;38533:5;38480:67;:::i;:::-;38474:4;38467:81;38336:222;37672:886;;37702:617;37754:4;37750:9;37742:6;37738:22;37788:36;37819:4;37788:36;:::i;:::-;37846:1;37860:208;37874:7;37871:1;37868:14;37860:208;;;37953:9;37948:3;37944:19;37938:26;37930:6;37923:42;38004:1;37996:6;37992:14;37982:24;;38051:2;38040:9;38036:18;38023:31;;37897:4;37894:1;37890:12;37885:17;;37860:208;;;38096:6;38087:7;38084:19;38081:179;;;38154:9;38149:3;38145:19;38139:26;38197:48;38239:4;38231:6;38227:17;38216:9;38197:48;:::i;:::-;38189:6;38182:64;38104:156;38081:179;38306:1;38302;38294:6;38290:14;38286:22;38280:4;38273:36;37709:610;;;37672:886;;37264:1300;;;37174:1390;;:::o;38570:652::-;38771:4;38809:3;38798:9;38794:19;38786:27;;38823:69;38889:1;38878:9;38874:17;38865:6;38823:69;:::i;:::-;38902:70;38968:2;38957:9;38953:18;38944:6;38902:70;:::i;:::-;38982:72;39050:2;39039:9;39035:18;39026:6;38982:72;:::i;:::-;39101:9;39095:4;39091:20;39086:2;39075:9;39071:18;39064:48;39129:86;39210:4;39201:6;39193;39129:86;:::i;:::-;39121:94;;38570:652;;;;;;;;:::o;39228:222::-;39368:34;39364:1;39356:6;39352:14;39345:58;39437:5;39432:2;39424:6;39420:15;39413:30;39228:222;:::o;39456:366::-;39598:3;39619:67;39683:2;39678:3;39619:67;:::i;:::-;39612:74;;39695:93;39784:3;39695:93;:::i;:::-;39813:2;39808:3;39804:12;39797:19;;39456:366;;;:::o;39828:419::-;39994:4;40032:2;40021:9;40017:18;40009:26;;40081:9;40075:4;40071:20;40067:1;40056:9;40052:17;40045:47;40109:131;40235:4;40109:131;:::i;:::-;40101:139;;39828:419;;;:::o;40253:220::-;40393:34;40389:1;40381:6;40377:14;40370:58;40462:3;40457:2;40449:6;40445:15;40438:28;40253:220;:::o;40479:366::-;40621:3;40642:67;40706:2;40701:3;40642:67;:::i;:::-;40635:74;;40718:93;40807:3;40718:93;:::i;:::-;40836:2;40831:3;40827:12;40820:19;;40479:366;;;:::o;40851:419::-;41017:4;41055:2;41044:9;41040:18;41032:26;;41104:9;41098:4;41094:20;41090:1;41079:9;41075:17;41068:47;41132:131;41258:4;41132:131;:::i;:::-;41124:139;;40851:419;;;:::o;41276:115::-;41361:23;41378:5;41361:23;:::i;:::-;41356:3;41349:36;41276:115;;:::o;41397:652::-;41598:4;41636:3;41625:9;41621:19;41613:27;;41650:69;41716:1;41705:9;41701:17;41692:6;41650:69;:::i;:::-;41766:9;41760:4;41756:20;41751:2;41740:9;41736:18;41729:48;41794:86;41875:4;41866:6;41858;41794:86;:::i;:::-;41786:94;;41890:70;41956:2;41945:9;41941:18;41932:6;41890:70;:::i;:::-;41970:72;42038:2;42027:9;42023:18;42014:6;41970:72;:::i;:::-;41397:652;;;;;;;;:::o;42055:434::-;42200:4;42238:2;42227:9;42223:18;42215:26;;42251:69;42317:1;42306:9;42302:17;42293:6;42251:69;:::i;:::-;42330:70;42396:2;42385:9;42381:18;42372:6;42330:70;:::i;:::-;42410:72;42478:2;42467:9;42463:18;42454:6;42410:72;:::i;:::-;42055:434;;;;;;:::o;42495:96::-;42553:6;42581:3;42571:13;;42495:96;;;;:::o;42597:1398::-;42719:43;42758:3;42753;42719:43;:::i;:::-;42827:18;42819:6;42816:30;42813:56;;;42849:18;;:::i;:::-;42813:56;42893:38;42925:4;42919:11;42893:38;:::i;:::-;42978:66;43037:6;43029;43023:4;42978:66;:::i;:::-;43071:1;43100:2;43092:6;43089:14;43117:1;43112:631;;;;43787:1;43804:6;43801:84;;;43860:9;43855:3;43851:19;43838:33;43829:42;;43801:84;43911:67;43971:6;43964:5;43911:67;:::i;:::-;43905:4;43898:81;43760:229;43082:907;;43112:631;43164:4;43160:9;43152:6;43148:22;43198:36;43229:4;43198:36;:::i;:::-;43256:1;43270:215;43284:7;43281:1;43278:14;43270:215;;;43370:9;43365:3;43361:19;43348:33;43340:6;43333:49;43421:1;43413:6;43409:14;43399:24;;43468:2;43457:9;43453:18;43440:31;;43307:4;43304:1;43300:12;43295:17;;43270:215;;;43513:6;43504:7;43501:19;43498:186;;;43578:9;43573:3;43569:19;43556:33;43621:48;43663:4;43655:6;43651:17;43640:9;43621:48;:::i;:::-;43613:6;43606:64;43521:163;43498:186;43730:1;43726;43718:6;43714:14;43710:22;43704:4;43697:36;43119:624;;;43082:907;;42694:1301;;;42597:1398;;;:::o;44001:545::-;44174:4;44212:3;44201:9;44197:19;44189:27;;44226:69;44292:1;44281:9;44277:17;44268:6;44226:69;:::i;:::-;44305:70;44371:2;44360:9;44356:18;44347:6;44305:70;:::i;:::-;44385:72;44453:2;44442:9;44438:18;44429:6;44385:72;:::i;:::-;44467;44535:2;44524:9;44520:18;44511:6;44467:72;:::i;:::-;44001:545;;;;;;;:::o;44552:432::-;44640:5;44665:65;44681:48;44722:6;44681:48;:::i;:::-;44665:65;:::i;:::-;44656:74;;44753:6;44746:5;44739:21;44791:4;44784:5;44780:16;44829:3;44820:6;44815:3;44811:16;44808:25;44805:112;;;44836:79;;:::i;:::-;44805:112;44926:52;44971:6;44966:3;44961;44926:52;:::i;:::-;44646:338;44552:432;;;;;:::o;45003:353::-;45069:5;45118:3;45111:4;45103:6;45099:17;45095:27;45085:122;;45126:79;;:::i;:::-;45085:122;45236:6;45230:13;45261:89;45346:3;45338:6;45331:4;45323:6;45319:17;45261:89;:::i;:::-;45252:98;;45075:281;45003:353;;;;:::o;45362:522::-;45441:6;45490:2;45478:9;45469:7;45465:23;45461:32;45458:119;;;45496:79;;:::i;:::-;45458:119;45637:1;45626:9;45622:17;45616:24;45667:18;45659:6;45656:30;45653:117;;;45689:79;;:::i;:::-;45653:117;45794:73;45859:7;45850:6;45839:9;45835:22;45794:73;:::i;:::-;45784:83;;45587:290;45362:522;;;;:::o;45890:719::-;46099:4;46137:3;46126:9;46122:19;46114:27;;46151:69;46217:1;46206:9;46202:17;46193:6;46151:69;:::i;:::-;46267:9;46261:4;46257:20;46252:2;46241:9;46237:18;46230:48;46295:76;46366:4;46357:6;46295:76;:::i;:::-;46287:84;;46381:70;46447:2;46436:9;46432:18;46423:6;46381:70;:::i;:::-;46498:9;46492:4;46488:20;46483:2;46472:9;46468:18;46461:48;46526:76;46597:4;46588:6;46526:76;:::i;:::-;46518:84;;45890:719;;;;;;;:::o;46615:223::-;46755:34;46751:1;46743:6;46739:14;46732:58;46824:6;46819:2;46811:6;46807:15;46800:31;46615:223;:::o;46844:366::-;46986:3;47007:67;47071:2;47066:3;47007:67;:::i;:::-;47000:74;;47083:93;47172:3;47083:93;:::i;:::-;47201:2;47196:3;47192:12;47185:19;;46844:366;;;:::o;47216:419::-;47382:4;47420:2;47409:9;47405:18;47397:26;;47469:9;47463:4;47459:20;47455:1;47444:9;47440:17;47433:47;47497:131;47623:4;47497:131;:::i;:::-;47489:139;;47216:419;;;:::o;47641:221::-;47781:34;47777:1;47769:6;47765:14;47758:58;47850:4;47845:2;47837:6;47833:15;47826:29;47641:221;:::o;47868:366::-;48010:3;48031:67;48095:2;48090:3;48031:67;:::i;:::-;48024:74;;48107:93;48196:3;48107:93;:::i;:::-;48225:2;48220:3;48216:12;48209:19;;47868:366;;;:::o;48240:419::-;48406:4;48444:2;48433:9;48429:18;48421:26;;48493:9;48487:4;48483:20;48479:1;48468:9;48464:17;48457:47;48521:131;48647:4;48521:131;:::i;:::-;48513:139;;48240:419;;;:::o;48665:179::-;48805:31;48801:1;48793:6;48789:14;48782:55;48665:179;:::o;48850:366::-;48992:3;49013:67;49077:2;49072:3;49013:67;:::i;:::-;49006:74;;49089:93;49178:3;49089:93;:::i;:::-;49207:2;49202:3;49198:12;49191:19;;48850:366;;;:::o;49222:419::-;49388:4;49426:2;49415:9;49411:18;49403:26;;49475:9;49469:4;49465:20;49461:1;49450:9;49446:17;49439:47;49503:131;49629:4;49503:131;:::i;:::-;49495:139;;49222:419;;;:::o;49647:224::-;49787:34;49783:1;49775:6;49771:14;49764:58;49856:7;49851:2;49843:6;49839:15;49832:32;49647:224;:::o;49877:366::-;50019:3;50040:67;50104:2;50099:3;50040:67;:::i;:::-;50033:74;;50116:93;50205:3;50116:93;:::i;:::-;50234:2;50229:3;50225:12;50218:19;;49877:366;;;:::o;50249:419::-;50415:4;50453:2;50442:9;50438:18;50430:26;;50502:9;50496:4;50492:20;50488:1;50477:9;50473:17;50466:47;50530:131;50656:4;50530:131;:::i;:::-;50522:139;;50249:419;;;:::o;50674:222::-;50814:34;50810:1;50802:6;50798:14;50791:58;50883:5;50878:2;50870:6;50866:15;50859:30;50674:222;:::o;50902:366::-;51044:3;51065:67;51129:2;51124:3;51065:67;:::i;:::-;51058:74;;51141:93;51230:3;51141:93;:::i;:::-;51259:2;51254:3;51250:12;51243:19;;50902:366;;;:::o;51274:419::-;51440:4;51478:2;51467:9;51463:18;51455:26;;51527:9;51521:4;51517:20;51513:1;51502:9;51498:17;51491:47;51555:131;51681:4;51555:131;:::i;:::-;51547:139;;51274:419;;;:::o;51699:225::-;51839:34;51835:1;51827:6;51823:14;51816:58;51908:8;51903:2;51895:6;51891:15;51884:33;51699:225;:::o;51930:366::-;52072:3;52093:67;52157:2;52152:3;52093:67;:::i;:::-;52086:74;;52169:93;52258:3;52169:93;:::i;:::-;52287:2;52282:3;52278:12;52271:19;;51930:366;;;:::o;52302:419::-;52468:4;52506:2;52495:9;52491:18;52483:26;;52555:9;52549:4;52545:20;52541:1;52530:9;52526:17;52519:47;52583:131;52709:4;52583:131;:::i;:::-;52575:139;;52302:419;;;:::o;52727:525::-;52892:4;52930:2;52919:9;52915:18;52907:26;;52943:69;53009:1;52998:9;52994:17;52985:6;52943:69;:::i;:::-;53059:9;53053:4;53049:20;53044:2;53033:9;53029:18;53022:48;53087:76;53158:4;53149:6;53087:76;:::i;:::-;53079:84;;53173:72;53241:2;53230:9;53226:18;53217:6;53173:72;:::i;:::-;52727:525;;;;;;:::o;53258:419::-;53397:4;53435:2;53424:9;53420:18;53412:26;;53484:9;53478:4;53474:20;53470:1;53459:9;53455:17;53448:47;53512:76;53583:4;53574:6;53512:76;:::i;:::-;53504:84;;53598:72;53666:2;53655:9;53651:18;53642:6;53598:72;:::i;:::-;53258:419;;;;;:::o;53683:178::-;53823:30;53819:1;53811:6;53807:14;53800:54;53683:178;:::o;53867:366::-;54009:3;54030:67;54094:2;54089:3;54030:67;:::i;:::-;54023:74;;54106:93;54195:3;54106:93;:::i;:::-;54224:2;54219:3;54215:12;54208:19;;53867:366;;;:::o;54239:419::-;54405:4;54443:2;54432:9;54428:18;54420:26;;54492:9;54486:4;54482:20;54478:1;54467:9;54463:17;54456:47;54520:131;54646:4;54520:131;:::i;:::-;54512:139;;54239:419;;;:::o;54664:164::-;54804:16;54800:1;54792:6;54788:14;54781:40;54664:164;:::o;54834:366::-;54976:3;54997:67;55061:2;55056:3;54997:67;:::i;:::-;54990:74;;55073:93;55162:3;55073:93;:::i;:::-;55191:2;55186:3;55182:12;55175:19;;54834:366;;;:::o;55206:419::-;55372:4;55410:2;55399:9;55395:18;55387:26;;55459:9;55453:4;55449:20;55445:1;55434:9;55430:17;55423:47;55487:131;55613:4;55487:131;:::i;:::-;55479:139;;55206:419;;;:::o;55631:167::-;55771:19;55767:1;55759:6;55755:14;55748:43;55631:167;:::o;55804:366::-;55946:3;55967:67;56031:2;56026:3;55967:67;:::i;:::-;55960:74;;56043:93;56132:3;56043:93;:::i;:::-;56161:2;56156:3;56152:12;56145:19;;55804:366;;;:::o;56176:419::-;56342:4;56380:2;56369:9;56365:18;56357:26;;56429:9;56423:4;56419:20;56415:1;56404:9;56400:17;56393:47;56457:131;56583:4;56457:131;:::i;:::-;56449:139;;56176:419;;;:::o;56601:386::-;56705:3;56733:38;56765:5;56733:38;:::i;:::-;56787:88;56868:6;56863:3;56787:88;:::i;:::-;56780:95;;56884:65;56942:6;56937:3;56930:4;56923:5;56919:16;56884:65;:::i;:::-;56974:6;56969:3;56965:16;56958:23;;56709:278;56601:386;;;;:::o;56993:271::-;57123:3;57145:93;57234:3;57225:6;57145:93;:::i;:::-;57138:100;;57255:3;57248:10;;56993:271;;;;:::o;57270:917::-;57525:4;57563:3;57552:9;57548:19;57540:27;;57577:69;57643:1;57632:9;57628:17;57619:6;57577:69;:::i;:::-;57693:9;57687:4;57683:20;57678:2;57667:9;57663:18;57656:48;57721:76;57792:4;57783:6;57721:76;:::i;:::-;57713:84;;57807:70;57873:2;57862:9;57858:18;57849:6;57807:70;:::i;:::-;57924:9;57918:4;57914:20;57909:2;57898:9;57894:18;57887:48;57952:76;58023:4;58014:6;57952:76;:::i;:::-;57944:84;;58076:9;58070:4;58066:20;58060:3;58049:9;58045:19;58038:49;58104:76;58175:4;58166:6;58104:76;:::i;:::-;58096:84;;57270:917;;;;;;;;:::o;58193:225::-;58333:34;58329:1;58321:6;58317:14;58310:58;58402:8;58397:2;58389:6;58385:15;58378:33;58193:225;:::o;58424:366::-;58566:3;58587:67;58651:2;58646:3;58587:67;:::i;:::-;58580:74;;58663:93;58752:3;58663:93;:::i;:::-;58781:2;58776:3;58772:12;58765:19;;58424:366;;;:::o;58796:419::-;58962:4;59000:2;58989:9;58985:18;58977:26;;59049:9;59043:4;59039:20;59035:1;59024:9;59020:17;59013:47;59077:131;59203:4;59077:131;:::i;:::-;59069:139;;58796:419;;;:::o;59221:235::-;59361:34;59357:1;59349:6;59345:14;59338:58;59430:18;59425:2;59417:6;59413:15;59406:43;59221:235;:::o;59462:366::-;59604:3;59625:67;59689:2;59684:3;59625:67;:::i;:::-;59618:74;;59701:93;59790:3;59701:93;:::i;:::-;59819:2;59814:3;59810:12;59803:19;;59462:366;;;:::o;59834:419::-;60000:4;60038:2;60027:9;60023:18;60015:26;;60087:9;60081:4;60077:20;60073:1;60062:9;60058:17;60051:47;60115:131;60241:4;60115:131;:::i;:::-;60107:139;;59834:419;;;:::o;60259:142::-;60362:32;60388:5;60362:32;:::i;:::-;60357:3;60350:45;60259:142;;:::o;60407:1064::-;60708:4;60746:3;60735:9;60731:19;60723:27;;60760:69;60826:1;60815:9;60811:17;60802:6;60760:69;:::i;:::-;60876:9;60870:4;60866:20;60861:2;60850:9;60846:18;60839:48;60904:76;60975:4;60966:6;60904:76;:::i;:::-;60896:84;;61027:9;61021:4;61017:20;61012:2;61001:9;60997:18;60990:48;61055:76;61126:4;61117:6;61055:76;:::i;:::-;61047:84;;61141:88;61225:2;61214:9;61210:18;61201:6;61141:88;:::i;:::-;61239:73;61307:3;61296:9;61292:19;61283:6;61239:73;:::i;:::-;61360:9;61354:4;61350:20;61344:3;61333:9;61329:19;61322:49;61388:76;61459:4;61450:6;61388:76;:::i;:::-;61380:84;;60407:1064;;;;;;;;;:::o;61477:141::-;61533:5;61564:6;61558:13;61549:22;;61580:32;61606:5;61580:32;:::i;:::-;61477:141;;;;:::o;61624:832::-;61720:6;61728;61736;61785:2;61773:9;61764:7;61760:23;61756:32;61753:119;;;61791:79;;:::i;:::-;61753:119;61911:1;61936:63;61991:7;61982:6;61971:9;61967:22;61936:63;:::i;:::-;61926:73;;61882:127;62069:2;62058:9;62054:18;62048:25;62100:18;62092:6;62089:30;62086:117;;;62122:79;;:::i;:::-;62086:117;62227:73;62292:7;62283:6;62272:9;62268:22;62227:73;:::i;:::-;62217:83;;62019:291;62349:2;62375:64;62431:7;62422:6;62411:9;62407:22;62375:64;:::i;:::-;62365:74;;62320:129;61624:832;;;;;:::o;62462:176::-;62602:28;62598:1;62590:6;62586:14;62579:52;62462:176;:::o;62644:366::-;62786:3;62807:67;62871:2;62866:3;62807:67;:::i;:::-;62800:74;;62883:93;62972:3;62883:93;:::i;:::-;63001:2;62996:3;62992:12;62985:19;;62644:366;;;:::o;63016:419::-;63182:4;63220:2;63209:9;63205:18;63197:26;;63269:9;63263:4;63259:20;63255:1;63244:9;63240:17;63233:47;63297:131;63423:4;63297:131;:::i;:::-;63289:139;;63016:419;;;:::o;63441:177::-;63581:29;63577:1;63569:6;63565:14;63558:53;63441:177;:::o;63624:366::-;63766:3;63787:67;63851:2;63846:3;63787:67;:::i;:::-;63780:74;;63863:93;63952:3;63863:93;:::i;:::-;63981:2;63976:3;63972:12;63965:19;;63624:366;;;:::o;63996:419::-;64162:4;64200:2;64189:9;64185:18;64177:26;;64249:9;64243:4;64239:20;64235:1;64224:9;64220:17;64213:47;64277:131;64403:4;64277:131;:::i;:::-;64269:139;;63996:419;;;:::o;64421:220::-;64561:34;64557:1;64549:6;64545:14;64538:58;64630:3;64625:2;64617:6;64613:15;64606:28;64421:220;:::o;64647:366::-;64789:3;64810:67;64874:2;64869:3;64810:67;:::i;:::-;64803:74;;64886:93;64975:3;64886:93;:::i;:::-;65004:2;64999:3;64995:12;64988:19;;64647:366;;;:::o;65019:419::-;65185:4;65223:2;65212:9;65208:18;65200:26;;65272:9;65266:4;65262:20;65258:1;65247:9;65243:17;65236:47;65300:131;65426:4;65300:131;:::i;:::-;65292:139;;65019:419;;;:::o;65444:221::-;65584:34;65580:1;65572:6;65568:14;65561:58;65653:4;65648:2;65640:6;65636:15;65629:29;65444:221;:::o;65671:366::-;65813:3;65834:67;65898:2;65893:3;65834:67;:::i;:::-;65827:74;;65910:93;65999:3;65910:93;:::i;:::-;66028:2;66023:3;66019:12;66012:19;;65671:366;;;:::o;66043:419::-;66209:4;66247:2;66236:9;66232:18;66224:26;;66296:9;66290:4;66286:20;66282:1;66271:9;66267:17;66260:47;66324:131;66450:4;66324:131;:::i;:::-;66316:139;;66043:419;;;:::o;66468:182::-;66608:34;66604:1;66596:6;66592:14;66585:58;66468:182;:::o;66656:366::-;66798:3;66819:67;66883:2;66878:3;66819:67;:::i;:::-;66812:74;;66895:93;66984:3;66895:93;:::i;:::-;67013:2;67008:3;67004:12;66997:19;;66656:366;;;:::o;67028:419::-;67194:4;67232:2;67221:9;67217:18;67209:26;;67281:9;67275:4;67271:20;67267:1;67256:9;67252:17;67245:47;67309:131;67435:4;67309:131;:::i;:::-;67301:139;;67028:419;;;:::o;67453:171::-;67593:23;67589:1;67581:6;67577:14;67570:47;67453:171;:::o;67630:366::-;67772:3;67793:67;67857:2;67852:3;67793:67;:::i;:::-;67786:74;;67869:93;67958:3;67869:93;:::i;:::-;67987:2;67982:3;67978:12;67971:19;;67630:366;;;:::o;68002:419::-;68168:4;68206:2;68195:9;68191:18;68183:26;;68255:9;68249:4;68245:20;68241:1;68230:9;68226:17;68219:47;68283:131;68409:4;68283:131;:::i;:::-;68275:139;;68002:419;;;:::o;68427:178::-;68567:30;68563:1;68555:6;68551:14;68544:54;68427:178;:::o;68611:366::-;68753:3;68774:67;68838:2;68833:3;68774:67;:::i;:::-;68767:74;;68850:93;68939:3;68850:93;:::i;:::-;68968:2;68963:3;68959:12;68952:19;;68611:366;;;:::o;68983:419::-;69149:4;69187:2;69176:9;69172:18;69164:26;;69236:9;69230:4;69226:20;69222:1;69211:9;69207:17;69200:47;69264:131;69390:4;69264:131;:::i;:::-;69256:139;;68983:419;;;:::o;69408:181::-;69548:33;69544:1;69536:6;69532:14;69525:57;69408:181;:::o;69595:366::-;69737:3;69758:67;69822:2;69817:3;69758:67;:::i;:::-;69751:74;;69834:93;69923:3;69834:93;:::i;:::-;69952:2;69947:3;69943:12;69936:19;;69595:366;;;:::o;69967:419::-;70133:4;70171:2;70160:9;70156:18;70148:26;;70220:9;70214:4;70210:20;70206:1;70195:9;70191:17;70184:47;70248:131;70374:4;70248:131;:::i;:::-;70240:139;;69967:419;;;:::o
Swarm Source
ipfs://48a15146ea5aac39a426bdc0e6b8c1f4b8fdb8015bee85c2fd931ea24fbcfd66
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.