Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 5 from a total of 5 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Set Authereum En... | 15468890 | 622 days ago | IN | 0 ETH | 0.00010134 | ||||
Change Owner | 15468807 | 622 days ago | IN | 0 ETH | 0.00012449 | ||||
Create Proxy | 15468791 | 622 days ago | IN | 0 ETH | 0.000136 | ||||
Initialize V1 | 10200831 | 1443 days ago | IN | 0 ETH | 0.00470519 | ||||
0x60806040 | 8835717 | 1662 days ago | IN | Create: AuthereumAccount | 0 ETH | 0.00725834 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
AuthereumAccount
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-11-02 */ pragma solidity 0.5.12; // @author Authereum, Inc. /** * @title AccountStateV1 * @author Authereum, Inc. * @dev This contract holds the state variables used by the account contracts. * @dev This abscraction exists in order to retain the order of the state variables. */ contract AccountStateV1 { uint256 public lastInitializedVersion; mapping(address => bool) public authKeys; uint256 public nonce; uint256 public numAuthKeys; } // File: contracts/account/state/AccountState.sol pragma solidity 0.5.12; /** * @title AccountState * @author Authereum, Inc. * @dev This contract holds the state variables used by the account contracts. * @dev This exists as the main contract to hold state. This contract is inherited * @dev by Account.sol, which will not care about state as long as it inherits * @dev AccountState.sol. Any state variable additions will be made to the various * @dev versions of AccountStateVX that this contract will inherit. */ contract AccountState is AccountStateV1 {} // File: contracts/account/event/AccountEvent.sol pragma solidity 0.5.12; /** * @title AccountEvent * @author Authereum, Inc. * @dev This contract holds the events used by the Authereum contracts. * @dev This abscraction exists in order to retain the order to give initialization functions * @dev access to events. * @dev This contract can be overwritten with no changes to the upgradeability. */ contract AccountEvent { /** * BaseAccount.sol */ event FundsReceived(address indexed sender, uint256 indexed value); event AddedAuthKey(address indexed authKey); event RemovedAuthKey(address indexed authKey); event SwappedAuthKeys(address indexed oldAuthKey, address indexed newAuthKey); // Invalid Sigs event InvalidAuthkey(); event InvalidTransactionDataSigner(); // Invalid Tx event CallFailed(bytes32 encodedData); /** * AccountUpgradeability.sol */ event Upgraded(address indexed implementation); } // File: contracts/account/initializer/AccountInitializeV1.sol pragma solidity 0.5.12; /** * @title AccountInitializeV1 * @author Authereum, Inc. * @dev This contract holds the initialize function used by the account contracts. * @dev This abscraction exists in order to retain the order of the initialization functions. */ contract AccountInitializeV1 is AccountState, AccountEvent { /// @dev Initialize the Authereum Account /// @param _authKey authKey that will own this account function initializeV1( address _authKey ) public { require(lastInitializedVersion == 0); lastInitializedVersion = 1; // Add self as an authKey authKeys[_authKey] = true; numAuthKeys += 1; emit AddedAuthKey(_authKey); } } // File: contracts/account/initializer/AccountInitialize.sol pragma solidity 0.5.12; /** * @title AccountInitialize * @author Authereum, Inc. * @dev This contract holds the intialize functions used by the account contracts. * @dev This exists as the main contract to hold these functions. This contract is inherited * @dev by AuthereumAccount.sol, which will not care about initialization functions as long as it inherits * @dev AccountInitialize.sol. Any initialization function additions will be made to the various * @dev versions of AccountInitializeVx that this contract will inherit. */ contract AccountInitialize is AccountInitializeV1 {} // File: contracts/interfaces/IERC1271.sol pragma solidity 0.5.12; contract IERC1271 { function isValidSignature( bytes memory _messageHash, bytes memory _signature) public view returns (bytes4 magicValue); } // File: openzeppelin-solidity/contracts/cryptography/ECDSA.sol pragma solidity ^0.5.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * (.note) This call _does not revert_ if the signature is invalid, or * if the signer is otherwise unable to be retrieved. In those scenarios, * the zero address is returned. * * (.warning) `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise) * be too long), and then calling `toEthSignedMessageHash` on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return address(0); } if (v != 27 && v != 28) { return address(0); } // If the signature is valid (and not malleable), return the signer address return ecrecover(hash, v, r, s); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * [`eth_sign`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign) * JSON-RPC method. * * See `recover`. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: solidity-bytes-utils/contracts/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.5.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(_bytes.length >= (_start + _length)); 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) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) { require(_bytes.length >= (_start + 20)); 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)); 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)); 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)); 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)); 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)); 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)); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint(bytes memory _bytes, uint _start) internal pure returns (uint256) { require(_bytes.length >= (_start + 32)); uint256 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)); 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(uint(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(uint(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: contracts/account/BaseAccount.sol pragma solidity 0.5.12; pragma experimental ABIEncoderV2; /** * @title BaseAccount * @author Authereum, Inc. * @dev Base account contract. Performs most of the functionality * @dev of an Authereum account contract. */ contract BaseAccount is AccountInitialize, IERC1271 { using SafeMath for uint256; using ECDSA for bytes32; using BytesLib for bytes; // Include a CHAIN_ID const uint256 constant CHAIN_ID = 1; // bytes4(keccak256("isValidSignature(bytes,bytes)") bytes4 constant internal VALID_SIG = 0x20c13b0b; bytes4 constant internal INVALID_SIG = 0xffffffff; modifier onlyValidAuthKeyOrSelf { _validateAuthKey(msg.sender); _; } // This is required for funds sent to this contract function () external payable {} /** * Getters */ /// @dev Get the current nonce of the contract /// @return The nonce of the contract function getNonce() public view returns (uint256) { return nonce; } /// @dev Get the chain ID constant /// @return The chain id function getChainId() public view returns (uint256) { return CHAIN_ID; } /** * Public functions */ /// @dev Execute a transaction /// @notice This is to be called directly by an AuthKey /// @param _destination Destination of the transaction /// @param _value Value of the transaction /// @param _data Data of the transaction /// @param _gasLimit Gas limit of the transaction /// @return Response of the call function executeTransaction( address _destination, uint256 _value, bytes memory _data, uint256 _gasLimit ) public onlyValidAuthKeyOrSelf returns (bytes memory) { return _executeTransaction(_destination, _value, _data, _gasLimit); } /// @dev Add an auth key to the list of auth keys /// @param _authKey Address of the auth key to add function addAuthKey(address _authKey) public onlyValidAuthKeyOrSelf { require(!authKeys[_authKey], "Auth key already added"); authKeys[_authKey] = true; numAuthKeys += 1; emit AddedAuthKey(_authKey); } /// @dev Add multiple auth keys to the list of auth keys /// @param _authKeys Array of addresses to add to the auth keys list function addMultipleAuthKeys(address[] memory _authKeys) public onlyValidAuthKeyOrSelf { for (uint256 i = 0; i < _authKeys.length; i++) { addAuthKey(_authKeys[i]); } } /// @dev Remove an auth key from the list of auth keys /// @param _authKey Address of the auth key to remove function removeAuthKey(address _authKey) public onlyValidAuthKeyOrSelf { require(authKeys[_authKey], "Auth key not yet added"); require(numAuthKeys > 1, "Cannot remove last auth key"); authKeys[_authKey] = false; numAuthKeys -= 1; emit RemovedAuthKey(_authKey); } /// @dev Remove multiple auth keys to the list of auth keys /// @param _authKeys Array of addresses to remove to the auth keys list function removeMultipleAuthKeys(address[] memory _authKeys) public onlyValidAuthKeyOrSelf { for (uint256 i = 0; i < _authKeys.length; i++) { removeAuthKey(_authKeys[i]); } } /// @dev Swap one authKey for a non-authKey /// @param _oldAuthKey An existing authKey /// @param _newAuthKey A non-existing authKey function swapAuthKeys( address _oldAuthKey, address _newAuthKey ) public onlyValidAuthKeyOrSelf { require(authKeys[_oldAuthKey], "Old auth key does not exist"); require(!authKeys[_newAuthKey], "New auth key already exists"); addAuthKey(_newAuthKey); removeAuthKey(_oldAuthKey); emit SwappedAuthKeys(_oldAuthKey, _newAuthKey); } /// @dev Swap multiple auth keys to the list of auth keys /// @param _oldAuthKeys Array of addresses to remove to the auth keys list /// @param _newAuthKeys Array of addresses to add to the auth keys list function swapMultipleAuthKeys( address[] memory _oldAuthKeys, address[] memory _newAuthKeys ) public { require(_oldAuthKeys.length == _newAuthKeys.length, "Input arrays not equal length"); for (uint256 i = 0; i < _oldAuthKeys.length; i++) { swapAuthKeys(_oldAuthKeys[i], _newAuthKeys[i]); } } /// @dev Check if a message and signature pair is valid /// @notice The _signatures parameter can either be one auth key signature or it can /// @notice be a login key signature and an auth key signature (signed login key) /// @param _msg Message that was signed /// @param _signatures Signature(s) of the data. Either a single signature (login) or two (login and auth) /// @return VALID_SIG or INVALID_SIG hex data function isValidSignature( bytes memory _msg, bytes memory _signatures ) public view returns (bytes4) { if (_signatures.length == 65) { return isValidAuthKeySignature(_msg, _signatures); } else if (_signatures.length == 130) { return isValidLoginKeySignature(_msg, _signatures); } else { revert("Invalid _signatures length"); } } /// @dev Check if a message and auth key signature pair is valid /// @param _msg Message that was signed /// @param _signature Signature of the data signed by the authkey /// @return VALID_SIG or INVALID_SIG hex data function isValidAuthKeySignature( bytes memory _msg, bytes memory _signature ) public view returns (bytes4) { address authKeyAddress = _getEthSignedMessageHash(_msg).recover( _signature ); if(authKeys[authKeyAddress]) { return VALID_SIG; } else { return INVALID_SIG; } } /// @dev Check if a message and login key signature pair is valid, as well as a signed login key by an auth key /// @param _msg Message that was signed /// @param _signatures Signatures of the data. Signed msg data by the login key and signed login key by auth key /// @return VALID_SIG or INVALID_SIG hex data function isValidLoginKeySignature( bytes memory _msg, bytes memory _signatures ) public view returns (bytes4) { bytes memory msgHashSignature = _signatures.slice(0, 65); bytes memory loginKeyAuthorizationSignature = _signatures.slice(65, 65); address loginKeyAddress = _getEthSignedMessageHash(_msg).recover( msgHashSignature ); bytes32 loginKeyAuthorizationMessageHash = keccak256(abi.encodePacked( loginKeyAddress )).toEthSignedMessageHash(); address authorizationSigner = loginKeyAuthorizationMessageHash.recover( loginKeyAuthorizationSignature ); if(authKeys[authorizationSigner]) { return VALID_SIG; } else { return INVALID_SIG; } } /** * Internal functions */ /// @dev Validate an authKey /// @param _authKey Address of the auth key to validate function _validateAuthKey(address _authKey) internal view { require(authKeys[_authKey] == true || msg.sender == address(this), "Auth key is invalid"); } /// @dev Validate signatures from an AuthKeyMetaTx /// @param _txDataMessageHash Ethereum signed message of the transaction /// @param _transactionDataSignature Signed tx data /// @return Address of the auth key that signed the data function _validateAuthKeyMetaTxSigs( bytes32 _txDataMessageHash, bytes memory _transactionDataSignature ) internal view returns (address) { address transactionDataSigner = _txDataMessageHash.recover(_transactionDataSignature); _validateAuthKey(transactionDataSigner); return transactionDataSigner; } /// @dev Validate signatures from an AuthKeyMetaTx /// @param _txDataMessageHash Ethereum signed message of the transaction /// @param _transactionDataSignature Signed tx data /// @param _loginKeyAuthorizationSignature Signed loginKey /// @return Address of the login key that signed the data function validateLoginKeyMetaTxSigs( bytes32 _txDataMessageHash, bytes memory _transactionDataSignature, bytes memory _loginKeyAuthorizationSignature ) public view returns (address) { address transactionDataSigner = _txDataMessageHash.recover( _transactionDataSignature ); bytes32 loginKeyAuthorizationMessageHash = keccak256(abi.encodePacked( transactionDataSigner )).toEthSignedMessageHash(); address authorizationSigner = loginKeyAuthorizationMessageHash.recover( _loginKeyAuthorizationSignature ); _validateAuthKey(authorizationSigner); return transactionDataSigner; } /// @dev Execute a transaction without a refund /// @notice This is the transaction sent from the CBA /// @param _destination Destination of the transaction /// @param _value Value of the transaction /// @param _data Data of the transaction /// @param _gasLimit Gas limit of the transaction /// @return Response of the call function _executeTransaction( address _destination, uint256 _value, bytes memory _data, uint256 _gasLimit ) internal returns (bytes memory) { (bool success, bytes memory response) = _destination.call.gas(_gasLimit).value(_value)(_data); if (!success) { bytes32 encodedData = _encodeData(nonce, _destination, _value, _data); emit CallFailed(encodedData); } // Increment nonce here so that both relayed and non-relayed calls will increment nonce // Must be incremented after !success data encode in order to encode original nonce nonce++; return response; } /// @dev Issue a refund /// @param _startGas Starting gas at the beginning of the transaction /// @param _gasPrice Gas price to use when sending a refund function _issueRefund( uint256 _startGas, uint256 _gasPrice ) internal { uint256 _gasUsed = _startGas.sub(gasleft()); require(_gasUsed.mul(_gasPrice) <= address(this).balance, "Insufficient gas for refund"); msg.sender.transfer(_gasUsed.mul(_gasPrice)); } /// @dev Get the gas buffer for each transaction /// @notice This takes into account the input params as well as the fixed /// @notice cost of checking if the account has enough gas left as well as the /// @notice transfer to the relayer /// @param _txData Input data of the transaction /// @return Total cost of input data and final require and transfer function _getGasBuffer(bytes memory _txData) internal view returns (uint256) { // Input data cost uint256 costPerByte = 68; uint256 txDataCost = _txData.length * costPerByte; // Cost of require and transfer uint256 costPerCheck = 10000; return txDataCost.add(costPerCheck); } /// @dev Encode data for a failed transaction /// @param _nonce Nonce of the transaction /// @param _destination Destination of the transaction /// @param _value Value of the transaction /// @param _data Data of the transaction /// @return Encoded data hash function _encodeData( uint256 _nonce, address _destination, uint256 _value, bytes memory _data ) internal pure returns (bytes32) { return keccak256(abi.encodePacked( _nonce, _destination, _value, _data )); } /// @dev Adds ETH signed message prefix to bytes message and hashes it /// @param _msg Bytes message before adding the prefix /// @return Prefixed and hashed message function _getEthSignedMessageHash(bytes memory _msg) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", _uint2str(_msg.length), _msg)); } /// @dev Convert uint to string /// @param _num Uint to be converted /// @return String equivalent of the uint function _uint2str(uint _num) private pure returns (string memory _uintAsString) { if (_num == 0) { return "0"; } uint i = _num; uint j = _num; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (i != 0) { bstr[k--] = byte(uint8(48 + i % 10)); i /= 10; } return string(bstr); } } // File: contracts/account/LoginKeyMetaTxAccount.sol pragma solidity 0.5.12; /** * @title LoginKeyMetaTxAccount * @author Authereum, Inc. * @dev Contract used by login keys to send transactions. Login key firwall checks * @dev are performed in this contract as well. */ contract LoginKeyMetaTxAccount is BaseAccount { /// @dev Execute an loginKey meta transaction /// @param _destinations Destinations of the transaction /// @param _datas Datas of the transaction /// @param _values Values of the transaction /// @param _gasLimits Gas limits of the transaction /// @param _transactionDataSignatures Signed tx datas /// @param _loginKeyAuthorizationSignature Signed loginKey /// @return Response of the call function executeMultipleLoginKeyMetaTx( address[] memory _destinations, bytes[] memory _datas, uint256[] memory _values, uint256[] memory _gasLimits, bytes[] memory _transactionDataSignatures, bytes memory _loginKeyAuthorizationSignature ) public returns (bytes[] memory) { uint256 startGas = gasleft(); // Verify data length verifyLoginKeyParamDataLength( _destinations, _datas, _values, _gasLimits, _transactionDataSignatures ); // Execute transactions individually bytes[] memory returnValues = new bytes[](_destinations.length); for(uint i = 0; i < _destinations.length; i++) { returnValues[i] = _executeLoginKeyMetaTx( _destinations[i], _datas[i], _values[i], _gasLimits[i], _transactionDataSignatures[i], _loginKeyAuthorizationSignature ); } // Refund gas costs _issueRefund(startGas, tx.gasprice); return returnValues; } /// @dev Check if a loginKey is valid /// @param _transactionDataSigner loginKey that signed the tx data /// @param _loginKeyAuthorizationSignature Signed loginKey /// @return True if login key is valid function isValidLoginKey( address _transactionDataSigner, bytes memory _loginKeyAuthorizationSignature ) public view returns (bool) { bytes32 loginKeyAuthorizationMessageHash = keccak256(abi.encodePacked( _transactionDataSigner )).toEthSignedMessageHash(); address authorizationSigner = loginKeyAuthorizationMessageHash.recover( _loginKeyAuthorizationSignature ); return authKeys[authorizationSigner]; } /** * Internal functions */ /// @dev Execute an loginKey meta transaction /// @param _destination Destination of the transaction /// @param _data Data of the transaction /// @param _value Value of the transaction /// @param _gasLimit Gas limit of the transaction /// @param _transactionDataSignature Signed tx data /// @param _loginKeyAuthorizationSignature Signed loginKey /// @return Response of the call function _executeLoginKeyMetaTx( address _destination, bytes memory _data, uint256 _value, uint256 _gasLimit, bytes memory _transactionDataSignature, bytes memory _loginKeyAuthorizationSignature ) internal returns (bytes memory) { uint256 startGas = gasleft(); // Login key cannot upgrade the contract require(_checkDestination(_destination), "Login key is not able to upgrade to proxy"); bytes32 _txDataMessageHash = keccak256(abi.encodePacked( address(this), msg.sig, CHAIN_ID, _destination, _data, _value, nonce, tx.gasprice, _gasLimit )).toEthSignedMessageHash(); validateLoginKeyMetaTxSigs( _txDataMessageHash, _transactionDataSignature, _loginKeyAuthorizationSignature ); return _executeTransaction( _destination, _value, _data, _gasLimit ); } /// @dev Verify the length of the input data /// @param _destinations Destinations of the transaction /// @param _dataArray Data of the transactions /// @param _values Values of the transaction /// @param _gasLimits Gas limits of the transaction /// @param _transactionDataSignatures Signed tx data function verifyLoginKeyParamDataLength( address[] memory _destinations, bytes[] memory _dataArray, uint256[] memory _values, uint256[] memory _gasLimits, bytes[] memory _transactionDataSignatures ) internal view { require(_destinations.length == _values.length, "Invalid values length"); require(_destinations.length == _dataArray.length, "Invalid dataArray length"); require(_destinations.length == _gasLimits.length, "Invalid gasLimits length"); require(_destinations.length == _transactionDataSignatures.length, "Invalid transactionDataSignatures length"); } /// @dev Check to see if the destination is self. /// @notice The login key is not able to upgrade the proxy by transacting with itself. /// @notice This transaction will throw if an upgrade is attempted /// @param _destination Destination address /// @return True if the destination is not self function _checkDestination(address _destination) internal view returns (bool) { return (address(this) != _destination); } } // File: contracts/account/AuthKeyMetaTxAccount.sol pragma solidity 0.5.12; /** * @title AuthKeyMetaTxAccount * @author Authereum, Inc. * @dev Contract used by auth keys to send transactions. */ contract AuthKeyMetaTxAccount is BaseAccount { /// @dev Execute multiple authKey meta transactiona /// @param _destinations Destinations of the transaction /// @param _datas Data of the transactions /// @param _values Values of the transaction /// @param _gasLimits Gas limits of the transaction /// @param _transactionDataSignatures Signed tx data function executeMultipleAuthKeyMetaTx( address[] memory _destinations, bytes[] memory _datas, uint256[] memory _values, uint256[] memory _gasLimits, bytes[] memory _transactionDataSignatures ) public returns (bytes[] memory) { uint256 startGas = gasleft(); // Verify data length verifyAuthKeyParamDataLength( _destinations, _datas, _values, _gasLimits, _transactionDataSignatures ); // Execute transactions individually bytes[] memory returnValues = new bytes[](_destinations.length); for(uint i = 0; i < _destinations.length; i++) { returnValues[i] = _executeAuthKeyMetaTx( _destinations[i], _datas[i], _values[i], _gasLimits[i], _transactionDataSignatures[i] ); } // Refund gas costs _issueRefund(startGas, tx.gasprice); return returnValues; } /** * Internal functions */ /// @dev Execute an authKey meta transaction /// @param _destination Destination of the transaction /// @param _data Data of the transaction /// @param _value Value of the transaction /// @param _gasLimit Gas limit of the transaction /// @param _transactionDataSignature Signed tx data /// @return Response of the call function _executeAuthKeyMetaTx( address _destination, bytes memory _data, uint256 _value, uint256 _gasLimit, bytes memory _transactionDataSignature ) internal returns (bytes memory) { bytes32 _txDataMessageHash = keccak256(abi.encodePacked( address(this), msg.sig, CHAIN_ID, _destination, _data, _value, nonce, tx.gasprice, _gasLimit )).toEthSignedMessageHash(); // Validate the signer _validateAuthKeyMetaTxSigs( _txDataMessageHash, _transactionDataSignature ); return _executeTransaction( _destination, _value, _data, _gasLimit ); } /// @dev Verify the length of the input data /// @param _destinations Destinations of the transaction /// @param _dataArray Data of the transactions /// @param _values Values of the transaction /// @param _gasLimits Gas limits of the transaction /// @param _transactionDataSignatures Signed tx data function verifyAuthKeyParamDataLength( address[] memory _destinations, bytes[] memory _dataArray, uint256[] memory _values, uint256[] memory _gasLimits, bytes[] memory _transactionDataSignatures ) internal view { require(_destinations.length == _values.length, "Invalid values length"); require(_destinations.length == _dataArray.length, "Invalid dataArray length"); require(_destinations.length == _gasLimits.length, "Invalid gasLimits length"); require(_destinations.length == _transactionDataSignatures.length, "Invalid gasLimits length"); } } // File: contracts/utils/Address.sol pragma solidity ^0.5.0; /** * Utility library of inline functions on addresses * * Source https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-solidity/v2.1.3/contracts/utils/Address.sol * This contract is copied here and renamed from the original to avoid clashes in the compiled artifacts * when the user imports a zos-lib contract (that transitively causes this contract to be compiled and added to the * build/artifacts folder) as well as the vanilla Address implementation from an openzeppelin version. */ library OpenZeppelinUpgradesAddress { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account address of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } // File: contracts/account/AccountUpgradeability.sol pragma solidity 0.5.12; /** * @title AccountUpgradeability * @author Authereum, Inc. * @dev The upgradeability logic for an Authereum account. */ contract AccountUpgradeability is BaseAccount { /// @dev Storage slot with the address of the current implementation. /// @notice This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted /// @notice by 1, and is validated in the constructor. bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /// Only allow this contract to perform upgrade logic modifier onlySelf() { require(address(this) == msg.sender); _; } /// @dev Upgrades the proxy to the newest implementation of a contract and /// @dev forwards a function call to it. /// @notice This is useful to initialize the proxied contract. /// @param _newImplementation Address of the new implementation. /// @param _data Array of initialize data function upgradeToAndCall( address _newImplementation, bytes memory _data ) public onlySelf { setImplementation(_newImplementation); (bool success,) = _newImplementation.delegatecall(_data); require(success); emit Upgraded(_newImplementation); } /// @dev Sets the implementation address of the proxy. /// @notice This is only meant to be called when upgrading self /// @notice The initial setImplementation for a proxy is set during /// @notice the proxy's initialization, not with this call /// @param _newImplementation Address of the new implementation. function setImplementation(address _newImplementation) internal { require(OpenZeppelinUpgradesAddress.isContract(_newImplementation), "Cannot set a proxy implementation to a non-contract address"); bytes32 slot = IMPLEMENTATION_SLOT; assembly { sstore(slot, _newImplementation) } } } // File: contracts/account/AuthereumAccount.sol pragma solidity 0.5.12; /** * @title AuthereumAccount * @author Authereum, Inc. * @dev Top-level contract used when creating an Authereum account. * @dev This contract is meant to only hold the version. All other logic is inherited. */ contract AuthereumAccount is BaseAccount, LoginKeyMetaTxAccount, AuthKeyMetaTxAccount, AccountUpgradeability { string constant public authereumVersion = "2019102500"; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authKey","type":"address"}],"name":"AddedAuthKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"encodedData","type":"bytes32"}],"name":"CallFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"FundsReceived","type":"event"},{"anonymous":false,"inputs":[],"name":"InvalidAuthkey","type":"event"},{"anonymous":false,"inputs":[],"name":"InvalidTransactionDataSigner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authKey","type":"address"}],"name":"RemovedAuthKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAuthKey","type":"address"},{"indexed":true,"internalType":"address","name":"newAuthKey","type":"address"}],"name":"SwappedAuthKeys","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"_authKey","type":"address"}],"name":"addAuthKey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_authKeys","type":"address[]"}],"name":"addMultipleAuthKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authKeys","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"authereumVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_destinations","type":"address[]"},{"internalType":"bytes[]","name":"_datas","type":"bytes[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256[]","name":"_gasLimits","type":"uint256[]"},{"internalType":"bytes[]","name":"_transactionDataSignatures","type":"bytes[]"}],"name":"executeMultipleAuthKeyMetaTx","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_destinations","type":"address[]"},{"internalType":"bytes[]","name":"_datas","type":"bytes[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256[]","name":"_gasLimits","type":"uint256[]"},{"internalType":"bytes[]","name":"_transactionDataSignatures","type":"bytes[]"},{"internalType":"bytes","name":"_loginKeyAuthorizationSignature","type":"bytes"}],"name":"executeMultipleLoginKeyMetaTx","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_gasLimit","type":"uint256"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_authKey","type":"address"}],"name":"initializeV1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"_msg","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isValidAuthKeySignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_transactionDataSigner","type":"address"},{"internalType":"bytes","name":"_loginKeyAuthorizationSignature","type":"bytes"}],"name":"isValidLoginKey","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"_msg","type":"bytes"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"isValidLoginKeySignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"_msg","type":"bytes"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastInitializedVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numAuthKeys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_authKey","type":"address"}],"name":"removeAuthKey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_authKeys","type":"address[]"}],"name":"removeMultipleAuthKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_oldAuthKey","type":"address"},{"internalType":"address","name":"_newAuthKey","type":"address"}],"name":"swapAuthKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_oldAuthKeys","type":"address[]"},{"internalType":"address[]","name":"_newAuthKeys","type":"address[]"}],"name":"swapMultipleAuthKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newImplementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_txDataMessageHash","type":"bytes32"},{"internalType":"bytes","name":"_transactionDataSignature","type":"bytes"},{"internalType":"bytes","name":"_loginKeyAuthorizationSignature","type":"bytes"}],"name":"validateLoginKeyMetaTxSigs","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613547806100206000396000f3fe6080604052600436106101405760003560e01c80635b79818f116100b6578063d087d2881161006f578063d087d2881461047b578063d59e3e98146104a6578063ec5e319e146104e3578063f399f1dd1461050e578063f454dfe114610537578063fd54c1221461057457610140565b80635b79818f1461036d5780637e7fd66c146103965780639565389e146103c1578063a331c254146103ea578063affed0e014610427578063b4c271641461045257610140565b806320c13b0b1161010857806320c13b0b146102255780633408e4701461026257806340914b061461028d5780634c477daf146102ca5780634f1ef286146103075780635175ca5e1461033057610140565b806306a41d091461014257806313f8c5781461017f5780631704db30146101a85780631b9a9f9e146101d15780631f602092146101fa575b005b34801561014e57600080fd5b506101696004803603610164919081019061212b565b6105b1565b6040516101769190612f44565b60405180910390f35b34801561018b57600080fd5b506101a660048036036101a19190810190612072565b6105d2565b005b3480156101b457600080fd5b506101cf60048036036101ca91908101906121a6565b610716565b005b3480156101dd57600080fd5b506101f860048036036101f39190810190612072565b61075b565b005b34801561020657600080fd5b5061020f61081f565b60405161021c9190612f66565b60405180910390f35b34801561023157600080fd5b5061024c600480360361024791908101906124da565b610858565b6040516102599190612f29565b60405180910390f35b34801561026e57600080fd5b506102776108d1565b60405161028491906131a8565b60405180910390f35b34801561029957600080fd5b506102b460048036036102af91908101906124da565b6108da565b6040516102c19190612f29565b60405180910390f35b3480156102d657600080fd5b506102f160048036036102ec919081019061245b565b61096e565b6040516102fe9190612e71565b60405180910390f35b34801561031357600080fd5b5061032e600480360361032991908101906120d7565b6109e6565b005b34801561033c57600080fd5b5061035760048036036103529190810190612072565b610ae4565b6040516103649190612eae565b60405180910390f35b34801561037957600080fd5b50610394600480360361038f91908101906121e7565b610b04565b005b3480156103a257600080fd5b506103ab610b99565b6040516103b891906131a8565b60405180910390f35b3480156103cd57600080fd5b506103e860048036036103e39190810190612072565b610b9f565b005b3480156103f657600080fd5b50610411600480360361040c9190810190612253565b610d28565b60405161041e9190612e8c565b60405180910390f35b34801561043357600080fd5b5061043c610e2e565b60405161044991906131a8565b60405180910390f35b34801561045e57600080fd5b506104796004803603610474919081019061209b565b610e34565b005b34801561048757600080fd5b50610490610fc6565b60405161049d91906131a8565b60405180910390f35b3480156104b257600080fd5b506104cd60048036036104c891908101906124da565b610fd0565b6040516104da9190612f29565b60405180910390f35b3480156104ef57600080fd5b506104f86110ec565b60405161050591906131a8565b60405180910390f35b34801561051a57600080fd5b50610535600480360361053091908101906121a6565b6110f2565b005b34801561054357600080fd5b5061055e60048036036105599190810190612342565b611137565b60405161056b9190612e8c565b60405180910390f35b34801561058057600080fd5b5061059b600480360361059691908101906120d7565b61123f565b6040516105a89190612eae565b60405180910390f35b60606105bc336112e1565b6105c8858585856113ad565b9050949350505050565b6105db336112e1565b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065f90613148565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600082825401925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9e46251f3febb4bf40cf64591f0efc1d6ac8a9f0b8900b2adaeb83227757058860405160405180910390a250565b61071f336112e1565b60008090505b81518110156107575761074a82828151811061073d57fe5b6020026020010151610b9f565b8080600101915050610725565b5050565b600080541461076957600080fd5b600160008190555060018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600082825401925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9e46251f3febb4bf40cf64591f0efc1d6ac8a9f0b8900b2adaeb83227757058860405160405180910390a250565b6040518060400160405280600a81526020017f323031393130323530300000000000000000000000000000000000000000000081525081565b60006041825114156108755761086e83836108da565b90506108cb565b608282511415610890576108898383610fd0565b90506108cb565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290612fc8565b60405180910390fd5b92915050565b60006001905090565b6000806108f8836108ea86611491565b6114cc90919063ffffffff16565b9050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561095c576320c13b0b60e01b915050610968565b63ffffffff60e01b9150505b92915050565b60008061098484866114cc90919063ffffffff16565b905060006109b78260405160200161099c9190612d01565b604051602081830303815290604052805190602001206115b8565b905060006109ce85836114cc90919063ffffffff16565b90506109d9816112e1565b8293505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610a1e57600080fd5b610a27826115e8565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610a4e9190612dbb565b600060405180830381855af49150503d8060008114610a89576040519150601f19603f3d011682016040523d82523d6000602084013e610a8e565b606091505b5050905080610a9c57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a2505050565b60016020528060005260406000206000915054906101000a900460ff1681565b8051825114610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f90613008565b60405180910390fd5b60008090505b8251811015610b9457610b87838281518110610b6657fe5b6020026020010151838381518110610b7a57fe5b6020026020010151610e34565b8080600101915050610b4e565b505050565b60005481565b610ba8336112e1565b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90613128565b60405180910390fd5b600160035411610c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7090613168565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600082825403925050819055508073ffffffffffffffffffffffffffffffffffffffff167f24a1d50afe4670e7a657fa10322b233e347dc26799afb2d72147a679e693f31f60405160405180910390a250565b606060005a9050610d3c878787878761165f565b60608751604051908082528060200260200182016040528015610d7357816020015b6060815260200190600190039081610d5e5790505b50905060008090505b8851811015610e1557610df1898281518110610d9457fe5b6020026020010151898381518110610da857fe5b6020026020010151898481518110610dbc57fe5b6020026020010151898581518110610dd057fe5b6020026020010151898681518110610de457fe5b6020026020010151611776565b828281518110610dfd57fe5b60200260200101819052508080600101915050610d7c565b50610e20823a611805565b809250505095945050505050565b60025481565b610e3d336112e1565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090613088565b60405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90612f88565b60405180910390fd5b610f5f816105d2565b610f6882610b9f565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f084d1bb6d163e102e9e0ca9dcb761e37f325346ac27c1d8bbfb23c105ffba70660405160405180910390a35050565b6000600254905090565b60006060610feb60006041856118e69092919063ffffffff16565b90506060611005604180866118e69092919063ffffffff16565b905060006110248361101688611491565b6114cc90919063ffffffff16565b905060006110578260405160200161103c9190612d01565b604051602081830303815290604052805190602001206115b8565b9050600061106e84836114cc90919063ffffffff16565b9050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110d6576320c13b0b60e01b955050505050506110e6565b63ffffffff60e01b955050505050505b92915050565b60035481565b6110fb336112e1565b60008090505b81518110156111335761112682828151811061111957fe5b60200260200101516105d2565b8080600101915050611101565b5050565b606060005a905061114b8888888888611972565b6060885160405190808252806020026020018201604052801561118257816020015b606081526020019060019003908161116d5790505b50905060008090505b8951811015611225576112018a82815181106111a357fe5b60200260200101518a83815181106111b757fe5b60200260200101518a84815181106111cb57fe5b60200260200101518a85815181106111df57fe5b60200260200101518a86815181106111f357fe5b60200260200101518a611a89565b82828151811061120d57fe5b6020026020010181905250808060010191505061118b565b50611230823a611805565b80925050509695505050505050565b600080611271846040516020016112569190612d01565b604051602081830303815290604052805190602001206115b8565b9050600061128884836114cc90919063ffffffff16565b9050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169250505092915050565b60011515600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148061136b57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613028565b60405180910390fd5b50565b6060600060608673ffffffffffffffffffffffffffffffffffffffff168487876040516113da9190612dbb565b600060405180830381858888f193505050503d8060008114611418576040519150601f19603f3d011682016040523d82523d6000602084013e61141d565b606091505b509150915081611472576000611437600254898989611b68565b90507fe22e3683fe845a34c5adea424d0beb84895f513ea06745002d9d65f90100591a816040516114689190612ec9565b60405180910390a1505b6002600081548092919060010191905055508092505050949350505050565b600061149d8251611ba1565b826040516020016114af929190612df8565b604051602081830303815290604052805190602001209050919050565b600060418251146114e057600090506115b2565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c111561153457600093505050506115b2565b601b8160ff161415801561154c5750601c8160ff1614155b1561155d57600093505050506115b2565b600186828585604051600081526020016040526040516115809493929190612ee4565b6020604051602081039080840390855afa1580156115a2573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6000816040516020016115cb9190612dd2565b604051602081830303815290604052805190602001209050919050565b6115f181611cd4565b611630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611627906130e8565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181555050565b82518551146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90613068565b60405180910390fd5b83518551146116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90613188565b60405180910390fd5b815185511461172b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611722906130a8565b60405180910390fd5b805185511461176f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611766906130a8565b60405180910390fd5b5050505050565b606060006117e0306000357fffffffff000000000000000000000000000000000000000000000000000000001660018a8a8a6002543a8c6040516020016117c599989796959493929190612d1c565b604051602081830303815290604052805190602001206115b8565b90506117ec8184611ce7565b506117f9878688876113ad565b91505095945050505050565b600061181a5a84611d1290919063ffffffff16565b90503073ffffffffffffffffffffffffffffffffffffffff16316118478383611d6890919063ffffffff16565b1115611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90612fa8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc6118b58484611d6890919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156118e0573d6000803e3d6000fd5b50505050565b6060818301845110156118f857600080fd5b606082156000811461191557604051915060208201604052611966565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156119535780518352602083019250602081019050611936565b50868552601f19601f8301166040525050505b50809150509392505050565b82518551146119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90613068565b60405180910390fd5b83518551146119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190613188565b60405180910390fd5b8151855114611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a35906130a8565b60405180910390fd5b8051855114611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a79906130c8565b60405180910390fd5b5050505050565b606060005a9050611a9988611dd8565b611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90613108565b60405180910390fd5b6000611b40306000357fffffffff000000000000000000000000000000000000000000000000000000001660018c8c8c6002543a8e604051602001611b2599989796959493929190612d1c565b604051602081830303815290604052805190602001206115b8565b9050611b4d81868661096e565b50611b5a89888a896113ad565b925050509695505050505050565b600084848484604051602001611b819493929190612e27565b604051602081830303815290604052805190602001209050949350505050565b60606000821415611be9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ccf565b6000829050600083905060005b60008214611c18578080600101915050600a8281611c1057fe5b049150611bf6565b6060816040519080825280601f01601f191660200182016040528015611c4d5781602001600182028038833980820191505090505b50905060006001830390505b60008514611cc657600a8581611c6b57fe5b0660300160f81b82828060019003935081518110611c8557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8581611cbe57fe5b049450611c59565b81955050505050505b919050565b600080823b905060008111915050919050565b600080611cfd83856114cc90919063ffffffff16565b9050611d08816112e1565b8091505092915050565b600082821115611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90612fe8565b60405180910390fd5b600082840390508091505092915050565b600080831415611d7b5760009050611dd2565b6000828402905082848281611d8c57fe5b0414611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613048565b60405180910390fd5b809150505b92915050565b60008173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600081359050611e20816134bf565b92915050565b600082601f830112611e3757600080fd5b8135611e4a611e45826131f0565b6131c3565b91508181835260208401935060208101905083856020840282011115611e6f57600080fd5b60005b83811015611e9f5781611e858882611e11565b845260208401935060208301925050600181019050611e72565b5050505092915050565b600082601f830112611eba57600080fd5b8135611ecd611ec882613218565b6131c3565b9150818183526020840193506020810190508360005b83811015611f135781358601611ef98882611fb5565b845260208401935060208301925050600181019050611ee3565b5050505092915050565b600082601f830112611f2e57600080fd5b8135611f41611f3c82613240565b6131c3565b91508181835260208401935060208101905083856020840282011115611f6657600080fd5b60005b83811015611f965781611f7c888261205d565b845260208401935060208301925050600181019050611f69565b5050505092915050565b600081359050611faf816134d6565b92915050565b600082601f830112611fc657600080fd5b8135611fd9611fd482613268565b6131c3565b91508082526020830160208301858383011115611ff557600080fd5b61200083828461340b565b50505092915050565b600082601f83011261201a57600080fd5b813561202d61202882613294565b6131c3565b9150808252602083016020830185838301111561204957600080fd5b61205483828461340b565b50505092915050565b60008135905061206c816134ed565b92915050565b60006020828403121561208457600080fd5b600061209284828501611e11565b91505092915050565b600080604083850312156120ae57600080fd5b60006120bc85828601611e11565b92505060206120cd85828601611e11565b9150509250929050565b600080604083850312156120ea57600080fd5b60006120f885828601611e11565b925050602083013567ffffffffffffffff81111561211557600080fd5b61212185828601612009565b9150509250929050565b6000806000806080858703121561214157600080fd5b600061214f87828801611e11565b94505060206121608782880161205d565b935050604085013567ffffffffffffffff81111561217d57600080fd5b61218987828801612009565b925050606061219a8782880161205d565b91505092959194509250565b6000602082840312156121b857600080fd5b600082013567ffffffffffffffff8111156121d257600080fd5b6121de84828501611e26565b91505092915050565b600080604083850312156121fa57600080fd5b600083013567ffffffffffffffff81111561221457600080fd5b61222085828601611e26565b925050602083013567ffffffffffffffff81111561223d57600080fd5b61224985828601611e26565b9150509250929050565b600080600080600060a0868803121561226b57600080fd5b600086013567ffffffffffffffff81111561228557600080fd5b61229188828901611e26565b955050602086013567ffffffffffffffff8111156122ae57600080fd5b6122ba88828901611ea9565b945050604086013567ffffffffffffffff8111156122d757600080fd5b6122e388828901611f1d565b935050606086013567ffffffffffffffff81111561230057600080fd5b61230c88828901611f1d565b925050608086013567ffffffffffffffff81111561232957600080fd5b61233588828901611ea9565b9150509295509295909350565b60008060008060008060c0878903121561235b57600080fd5b600087013567ffffffffffffffff81111561237557600080fd5b61238189828a01611e26565b965050602087013567ffffffffffffffff81111561239e57600080fd5b6123aa89828a01611ea9565b955050604087013567ffffffffffffffff8111156123c757600080fd5b6123d389828a01611f1d565b945050606087013567ffffffffffffffff8111156123f057600080fd5b6123fc89828a01611f1d565b935050608087013567ffffffffffffffff81111561241957600080fd5b61242589828a01611ea9565b92505060a087013567ffffffffffffffff81111561244257600080fd5b61244e89828a01612009565b9150509295509295509295565b60008060006060848603121561247057600080fd5b600061247e86828701611fa0565b935050602084013567ffffffffffffffff81111561249b57600080fd5b6124a786828701612009565b925050604084013567ffffffffffffffff8111156124c457600080fd5b6124d086828701612009565b9150509250925092565b600080604083850312156124ed57600080fd5b600083013567ffffffffffffffff81111561250757600080fd5b61251385828601612009565b925050602083013567ffffffffffffffff81111561253057600080fd5b61253c85828601612009565b9150509250929050565b600061255283836126d1565b905092915050565b61256b61256682613380565b61345f565b82525050565b61257a8161336e565b82525050565b61259161258c8261336e565b61344d565b82525050565b60006125a2826132d0565b6125ac8185613314565b9350836020820285016125be856132c0565b8060005b858110156125fa57848403895281516125db8582612546565b94506125e683613307565b925060208a019950506001810190506125c2565b50829750879550505050505092915050565b61261581613392565b82525050565b6126248161339e565b82525050565b61263b6126368261339e565b613471565b82525050565b61264a816133a8565b82525050565b61266161265c826133a8565b61347b565b82525050565b6000612672826132e6565b61267c8185613336565b935061268c81856020860161341a565b612695816134a1565b840191505092915050565b60006126ab826132e6565b6126b58185613347565b93506126c581856020860161341a565b80840191505092915050565b60006126dc826132db565b6126e68185613325565b93506126f681856020860161341a565b6126ff816134a1565b840191505092915050565b6000612715826132fc565b61271f8185613363565b935061272f81856020860161341a565b80840191505092915050565b6000612746826132f1565b6127508185613352565b935061276081856020860161341a565b612769816134a1565b840191505092915050565b6000612781601b83613352565b91507f4e65772061757468206b657920616c72656164792065786973747300000000006000830152602082019050919050565b60006127c1601c83613363565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000612801601b83613352565b91507f496e73756666696369656e742067617320666f7220726566756e6400000000006000830152602082019050919050565b6000612841601a83613352565b91507f496e76616c6964205f7369676e617475726573206c656e6774680000000000006000830152602082019050919050565b6000612881601e83613352565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006128c1601d83613352565b91507f496e70757420617272617973206e6f7420657175616c206c656e6774680000006000830152602082019050919050565b6000612901601383613352565b91507f41757468206b657920697320696e76616c6964000000000000000000000000006000830152602082019050919050565b6000612941602183613352565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006129a7601583613352565b91507f496e76616c69642076616c756573206c656e67746800000000000000000000006000830152602082019050919050565b60006129e7601a83613363565b91507f19457468657265756d205369676e6564204d6573736167653a0a0000000000006000830152601a82019050919050565b6000612a27601b83613352565b91507f4f6c642061757468206b657920646f6573206e6f7420657869737400000000006000830152602082019050919050565b6000612a67601883613352565b91507f496e76616c6964206761734c696d697473206c656e67746800000000000000006000830152602082019050919050565b6000612aa7602883613352565b91507f496e76616c6964207472616e73616374696f6e446174615369676e617475726560008301527f73206c656e6774680000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b0d603b83613352565b91507f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f60008301527f6e20746f2061206e6f6e2d636f6e7472616374206164647265737300000000006020830152604082019050919050565b6000612b73602983613352565b91507f4c6f67696e206b6579206973206e6f742061626c6520746f207570677261646560008301527f20746f2070726f787900000000000000000000000000000000000000000000006020830152604082019050919050565b6000612bd9601683613352565b91507f41757468206b6579206e6f7420796574206164646564000000000000000000006000830152602082019050919050565b6000612c19601683613352565b91507f41757468206b657920616c7265616479206164646564000000000000000000006000830152602082019050919050565b6000612c59601b83613352565b91507f43616e6e6f742072656d6f7665206c6173742061757468206b657900000000006000830152602082019050919050565b6000612c99601883613352565b91507f496e76616c696420646174614172726179206c656e67746800000000000000006000830152602082019050919050565b612cd5816133f4565b82525050565b612cec612ce7826133f4565b613497565b82525050565b612cfb816133fe565b82525050565b6000612d0d8284612580565b60148201915081905092915050565b6000612d28828c61255a565b601482019150612d38828b612650565b600482019150612d48828a612cdb565b602082019150612d588289612580565b601482019150612d6882886126a0565b9150612d748287612cdb565b602082019150612d848286612cdb565b602082019150612d948285612cdb565b602082019150612da48284612cdb565b6020820191508190509a9950505050505050505050565b6000612dc782846126a0565b915081905092915050565b6000612ddd826127b4565b9150612de9828461262a565b60208201915081905092915050565b6000612e03826129da565b9150612e0f828561270a565b9150612e1b82846126a0565b91508190509392505050565b6000612e338287612cdb565b602082019150612e438286612580565b601482019150612e538285612cdb565b602082019150612e6382846126a0565b915081905095945050505050565b6000602082019050612e866000830184612571565b92915050565b60006020820190508181036000830152612ea68184612597565b905092915050565b6000602082019050612ec3600083018461260c565b92915050565b6000602082019050612ede600083018461261b565b92915050565b6000608082019050612ef9600083018761261b565b612f066020830186612cf2565b612f13604083018561261b565b612f20606083018461261b565b95945050505050565b6000602082019050612f3e6000830184612641565b92915050565b60006020820190508181036000830152612f5e8184612667565b905092915050565b60006020820190508181036000830152612f80818461273b565b905092915050565b60006020820190508181036000830152612fa181612774565b9050919050565b60006020820190508181036000830152612fc1816127f4565b9050919050565b60006020820190508181036000830152612fe181612834565b9050919050565b6000602082019050818103600083015261300181612874565b9050919050565b60006020820190508181036000830152613021816128b4565b9050919050565b60006020820190508181036000830152613041816128f4565b9050919050565b6000602082019050818103600083015261306181612934565b9050919050565b600060208201905081810360008301526130818161299a565b9050919050565b600060208201905081810360008301526130a181612a1a565b9050919050565b600060208201905081810360008301526130c181612a5a565b9050919050565b600060208201905081810360008301526130e181612a9a565b9050919050565b6000602082019050818103600083015261310181612b00565b9050919050565b6000602082019050818103600083015261312181612b66565b9050919050565b6000602082019050818103600083015261314181612bcc565b9050919050565b6000602082019050818103600083015261316181612c0c565b9050919050565b6000602082019050818103600083015261318181612c4c565b9050919050565b600060208201905081810360008301526131a181612c8c565b9050919050565b60006020820190506131bd6000830184612ccc565b92915050565b6000604051905081810181811067ffffffffffffffff821117156131e657600080fd5b8060405250919050565b600067ffffffffffffffff82111561320757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561322f57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561325757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561327f57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156132ab57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613379826133d4565b9050919050565b600061338b826133d4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561343857808201518184015260208101905061341d565b83811115613447576000848401525b50505050565b600061345882613485565b9050919050565b600061346a82613485565b9050919050565b6000819050919050565b6000819050919050565b6000613490826134b2565b9050919050565b6000819050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6134c88161336e565b81146134d357600080fd5b50565b6134df8161339e565b81146134ea57600080fd5b50565b6134f6816133f4565b811461350157600080fd5b5056fea365627a7a7231582080380f6ece6e2784333874a85f2cd1d7f9092eba8d244a4a3c5ee5fc0e0882c76c6578706572696d656e74616cf564736f6c634300050c0040
Deployed Bytecode
0x6080604052600436106101405760003560e01c80635b79818f116100b6578063d087d2881161006f578063d087d2881461047b578063d59e3e98146104a6578063ec5e319e146104e3578063f399f1dd1461050e578063f454dfe114610537578063fd54c1221461057457610140565b80635b79818f1461036d5780637e7fd66c146103965780639565389e146103c1578063a331c254146103ea578063affed0e014610427578063b4c271641461045257610140565b806320c13b0b1161010857806320c13b0b146102255780633408e4701461026257806340914b061461028d5780634c477daf146102ca5780634f1ef286146103075780635175ca5e1461033057610140565b806306a41d091461014257806313f8c5781461017f5780631704db30146101a85780631b9a9f9e146101d15780631f602092146101fa575b005b34801561014e57600080fd5b506101696004803603610164919081019061212b565b6105b1565b6040516101769190612f44565b60405180910390f35b34801561018b57600080fd5b506101a660048036036101a19190810190612072565b6105d2565b005b3480156101b457600080fd5b506101cf60048036036101ca91908101906121a6565b610716565b005b3480156101dd57600080fd5b506101f860048036036101f39190810190612072565b61075b565b005b34801561020657600080fd5b5061020f61081f565b60405161021c9190612f66565b60405180910390f35b34801561023157600080fd5b5061024c600480360361024791908101906124da565b610858565b6040516102599190612f29565b60405180910390f35b34801561026e57600080fd5b506102776108d1565b60405161028491906131a8565b60405180910390f35b34801561029957600080fd5b506102b460048036036102af91908101906124da565b6108da565b6040516102c19190612f29565b60405180910390f35b3480156102d657600080fd5b506102f160048036036102ec919081019061245b565b61096e565b6040516102fe9190612e71565b60405180910390f35b34801561031357600080fd5b5061032e600480360361032991908101906120d7565b6109e6565b005b34801561033c57600080fd5b5061035760048036036103529190810190612072565b610ae4565b6040516103649190612eae565b60405180910390f35b34801561037957600080fd5b50610394600480360361038f91908101906121e7565b610b04565b005b3480156103a257600080fd5b506103ab610b99565b6040516103b891906131a8565b60405180910390f35b3480156103cd57600080fd5b506103e860048036036103e39190810190612072565b610b9f565b005b3480156103f657600080fd5b50610411600480360361040c9190810190612253565b610d28565b60405161041e9190612e8c565b60405180910390f35b34801561043357600080fd5b5061043c610e2e565b60405161044991906131a8565b60405180910390f35b34801561045e57600080fd5b506104796004803603610474919081019061209b565b610e34565b005b34801561048757600080fd5b50610490610fc6565b60405161049d91906131a8565b60405180910390f35b3480156104b257600080fd5b506104cd60048036036104c891908101906124da565b610fd0565b6040516104da9190612f29565b60405180910390f35b3480156104ef57600080fd5b506104f86110ec565b60405161050591906131a8565b60405180910390f35b34801561051a57600080fd5b50610535600480360361053091908101906121a6565b6110f2565b005b34801561054357600080fd5b5061055e60048036036105599190810190612342565b611137565b60405161056b9190612e8c565b60405180910390f35b34801561058057600080fd5b5061059b600480360361059691908101906120d7565b61123f565b6040516105a89190612eae565b60405180910390f35b60606105bc336112e1565b6105c8858585856113ad565b9050949350505050565b6105db336112e1565b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065f90613148565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600082825401925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9e46251f3febb4bf40cf64591f0efc1d6ac8a9f0b8900b2adaeb83227757058860405160405180910390a250565b61071f336112e1565b60008090505b81518110156107575761074a82828151811061073d57fe5b6020026020010151610b9f565b8080600101915050610725565b5050565b600080541461076957600080fd5b600160008190555060018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600082825401925050819055508073ffffffffffffffffffffffffffffffffffffffff167f9e46251f3febb4bf40cf64591f0efc1d6ac8a9f0b8900b2adaeb83227757058860405160405180910390a250565b6040518060400160405280600a81526020017f323031393130323530300000000000000000000000000000000000000000000081525081565b60006041825114156108755761086e83836108da565b90506108cb565b608282511415610890576108898383610fd0565b90506108cb565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290612fc8565b60405180910390fd5b92915050565b60006001905090565b6000806108f8836108ea86611491565b6114cc90919063ffffffff16565b9050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561095c576320c13b0b60e01b915050610968565b63ffffffff60e01b9150505b92915050565b60008061098484866114cc90919063ffffffff16565b905060006109b78260405160200161099c9190612d01565b604051602081830303815290604052805190602001206115b8565b905060006109ce85836114cc90919063ffffffff16565b90506109d9816112e1565b8293505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610a1e57600080fd5b610a27826115e8565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610a4e9190612dbb565b600060405180830381855af49150503d8060008114610a89576040519150601f19603f3d011682016040523d82523d6000602084013e610a8e565b606091505b5050905080610a9c57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a2505050565b60016020528060005260406000206000915054906101000a900460ff1681565b8051825114610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f90613008565b60405180910390fd5b60008090505b8251811015610b9457610b87838281518110610b6657fe5b6020026020010151838381518110610b7a57fe5b6020026020010151610e34565b8080600101915050610b4e565b505050565b60005481565b610ba8336112e1565b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90613128565b60405180910390fd5b600160035411610c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7090613168565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600082825403925050819055508073ffffffffffffffffffffffffffffffffffffffff167f24a1d50afe4670e7a657fa10322b233e347dc26799afb2d72147a679e693f31f60405160405180910390a250565b606060005a9050610d3c878787878761165f565b60608751604051908082528060200260200182016040528015610d7357816020015b6060815260200190600190039081610d5e5790505b50905060008090505b8851811015610e1557610df1898281518110610d9457fe5b6020026020010151898381518110610da857fe5b6020026020010151898481518110610dbc57fe5b6020026020010151898581518110610dd057fe5b6020026020010151898681518110610de457fe5b6020026020010151611776565b828281518110610dfd57fe5b60200260200101819052508080600101915050610d7c565b50610e20823a611805565b809250505095945050505050565b60025481565b610e3d336112e1565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090613088565b60405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90612f88565b60405180910390fd5b610f5f816105d2565b610f6882610b9f565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f084d1bb6d163e102e9e0ca9dcb761e37f325346ac27c1d8bbfb23c105ffba70660405160405180910390a35050565b6000600254905090565b60006060610feb60006041856118e69092919063ffffffff16565b90506060611005604180866118e69092919063ffffffff16565b905060006110248361101688611491565b6114cc90919063ffffffff16565b905060006110578260405160200161103c9190612d01565b604051602081830303815290604052805190602001206115b8565b9050600061106e84836114cc90919063ffffffff16565b9050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110d6576320c13b0b60e01b955050505050506110e6565b63ffffffff60e01b955050505050505b92915050565b60035481565b6110fb336112e1565b60008090505b81518110156111335761112682828151811061111957fe5b60200260200101516105d2565b8080600101915050611101565b5050565b606060005a905061114b8888888888611972565b6060885160405190808252806020026020018201604052801561118257816020015b606081526020019060019003908161116d5790505b50905060008090505b8951811015611225576112018a82815181106111a357fe5b60200260200101518a83815181106111b757fe5b60200260200101518a84815181106111cb57fe5b60200260200101518a85815181106111df57fe5b60200260200101518a86815181106111f357fe5b60200260200101518a611a89565b82828151811061120d57fe5b6020026020010181905250808060010191505061118b565b50611230823a611805565b80925050509695505050505050565b600080611271846040516020016112569190612d01565b604051602081830303815290604052805190602001206115b8565b9050600061128884836114cc90919063ffffffff16565b9050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169250505092915050565b60011515600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148061136b57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613028565b60405180910390fd5b50565b6060600060608673ffffffffffffffffffffffffffffffffffffffff168487876040516113da9190612dbb565b600060405180830381858888f193505050503d8060008114611418576040519150601f19603f3d011682016040523d82523d6000602084013e61141d565b606091505b509150915081611472576000611437600254898989611b68565b90507fe22e3683fe845a34c5adea424d0beb84895f513ea06745002d9d65f90100591a816040516114689190612ec9565b60405180910390a1505b6002600081548092919060010191905055508092505050949350505050565b600061149d8251611ba1565b826040516020016114af929190612df8565b604051602081830303815290604052805190602001209050919050565b600060418251146114e057600090506115b2565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c111561153457600093505050506115b2565b601b8160ff161415801561154c5750601c8160ff1614155b1561155d57600093505050506115b2565b600186828585604051600081526020016040526040516115809493929190612ee4565b6020604051602081039080840390855afa1580156115a2573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6000816040516020016115cb9190612dd2565b604051602081830303815290604052805190602001209050919050565b6115f181611cd4565b611630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611627906130e8565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181555050565b82518551146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90613068565b60405180910390fd5b83518551146116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90613188565b60405180910390fd5b815185511461172b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611722906130a8565b60405180910390fd5b805185511461176f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611766906130a8565b60405180910390fd5b5050505050565b606060006117e0306000357fffffffff000000000000000000000000000000000000000000000000000000001660018a8a8a6002543a8c6040516020016117c599989796959493929190612d1c565b604051602081830303815290604052805190602001206115b8565b90506117ec8184611ce7565b506117f9878688876113ad565b91505095945050505050565b600061181a5a84611d1290919063ffffffff16565b90503073ffffffffffffffffffffffffffffffffffffffff16316118478383611d6890919063ffffffff16565b1115611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90612fa8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc6118b58484611d6890919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156118e0573d6000803e3d6000fd5b50505050565b6060818301845110156118f857600080fd5b606082156000811461191557604051915060208201604052611966565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156119535780518352602083019250602081019050611936565b50868552601f19601f8301166040525050505b50809150509392505050565b82518551146119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90613068565b60405180910390fd5b83518551146119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190613188565b60405180910390fd5b8151855114611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a35906130a8565b60405180910390fd5b8051855114611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a79906130c8565b60405180910390fd5b5050505050565b606060005a9050611a9988611dd8565b611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90613108565b60405180910390fd5b6000611b40306000357fffffffff000000000000000000000000000000000000000000000000000000001660018c8c8c6002543a8e604051602001611b2599989796959493929190612d1c565b604051602081830303815290604052805190602001206115b8565b9050611b4d81868661096e565b50611b5a89888a896113ad565b925050509695505050505050565b600084848484604051602001611b819493929190612e27565b604051602081830303815290604052805190602001209050949350505050565b60606000821415611be9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ccf565b6000829050600083905060005b60008214611c18578080600101915050600a8281611c1057fe5b049150611bf6565b6060816040519080825280601f01601f191660200182016040528015611c4d5781602001600182028038833980820191505090505b50905060006001830390505b60008514611cc657600a8581611c6b57fe5b0660300160f81b82828060019003935081518110611c8557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8581611cbe57fe5b049450611c59565b81955050505050505b919050565b600080823b905060008111915050919050565b600080611cfd83856114cc90919063ffffffff16565b9050611d08816112e1565b8091505092915050565b600082821115611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90612fe8565b60405180910390fd5b600082840390508091505092915050565b600080831415611d7b5760009050611dd2565b6000828402905082848281611d8c57fe5b0414611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613048565b60405180910390fd5b809150505b92915050565b60008173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600081359050611e20816134bf565b92915050565b600082601f830112611e3757600080fd5b8135611e4a611e45826131f0565b6131c3565b91508181835260208401935060208101905083856020840282011115611e6f57600080fd5b60005b83811015611e9f5781611e858882611e11565b845260208401935060208301925050600181019050611e72565b5050505092915050565b600082601f830112611eba57600080fd5b8135611ecd611ec882613218565b6131c3565b9150818183526020840193506020810190508360005b83811015611f135781358601611ef98882611fb5565b845260208401935060208301925050600181019050611ee3565b5050505092915050565b600082601f830112611f2e57600080fd5b8135611f41611f3c82613240565b6131c3565b91508181835260208401935060208101905083856020840282011115611f6657600080fd5b60005b83811015611f965781611f7c888261205d565b845260208401935060208301925050600181019050611f69565b5050505092915050565b600081359050611faf816134d6565b92915050565b600082601f830112611fc657600080fd5b8135611fd9611fd482613268565b6131c3565b91508082526020830160208301858383011115611ff557600080fd5b61200083828461340b565b50505092915050565b600082601f83011261201a57600080fd5b813561202d61202882613294565b6131c3565b9150808252602083016020830185838301111561204957600080fd5b61205483828461340b565b50505092915050565b60008135905061206c816134ed565b92915050565b60006020828403121561208457600080fd5b600061209284828501611e11565b91505092915050565b600080604083850312156120ae57600080fd5b60006120bc85828601611e11565b92505060206120cd85828601611e11565b9150509250929050565b600080604083850312156120ea57600080fd5b60006120f885828601611e11565b925050602083013567ffffffffffffffff81111561211557600080fd5b61212185828601612009565b9150509250929050565b6000806000806080858703121561214157600080fd5b600061214f87828801611e11565b94505060206121608782880161205d565b935050604085013567ffffffffffffffff81111561217d57600080fd5b61218987828801612009565b925050606061219a8782880161205d565b91505092959194509250565b6000602082840312156121b857600080fd5b600082013567ffffffffffffffff8111156121d257600080fd5b6121de84828501611e26565b91505092915050565b600080604083850312156121fa57600080fd5b600083013567ffffffffffffffff81111561221457600080fd5b61222085828601611e26565b925050602083013567ffffffffffffffff81111561223d57600080fd5b61224985828601611e26565b9150509250929050565b600080600080600060a0868803121561226b57600080fd5b600086013567ffffffffffffffff81111561228557600080fd5b61229188828901611e26565b955050602086013567ffffffffffffffff8111156122ae57600080fd5b6122ba88828901611ea9565b945050604086013567ffffffffffffffff8111156122d757600080fd5b6122e388828901611f1d565b935050606086013567ffffffffffffffff81111561230057600080fd5b61230c88828901611f1d565b925050608086013567ffffffffffffffff81111561232957600080fd5b61233588828901611ea9565b9150509295509295909350565b60008060008060008060c0878903121561235b57600080fd5b600087013567ffffffffffffffff81111561237557600080fd5b61238189828a01611e26565b965050602087013567ffffffffffffffff81111561239e57600080fd5b6123aa89828a01611ea9565b955050604087013567ffffffffffffffff8111156123c757600080fd5b6123d389828a01611f1d565b945050606087013567ffffffffffffffff8111156123f057600080fd5b6123fc89828a01611f1d565b935050608087013567ffffffffffffffff81111561241957600080fd5b61242589828a01611ea9565b92505060a087013567ffffffffffffffff81111561244257600080fd5b61244e89828a01612009565b9150509295509295509295565b60008060006060848603121561247057600080fd5b600061247e86828701611fa0565b935050602084013567ffffffffffffffff81111561249b57600080fd5b6124a786828701612009565b925050604084013567ffffffffffffffff8111156124c457600080fd5b6124d086828701612009565b9150509250925092565b600080604083850312156124ed57600080fd5b600083013567ffffffffffffffff81111561250757600080fd5b61251385828601612009565b925050602083013567ffffffffffffffff81111561253057600080fd5b61253c85828601612009565b9150509250929050565b600061255283836126d1565b905092915050565b61256b61256682613380565b61345f565b82525050565b61257a8161336e565b82525050565b61259161258c8261336e565b61344d565b82525050565b60006125a2826132d0565b6125ac8185613314565b9350836020820285016125be856132c0565b8060005b858110156125fa57848403895281516125db8582612546565b94506125e683613307565b925060208a019950506001810190506125c2565b50829750879550505050505092915050565b61261581613392565b82525050565b6126248161339e565b82525050565b61263b6126368261339e565b613471565b82525050565b61264a816133a8565b82525050565b61266161265c826133a8565b61347b565b82525050565b6000612672826132e6565b61267c8185613336565b935061268c81856020860161341a565b612695816134a1565b840191505092915050565b60006126ab826132e6565b6126b58185613347565b93506126c581856020860161341a565b80840191505092915050565b60006126dc826132db565b6126e68185613325565b93506126f681856020860161341a565b6126ff816134a1565b840191505092915050565b6000612715826132fc565b61271f8185613363565b935061272f81856020860161341a565b80840191505092915050565b6000612746826132f1565b6127508185613352565b935061276081856020860161341a565b612769816134a1565b840191505092915050565b6000612781601b83613352565b91507f4e65772061757468206b657920616c72656164792065786973747300000000006000830152602082019050919050565b60006127c1601c83613363565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000612801601b83613352565b91507f496e73756666696369656e742067617320666f7220726566756e6400000000006000830152602082019050919050565b6000612841601a83613352565b91507f496e76616c6964205f7369676e617475726573206c656e6774680000000000006000830152602082019050919050565b6000612881601e83613352565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006128c1601d83613352565b91507f496e70757420617272617973206e6f7420657175616c206c656e6774680000006000830152602082019050919050565b6000612901601383613352565b91507f41757468206b657920697320696e76616c6964000000000000000000000000006000830152602082019050919050565b6000612941602183613352565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006129a7601583613352565b91507f496e76616c69642076616c756573206c656e67746800000000000000000000006000830152602082019050919050565b60006129e7601a83613363565b91507f19457468657265756d205369676e6564204d6573736167653a0a0000000000006000830152601a82019050919050565b6000612a27601b83613352565b91507f4f6c642061757468206b657920646f6573206e6f7420657869737400000000006000830152602082019050919050565b6000612a67601883613352565b91507f496e76616c6964206761734c696d697473206c656e67746800000000000000006000830152602082019050919050565b6000612aa7602883613352565b91507f496e76616c6964207472616e73616374696f6e446174615369676e617475726560008301527f73206c656e6774680000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b0d603b83613352565b91507f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f60008301527f6e20746f2061206e6f6e2d636f6e7472616374206164647265737300000000006020830152604082019050919050565b6000612b73602983613352565b91507f4c6f67696e206b6579206973206e6f742061626c6520746f207570677261646560008301527f20746f2070726f787900000000000000000000000000000000000000000000006020830152604082019050919050565b6000612bd9601683613352565b91507f41757468206b6579206e6f7420796574206164646564000000000000000000006000830152602082019050919050565b6000612c19601683613352565b91507f41757468206b657920616c7265616479206164646564000000000000000000006000830152602082019050919050565b6000612c59601b83613352565b91507f43616e6e6f742072656d6f7665206c6173742061757468206b657900000000006000830152602082019050919050565b6000612c99601883613352565b91507f496e76616c696420646174614172726179206c656e67746800000000000000006000830152602082019050919050565b612cd5816133f4565b82525050565b612cec612ce7826133f4565b613497565b82525050565b612cfb816133fe565b82525050565b6000612d0d8284612580565b60148201915081905092915050565b6000612d28828c61255a565b601482019150612d38828b612650565b600482019150612d48828a612cdb565b602082019150612d588289612580565b601482019150612d6882886126a0565b9150612d748287612cdb565b602082019150612d848286612cdb565b602082019150612d948285612cdb565b602082019150612da48284612cdb565b6020820191508190509a9950505050505050505050565b6000612dc782846126a0565b915081905092915050565b6000612ddd826127b4565b9150612de9828461262a565b60208201915081905092915050565b6000612e03826129da565b9150612e0f828561270a565b9150612e1b82846126a0565b91508190509392505050565b6000612e338287612cdb565b602082019150612e438286612580565b601482019150612e538285612cdb565b602082019150612e6382846126a0565b915081905095945050505050565b6000602082019050612e866000830184612571565b92915050565b60006020820190508181036000830152612ea68184612597565b905092915050565b6000602082019050612ec3600083018461260c565b92915050565b6000602082019050612ede600083018461261b565b92915050565b6000608082019050612ef9600083018761261b565b612f066020830186612cf2565b612f13604083018561261b565b612f20606083018461261b565b95945050505050565b6000602082019050612f3e6000830184612641565b92915050565b60006020820190508181036000830152612f5e8184612667565b905092915050565b60006020820190508181036000830152612f80818461273b565b905092915050565b60006020820190508181036000830152612fa181612774565b9050919050565b60006020820190508181036000830152612fc1816127f4565b9050919050565b60006020820190508181036000830152612fe181612834565b9050919050565b6000602082019050818103600083015261300181612874565b9050919050565b60006020820190508181036000830152613021816128b4565b9050919050565b60006020820190508181036000830152613041816128f4565b9050919050565b6000602082019050818103600083015261306181612934565b9050919050565b600060208201905081810360008301526130818161299a565b9050919050565b600060208201905081810360008301526130a181612a1a565b9050919050565b600060208201905081810360008301526130c181612a5a565b9050919050565b600060208201905081810360008301526130e181612a9a565b9050919050565b6000602082019050818103600083015261310181612b00565b9050919050565b6000602082019050818103600083015261312181612b66565b9050919050565b6000602082019050818103600083015261314181612bcc565b9050919050565b6000602082019050818103600083015261316181612c0c565b9050919050565b6000602082019050818103600083015261318181612c4c565b9050919050565b600060208201905081810360008301526131a181612c8c565b9050919050565b60006020820190506131bd6000830184612ccc565b92915050565b6000604051905081810181811067ffffffffffffffff821117156131e657600080fd5b8060405250919050565b600067ffffffffffffffff82111561320757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561322f57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561325757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561327f57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156132ab57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613379826133d4565b9050919050565b600061338b826133d4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561343857808201518184015260208101905061341d565b83811115613447576000848401525b50505050565b600061345882613485565b9050919050565b600061346a82613485565b9050919050565b6000819050919050565b6000819050919050565b6000613490826134b2565b9050919050565b6000819050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6134c88161336e565b81146134d357600080fd5b50565b6134df8161339e565b81146134ea57600080fd5b50565b6134f6816133f4565b811461350157600080fd5b5056fea365627a7a7231582080380f6ece6e2784333874a85f2cd1d7f9092eba8d244a4a3c5ee5fc0e0882c76c6578706572696d656e74616cf564736f6c634300050c0040
Deployed Bytecode Sourcemap
57688:174:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32322:318;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32322:318:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32759:242;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32759:242:0;;;;;;;;;;;;;;;;:::i;:::-;;33938:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33938:209:0;;;;;;;;;;;;;;;;:::i;:::-;;2609:307;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2609:307:0;;;;;;;;;;;;;;;;:::i;:::-;;57804:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57804:54:0;;;:::i;:::-;;;;;;;;;;;;;;;;35782:464;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35782:464:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31838:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31838:86:0;;;:::i;:::-;;;;;;;;;;;;;;;;36491:416;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36491:416:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39405:758;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39405:758:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;56352:335;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56352:335:0;;;;;;;;;;;;;;;;:::i;:::-;;366:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;366:40:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;34954:374;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34954:374:0;;;;;;;;;;;;;;;;:::i;:::-;;322:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;322:37:0;;;:::i;:::-;;;;;;;;;;;;;;;;33475:313;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33475:313:0;;;;;;;;;;;;;;;;:::i;:::-;;50427:986;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50427:986:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;413:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;413:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;34303:423;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34303:423:0;;;;;;;;;;;;;;;;:::i;:::-;;31679:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31679:81:0;;;:::i;:::-;;;;;;;;;;;;;;;;37246:869;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37246:869:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;440:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;440:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;33145:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33145:203:0;;;;;;;;;;;;;;;;:::i;:::-;;44954:1077;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44954:1077:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;46262:538;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46262:538:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32322:318;32536:12;31395:28;31412:10;31395:16;:28::i;:::-;32573:59;32593:12;32607:6;32615:5;32622:9;32573:19;:59::i;:::-;32566:66;;32322:318;;;;;;:::o;32759:242::-;31395:28;31412:10;31395:16;:28::i;:::-;32847:8;:18;32856:8;32847:18;;;;;;;;;;;;;;;;;;;;;;;;;32846:19;32838:54;;;;;;;;;;;;;;;;;;;;;;32924:4;32903:8;:18;32912:8;32903:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;32954:1;32939:11;;:16;;;;;;;;;;;32984:8;32971:22;;;;;;;;;;;;32759:242;:::o;33938:209::-;31395:28;31412:10;31395:16;:28::i;:::-;34044:9;34056:1;34044:13;;34039:101;34063:9;:16;34059:1;:20;34039:101;;;34101:27;34115:9;34125:1;34115:12;;;;;;;;;;;;;;34101:13;:27::i;:::-;34081:3;;;;;;;34039:101;;;;33938:209;:::o;2609:307::-;2731:1;2705:22;;:27;2697:36;;;;;;2769:1;2744:22;:26;;;;2839:4;2818:8;:18;2827:8;2818:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;2869:1;2854:11;;:16;;;;;;;;;;;2899:8;2886:22;;;;;;;;;;;;2609:307;:::o;57804:54::-;;;;;;;;;;;;;;;;;;;:::o;35782:464::-;35926:6;35976:2;35954:11;:18;:24;35950:289;;;36002:42;36026:4;36032:11;36002:23;:42::i;:::-;35995:49;;;;35950:289;36088:3;36066:11;:18;:25;36062:177;;;36115:43;36140:4;36146:11;36115:24;:43::i;:::-;36108:50;;;;36062:177;36191:36;;;;;;;;;;;;;;;;;;;35782:464;;;;;:::o;31838:86::-;31881:7;31172:1;31901:15;;31838:86;:::o;36491:416::-;36641:6;36665:22;36690:74;36743:10;36690:30;36715:4;36690:24;:30::i;:::-;:38;;:74;;;;:::i;:::-;36665:99;;36780:8;:24;36789:14;36780:24;;;;;;;;;;;;;;;;;;;;;;;;;36777:123;;;31277:10;36828:9;;36821:16;;;;;36777:123;31333:10;36877:11;;36870:18;;;36491:416;;;;;:::o;39405:758::-;39637:7;39662:29;39694:77;39735:25;39694:18;:26;;:77;;;;:::i;:::-;39662:109;;39784:40;39827:99;39868:21;39837:63;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;39837:63:0;;;39827:74;;;;;;:97;:99::i;:::-;39784:142;;39939:27;39969:97;40024:31;39969:32;:40;;:97;;;;:::i;:::-;39939:127;;40077:37;40094:19;40077:16;:37::i;:::-;40134:21;40127:28;;;;;39405:758;;;;;:::o;56352:335::-;56001:10;55984:27;;55992:4;55984:27;;;55976:36;;;;;;56504:37;56522:18;56504:17;:37::i;:::-;56553:12;56570:18;:31;;56602:5;56570:38;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;56552:56:0;;;56627:7;56619:16;;;;;;56660:18;56651:28;;;;;;;;;;;;56023:1;56352:335;;:::o;366:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;34954:374::-;35134:12;:19;35111:12;:19;:42;35103:84;;;;;;;;;;;;;;;;;;;;;;35203:9;35215:1;35203:13;;35198:123;35222:12;:19;35218:1;:23;35198:123;;;35263:46;35276:12;35289:1;35276:15;;;;;;;;;;;;;;35293:12;35306:1;35293:15;;;;;;;;;;;;;;35263:12;:46::i;:::-;35243:3;;;;;;;35198:123;;;;34954:374;;:::o;322:37::-;;;;:::o;33475:313::-;31395:28;31412:10;31395:16;:28::i;:::-;33565:8;:18;33574:8;33565:18;;;;;;;;;;;;;;;;;;;;;;;;;33557:53;;;;;;;;;;;;;;;;;;;;;;33643:1;33629:11;;:15;33621:55;;;;;;;;;;;;;;;;;;;;;;33708:5;33687:8;:18;33696:8;33687:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;33739:1;33724:11;;:16;;;;;;;;;;;33771:8;33756:24;;;;;;;;;;;;33475:313;:::o;50427:986::-;50704:14;50736:16;50755:9;50736:28;;50808:124;50851:13;50866:6;50874:7;50883:10;50895:26;50808:28;:124::i;:::-;50991:27;51033:13;:20;51021:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50991:63;;51069:6;51078:1;51069:10;;51065:232;51085:13;:20;51081:1;:24;51065:232;;;51145:140;51185:13;51199:1;51185:16;;;;;;;;;;;;;;51203:6;51210:1;51203:9;;;;;;;;;;;;;;51214:7;51222:1;51214:10;;;;;;;;;;;;;;51226;51237:1;51226:13;;;;;;;;;;;;;;51241:26;51268:1;51241:29;;;;;;;;;;;;;;51145:21;:140::i;:::-;51127:12;51140:1;51127:15;;;;;;;;;;;;;:158;;;;51107:3;;;;;;;51065:232;;;;51338:35;51351:8;51361:11;51338:12;:35::i;:::-;51393:12;51386:19;;;;50427:986;;;;;;;:::o;413:20::-;;;;:::o;34303:423::-;31395:28;31412:10;31395:16;:28::i;:::-;34464:8;:21;34473:11;34464:21;;;;;;;;;;;;;;;;;;;;;;;;;34456:61;;;;;;;;;;;;;;;;;;;;;;34537:8;:21;34546:11;34537:21;;;;;;;;;;;;;;;;;;;;;;;;;34536:22;34528:62;;;;;;;;;;;;;;;;;;;;;;34601:23;34612:11;34601:10;:23::i;:::-;34635:26;34649:11;34635:13;:26::i;:::-;34706:11;34677:41;;34693:11;34677:41;;;;;;;;;;;;34303:423;;:::o;31679:81::-;31720:7;31747:5;;31740:12;;31679:81;:::o;37246:869::-;37398:6;37422:29;37454:24;37472:1;37475:2;37454:11;:17;;:24;;;;;:::i;:::-;37422:56;;37489:43;37535:25;37553:2;37557;37535:11;:17;;:25;;;;;:::i;:::-;37489:71;;37573:23;37599:80;37652:16;37599:30;37624:4;37599:24;:30::i;:::-;:38;;:80;;;;:::i;:::-;37573:106;;37692:40;37735:93;37776:15;37745:57;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37745:57:0;;;37735:68;;;;;;:91;:93::i;:::-;37692:136;;37841:27;37871:96;37926:30;37871:32;:40;;:96;;;;:::i;:::-;37841:126;;37983:8;:29;37992:19;37983:29;;;;;;;;;;;;;;;;;;;;;;;;;37980:128;;;31277:10;38036:9;;38029:16;;;;;;;;;37980:128;31333:10;38085:11;;38078:18;;;;;;;37246:869;;;;;:::o;440:26::-;;;;:::o;33145:203::-;31395:28;31412:10;31395:16;:28::i;:::-;33248:9;33260:1;33248:13;;33243:98;33267:9;:16;33263:1;:20;33243:98;;;33305:24;33316:9;33326:1;33316:12;;;;;;;;;;;;;;33305:10;:24::i;:::-;33285:3;;;;;;;33243:98;;;;33145:203;:::o;44954:1077::-;45287:14;45319:16;45338:9;45319:28;;45391:125;45435:13;45450:6;45458:7;45467:10;45479:26;45391:29;:125::i;:::-;45575:27;45617:13;:20;45605:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45575:63;;45653:6;45662:1;45653:10;;45649:266;45669:13;:20;45665:1;:24;45649:266;;;45729:174;45770:13;45784:1;45770:16;;;;;;;;;;;;;;45788:6;45795:1;45788:9;;;;;;;;;;;;;;45799:7;45807:1;45799:10;;;;;;;;;;;;;;45811;45822:1;45811:13;;;;;;;;;;;;;;45826:26;45853:1;45826:29;;;;;;;;;;;;;;45857:31;45729:22;:174::i;:::-;45711:12;45724:1;45711:15;;;;;;;;;;;;;:192;;;;45691:3;;;;;;;45649:266;;;;45956:35;45969:8;45979:11;45956:12;:35::i;:::-;46011:12;46004:19;;;;44954:1077;;;;;;;;:::o;46262:538::-;46438:4;46460:40;46503:100;46544:22;46513:64;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;46513:64:0;;;46503:75;;;;;;:98;:100::i;:::-;46460:143;;46616:27;46646:97;46701:31;46646:32;:40;;:97;;;;:::i;:::-;46616:127;;46763:8;:29;46772:19;46763:29;;;;;;;;;;;;;;;;;;;;;;;;;46756:36;;;;46262:538;;;;:::o;38266:166::-;38365:4;38343:26;;:8;:18;38352:8;38343:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;:57;;;;38395:4;38373:27;;:10;:27;;;38343:57;38335:89;;;;;;;;;;;;;;;;;;;;;;38266:166;:::o;40530:719::-;40715:12;40746;40760:21;40785:12;:17;;40807:9;40824:6;40832:5;40785:53;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;40745:93:0;;;;40856:7;40851:153;;40880:19;40902:47;40914:5;;40921:12;40935:6;40943:5;40902:11;:47::i;:::-;40880:69;;40969:23;40980:11;40969:23;;;;;;;;;;;;;;;40851:153;;41206:5;;:7;;;;;;;;;;;;;41233:8;41226:15;;;;40530:719;;;;;;:::o;43327:202::-;43403:7;43491:22;43501:4;:11;43491:9;:22::i;:::-;43515:4;43440:80;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;43440:80:0;;;43430:91;;;;;;43423:98;;43327:202;;;:::o;5169:1930::-;5247:7;5330:2;5310:9;:16;:22;5306:74;;5365:1;5349:19;;;;5306:74;5449:9;5469;5489:7;5741:4;5730:9;5726:20;5720:27;5715:32;;5787:4;5776:9;5772:20;5766:27;5761:32;;5841:4;5830:9;5826:20;5820:27;5817:1;5812:36;5807:41;;6771:66;6766:1;6758:10;;:79;6754:129;;;6869:1;6854:17;;;;;;;6754:129;6904:2;6899:1;:7;;;;:18;;;;;6915:2;6910:1;:7;;;;6899:18;6895:68;;;6949:1;6934:17;;;;;;;6895:68;7067:24;7077:4;7083:1;7086;7089;7067:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7067:24:0;;;;;;;;7060:31;;;;;5169:1930;;;;;:::o;7375:269::-;7444:7;7630:4;7577:58;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;7577:58:0;;;7567:69;;;;;;7560:76;;7375:269;;;:::o;57031:339::-;57114:58;57153:18;57114:38;:58::i;:::-;57106:130;;;;;;;;;;;;;;;;;;;;;;57249:12;55811:66;57264:19;;57249:34;;57333:18;57327:4;57320:32;57305:58;;:::o;52983:658::-;53310:7;:14;53286:13;:20;:38;53278:72;;;;;;;;;;;;;;;;;;;;;;53393:10;:17;53369:13;:20;:41;53361:78;;;;;;;;;;;;;;;;;;;;;;53482:10;:17;53458:13;:20;:41;53450:78;;;;;;;;;;;;;;;;;;;;;;53571:26;:33;53547:13;:20;:57;53539:94;;;;;;;;;;;;;;;;;;;;;;52983:658;;;;;:::o;51823:822::-;52059:12;52089:26;52118:274;52167:4;52187:7;;;;31172:1;52232:12;52259:5;52279:6;52300:5;;52320:11;52346:9;52128:238;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;52128:238:0;;;52118:249;;;;;;:272;:274::i;:::-;52089:303;;52437:97;52478:18;52498:25;52437:26;:97::i;:::-;;52554:83;52588:12;52602:6;52610:5;52617:9;52554:19;:83::i;:::-;52547:90;;;51823:822;;;;;;;:::o;41426:324::-;41545:16;41564:24;41578:9;41564;:13;;:24;;;;:::i;:::-;41545:43;;41642:4;41634:21;;;41607:23;41620:9;41607:8;:12;;:23;;;;:::i;:::-;:48;;41599:88;;;;;;;;;;;;;;;;;;;;;;41698:10;:19;;:44;41718:23;41731:9;41718:8;:12;;:23;;;;:::i;:::-;41698:44;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41698:44:0;41426:324;;;:::o;21063:2599::-;21210:12;21275:7;21266:6;:16;21248:6;:13;:35;;21240:44;;;;;;21297:22;21370:7;21363:15;21397:1;21392:2005;;;;23541:4;23535:11;23522:24;;23594:4;23583:9;23579:20;23573:4;23566:34;21356:2259;;21392:2005;21577:4;21571:11;21558:24;;22246:2;22237:7;22233:16;22634:9;22627:17;22621:4;22617:28;22605:9;22594;22590:25;22586:60;22683:7;22679:2;22675:16;22940:6;22926:9;22919:17;22913:4;22909:28;22897:9;22889:6;22885:22;22881:57;22877:70;22711:434;22974:3;22970:2;22967:11;22711:434;;;23122:2;23116:9;23112:2;23105:21;23016:4;23012:2;23008:13;23002:19;;23057:4;23053:2;23049:13;23043:19;;22711:434;;;22715:251;23183:7;23172:9;23165:26;23377:2;23373:7;23368:2;23364;23360:11;23356:25;23350:4;23343:39;21399:1998;;;21356:2259;;23645:9;23638:16;;;21063:2599;;;;;:::o;48681:675::-;49009:7;:14;48985:13;:20;:38;48977:72;;;;;;;;;;;;;;;;;;;;;;49092:10;:17;49068:13;:20;:41;49060:78;;;;;;;;;;;;;;;;;;;;;;49181:10;:17;49157:13;:20;:41;49149:78;;;;;;;;;;;;;;;;;;;;;;49270:26;:33;49246:13;:20;:57;49238:110;;;;;;;;;;;;;;;;;;;;;;48681:675;;;;;:::o;47275:1068::-;47567:12;47597:16;47616:9;47597:28;;47696:31;47714:12;47696:17;:31::i;:::-;47688:85;;;;;;;;;;;;;;;;;;;;;;47786:26;47815:274;47864:4;47884:7;;;;31172:1;47929:12;47956:5;47976:6;47997:5;;48017:11;48043:9;47825:238;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47825:238:0;;;47815:249;;;;;;:272;:274::i;:::-;47786:303;;48102:130;48143:18;48163:25;48190:31;48102:26;:130::i;:::-;;48252:83;48286:12;48300:6;48308:5;48315:9;48252:19;:83::i;:::-;48245:90;;;;47275:1068;;;;;;;;:::o;42783:355::-;42971:7;43044:6;43065:12;43092:6;43113:5;43013:116;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;43013:116:0;;;43003:127;;;;;;42996:134;;42783:355;;;;;;:::o;43663:509::-;43715:27;43767:1;43759:4;:9;43755:52;;;43785:10;;;;;;;;;;;;;;;;;;;;;43755:52;43817:6;43826:4;43817:13;;43841:6;43850:4;43841:13;;43865:8;43884:69;43896:1;43891;:6;43884:69;;43914:5;;;;;;;43939:2;43934:7;;;;;;;;;43884:69;;;43963:17;43993:3;43983:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;43983:14:0;;;;43963:34;;44008:6;44023:1;44017:3;:7;44008:16;;44035:100;44047:1;44042;:6;44035:100;;44097:2;44093:1;:6;;;;;;44088:2;:11;44077:24;;44065:4;44070:3;;;;;;;44065:9;;;;;;;;;;;:36;;;;;;;;;;;44121:2;44116:7;;;;;;;;;44035:100;;;44159:4;44145:19;;;;;;;43663:509;;;;:::o;54630:627::-;54690:4;54707:12;55214:7;55202:20;55194:28;;55248:1;55241:4;:8;55234:15;;;54630:627;;;:::o;38693:386::-;38872:7;38897:29;38929:53;38956:25;38929:18;:26;;:53;;;;:::i;:::-;38897:85;;38993:39;39010:21;38993:16;:39::i;:::-;39050:21;39043:28;;;38693:386;;;;:::o;9028:184::-;9086:7;9119:1;9114;:6;;9106:49;;;;;;;;;;;;;;;;;;;;;;9166:9;9182:1;9178;:5;9166:17;;9203:1;9196:8;;;9028:184;;;;:::o;9463:470::-;9521:7;9770:1;9765;:6;9761:47;;;9795:1;9788:8;;;;9761:47;9820:9;9836:1;9832;:5;9820:17;;9865:1;9860;9856;:5;;;;;;:10;9848:56;;;;;;;;;;;;;;;;;;;;;;9924:1;9917:8;;;9463:470;;;;;:::o;49685:135::-;49757:4;49799:12;49782:29;;49790:4;49782:29;;;;49774:38;;49685:135;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;160:707;;277:3;270:4;262:6;258:17;254:27;244:2;;295:1;292;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;;;354:80;;;345:89;;451:5;476:6;469:5;462:21;506:4;498:6;494:17;484:27;;528:4;523:3;519:14;512:21;;581:6;628:3;620:4;612:6;608:17;603:3;599:27;596:36;593:2;;;645:1;642;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;738:3;760:37;793:3;781:10;760:37;;;755:3;748:50;821:4;816:3;812:14;805:21;;849:4;844:3;840:14;833:21;;712:149;702:1;699;695:9;690:14;;655:206;;;659:14;237:630;;;;;;;;891:693;;1013:3;1006:4;998:6;994:17;990:27;980:2;;1031:1;1028;1021:12;980:2;1068:6;1055:20;1090:85;1105:69;1167:6;1105:69;;;1090:85;;;1081:94;;1192:5;1217:6;1210:5;1203:21;1247:4;1239:6;1235:17;1225:27;;1269:4;1264:3;1260:14;1253:21;;1322:6;1355:1;1340:238;1365:6;1362:1;1359:13;1340:238;;;1448:3;1435:17;1427:6;1423:30;1472:42;1510:3;1498:10;1472:42;;;1467:3;1460:55;1538:4;1533:3;1529:14;1522:21;;1566:4;1561:3;1557:14;1550:21;;1397:181;1387:1;1384;1380:9;1375:14;;1340:238;;;1344:14;973:611;;;;;;;;1610:707;;1727:3;1720:4;1712:6;1708:17;1704:27;1694:2;;1745:1;1742;1735:12;1694:2;1782:6;1769:20;1804:80;1819:64;1876:6;1819:64;;;1804:80;;;1795:89;;1901:5;1926:6;1919:5;1912:21;1956:4;1948:6;1944:17;1934:27;;1978:4;1973:3;1969:14;1962:21;;2031:6;2078:3;2070:4;2062:6;2058:17;2053:3;2049:27;2046:36;2043:2;;;2095:1;2092;2085:12;2043:2;2120:1;2105:206;2130:6;2127:1;2124:13;2105:206;;;2188:3;2210:37;2243:3;2231:10;2210:37;;;2205:3;2198:50;2271:4;2266:3;2262:14;2255:21;;2299:4;2294:3;2290:14;2283:21;;2162:149;2152:1;2149;2145:9;2140:14;;2105:206;;;2109:14;1687:630;;;;;;;;2325:130;;2405:6;2392:20;2383:29;;2417:33;2444:5;2417:33;;;2377:78;;;;;2463:432;;2560:3;2553:4;2545:6;2541:17;2537:27;2527:2;;2578:1;2575;2568:12;2527:2;2615:6;2602:20;2637:60;2652:44;2689:6;2652:44;;;2637:60;;;2628:69;;2717:6;2710:5;2703:21;2753:4;2745:6;2741:17;2786:4;2779:5;2775:16;2821:3;2812:6;2807:3;2803:16;2800:25;2797:2;;;2838:1;2835;2828:12;2797:2;2848:41;2882:6;2877:3;2872;2848:41;;;2520:375;;;;;;;;2904:440;;3005:3;2998:4;2990:6;2986:17;2982:27;2972:2;;3023:1;3020;3013:12;2972:2;3060:6;3047:20;3082:64;3097:48;3138:6;3097:48;;;3082:64;;;3073:73;;3166:6;3159:5;3152:21;3202:4;3194:6;3190:17;3235:4;3228:5;3224:16;3270:3;3261:6;3256:3;3252:16;3249:25;3246:2;;;3287:1;3284;3277:12;3246:2;3297:41;3331:6;3326:3;3321;3297:41;;;2965:379;;;;;;;;3352:130;;3432:6;3419:20;3410:29;;3444:33;3471:5;3444:33;;;3404:78;;;;;3489:241;;3593:2;3581:9;3572:7;3568:23;3564:32;3561:2;;;3609:1;3606;3599:12;3561:2;3644:1;3661:53;3706:7;3697:6;3686:9;3682:22;3661:53;;;3651:63;;3623:97;3555:175;;;;;3737:366;;;3858:2;3846:9;3837:7;3833:23;3829:32;3826:2;;;3874:1;3871;3864:12;3826:2;3909:1;3926:53;3971:7;3962:6;3951:9;3947:22;3926:53;;;3916:63;;3888:97;4016:2;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;;;4024:63;;3995:98;3820:283;;;;;;4110:470;;;4240:2;4228:9;4219:7;4215:23;4211:32;4208:2;;;4256:1;4253;4246:12;4208:2;4291:1;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;;;4298:63;;4270:97;4426:2;4415:9;4411:18;4398:32;4450:18;4442:6;4439:30;4436:2;;;4482:1;4479;4472:12;4436:2;4502:62;4556:7;4547:6;4536:9;4532:22;4502:62;;;4492:72;;4377:193;4202:378;;;;;;4587:721;;;;;4751:3;4739:9;4730:7;4726:23;4722:33;4719:2;;;4768:1;4765;4758:12;4719:2;4803:1;4820:53;4865:7;4856:6;4845:9;4841:22;4820:53;;;4810:63;;4782:97;4910:2;4928:53;4973:7;4964:6;4953:9;4949:22;4928:53;;;4918:63;;4889:98;5046:2;5035:9;5031:18;5018:32;5070:18;5062:6;5059:30;5056:2;;;5102:1;5099;5092:12;5056:2;5122:62;5176:7;5167:6;5156:9;5152:22;5122:62;;;5112:72;;4997:193;5221:2;5239:53;5284:7;5275:6;5264:9;5260:22;5239:53;;;5229:63;;5200:98;4713:595;;;;;;;;5315:377;;5444:2;5432:9;5423:7;5419:23;5415:32;5412:2;;;5460:1;5457;5450:12;5412:2;5523:1;5512:9;5508:17;5495:31;5546:18;5538:6;5535:30;5532:2;;;5578:1;5575;5568:12;5532:2;5598:78;5668:7;5659:6;5648:9;5644:22;5598:78;;;5588:88;;5474:208;5406:286;;;;;5699:638;;;5870:2;5858:9;5849:7;5845:23;5841:32;5838:2;;;5886:1;5883;5876:12;5838:2;5949:1;5938:9;5934:17;5921:31;5972:18;5964:6;5961:30;5958:2;;;6004:1;6001;5994:12;5958:2;6024:78;6094:7;6085:6;6074:9;6070:22;6024:78;;;6014:88;;5900:208;6167:2;6156:9;6152:18;6139:32;6191:18;6183:6;6180:30;6177:2;;;6223:1;6220;6213:12;6177:2;6243:78;6313:7;6304:6;6293:9;6289:22;6243:78;;;6233:88;;6118:209;5832:505;;;;;;6344:1443;;;;;;6651:3;6639:9;6630:7;6626:23;6622:33;6619:2;;;6668:1;6665;6658:12;6619:2;6731:1;6720:9;6716:17;6703:31;6754:18;6746:6;6743:30;6740:2;;;6786:1;6783;6776:12;6740:2;6806:78;6876:7;6867:6;6856:9;6852:22;6806:78;;;6796:88;;6682:208;6949:2;6938:9;6934:18;6921:32;6973:18;6965:6;6962:30;6959:2;;;7005:1;7002;6995:12;6959:2;7025:83;7100:7;7091:6;7080:9;7076:22;7025:83;;;7015:93;;6900:214;7173:2;7162:9;7158:18;7145:32;7197:18;7189:6;7186:30;7183:2;;;7229:1;7226;7219:12;7183:2;7249:78;7319:7;7310:6;7299:9;7295:22;7249:78;;;7239:88;;7124:209;7392:2;7381:9;7377:18;7364:32;7416:18;7408:6;7405:30;7402:2;;;7448:1;7445;7438:12;7402:2;7468:78;7538:7;7529:6;7518:9;7514:22;7468:78;;;7458:88;;7343:209;7611:3;7600:9;7596:19;7583:33;7636:18;7628:6;7625:30;7622:2;;;7668:1;7665;7658:12;7622:2;7688:83;7763:7;7754:6;7743:9;7739:22;7688:83;;;7678:93;;7562:215;6613:1174;;;;;;;;;7794:1673;;;;;;;8127:3;8115:9;8106:7;8102:23;8098:33;8095:2;;;8144:1;8141;8134:12;8095:2;8207:1;8196:9;8192:17;8179:31;8230:18;8222:6;8219:30;8216:2;;;8262:1;8259;8252:12;8216:2;8282:78;8352:7;8343:6;8332:9;8328:22;8282:78;;;8272:88;;8158:208;8425:2;8414:9;8410:18;8397:32;8449:18;8441:6;8438:30;8435:2;;;8481:1;8478;8471:12;8435:2;8501:83;8576:7;8567:6;8556:9;8552:22;8501:83;;;8491:93;;8376:214;8649:2;8638:9;8634:18;8621:32;8673:18;8665:6;8662:30;8659:2;;;8705:1;8702;8695:12;8659:2;8725:78;8795:7;8786:6;8775:9;8771:22;8725:78;;;8715:88;;8600:209;8868:2;8857:9;8853:18;8840:32;8892:18;8884:6;8881:30;8878:2;;;8924:1;8921;8914:12;8878:2;8944:78;9014:7;9005:6;8994:9;8990:22;8944:78;;;8934:88;;8819:209;9087:3;9076:9;9072:19;9059:33;9112:18;9104:6;9101:30;9098:2;;;9144:1;9141;9134:12;9098:2;9164:83;9239:7;9230:6;9219:9;9215:22;9164:83;;;9154:93;;9038:215;9312:3;9301:9;9297:19;9284:33;9337:18;9329:6;9326:30;9323:2;;;9369:1;9366;9359:12;9323:2;9389:62;9443:7;9434:6;9423:9;9419:22;9389:62;;;9379:72;;9263:194;8089:1378;;;;;;;;;9474:699;;;;9630:2;9618:9;9609:7;9605:23;9601:32;9598:2;;;9646:1;9643;9636:12;9598:2;9681:1;9698:53;9743:7;9734:6;9723:9;9719:22;9698:53;;;9688:63;;9660:97;9816:2;9805:9;9801:18;9788:32;9840:18;9832:6;9829:30;9826:2;;;9872:1;9869;9862:12;9826:2;9892:62;9946:7;9937:6;9926:9;9922:22;9892:62;;;9882:72;;9767:193;10019:2;10008:9;10004:18;9991:32;10043:18;10035:6;10032:30;10029:2;;;10075:1;10072;10065:12;10029:2;10095:62;10149:7;10140:6;10129:9;10125:22;10095:62;;;10085:72;;9970:193;9592:581;;;;;;10180:574;;;10319:2;10307:9;10298:7;10294:23;10290:32;10287:2;;;10335:1;10332;10325:12;10287:2;10398:1;10387:9;10383:17;10370:31;10421:18;10413:6;10410:30;10407:2;;;10453:1;10450;10443:12;10407:2;10473:62;10527:7;10518:6;10507:9;10503:22;10473:62;;;10463:72;;10349:192;10600:2;10589:9;10585:18;10572:32;10624:18;10616:6;10613:30;10610:2;;;10656:1;10653;10646:12;10610:2;10676:62;10730:7;10721:6;10710:9;10706:22;10676:62;;;10666:72;;10551:193;10281:473;;;;;;10762:177;;10873:60;10929:3;10921:6;10873:60;;;10859:74;;10852:87;;;;;10947:184;11064:61;11092:32;11118:5;11092:32;;;11064:61;;;11059:3;11052:74;11046:85;;;11138:113;11221:24;11239:5;11221:24;;;11216:3;11209:37;11203:48;;;11258:152;11359:45;11379:24;11397:5;11379:24;;;11359:45;;;11354:3;11347:58;11341:69;;;11444:888;;11599:59;11652:5;11599:59;;;11671:91;11755:6;11750:3;11671:91;;;11664:98;;11785:3;11827:4;11819:6;11815:17;11810:3;11806:27;11854:61;11909:5;11854:61;;;11935:7;11963:1;11948:345;11973:6;11970:1;11967:13;11948:345;;;12035:9;12029:4;12025:20;12020:3;12013:33;12080:6;12074:13;12102:74;12171:4;12156:13;12102:74;;;12094:82;;12193:65;12251:6;12193:65;;;12183:75;;12281:4;12276:3;12272:14;12265:21;;12005:288;11995:1;11992;11988:9;11983:14;;11948:345;;;11952:14;12306:4;12299:11;;12323:3;12316:10;;11578:754;;;;;;;;;;12340:104;12417:21;12432:5;12417:21;;;12412:3;12405:34;12399:45;;;12451:113;12534:24;12552:5;12534:24;;;12529:3;12522:37;12516:48;;;12571:152;12672:45;12692:24;12710:5;12692:24;;;12672:45;;;12667:3;12660:58;12654:69;;;12730:110;12811:23;12828:5;12811:23;;;12806:3;12799:36;12793:47;;;12847:148;12946:43;12965:23;12982:5;12965:23;;;12946:43;;;12941:3;12934:56;12928:67;;;13002:343;;13112:38;13144:5;13112:38;;;13162:70;13225:6;13220:3;13162:70;;;13155:77;;13237:52;13282:6;13277:3;13270:4;13263:5;13259:16;13237:52;;;13310:29;13332:6;13310:29;;;13305:3;13301:39;13294:46;;13092:253;;;;;;13352:356;;13480:38;13512:5;13480:38;;;13530:88;13611:6;13606:3;13530:88;;;13523:95;;13623:52;13668:6;13663:3;13656:4;13649:5;13645:16;13623:52;;;13696:6;13691:3;13687:16;13680:23;;13460:248;;;;;;13715:315;;13811:34;13839:5;13811:34;;;13857:60;13910:6;13905:3;13857:60;;;13850:67;;13922:52;13967:6;13962:3;13955:4;13948:5;13944:16;13922:52;;;13995:29;14017:6;13995:29;;;13990:3;13986:39;13979:46;;13791:239;;;;;;14037:360;;14167:39;14200:5;14167:39;;;14218:89;14300:6;14295:3;14218:89;;;14211:96;;14312:52;14357:6;14352:3;14345:4;14338:5;14334:16;14312:52;;;14385:6;14380:3;14376:16;14369:23;;14147:250;;;;;;14404:339;;14512:35;14541:5;14512:35;;;14559:71;14623:6;14618:3;14559:71;;;14552:78;;14635:52;14680:6;14675:3;14668:4;14661:5;14657:16;14635:52;;;14708:29;14730:6;14708:29;;;14703:3;14699:39;14692:46;;14492:251;;;;;;14751:364;;14911:67;14975:2;14970:3;14911:67;;;14904:74;;15011:66;15007:1;15002:3;14998:11;14991:87;15106:2;15101:3;15097:12;15090:19;;14897:218;;;;15124:400;;15302:85;15384:2;15379:3;15302:85;;;15295:92;;15420:66;15416:1;15411:3;15407:11;15400:87;15515:2;15510:3;15506:12;15499:19;;15288:236;;;;15533:364;;15693:67;15757:2;15752:3;15693:67;;;15686:74;;15793:66;15789:1;15784:3;15780:11;15773:87;15888:2;15883:3;15879:12;15872:19;;15679:218;;;;15906:364;;16066:67;16130:2;16125:3;16066:67;;;16059:74;;16166:66;16162:1;16157:3;16153:11;16146:87;16261:2;16256:3;16252:12;16245:19;;16052:218;;;;16279:364;;16439:67;16503:2;16498:3;16439:67;;;16432:74;;16539:66;16535:1;16530:3;16526:11;16519:87;16634:2;16629:3;16625:12;16618:19;;16425:218;;;;16652:364;;16812:67;16876:2;16871:3;16812:67;;;16805:74;;16912:66;16908:1;16903:3;16899:11;16892:87;17007:2;17002:3;16998:12;16991:19;;16798:218;;;;17025:364;;17185:67;17249:2;17244:3;17185:67;;;17178:74;;17285:66;17281:1;17276:3;17272:11;17265:87;17380:2;17375:3;17371:12;17364:19;;17171:218;;;;17398:465;;17558:67;17622:2;17617:3;17558:67;;;17551:74;;17658:66;17654:1;17649:3;17645:11;17638:87;17759:66;17754:2;17749:3;17745:12;17738:88;17854:2;17849:3;17845:12;17838:19;;17544:319;;;;17872:364;;18032:67;18096:2;18091:3;18032:67;;;18025:74;;18132:66;18128:1;18123:3;18119:11;18112:87;18227:2;18222:3;18218:12;18211:19;;18018:218;;;;18245:400;;18423:85;18505:2;18500:3;18423:85;;;18416:92;;18541:66;18537:1;18532:3;18528:11;18521:87;18636:2;18631:3;18627:12;18620:19;;18409:236;;;;18654:364;;18814:67;18878:2;18873:3;18814:67;;;18807:74;;18914:66;18910:1;18905:3;18901:11;18894:87;19009:2;19004:3;19000:12;18993:19;;18800:218;;;;19027:364;;19187:67;19251:2;19246:3;19187:67;;;19180:74;;19287:66;19283:1;19278:3;19274:11;19267:87;19382:2;19377:3;19373:12;19366:19;;19173:218;;;;19400:465;;19560:67;19624:2;19619:3;19560:67;;;19553:74;;19660:66;19656:1;19651:3;19647:11;19640:87;19761:66;19756:2;19751:3;19747:12;19740:88;19856:2;19851:3;19847:12;19840:19;;19546:319;;;;19874:465;;20034:67;20098:2;20093:3;20034:67;;;20027:74;;20134:66;20130:1;20125:3;20121:11;20114:87;20235:66;20230:2;20225:3;20221:12;20214:88;20330:2;20325:3;20321:12;20314:19;;20020:319;;;;20348:465;;20508:67;20572:2;20567:3;20508:67;;;20501:74;;20608:66;20604:1;20599:3;20595:11;20588:87;20709:66;20704:2;20699:3;20695:12;20688:88;20804:2;20799:3;20795:12;20788:19;;20494:319;;;;20822:364;;20982:67;21046:2;21041:3;20982:67;;;20975:74;;21082:66;21078:1;21073:3;21069:11;21062:87;21177:2;21172:3;21168:12;21161:19;;20968:218;;;;21195:364;;21355:67;21419:2;21414:3;21355:67;;;21348:74;;21455:66;21451:1;21446:3;21442:11;21435:87;21550:2;21545:3;21541:12;21534:19;;21341:218;;;;21568:364;;21728:67;21792:2;21787:3;21728:67;;;21721:74;;21828:66;21824:1;21819:3;21815:11;21808:87;21923:2;21918:3;21914:12;21907:19;;21714:218;;;;21941:364;;22101:67;22165:2;22160:3;22101:67;;;22094:74;;22201:66;22197:1;22192:3;22188:11;22181:87;22296:2;22291:3;22287:12;22280:19;;22087:218;;;;22313:113;22396:24;22414:5;22396:24;;;22391:3;22384:37;22378:48;;;22433:152;22534:45;22554:24;22572:5;22554:24;;;22534:45;;;22529:3;22522:58;22516:69;;;22592:107;22671:22;22687:5;22671:22;;;22666:3;22659:35;22653:46;;;22706:244;;22825:75;22896:3;22887:6;22825:75;;;22922:2;22917:3;22913:12;22906:19;;22942:3;22935:10;;22813:137;;;;;22957:1401;;23332:91;23419:3;23410:6;23332:91;;;23445:2;23440:3;23436:12;23429:19;;23459:73;23528:3;23519:6;23459:73;;;23554:1;23549:3;23545:11;23538:18;;23567:75;23638:3;23629:6;23567:75;;;23664:2;23659:3;23655:12;23648:19;;23678:75;23749:3;23740:6;23678:75;;;23775:2;23770:3;23766:12;23759:19;;23796:93;23885:3;23876:6;23796:93;;;23789:100;;23900:75;23971:3;23962:6;23900:75;;;23997:2;23992:3;23988:12;23981:19;;24011:75;24082:3;24073:6;24011:75;;;24108:2;24103:3;24099:12;24092:19;;24122:75;24193:3;24184:6;24122:75;;;24219:2;24214:3;24210:12;24203:19;;24233:75;24304:3;24295:6;24233:75;;;24330:2;24325:3;24321:12;24314:19;;24350:3;24343:10;;23320:1038;;;;;;;;;;;;;24365:262;;24509:93;24598:3;24589:6;24509:93;;;24502:100;;24619:3;24612:10;;24490:137;;;;;24634:511;;24861:148;25005:3;24861:148;;;24854:155;;25020:75;25091:3;25082:6;25020:75;;;25117:2;25112:3;25108:12;25101:19;;25137:3;25130:10;;24842:303;;;;;25152:690;;25445:148;25589:3;25445:148;;;25438:155;;25611:95;25702:3;25693:6;25611:95;;;25604:102;;25724:93;25813:3;25804:6;25724:93;;;25717:100;;25834:3;25827:10;;25426:416;;;;;;25849:679;;26070:75;26141:3;26132:6;26070:75;;;26167:2;26162:3;26158:12;26151:19;;26181:75;26252:3;26243:6;26181:75;;;26278:2;26273:3;26269:12;26262:19;;26292:75;26363:3;26354:6;26292:75;;;26389:2;26384:3;26380:12;26373:19;;26410:93;26499:3;26490:6;26410:93;;;26403:100;;26520:3;26513:10;;26058:470;;;;;;;;26535:213;;26653:2;26642:9;26638:18;26630:26;;26667:71;26735:1;26724:9;26720:17;26711:6;26667:71;;;26624:124;;;;;26755:381;;26933:2;26922:9;26918:18;26910:26;;26983:9;26977:4;26973:20;26969:1;26958:9;26954:17;26947:47;27008:118;27121:4;27112:6;27008:118;;;27000:126;;26904:232;;;;;27143:201;;27255:2;27244:9;27240:18;27232:26;;27269:65;27331:1;27320:9;27316:17;27307:6;27269:65;;;27226:118;;;;;27351:213;;27469:2;27458:9;27454:18;27446:26;;27483:71;27551:1;27540:9;27536:17;27527:6;27483:71;;;27440:124;;;;;27571:539;;27769:3;27758:9;27754:19;27746:27;;27784:71;27852:1;27841:9;27837:17;27828:6;27784:71;;;27866:68;27930:2;27919:9;27915:18;27906:6;27866:68;;;27945:72;28013:2;28002:9;27998:18;27989:6;27945:72;;;28028;28096:2;28085:9;28081:18;28072:6;28028:72;;;27740:370;;;;;;;;28117:209;;28233:2;28222:9;28218:18;28210:26;;28247:69;28313:1;28302:9;28298:17;28289:6;28247:69;;;28204:122;;;;;28333:297;;28469:2;28458:9;28454:18;28446:26;;28519:9;28513:4;28509:20;28505:1;28494:9;28490:17;28483:47;28544:76;28615:4;28606:6;28544:76;;;28536:84;;28440:190;;;;;28637:293;;28771:2;28760:9;28756:18;28748:26;;28821:9;28815:4;28811:20;28807:1;28796:9;28792:17;28785:47;28846:74;28915:4;28906:6;28846:74;;;28838:82;;28742:188;;;;;28937:407;;29128:2;29117:9;29113:18;29105:26;;29178:9;29172:4;29168:20;29164:1;29153:9;29149:17;29142:47;29203:131;29329:4;29203:131;;;29195:139;;29099:245;;;;29351:407;;29542:2;29531:9;29527:18;29519:26;;29592:9;29586:4;29582:20;29578:1;29567:9;29563:17;29556:47;29617:131;29743:4;29617:131;;;29609:139;;29513:245;;;;29765:407;;29956:2;29945:9;29941:18;29933:26;;30006:9;30000:4;29996:20;29992:1;29981:9;29977:17;29970:47;30031:131;30157:4;30031:131;;;30023:139;;29927:245;;;;30179:407;;30370:2;30359:9;30355:18;30347:26;;30420:9;30414:4;30410:20;30406:1;30395:9;30391:17;30384:47;30445:131;30571:4;30445:131;;;30437:139;;30341:245;;;;30593:407;;30784:2;30773:9;30769:18;30761:26;;30834:9;30828:4;30824:20;30820:1;30809:9;30805:17;30798:47;30859:131;30985:4;30859:131;;;30851:139;;30755:245;;;;31007:407;;31198:2;31187:9;31183:18;31175:26;;31248:9;31242:4;31238:20;31234:1;31223:9;31219:17;31212:47;31273:131;31399:4;31273:131;;;31265:139;;31169:245;;;;31421:407;;31612:2;31601:9;31597:18;31589:26;;31662:9;31656:4;31652:20;31648:1;31637:9;31633:17;31626:47;31687:131;31813:4;31687:131;;;31679:139;;31583:245;;;;31835:407;;32026:2;32015:9;32011:18;32003:26;;32076:9;32070:4;32066:20;32062:1;32051:9;32047:17;32040:47;32101:131;32227:4;32101:131;;;32093:139;;31997:245;;;;32249:407;;32440:2;32429:9;32425:18;32417:26;;32490:9;32484:4;32480:20;32476:1;32465:9;32461:17;32454:47;32515:131;32641:4;32515:131;;;32507:139;;32411:245;;;;32663:407;;32854:2;32843:9;32839:18;32831:26;;32904:9;32898:4;32894:20;32890:1;32879:9;32875:17;32868:47;32929:131;33055:4;32929:131;;;32921:139;;32825:245;;;;33077:407;;33268:2;33257:9;33253:18;33245:26;;33318:9;33312:4;33308:20;33304:1;33293:9;33289:17;33282:47;33343:131;33469:4;33343:131;;;33335:139;;33239:245;;;;33491:407;;33682:2;33671:9;33667:18;33659:26;;33732:9;33726:4;33722:20;33718:1;33707:9;33703:17;33696:47;33757:131;33883:4;33757:131;;;33749:139;;33653:245;;;;33905:407;;34096:2;34085:9;34081:18;34073:26;;34146:9;34140:4;34136:20;34132:1;34121:9;34117:17;34110:47;34171:131;34297:4;34171:131;;;34163:139;;34067:245;;;;34319:407;;34510:2;34499:9;34495:18;34487:26;;34560:9;34554:4;34550:20;34546:1;34535:9;34531:17;34524:47;34585:131;34711:4;34585:131;;;34577:139;;34481:245;;;;34733:407;;34924:2;34913:9;34909:18;34901:26;;34974:9;34968:4;34964:20;34960:1;34949:9;34945:17;34938:47;34999:131;35125:4;34999:131;;;34991:139;;34895:245;;;;35147:407;;35338:2;35327:9;35323:18;35315:26;;35388:9;35382:4;35378:20;35374:1;35363:9;35359:17;35352:47;35413:131;35539:4;35413:131;;;35405:139;;35309:245;;;;35561:407;;35752:2;35741:9;35737:18;35729:26;;35802:9;35796:4;35792:20;35788:1;35777:9;35773:17;35766:47;35827:131;35953:4;35827:131;;;35819:139;;35723:245;;;;35975:213;;36093:2;36082:9;36078:18;36070:26;;36107:71;36175:1;36164:9;36160:17;36151:6;36107:71;;;36064:124;;;;;36195:256;;36257:2;36251:9;36241:19;;36295:4;36287:6;36283:17;36394:6;36382:10;36379:22;36358:18;36346:10;36343:34;36340:62;36337:2;;;36415:1;36412;36405:12;36337:2;36435:10;36431:2;36424:22;36235:216;;;;;36458:304;;36617:18;36609:6;36606:30;36603:2;;;36649:1;36646;36639:12;36603:2;36684:4;36676:6;36672:17;36664:25;;36747:4;36741;36737:15;36729:23;;36540:222;;;;36769:309;;36933:18;36925:6;36922:30;36919:2;;;36965:1;36962;36955:12;36919:2;37000:4;36992:6;36988:17;36980:25;;37063:4;37057;37053:15;37045:23;;36856:222;;;;37085:304;;37244:18;37236:6;37233:30;37230:2;;;37276:1;37273;37266:12;37230:2;37311:4;37303:6;37299:17;37291:25;;37374:4;37368;37364:15;37356:23;;37167:222;;;;37396:317;;37535:18;37527:6;37524:30;37521:2;;;37567:1;37564;37557:12;37521:2;37634:4;37630:9;37623:4;37615:6;37611:17;37607:33;37599:41;;37698:4;37692;37688:15;37680:23;;37458:255;;;;37720:321;;37863:18;37855:6;37852:30;37849:2;;;37895:1;37892;37885:12;37849:2;37962:4;37958:9;37951:4;37943:6;37939:17;37935:33;37927:41;;38026:4;38020;38016:15;38008:23;;37786:255;;;;38048:156;;38139:3;38131:11;;38177:4;38172:3;38168:14;38160:22;;38125:79;;;;38211:142;;38325:5;38319:12;38309:22;;38290:63;;;;38360:117;;38449:5;38443:12;38433:22;;38414:63;;;;38484:121;;38577:5;38571:12;38561:22;;38542:63;;;;38612:118;;38702:5;38696:12;38686:22;;38667:63;;;;38737:122;;38831:5;38825:12;38815:22;;38796:63;;;;38866:113;;38969:4;38964:3;38960:14;38952:22;;38946:33;;;;38987:183;;39122:6;39117:3;39110:19;39159:4;39154:3;39150:14;39135:29;;39103:67;;;;;39179:152;;39283:6;39278:3;39271:19;39320:4;39315:3;39311:14;39296:29;;39264:67;;;;;39340:162;;39454:6;39449:3;39442:19;39491:4;39486:3;39482:14;39467:29;;39435:67;;;;;39511:144;;39646:3;39631:18;;39624:31;;;;;39664:163;;39779:6;39774:3;39767:19;39816:4;39811:3;39807:14;39792:29;;39760:67;;;;;39836:145;;39972:3;39957:18;;39950:31;;;;;39989:91;;40051:24;40069:5;40051:24;;;40040:35;;40034:46;;;;40087:99;;40157:24;40175:5;40157:24;;;40146:35;;40140:46;;;;40193:85;;40266:5;40259:13;40252:21;40241:32;;40235:43;;;;40285:72;;40347:5;40336:16;;40330:27;;;;40364:144;;40436:66;40429:5;40425:78;40414:89;;40408:100;;;;40515:121;;40588:42;40581:5;40577:54;40566:65;;40560:76;;;;40643:72;;40705:5;40694:16;;40688:27;;;;40722:81;;40793:4;40786:5;40782:16;40771:27;;40765:38;;;;40811:145;40892:6;40887:3;40882;40869:30;40948:1;40939:6;40934:3;40930:16;40923:27;40862:94;;;;40965:268;41030:1;41037:101;41051:6;41048:1;41045:13;41037:101;;;41127:1;41122:3;41118:11;41112:18;41108:1;41103:3;41099:11;41092:39;41073:2;41070:1;41066:10;41061:15;;41037:101;;;41153:6;41150:1;41147:13;41144:2;;;41218:1;41209:6;41204:3;41200:16;41193:27;41144:2;41014:219;;;;;41241:95;;41305:26;41325:5;41305:26;;;41294:37;;41288:48;;;;41343:103;;41415:26;41435:5;41415:26;;;41404:37;;41398:48;;;;41453:74;;41517:5;41506:16;;41500:27;;;;41534:73;;41597:5;41586:16;;41580:27;;;;41614:89;;41678:20;41692:5;41678:20;;;41667:31;;41661:42;;;;41710:74;;41774:5;41763:16;;41757:27;;;;41791:97;;41879:2;41875:7;41870:2;41863:5;41859:14;41855:28;41845:38;;41839:49;;;;41896:94;;41974:5;41970:2;41966:14;41944:36;;41938:52;;;;41998:117;42067:24;42085:5;42067:24;;;42060:5;42057:35;42047:2;;42106:1;42103;42096:12;42047:2;42041:74;;42122:117;42191:24;42209:5;42191:24;;;42184:5;42181:35;42171:2;;42230:1;42227;42220:12;42171:2;42165:74;;42246:117;42315:24;42333:5;42315:24;;;42308:5;42305:35;42295:2;;42354:1;42351;42344:12;42295:2;42289:74;
Swarm Source
bzzr://80380f6ece6e2784333874a85f2cd1d7f9092eba8d244a4a3c5ee5fc0e0882c7
Loading...
Loading
Loading...
Loading
OVERVIEW
Logic address for Authereum account proxiesMultichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.