Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,588 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Purchase Through... | 14879340 | 956 days ago | IN | 1 ETH | 0.00855579 | ||||
Purchase Through... | 14848611 | 961 days ago | IN | 1 ETH | 0.00351496 | ||||
Purchase Through... | 14848611 | 961 days ago | IN | 1 ETH | 0.00319491 | ||||
Purchase Through... | 14848611 | 961 days ago | IN | 1 ETH | 0.01344902 | ||||
Purchase Through... | 14848609 | 961 days ago | IN | 1 ETH | 0.01491972 | ||||
Purchase Through... | 14848607 | 961 days ago | IN | 1 ETH | 0.01514445 | ||||
Purchase Through... | 14848607 | 961 days ago | IN | 1 ETH | 0.01495307 | ||||
Purchase Through... | 14848607 | 961 days ago | IN | 1 ETH | 0.02125717 | ||||
Purchase Through... | 14848607 | 961 days ago | IN | 1 ETH | 0.0242241 | ||||
Purchase Through... | 14848606 | 961 days ago | IN | 1 ETH | 0.01578942 | ||||
Purchase Through... | 14848605 | 961 days ago | IN | 1 ETH | 0.02103206 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.01529736 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.01529736 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.01518846 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.01542033 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.01984723 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.01984723 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.02107692 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.02107692 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.0239441 | ||||
Purchase Through... | 14848603 | 961 days ago | IN | 1 ETH | 0.06389296 | ||||
Set Auction | 14848502 | 961 days ago | IN | 0 ETH | 0.00247423 | ||||
Flip Limiter For... | 14848497 | 961 days ago | IN | 0 ETH | 0.00275498 | ||||
Premint | 14848489 | 961 days ago | IN | 0 ETH | 0.01544745 | ||||
Set Auction | 14848446 | 961 days ago | IN | 0 ETH | 0.00653597 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14848611 | 961 days ago | 0.2 ETH | ||||
14848611 | 961 days ago | 0.8 ETH | ||||
14848609 | 961 days ago | 0.2 ETH | ||||
14848609 | 961 days ago | 0.8 ETH | ||||
14848607 | 961 days ago | 0.2 ETH | ||||
14848607 | 961 days ago | 0.8 ETH | ||||
14848607 | 961 days ago | 0.2 ETH | ||||
14848607 | 961 days ago | 0.8 ETH | ||||
14848607 | 961 days ago | 0.2 ETH | ||||
14848607 | 961 days ago | 0.8 ETH | ||||
14848607 | 961 days ago | 0.2 ETH | ||||
14848607 | 961 days ago | 0.8 ETH | ||||
14848606 | 961 days ago | 0.2 ETH | ||||
14848606 | 961 days ago | 0.8 ETH | ||||
14848605 | 961 days ago | 0.2 ETH | ||||
14848605 | 961 days ago | 0.8 ETH | ||||
14848603 | 961 days ago | 0.2 ETH | ||||
14848603 | 961 days ago | 0.8 ETH | ||||
14848603 | 961 days ago | 0.2 ETH | ||||
14848603 | 961 days ago | 0.8 ETH | ||||
14848603 | 961 days ago | 0.2 ETH | ||||
14848603 | 961 days ago | 0.8 ETH | ||||
14848603 | 961 days ago | 0.2 ETH | ||||
14848603 | 961 days ago | 0.8 ETH | ||||
14848603 | 961 days ago | 0.2 ETH |
Loading...
Loading
Contract Name:
SalePlatform
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; import "./interfaces/IQuantumArt.sol"; import "./interfaces/IQuantumMintPass.sol"; import "./interfaces/IQuantumUnlocked.sol"; import "./interfaces/IQuantumKeyRing.sol"; import "./ContinuousDutchAuction.sol"; import "@rari-capital/solmate/src/auth/Auth.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/structs/BitMaps.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; contract SalePlatform is ContinuousDutchAuction, ReentrancyGuard, Auth { using BitMaps for BitMaps.BitMap; using Strings for uint256; struct Sale { uint128 price; uint64 start; uint64 limit; } struct MPClaim { uint64 mpId; uint64 start; uint128 price; } struct Whitelist { uint192 price; uint64 start; bytes32 merkleRoot; } event Purchased(uint256 indexed dropId, uint256 tokenId, address to); event DropCreated(uint256 dropId); //mapping dropId => struct mapping (uint256 => Sale) public sales; mapping (uint256 => MPClaim) public mpClaims; mapping (uint256 => Whitelist) public whitelists; uint256 public defaultArtistCut; //10000 * percentage IQuantumArt public quantum; IQuantumMintPass public mintpass; IQuantumUnlocked public keyUnlocks; IQuantumKeyRing public keyRing; address[] public privilegedContracts; BitMaps.BitMap private _disablingLimiter; mapping (uint256 => BitMaps.BitMap) private _claimedWL; mapping (address => BitMaps.BitMap) private _alreadyBought; mapping (uint256 => uint256) private _overridedArtistCut; // dropId -> cut address payable private _quantumTreasury; //TODO: Better drop mechanism struct UnlockSale { uint128 price; uint64 start; uint64 period; address artist; uint256 overrideArtistcut; uint256[] enabledKeyRanges; } uint private constant SEPARATOR = 10**4; uint128 private _nextUnlockDropId; //TODO: CLEAN UP mapping(uint256 => mapping(uint256 => bool)) keyUnlockClaims; //TODO: Seperate sales mechanisms for target sales is not right. mapping (uint256 => UnlockSale) public keySales; constructor( address deployedQuantum, address deployedMP, address deployedKeyRing, address deployedUnlocks, address admin, address payable treasury, address authority) Auth(admin, Authority(authority)) { quantum = IQuantumArt(deployedQuantum); mintpass = IQuantumMintPass(deployedMP); keyRing = IQuantumKeyRing(deployedKeyRing); keyUnlocks = IQuantumUnlocked(deployedUnlocks); _quantumTreasury = treasury; defaultArtistCut = 8000; //default 80% for artist } modifier checkCaller { require(msg.sender.code.length == 0, "Contract forbidden"); _; } modifier isFirstTime(uint256 dropId) { if (!_disablingLimiter.get(dropId)) { require(!_alreadyBought[msg.sender].get(dropId), string(abi.encodePacked("Already bought drop ", dropId.toString()))); _alreadyBought[msg.sender].set(dropId); } _; } function setPrivilegedContracts(address[] calldata contracts) requiresAuth public { privilegedContracts = contracts; } function withdraw(address payable to) requiresAuth public { Address.sendValue(to, address(this).balance); } function premint(uint256 dropId, address[] calldata recipients) requiresAuth public { for(uint256 i = 0; i < recipients.length; i++) { uint256 tokenId = quantum.mintTo(dropId, recipients[i]); emit Purchased(dropId, tokenId, recipients[i]); } } function setMintpass(address deployedMP) requiresAuth public { mintpass = IQuantumMintPass(deployedMP); } function setQuantum(address deployedQuantum) requiresAuth public { quantum = IQuantumArt(deployedQuantum); } function setKeyRing(address deployedKeyRing) requiresAuth public { keyRing = IQuantumKeyRing(deployedKeyRing); } function setKeyUnlocks(address deployedUnlocks) requiresAuth public { keyUnlocks = IQuantumUnlocked(deployedUnlocks); } function setDefaultArtistCut(uint256 cut) requiresAuth public { defaultArtistCut = cut; } function createSale(uint256 dropId, uint128 price, uint64 start, uint64 limit) requiresAuth public { sales[dropId] = Sale(price, start, limit); } function createMPClaim(uint256 dropId, uint64 mpId, uint64 start, uint128 price) requiresAuth public { mpClaims[dropId] = MPClaim(mpId, start, price); } function createWLClaim(uint256 dropId, uint192 price, uint64 start, bytes32 root) requiresAuth public { whitelists[dropId] = Whitelist(price, start, root); } function flipUint64(uint64 x) internal pure returns (uint64) { return x > 0 ? 0 : type(uint64).max; } function flipSaleState(uint256 dropId) requiresAuth public { sales[dropId].start = flipUint64(sales[dropId].start); } function flipMPClaimState(uint256 dropId) requiresAuth public { mpClaims[dropId].start = flipUint64(mpClaims[dropId].start); } function flipWLState(uint256 dropId) requiresAuth public { whitelists[dropId].start = flipUint64(whitelists[dropId].start); } function flipLimiterForDrop(uint256 dropId) requiresAuth public { if (_disablingLimiter.get(dropId)) { _disablingLimiter.unset(dropId); } else { _disablingLimiter.set(dropId); } } function overrideArtistcut(uint256 dropId, uint256 cut) requiresAuth public { _overridedArtistCut[dropId] = cut; } function overrideUnlockArtistCut(uint256 dropId, uint256 cut) requiresAuth public { keySales[dropId].overrideArtistcut = cut; } function setAuction( uint256 auctionId, uint256 startingPrice, uint128 decreasingConstant, uint64 start, uint64 period ) public override requiresAuth { super.setAuction(auctionId, startingPrice, decreasingConstant, start, period); } function curatedPayout(address artist, uint256 dropId, uint256 amount) internal { uint256 artistCut = _overridedArtistCut[dropId] == 0 ? defaultArtistCut : _overridedArtistCut[dropId]; uint256 payout_ = (amount*artistCut)/10000; Address.sendValue(payable(artist), payout_); Address.sendValue(_quantumTreasury, amount - payout_); } function genericPayout(address artist, uint256 amount, uint256 cut) internal { uint256 artistCut = cut == 0 ? defaultArtistCut : cut; uint256 payout_ = (amount*artistCut)/10000; Address.sendValue(payable(artist), payout_); Address.sendValue(_quantumTreasury, amount - payout_); } function _isPrivileged(address user) internal view returns (bool) { uint256 length = privilegedContracts.length; unchecked { for(uint i; i < length; i++) { /// @dev using this interface because has balanceOf if (IQuantumArt(privilegedContracts[i]).balanceOf(user) > 0) { return true; } } } return false; } function purchase(uint256 dropId, uint256 amount) nonReentrant checkCaller isFirstTime(dropId) payable public { Sale memory sale = sales[dropId]; require(block.timestamp >= sale.start, "PURCHASE:SALE INACTIVE"); require(amount <= sale.limit, "PURCHASE:OVER LIMIT"); require(msg.value == amount * sale.price, "PURCHASE:INCORRECT MSG.VALUE"); for(uint256 i = 0; i < amount; i++) { uint256 tokenId = quantum.mintTo(dropId, msg.sender); emit Purchased(dropId, tokenId, msg.sender); } curatedPayout(quantum.getArtist(dropId), dropId, msg.value); } function purchaseThroughAuction(uint256 dropId) nonReentrant checkCaller isFirstTime(dropId) payable public { Auction memory auction = _auctions[dropId]; // if 5 minutes before public auction // if holder -> special treatment uint256 userPaid = auction.startingPrice; if ( block.timestamp <= auction.start && block.timestamp >= auction.start - 300 && _isPrivileged(msg.sender) ) { require(msg.value == userPaid, "PURCHASE:INCORRECT MSG.VALUE"); } else { userPaid = verifyBid(dropId); } uint256 tokenId = quantum.mintTo(dropId, msg.sender); emit Purchased(dropId, tokenId, msg.sender); curatedPayout(quantum.getArtist(dropId), dropId, userPaid); } function unlockWithKey(uint256 keyId, uint128 dropId, uint256 variant) nonReentrant checkCaller payable public { require(keyRing.ownerOf(keyId) == msg.sender, "PURCHASE:NOT KEY OWNER"); require(!keyUnlockClaims[dropId][keyId], "PURCHASE:KEY ALREADY USED"); require(variant>0 && variant<13, "PURCHASE:INVALID VARIANT"); UnlockSale memory sale = keySales[dropId]; //Check is a valid key range (to limit to particular keys) bool inRange = false; if (sale.enabledKeyRanges.length > 0) { for (uint256 i=0; i<sale.enabledKeyRanges.length; i++) { if ((keyId >= (sale.enabledKeyRanges[i] * SEPARATOR)) && (keyId < (((sale.enabledKeyRanges[i]+1) * SEPARATOR)-1))) inRange = true; } } else inRange = true; require(inRange, "PURCHASE:SALE NOT AVAILABLE TO THIS KEY"); require(block.timestamp >= sale.start, "PURCHASE:SALE NOT STARTED"); require(block.timestamp <= (sale.start + sale.period), "PURCHASE:SALE EXPIRED"); require(msg.value == sale.price, "PURCHASE:INCORRECT MSG.VALUE"); uint256 tokenId = keyUnlocks.mint(msg.sender, dropId, variant); keyUnlockClaims[dropId][keyId] = true; emit Purchased(dropId, tokenId, msg.sender); genericPayout(sale.artist, msg.value, sale.overrideArtistcut); } function createUnlockSale(uint128 price, uint64 start, uint64 period, address artist, uint256[] calldata enabledKeyRanges) requiresAuth public { emit DropCreated(_nextUnlockDropId); uint256[] memory blankRanges; keySales[_nextUnlockDropId++] = UnlockSale(price, start, period, artist, 0, blankRanges); for (uint i=0; i<enabledKeyRanges.length; i++) keySales[_nextUnlockDropId-1].enabledKeyRanges.push(enabledKeyRanges[i]); } function isKeyUsed(uint256 dropId, uint256 keyId) public view returns (bool) { return keyUnlockClaims[dropId][keyId]; } function claimWithMintPass(uint256 dropId, uint256 amount) nonReentrant payable public { MPClaim memory mpClaim = mpClaims[dropId]; require(block.timestamp >= mpClaim.start, "MP: CLAIMING INACTIVE"); require(msg.value == amount * mpClaim.price, "MP:WRONG MSG.VALUE"); mintpass.burnFromRedeem(msg.sender, mpClaim.mpId, amount); //burn mintpasses for(uint256 i = 0; i < amount; i++) { uint256 tokenId = quantum.mintTo(dropId, msg.sender); emit Purchased(dropId, tokenId, msg.sender); } if (msg.value > 0) curatedPayout(quantum.getArtist(dropId), dropId, msg.value); } function purchaseThroughWhitelist(uint256 dropId, uint256 amount, uint256 index, bytes32[] calldata merkleProof) nonReentrant external payable { Whitelist memory whitelist = whitelists[dropId]; require(block.timestamp >= whitelist.start, "WL:INACTIVE"); require(msg.value == whitelist.price * amount, "WL: INVALID MSG.VALUE"); require(!_claimedWL[dropId].get(index), "WL:ALREADY CLAIMED"); bytes32 node = keccak256(abi.encodePacked(msg.sender, amount, index)); require(MerkleProof.verify(merkleProof, whitelist.merkleRoot, node),"WL:INVALID PROOF"); _claimedWL[dropId].set(index); uint256 tokenId = quantum.mintTo(dropId, msg.sender); emit Purchased(dropId, tokenId, msg.sender); curatedPayout(quantum.getArtist(dropId), dropId, msg.value); } function isWLClaimed(uint256 dropId, uint256 index) public view returns (bool) { return _claimedWL[dropId].get(index); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IQuantumArt { function mintTo(uint256 dropId, address artist) external returns (uint256); function burn(uint256 tokenId) external; function getArtist(uint256 dropId) external view returns (address); function balanceOf(address user) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IQuantumMintPass { function burnFromRedeem(address user, uint256 mpId, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IQuantumUnlocked { function mint(address to, uint128 dropId, uint256 variant) external returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IQuantumKeyRing { function make(address to, uint256 id, uint256 amount) external; function ownerOf(uint256 tokenId) external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; import "@openzeppelin/contracts/utils/Address.sol"; abstract contract ContinuousDutchAuction { struct Auction { uint256 startingPrice; uint128 decreasingConstant; uint64 start; uint64 period; //period in seconds : MAX IS 18 HOURS } mapping (uint => Auction) internal _auctions; function auctions(uint256 auctionId) public view returns ( uint256 startingPrice, uint128 decreasingConstant, uint64 start, uint64 period, bool active ) { Auction memory auction = _auctions[auctionId]; startingPrice = auction.startingPrice; decreasingConstant = auction.decreasingConstant; start = auction.start; period = auction.period; active = start > 0 && block.timestamp >= start; } function setAuction( uint256 auctionId, uint256 startingPrice, uint128 decreasingConstant, uint64 start, uint64 period ) virtual public { unchecked { require(startingPrice - decreasingConstant * period <= startingPrice, "setAuction: floor price underflow"); } _auctions[auctionId] = Auction(startingPrice, decreasingConstant, start, period); } function getPrice(uint256 auctionId) virtual public view returns (uint256 price) { Auction memory auction = _auctions[auctionId]; //only compute correct price if necessary if (block.timestamp < auction.start) price = auction.startingPrice; else if (block.timestamp >= auction.start + auction.period) price = auction.startingPrice - auction.period * auction.decreasingConstant; else price = auction.startingPrice - (auction.decreasingConstant * (block.timestamp - auction.start)); } function verifyBid(uint256 auctionId) internal returns (uint256) { Auction memory auction = _auctions[auctionId]; require(auction.start > 0, "AUCTION:NOT CREATED"); require(block.timestamp >= auction.start, "PURCHASE:AUCTION NOT STARTED"); uint256 pricePaid = getPrice(auctionId); require(msg.value >= pricePaid, "PURCHASE:INCORRECT MSG.VALUE"); if (msg.value - pricePaid > 0) Address.sendValue(payable(msg.sender), msg.value-pricePaid); //refund difference return pricePaid; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Provides a flexible and updatable auth pattern which is completely separate from application logic. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Auth.sol) /// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol) abstract contract Auth { event OwnerUpdated(address indexed user, address indexed newOwner); event AuthorityUpdated(address indexed user, Authority indexed newAuthority); address public owner; Authority public authority; constructor(address _owner, Authority _authority) { owner = _owner; authority = _authority; emit OwnerUpdated(msg.sender, _owner); emit AuthorityUpdated(msg.sender, _authority); } modifier requiresAuth() { require(isAuthorized(msg.sender, msg.sig), "UNAUTHORIZED"); _; } function isAuthorized(address user, bytes4 functionSig) internal view virtual returns (bool) { Authority auth = authority; // Memoizing authority saves us a warm SLOAD, around 100 gas. // Checking if the caller is the owner only after calling the authority saves gas in most cases, but be // aware that this makes protected functions uncallable even to the owner if the authority is out of order. return (address(auth) != address(0) && auth.canCall(user, address(this), functionSig)) || user == owner; } function setAuthority(Authority newAuthority) public virtual { // We check if the caller is the owner first because we want to ensure they can // always swap out the authority even if it's reverting or using up a lot of gas. require(msg.sender == owner || authority.canCall(msg.sender, address(this), msg.sig)); authority = newAuthority; emit AuthorityUpdated(msg.sender, newAuthority); } function setOwner(address newOwner) public virtual requiresAuth { owner = newOwner; emit OwnerUpdated(msg.sender, newOwner); } } /// @notice A generic interface for a contract which provides authorization data to an Auth instance. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Auth.sol) /// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol) interface Authority { function canCall( address user, address target, bytes4 functionSig ) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/structs/BitMaps.sol) pragma solidity ^0.8.0; /** * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential. * Largelly inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor]. */ library BitMaps { struct BitMap { mapping(uint256 => uint256) _data; } /** * @dev Returns whether the bit at `index` is set. */ function get(BitMap storage bitmap, uint256 index) internal view returns (bool) { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); return bitmap._data[bucket] & mask != 0; } /** * @dev Sets the bit at `index` to the boolean `value`. */ function setTo( BitMap storage bitmap, uint256 index, bool value ) internal { if (value) { set(bitmap, index); } else { unset(bitmap, index); } } /** * @dev Sets the bit at `index`. */ function set(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] |= mask; } /** * @dev Unsets the bit at `index`. */ function unset(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] &= ~mask; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"deployedQuantum","type":"address"},{"internalType":"address","name":"deployedMP","type":"address"},{"internalType":"address","name":"deployedKeyRing","type":"address"},{"internalType":"address","name":"deployedUnlocks","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"address payable","name":"treasury","type":"address"},{"internalType":"address","name":"authority","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dropId","type":"uint256"}],"name":"DropCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"dropId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Purchased","type":"event"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"auctions","outputs":[{"internalType":"uint256","name":"startingPrice","type":"uint256"},{"internalType":"uint128","name":"decreasingConstant","type":"uint128"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"period","type":"uint64"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract Authority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimWithMintPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint64","name":"mpId","type":"uint64"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint128","name":"price","type":"uint128"}],"name":"createMPClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"limit","type":"uint64"}],"name":"createSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"period","type":"uint64"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256[]","name":"enabledKeyRanges","type":"uint256[]"}],"name":"createUnlockSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint192","name":"price","type":"uint192"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"createWLClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultArtistCut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"}],"name":"flipLimiterForDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"}],"name":"flipMPClaimState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"}],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"}],"name":"flipWLState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint256","name":"keyId","type":"uint256"}],"name":"isKeyUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isWLClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keyRing","outputs":[{"internalType":"contract IQuantumKeyRing","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"keySales","outputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"period","type":"uint64"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"overrideArtistcut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keyUnlocks","outputs":[{"internalType":"contract IQuantumUnlocked","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintpass","outputs":[{"internalType":"contract IQuantumMintPass","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mpClaims","outputs":[{"internalType":"uint64","name":"mpId","type":"uint64"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint128","name":"price","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint256","name":"cut","type":"uint256"}],"name":"overrideArtistcut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint256","name":"cut","type":"uint256"}],"name":"overrideUnlockArtistCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"premint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"privilegedContracts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"}],"name":"purchaseThroughAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dropId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"purchaseThroughWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"quantum","outputs":[{"internalType":"contract IQuantumArt","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sales","outputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"limit","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint256","name":"startingPrice","type":"uint256"},{"internalType":"uint128","name":"decreasingConstant","type":"uint128"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"period","type":"uint64"}],"name":"setAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cut","type":"uint256"}],"name":"setDefaultArtistCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"deployedKeyRing","type":"address"}],"name":"setKeyRing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"deployedUnlocks","type":"address"}],"name":"setKeyUnlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"deployedMP","type":"address"}],"name":"setMintpass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts","type":"address[]"}],"name":"setPrivilegedContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"deployedQuantum","type":"address"}],"name":"setQuantum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"keyId","type":"uint256"},{"internalType":"uint128","name":"dropId","type":"uint128"},{"internalType":"uint256","name":"variant","type":"uint256"}],"name":"unlockWithKey","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelists","outputs":[{"internalType":"uint192","name":"price","type":"uint192"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004c3138038062004c31833981016040819052620000349162000151565b60018055600280546001600160a01b038086166001600160a01b0319928316811790935560038054918516919092161790556040518491839133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a36040516001600160a01b0382169033907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b7638998019890600090a35050600880546001600160a01b03199081166001600160a01b03998a16179091556009805482169789169790971790965550600b805486169487169490941790935550600a80548416918516919091179055601180549092169216919091179055611f40600755620001fc565b6001600160a01b03811681146200014e57600080fd5b50565b600080600080600080600060e0888a0312156200016d57600080fd5b87516200017a8162000138565b60208901519097506200018d8162000138565b6040890151909650620001a08162000138565b6060890151909550620001b38162000138565b6080890151909450620001c68162000138565b60a0890151909350620001d98162000138565b60c0890151909250620001ec8162000138565b8091505092959891949750929550565b614a25806200020c6000396000f3fe6080604052600436106102d15760003560e01c8063965dfc7c11610179578063dbaed9bb116100d6578063e19feded1161008a578063f6e5446a11610064578063f6e5446a14610a3f578063fde78b2c14610a5f578063fe4d5add14610a7f57600080fd5b8063e19feded146109df578063e757223014610a0c578063f0cfbe5914610a2c57600080fd5b8063dd49b0eb116100bb578063dd49b0eb14610972578063df2d8f4d14610992578063e14cabc6146109b257600080fd5b8063dbaed9bb146108a9578063dcb9d873146108c957600080fd5b8063b5f522f71161012d578063c363419311610112578063c363419314610788578063c9f977a1146107a8578063d573b3271461089657600080fd5b8063b5f522f7146106b9578063bf7e214f1461075b57600080fd5b80639be59f321161015e5780639be59f3214610655578063a3567e5914610679578063aa93e3e01461069957600080fd5b8063965dfc7c146106085780639aa395f41461062857600080fd5b806350e84066116102325780636cd690eb116101e65780638c43247b116101c05780638c43247b146105695780638da5cb5b146105bb57806391fc6d19146105e857600080fd5b80636cd690eb1461051657806370876c98146105365780637a9e5e4b1461054957600080fd5b8063571a26a011610217578063571a26a01461046e5780635cdfc560146104d65780636235b7d5146104f657600080fd5b806350e840661461041357806351cff8d91461044e57600080fd5b80632a23aa691161028957806344ab32b11161026e57806344ab32b1146103ab578063463c0d5f146103cb578063464862cb146103de57600080fd5b80632a23aa691461036b578063313112ce1461038b57600080fd5b806322b8854b116102ba57806322b8854b14610318578063241e28f81461033857806327078dde1461034b57600080fd5b806313af4035146102d65780631dfaf65e146102f8575b600080fd5b3480156102e257600080fd5b506102f66102f1366004614290565b610b20565b005b34801561030457600080fd5b506102f6610313366004614336565b610bff565b34801561032457600080fd5b506102f66103333660046143be565b610f29565b6102f66103463660046143e0565b610fa4565b34801561035757600080fd5b506102f6610366366004614290565b611422565b34801561037757600080fd5b506102f6610386366004614441565b6114d2565b34801561039757600080fd5b506102f66103a6366004614441565b6115be565b3480156103b757600080fd5b506102f66103c6366004614441565b6116ba565b6102f66103d936600461445a565b611728565b3480156103ea57600080fd5b506103fe6103f93660046143be565b611e52565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b506103fe61042e3660046143be565b600091825260136020908152604080842092845291905290205460ff1690565b34801561045a57600080fd5b506102f6610469366004614290565b611e82565b34801561047a57600080fd5b5061048e610489366004614441565b611ef8565b604080519586526fffffffffffffffffffffffffffffffff909416602086015267ffffffffffffffff928316938501939093521660608301521515608082015260a00161040a565b3480156104e257600080fd5b506102f66104f136600461448f565b611f90565b34801561050257600080fd5b506102f66105113660046144db565b612174565b34801561052257600080fd5b506102f661053136600461453e565b612249565b6102f66105443660046143be565b612372565b34801561055557600080fd5b506102f6610564366004614290565b6127f2565b34801561057557600080fd5b506009546105969073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161040a565b3480156105c757600080fd5b506002546105969073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105f457600080fd5b506102f661060336600461458b565b61294f565b34801561061457600080fd5b50610596610623366004614441565b6129cc565b34801561063457600080fd5b506008546105969073ffffffffffffffffffffffffffffffffffffffff1681565b34801561066157600080fd5b5061066b60075481565b60405190815260200161040a565b34801561068557600080fd5b506102f6610694366004614290565b612a03565b3480156106a557600080fd5b506102f66106b4366004614441565b612ab3565b3480156106c557600080fd5b506107226106d4366004614441565b6004602052600090815260409020546fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691600160c01b90041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161040a565b34801561076757600080fd5b506003546105969073ffffffffffffffffffffffffffffffffffffffff1681565b34801561079457600080fd5b506102f66107a3366004614290565b612b8d565b3480156107b457600080fd5b506108376107c3366004614441565b6014602052600090815260409020805460018201546002909201546fffffffffffffffffffffffffffffffff82169267ffffffffffffffff7001000000000000000000000000000000008404811693600160c01b9004169173ffffffffffffffffffffffffffffffffffffffff9091169085565b604080516fffffffffffffffffffffffffffffffff96909616865267ffffffffffffffff9485166020870152929093169184019190915273ffffffffffffffffffffffffffffffffffffffff166060830152608082015260a00161040a565b6102f66108a4366004614441565b612c3d565b3480156108b557600080fd5b506102f66108c43660046143be565b613033565b3480156108d557600080fd5b506109396108e4366004614441565b60056020526000908152604090205467ffffffffffffffff808216916801000000000000000081049091169070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1683565b6040805167ffffffffffffffff94851681529390921660208401526fffffffffffffffffffffffffffffffff169082015260600161040a565b34801561097e57600080fd5b506102f661098d3660046145e2565b6130b1565b34801561099e57600080fd5b506102f66109ad366004614290565b6131c6565b3480156109be57600080fd5b50600b546105969073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109eb57600080fd5b50600a546105969073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a1857600080fd5b5061066b610a27366004614441565b613276565b6102f6610a3a3660046143be565b6133ac565b348015610a4b57600080fd5b506102f6610a5a366004614624565b61376c565b348015610a6b57600080fd5b506102f6610a7a366004614441565b6137e6565b348015610a8b57600080fd5b50610ae1610a9a366004614441565b6006602052600090815260409020805460019091015477ffffffffffffffffffffffffffffffffffffffffffffffff821691600160c01b900467ffffffffffffffff169083565b6040805177ffffffffffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff90921660208401529082015260600161040a565b610b4e336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b610b8e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b610c2d336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b610c685760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6012546040516fffffffffffffffffffffffffffffffff90911681527f01a6d33d95d2560a8c53f00317beb1d0364b3ecf2d43f647d2b4671df27f4f459060200160405180910390a160606040518060c00160405280886fffffffffffffffffffffffffffffffff1681526020018767ffffffffffffffff1681526020018667ffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200182815250601460006012600081819054906101000a90046fffffffffffffffffffffffffffffffff1680929190610d4f90614695565b82546101009290920a6fffffffffffffffffffffffffffffffff81810219909316918316021790915590811682526020808301939093526040918201600020845181548686015194870151919093167fffffffffffffffff0000000000000000000000000000000000000000000000009093169290921770010000000000000000000000000000000067ffffffffffffffff948516021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b939092169290920217815560608301516001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790556080830151600282015560a083015180519192610e8092600385019290910190614196565b5090505060005b82811015610f1f57601254601490600090610eb6906001906fffffffffffffffffffffffffffffffff166146c5565b6fffffffffffffffffffffffffffffffff168152602001908152602001600020600301848483818110610eeb57610eeb6146f6565b8354600181018555600094855260209485902091909402929092013591909201555080610f1781614725565b915050610e87565b5050505050505050565b610f57336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b610f925760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b60009182526010602052604090912055565b60026001541415610ff75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b600260019081556000868152600660209081526040918290208251606081018452815477ffffffffffffffffffffffffffffffffffffffffffffffff81168252600160c01b900467ffffffffffffffff16928101839052930154918301919091524210156110a75760405162461bcd60e51b815260206004820152600b60248201527f574c3a494e4143544956450000000000000000000000000000000000000000006044820152606401610b85565b80516110ce90869077ffffffffffffffffffffffffffffffffffffffffffffffff1661475e565b341461111c5760405162461bcd60e51b815260206004820152601560248201527f574c3a20494e56414c4944204d53472e56414c554500000000000000000000006044820152606401610b85565b6000868152600e60209081526040808320600888901c8452909152902054600160ff86161b161561118f5760405162461bcd60e51b815260206004820152601260248201527f574c3a414c524541445920434c41494d454400000000000000000000000000006044820152606401610b85565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481018690526054810185905260009060740160405160208183030381529060405280519060200120905061122a8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050506040840151836139c6565b6112765760405162461bcd60e51b815260206004820152601060248201527f574c3a494e56414c49442050524f4f46000000000000000000000000000000006044820152606401610b85565b6000878152600e60209081526040808320600889901c845290915290208054600160ff88161b1790556008546040517fb723b34e0000000000000000000000000000000000000000000000000000000081526004810189905233602482015260009173ffffffffffffffffffffffffffffffffffffffff169063b723b34e906044016020604051808303816000875af1158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b919061479b565b6040805182815233602082015291925089917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a26008546040517f811dd0e2000000000000000000000000000000000000000000000000000000008152600481018a90526114149173ffffffffffffffffffffffffffffffffffffffff169063811dd0e290602401602060405180830381865afa1580156113e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140d91906147b4565b89346139dc565b505060018055505050505050565b611450336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61148b5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611500336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61153b5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6000818152600560205260409020546115699068010000000000000000900467ffffffffffffffff16613a5b565b600091825260056020526040909120805467ffffffffffffffff9290921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b6115ec336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6116275760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b60008181526004602052604090205461165d90700100000000000000000000000000000000900467ffffffffffffffff16613a5b565b600091825260046020526040909120805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055565b6116e8336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6117235760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600755565b6002600154141561177b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b6002600155333b156117cf5760405162461bcd60e51b815260206004820152601260248201527f436f6e747261637420666f7262696464656e00000000000000000000000000006044820152606401610b85565b600b546040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101859052339173ffffffffffffffffffffffffffffffffffffffff1690636352211e90602401602060405180830381865afa15801561183e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186291906147b4565b73ffffffffffffffffffffffffffffffffffffffff16146118c55760405162461bcd60e51b815260206004820152601660248201527f50555243484153453a4e4f54204b4559204f574e4552000000000000000000006044820152606401610b85565b6fffffffffffffffffffffffffffffffff8216600090815260136020908152604080832086845290915290205460ff16156119425760405162461bcd60e51b815260206004820152601960248201527f50555243484153453a4b455920414c52454144592055534544000000000000006044820152606401610b85565b6000811180156119525750600d81105b61199e5760405162461bcd60e51b815260206004820152601860248201527f50555243484153453a494e56414c49442056415249414e5400000000000000006044820152606401610b85565b6fffffffffffffffffffffffffffffffff8083166000908152601460209081526040808320815160c0810183528154958616815267ffffffffffffffff7001000000000000000000000000000000008704811682860152600160c01b90960490951685830152600181015473ffffffffffffffffffffffffffffffffffffffff16606086015260028101546080860152600381018054835181860281018601909452808452949594919360a08601939290830182828015611a7e57602002820191906000526020600020905b815481526020019060010190808311611a6a575b50505050508152505090506000808260a00151511115611b455760005b8260a0015151811015611b3f576127108360a001518281518110611ac157611ac16146f6565b6020026020010151611ad3919061475e565b8610158015611b23575060016127108460a001518381518110611af857611af86146f6565b60200260200101516001611b0c91906147d1565b611b16919061475e565b611b2091906147e9565b86105b15611b2d57600191505b80611b3781614725565b915050611a9b565b50611b49565b5060015b80611bbc5760405162461bcd60e51b815260206004820152602760248201527f50555243484153453a53414c45204e4f5420415641494c41424c4520544f205460448201527f484953204b4559000000000000000000000000000000000000000000000000006064820152608401610b85565b816020015167ffffffffffffffff16421015611c1a5760405162461bcd60e51b815260206004820152601960248201527f50555243484153453a53414c45204e4f542053544152544544000000000000006044820152606401610b85565b81604001518260200151611c2e9190614800565b67ffffffffffffffff16421115611c875760405162461bcd60e51b815260206004820152601560248201527f50555243484153453a53414c45204558504952454400000000000000000000006044820152606401610b85565b81600001516fffffffffffffffffffffffffffffffff163414611cec5760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a494e434f5252454354204d53472e56414c5545000000006044820152606401610b85565b600a546040517ff6e384e40000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff861660248201526044810185905260009173ffffffffffffffffffffffffffffffffffffffff169063f6e384e4906064016020604051808303816000875af1158015611d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da0919061479b565b6fffffffffffffffffffffffffffffffff861660008181526013602090815260408083208b845282529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558151848152339181019190915292935090917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a2611e468360600151348560800151613a85565b50506001805550505050565b6000828152600e60209081526040808320600885901c8452909152812054600160ff84161b1615155b9392505050565b611eb0336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b611eeb5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b611ef58147613ae5565b50565b600081815260208181526040808320815160808101835281548082526001909201546fffffffffffffffffffffffffffffffff811694820185905267ffffffffffffffff70010000000000000000000000000000000082048116948301859052600160c01b90910416606082018190529194908315801590611f8457508367ffffffffffffffff164210155b91505091939590929450565b611fbe336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b611ff95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b60005b8181101561216e5760085460009073ffffffffffffffffffffffffffffffffffffffff1663b723b34e86868686818110612038576120386146f6565b905060200201602081019061204d9190614290565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152600481019290925273ffffffffffffffffffffffffffffffffffffffff1660248201526044016020604051808303816000875af11580156120be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e2919061479b565b9050847f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd8082868686818110612119576121196146f6565b905060200201602081019061212e9190614290565b6040805192835273ffffffffffffffffffffffffffffffffffffffff90911660208301520160405180910390a2508061216681614725565b915050611ffc565b50505050565b6121a2336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6121dd5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6040805160608101825277ffffffffffffffffffffffffffffffffffffffffffffffff948516815267ffffffffffffffff93841660208083019182528284019485526000978852600690529190952094519051909216600160c01b029190921617825551600190910155565b612277336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6122b25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b604080516060810182526fffffffffffffffffffffffffffffffff948516815267ffffffffffffffff93841660208083019182529385168284019081526000978852600490945291909520945185549151925194167fffffffffffffffff00000000000000000000000000000000000000000000000090911617700100000000000000000000000000000000918316919091021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9290911691909102179055565b600260015414156123c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b6002600155333b156124195760405162461bcd60e51b815260206004820152601260248201527f436f6e747261637420666f7262696464656e00000000000000000000000000006044820152606401610b85565b600882901c6000908152600d60205260409020548290600160ff83161b166124d557336000908152600f60209081526040808320600885901c8452909152902054600160ff83161b161561246c82613c0b565b60405160200161247c9190614858565b604051602081830303815290604052906124a95760405162461bcd60e51b8152600401610b85919061489d565b50336000908152600f60209081526040808320600885901c845290915290208054600160ff84161b1790555b600083815260046020908152604091829020825160608101845290546fffffffffffffffffffffffffffffffff8116825267ffffffffffffffff70010000000000000000000000000000000082048116938301849052600160c01b909104169281019290925242101561258a5760405162461bcd60e51b815260206004820152601660248201527f50555243484153453a53414c4520494e414354495645000000000000000000006044820152606401610b85565b806040015167ffffffffffffffff168311156125e85760405162461bcd60e51b815260206004820152601360248201527f50555243484153453a4f564552204c494d4954000000000000000000000000006044820152606401610b85565b8051612606906fffffffffffffffffffffffffffffffff168461475e565b34146126545760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a494e434f5252454354204d53472e56414c5545000000006044820152606401610b85565b60005b8381101561274b576008546040517fb723b34e0000000000000000000000000000000000000000000000000000000081526004810187905233602482015260009173ffffffffffffffffffffffffffffffffffffffff169063b723b34e906044016020604051808303816000875af11580156126d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fb919061479b565b6040805182815233602082015291925087917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a2508061274381614725565b915050612657565b506008546040517f811dd0e2000000000000000000000000000000000000000000000000000000008152600481018690526127e89173ffffffffffffffffffffffffffffffffffffffff169063811dd0e290602401602060405180830381865afa1580156127bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e191906147b4565b85346139dc565b5050600180555050565b60025473ffffffffffffffffffffffffffffffffffffffff163314806128d557506003546040517fb70096130000000000000000000000000000000000000000000000000000000081523360048201523060248201526000357fffffffff0000000000000000000000000000000000000000000000000000000016604482015273ffffffffffffffffffffffffffffffffffffffff9091169063b700961390606401602060405180830381865afa1580156128b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d591906148ee565b6128de57600080fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b7638998019890600090a350565b61297d336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6129b85760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6129c58585858585613d3d565b5050505050565b600c81815481106129dc57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b612a31336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b612a6c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612ae1336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b612b1c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600081815260066020526040902054612b4590600160c01b900467ffffffffffffffff16613a5b565b600091825260066020526040909120805467ffffffffffffffff92909216600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b612bbb336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b612bf65760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60026001541415612c905760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b6002600155333b15612ce45760405162461bcd60e51b815260206004820152601260248201527f436f6e747261637420666f7262696464656e00000000000000000000000000006044820152606401610b85565b600881901c6000908152600d60205260409020548190600160ff83161b16612da057336000908152600f60209081526040808320600885901c8452909152902054600160ff83161b1615612d3782613c0b565b604051602001612d479190614858565b60405160208183030381529060405290612d745760405162461bcd60e51b8152600401610b85919061489d565b50336000908152600f60209081526040808320600885901c845290915290208054600160ff84161b1790555b60008281526020818152604091829020825160808101845281548082526001909201546fffffffffffffffffffffffffffffffff81169382019390935267ffffffffffffffff70010000000000000000000000000000000084048116948201859052600160c01b909304909216606083015290914211801590612e3e575061012c8260400151612e309190614910565b67ffffffffffffffff164210155b8015612e4e5750612e4e33613ea7565b15612ea757803414612ea25760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a494e434f5252454354204d53472e56414c5545000000006044820152606401610b85565b612eb3565b612eb084613f8b565b90505b6008546040517fb723b34e0000000000000000000000000000000000000000000000000000000081526004810186905233602482015260009173ffffffffffffffffffffffffffffffffffffffff169063b723b34e906044016020604051808303816000875af1158015612f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4f919061479b565b6040805182815233602082015291925086917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a26008546040517f811dd0e2000000000000000000000000000000000000000000000000000000008152600481018790526130289173ffffffffffffffffffffffffffffffffffffffff169063811dd0e290602401602060405180830381865afa158015612ffd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302191906147b4565b86846139dc565b505060018055505050565b613061336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61309c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b60009182526014602052604090912060020155565b6130df336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61311a5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6040805160608101825267ffffffffffffffff948516815292841660208085019182526fffffffffffffffffffffffffffffffff9384168584019081526000978852600590915291909520925183549551915183167001000000000000000000000000000000000291851668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090961694169390931793909317909216179055565b6131f4336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61322f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000818152602081815260408083208151608081018352815481526001909101546fffffffffffffffffffffffffffffffff81169382019390935267ffffffffffffffff70010000000000000000000000000000000084048116928201839052600160c01b90930490921660608301524210156132f657805191506133a6565b8060600151816040015161330a9190614800565b67ffffffffffffffff16421061335d578060200151816060015167ffffffffffffffff166133389190614931565b8151613356916fffffffffffffffffffffffffffffffff16906147e9565b91506133a6565b60408101516133769067ffffffffffffffff16426147e9565b81602001516fffffffffffffffffffffffffffffffff16613397919061475e565b81516133a391906147e9565b91505b50919050565b600260015414156133ff5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b60026001556000828152600560209081526040918290208251606081018452905467ffffffffffffffff80821683526801000000000000000082041692820183905270010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16928101929092524210156134bd5760405162461bcd60e51b815260206004820152601560248201527f4d503a20434c41494d494e4720494e41435449564500000000000000000000006044820152606401610b85565b60408101516134de906fffffffffffffffffffffffffffffffff168361475e565b341461352c5760405162461bcd60e51b815260206004820152601260248201527f4d503a57524f4e47204d53472e56414c554500000000000000000000000000006044820152606401610b85565b60095481516040517f3aeca21000000000000000000000000000000000000000000000000000000000815233600482015267ffffffffffffffff90911660248201526044810184905273ffffffffffffffffffffffffffffffffffffffff90911690633aeca21090606401600060405180830381600087803b1580156135b157600080fd5b505af11580156135c5573d6000803e3d6000fd5b5050505060005b828110156136c0576008546040517fb723b34e0000000000000000000000000000000000000000000000000000000081526004810186905233602482015260009173ffffffffffffffffffffffffffffffffffffffff169063b723b34e906044016020604051808303816000875af115801561364c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613670919061479b565b6040805182815233602082015291925086917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a250806136b881614725565b9150506135cc565b503415613763576008546040517f811dd0e2000000000000000000000000000000000000000000000000000000008152600481018590526137639173ffffffffffffffffffffffffffffffffffffffff169063811dd0e290602401602060405180830381865afa158015613738573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375c91906147b4565b84346139dc565b50506001805550565b61379a336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6137d55760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6137e1600c83836141e1565b505050565b613814336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61384f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600881901c6000908152600d6020526040902054600160ff83161b161561389357600881901c6000908152600d602052604090208054600160ff84161b1916905550565b600881901c6000908152600d602052604090208054600160ff84161b17905550565b60035460009073ffffffffffffffffffffffffffffffffffffffff16801580159061399957506040517fb700961300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527fffffffff000000000000000000000000000000000000000000000000000000008516604483015282169063b700961390606401602060405180830381865afa158015613975573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399991906148ee565b806139be575060025473ffffffffffffffffffffffffffffffffffffffff8581169116145b949350505050565b6000826139d38584614122565b14949350505050565b60008281526010602052604081205415613a0457600083815260106020526040902054613a08565b6007545b90506000612710613a19838561475e565b613a239190614998565b9050613a2f8582613ae5565b6011546129c59073ffffffffffffffffffffffffffffffffffffffff16613a5683866147e9565b613ae5565b6000808267ffffffffffffffff1611613a7c5767ffffffffffffffff613a7f565b60005b92915050565b60008115613a935781613a97565b6007545b90506000612710613aa8838661475e565b613ab29190614998565b9050613abe8582613ae5565b6011546129c59073ffffffffffffffffffffffffffffffffffffffff16613a5683876147e9565b80471015613b355760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b85565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613b8f576040519150601f19603f3d011682016040523d82523d6000602084013e613b94565b606091505b50509050806137e15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b85565b606081613c4b57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613c755780613c5f81614725565b9150613c6e9050600a83614998565b9150613c4f565b60008167ffffffffffffffff811115613c9057613c906149ac565b6040519080825280601f01601f191660200182016040528015613cba576020820181803683370190505b5090505b84156139be57613ccf6001836147e9565b9150613cdc600a866149db565b613ce79060306147d1565b60f81b818381518110613cfc57613cfc6146f6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613d36600a86614998565b9450613cbe565b838167ffffffffffffffff1684026fffffffffffffffffffffffffffffffff1685031115613dd35760405162461bcd60e51b815260206004820152602160248201527f73657441756374696f6e3a20666c6f6f7220707269636520756e646572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610b85565b604080516080810182529485526fffffffffffffffffffffffffffffffff938416602080870191825267ffffffffffffffff948516878401908152938516606088019081526000988952908890529190962094518555945160019094018054915195518316600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff96909316700100000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090921694909316939093179290921792909216179055565b600c54600090815b81811015613f81576000600c8281548110613ecc57613ecc6146f6565b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152909116906370a0823190602401602060405180830381865afa158015613f45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f69919061479b565b1115613f79575060019392505050565b600101613eaf565b5060009392505050565b6000818152602081815260408083208151608081018352815481526001909101546fffffffffffffffffffffffffffffffff81169382019390935267ffffffffffffffff70010000000000000000000000000000000084048116928201839052600160c01b90930490921660608301526140475760405162461bcd60e51b815260206004820152601360248201527f41554354494f4e3a4e4f542043524541544544000000000000000000000000006044820152606401610b85565b806040015167ffffffffffffffff164210156140a55760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a41554354494f4e204e4f542053544152544544000000006044820152606401610b85565b60006140b084613276565b9050803410156141025760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a494e434f5252454354204d53472e56414c5545000000006044820152606401610b85565b600061410e82346147e9565b1115611e7b57611e7b33613a5683346147e9565b600081815b845181101561418e576000858281518110614144576141446146f6565b6020026020010151905080831161416a576000838152602082905260409020925061417b565b600081815260208490526040902092505b508061418681614725565b915050614127565b509392505050565b8280548282559060005260206000209081019282156141d1579160200282015b828111156141d15782518255916020019190600101906141b6565b506141dd929150614259565b5090565b8280548282559060005260206000209081019282156141d1579160200282015b828111156141d15781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190614201565b5b808211156141dd576000815560010161425a565b73ffffffffffffffffffffffffffffffffffffffff81168114611ef557600080fd5b6000602082840312156142a257600080fd5b8135611e7b8161426e565b80356fffffffffffffffffffffffffffffffff811681146142cd57600080fd5b919050565b803567ffffffffffffffff811681146142cd57600080fd5b60008083601f8401126142fc57600080fd5b50813567ffffffffffffffff81111561431457600080fd5b6020830191508360208260051b850101111561432f57600080fd5b9250929050565b60008060008060008060a0878903121561434f57600080fd5b614358876142ad565b9550614366602088016142d2565b9450614374604088016142d2565b935060608701356143848161426e565b9250608087013567ffffffffffffffff8111156143a057600080fd5b6143ac89828a016142ea565b979a9699509497509295939492505050565b600080604083850312156143d157600080fd5b50508035926020909101359150565b6000806000806000608086880312156143f857600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff81111561442457600080fd5b614430888289016142ea565b969995985093965092949392505050565b60006020828403121561445357600080fd5b5035919050565b60008060006060848603121561446f57600080fd5b8335925061447f602085016142ad565b9150604084013590509250925092565b6000806000604084860312156144a457600080fd5b83359250602084013567ffffffffffffffff8111156144c257600080fd5b6144ce868287016142ea565b9497909650939450505050565b600080600080608085870312156144f157600080fd5b84359350602085013577ffffffffffffffffffffffffffffffffffffffffffffffff8116811461452057600080fd5b925061452e604086016142d2565b9396929550929360600135925050565b6000806000806080858703121561455457600080fd5b84359350614564602086016142ad565b9250614572604086016142d2565b9150614580606086016142d2565b905092959194509250565b600080600080600060a086880312156145a357600080fd5b85359450602086013593506145ba604087016142ad565b92506145c8606087016142d2565b91506145d6608087016142d2565b90509295509295909350565b600080600080608085870312156145f857600080fd5b84359350614608602086016142d2565b9250614616604086016142d2565b9150614580606086016142ad565b6000806020838503121561463757600080fd5b823567ffffffffffffffff81111561464e57600080fd5b61465a858286016142ea565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff808316818114156146bb576146bb614666565b6001019392505050565b60006fffffffffffffffffffffffffffffffff838116908316818110156146ee576146ee614666565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561475757614757614666565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561479657614796614666565b500290565b6000602082840312156147ad57600080fd5b5051919050565b6000602082840312156147c657600080fd5b8151611e7b8161426e565b600082198211156147e4576147e4614666565b500190565b6000828210156147fb576147fb614666565b500390565b600067ffffffffffffffff80831681851680830382111561482357614823614666565b01949350505050565b60005b8381101561484757818101518382015260200161482f565b8381111561216e5750506000910152565b7f416c726561647920626f756768742064726f702000000000000000000000000081526000825161489081601485016020870161482c565b9190910160140192915050565b60208152600082518060208401526148bc81604085016020870161482c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561490057600080fd5b81518015158114611e7b57600080fd5b600067ffffffffffffffff838116908316818110156146ee576146ee614666565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561496057614960614666565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826149a7576149a7614969565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000826149ea576149ea614969565b50069056fea26469706673582212204e3cfb27f74ca445aca154f502e1dc3143a824da6a9570b4743db5827487cb1d64736f6c634300080b003300000000000000000000000046ac8540d698167fcbb9e846511beb8cf8af9bd80000000000000000000000002fea46fbccb5ee07c293fe500353579895abf7d00000000000000000000000009705a7113363a383c8a96689e20286abe6612bb30000000000000000000000000faed6ddef3773f3ee5828383aaeeaca2a94564a000000000000000000000000c5c721caa3cad959818e891b533a34c37946e9bf000000000000000000000000e0faf18f33c307ca812b80c771ad3c9e5f043fe90000000000000000000000008c1927427eaaca6a64e238544adfb95451cc05a1
Deployed Bytecode
0x6080604052600436106102d15760003560e01c8063965dfc7c11610179578063dbaed9bb116100d6578063e19feded1161008a578063f6e5446a11610064578063f6e5446a14610a3f578063fde78b2c14610a5f578063fe4d5add14610a7f57600080fd5b8063e19feded146109df578063e757223014610a0c578063f0cfbe5914610a2c57600080fd5b8063dd49b0eb116100bb578063dd49b0eb14610972578063df2d8f4d14610992578063e14cabc6146109b257600080fd5b8063dbaed9bb146108a9578063dcb9d873146108c957600080fd5b8063b5f522f71161012d578063c363419311610112578063c363419314610788578063c9f977a1146107a8578063d573b3271461089657600080fd5b8063b5f522f7146106b9578063bf7e214f1461075b57600080fd5b80639be59f321161015e5780639be59f3214610655578063a3567e5914610679578063aa93e3e01461069957600080fd5b8063965dfc7c146106085780639aa395f41461062857600080fd5b806350e84066116102325780636cd690eb116101e65780638c43247b116101c05780638c43247b146105695780638da5cb5b146105bb57806391fc6d19146105e857600080fd5b80636cd690eb1461051657806370876c98146105365780637a9e5e4b1461054957600080fd5b8063571a26a011610217578063571a26a01461046e5780635cdfc560146104d65780636235b7d5146104f657600080fd5b806350e840661461041357806351cff8d91461044e57600080fd5b80632a23aa691161028957806344ab32b11161026e57806344ab32b1146103ab578063463c0d5f146103cb578063464862cb146103de57600080fd5b80632a23aa691461036b578063313112ce1461038b57600080fd5b806322b8854b116102ba57806322b8854b14610318578063241e28f81461033857806327078dde1461034b57600080fd5b806313af4035146102d65780631dfaf65e146102f8575b600080fd5b3480156102e257600080fd5b506102f66102f1366004614290565b610b20565b005b34801561030457600080fd5b506102f6610313366004614336565b610bff565b34801561032457600080fd5b506102f66103333660046143be565b610f29565b6102f66103463660046143e0565b610fa4565b34801561035757600080fd5b506102f6610366366004614290565b611422565b34801561037757600080fd5b506102f6610386366004614441565b6114d2565b34801561039757600080fd5b506102f66103a6366004614441565b6115be565b3480156103b757600080fd5b506102f66103c6366004614441565b6116ba565b6102f66103d936600461445a565b611728565b3480156103ea57600080fd5b506103fe6103f93660046143be565b611e52565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b506103fe61042e3660046143be565b600091825260136020908152604080842092845291905290205460ff1690565b34801561045a57600080fd5b506102f6610469366004614290565b611e82565b34801561047a57600080fd5b5061048e610489366004614441565b611ef8565b604080519586526fffffffffffffffffffffffffffffffff909416602086015267ffffffffffffffff928316938501939093521660608301521515608082015260a00161040a565b3480156104e257600080fd5b506102f66104f136600461448f565b611f90565b34801561050257600080fd5b506102f66105113660046144db565b612174565b34801561052257600080fd5b506102f661053136600461453e565b612249565b6102f66105443660046143be565b612372565b34801561055557600080fd5b506102f6610564366004614290565b6127f2565b34801561057557600080fd5b506009546105969073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161040a565b3480156105c757600080fd5b506002546105969073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105f457600080fd5b506102f661060336600461458b565b61294f565b34801561061457600080fd5b50610596610623366004614441565b6129cc565b34801561063457600080fd5b506008546105969073ffffffffffffffffffffffffffffffffffffffff1681565b34801561066157600080fd5b5061066b60075481565b60405190815260200161040a565b34801561068557600080fd5b506102f6610694366004614290565b612a03565b3480156106a557600080fd5b506102f66106b4366004614441565b612ab3565b3480156106c557600080fd5b506107226106d4366004614441565b6004602052600090815260409020546fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691600160c01b90041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161040a565b34801561076757600080fd5b506003546105969073ffffffffffffffffffffffffffffffffffffffff1681565b34801561079457600080fd5b506102f66107a3366004614290565b612b8d565b3480156107b457600080fd5b506108376107c3366004614441565b6014602052600090815260409020805460018201546002909201546fffffffffffffffffffffffffffffffff82169267ffffffffffffffff7001000000000000000000000000000000008404811693600160c01b9004169173ffffffffffffffffffffffffffffffffffffffff9091169085565b604080516fffffffffffffffffffffffffffffffff96909616865267ffffffffffffffff9485166020870152929093169184019190915273ffffffffffffffffffffffffffffffffffffffff166060830152608082015260a00161040a565b6102f66108a4366004614441565b612c3d565b3480156108b557600080fd5b506102f66108c43660046143be565b613033565b3480156108d557600080fd5b506109396108e4366004614441565b60056020526000908152604090205467ffffffffffffffff808216916801000000000000000081049091169070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1683565b6040805167ffffffffffffffff94851681529390921660208401526fffffffffffffffffffffffffffffffff169082015260600161040a565b34801561097e57600080fd5b506102f661098d3660046145e2565b6130b1565b34801561099e57600080fd5b506102f66109ad366004614290565b6131c6565b3480156109be57600080fd5b50600b546105969073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109eb57600080fd5b50600a546105969073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a1857600080fd5b5061066b610a27366004614441565b613276565b6102f6610a3a3660046143be565b6133ac565b348015610a4b57600080fd5b506102f6610a5a366004614624565b61376c565b348015610a6b57600080fd5b506102f6610a7a366004614441565b6137e6565b348015610a8b57600080fd5b50610ae1610a9a366004614441565b6006602052600090815260409020805460019091015477ffffffffffffffffffffffffffffffffffffffffffffffff821691600160c01b900467ffffffffffffffff169083565b6040805177ffffffffffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff90921660208401529082015260600161040a565b610b4e336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b610b8e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b610c2d336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b610c685760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6012546040516fffffffffffffffffffffffffffffffff90911681527f01a6d33d95d2560a8c53f00317beb1d0364b3ecf2d43f647d2b4671df27f4f459060200160405180910390a160606040518060c00160405280886fffffffffffffffffffffffffffffffff1681526020018767ffffffffffffffff1681526020018667ffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200182815250601460006012600081819054906101000a90046fffffffffffffffffffffffffffffffff1680929190610d4f90614695565b82546101009290920a6fffffffffffffffffffffffffffffffff81810219909316918316021790915590811682526020808301939093526040918201600020845181548686015194870151919093167fffffffffffffffff0000000000000000000000000000000000000000000000009093169290921770010000000000000000000000000000000067ffffffffffffffff948516021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b939092169290920217815560608301516001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790556080830151600282015560a083015180519192610e8092600385019290910190614196565b5090505060005b82811015610f1f57601254601490600090610eb6906001906fffffffffffffffffffffffffffffffff166146c5565b6fffffffffffffffffffffffffffffffff168152602001908152602001600020600301848483818110610eeb57610eeb6146f6565b8354600181018555600094855260209485902091909402929092013591909201555080610f1781614725565b915050610e87565b5050505050505050565b610f57336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b610f925760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b60009182526010602052604090912055565b60026001541415610ff75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b600260019081556000868152600660209081526040918290208251606081018452815477ffffffffffffffffffffffffffffffffffffffffffffffff81168252600160c01b900467ffffffffffffffff16928101839052930154918301919091524210156110a75760405162461bcd60e51b815260206004820152600b60248201527f574c3a494e4143544956450000000000000000000000000000000000000000006044820152606401610b85565b80516110ce90869077ffffffffffffffffffffffffffffffffffffffffffffffff1661475e565b341461111c5760405162461bcd60e51b815260206004820152601560248201527f574c3a20494e56414c4944204d53472e56414c554500000000000000000000006044820152606401610b85565b6000868152600e60209081526040808320600888901c8452909152902054600160ff86161b161561118f5760405162461bcd60e51b815260206004820152601260248201527f574c3a414c524541445920434c41494d454400000000000000000000000000006044820152606401610b85565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481018690526054810185905260009060740160405160208183030381529060405280519060200120905061122a8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050506040840151836139c6565b6112765760405162461bcd60e51b815260206004820152601060248201527f574c3a494e56414c49442050524f4f46000000000000000000000000000000006044820152606401610b85565b6000878152600e60209081526040808320600889901c845290915290208054600160ff88161b1790556008546040517fb723b34e0000000000000000000000000000000000000000000000000000000081526004810189905233602482015260009173ffffffffffffffffffffffffffffffffffffffff169063b723b34e906044016020604051808303816000875af1158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b919061479b565b6040805182815233602082015291925089917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a26008546040517f811dd0e2000000000000000000000000000000000000000000000000000000008152600481018a90526114149173ffffffffffffffffffffffffffffffffffffffff169063811dd0e290602401602060405180830381865afa1580156113e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140d91906147b4565b89346139dc565b505060018055505050505050565b611450336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61148b5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611500336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61153b5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6000818152600560205260409020546115699068010000000000000000900467ffffffffffffffff16613a5b565b600091825260056020526040909120805467ffffffffffffffff9290921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b6115ec336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6116275760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b60008181526004602052604090205461165d90700100000000000000000000000000000000900467ffffffffffffffff16613a5b565b600091825260046020526040909120805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055565b6116e8336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6117235760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600755565b6002600154141561177b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b6002600155333b156117cf5760405162461bcd60e51b815260206004820152601260248201527f436f6e747261637420666f7262696464656e00000000000000000000000000006044820152606401610b85565b600b546040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101859052339173ffffffffffffffffffffffffffffffffffffffff1690636352211e90602401602060405180830381865afa15801561183e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186291906147b4565b73ffffffffffffffffffffffffffffffffffffffff16146118c55760405162461bcd60e51b815260206004820152601660248201527f50555243484153453a4e4f54204b4559204f574e4552000000000000000000006044820152606401610b85565b6fffffffffffffffffffffffffffffffff8216600090815260136020908152604080832086845290915290205460ff16156119425760405162461bcd60e51b815260206004820152601960248201527f50555243484153453a4b455920414c52454144592055534544000000000000006044820152606401610b85565b6000811180156119525750600d81105b61199e5760405162461bcd60e51b815260206004820152601860248201527f50555243484153453a494e56414c49442056415249414e5400000000000000006044820152606401610b85565b6fffffffffffffffffffffffffffffffff8083166000908152601460209081526040808320815160c0810183528154958616815267ffffffffffffffff7001000000000000000000000000000000008704811682860152600160c01b90960490951685830152600181015473ffffffffffffffffffffffffffffffffffffffff16606086015260028101546080860152600381018054835181860281018601909452808452949594919360a08601939290830182828015611a7e57602002820191906000526020600020905b815481526020019060010190808311611a6a575b50505050508152505090506000808260a00151511115611b455760005b8260a0015151811015611b3f576127108360a001518281518110611ac157611ac16146f6565b6020026020010151611ad3919061475e565b8610158015611b23575060016127108460a001518381518110611af857611af86146f6565b60200260200101516001611b0c91906147d1565b611b16919061475e565b611b2091906147e9565b86105b15611b2d57600191505b80611b3781614725565b915050611a9b565b50611b49565b5060015b80611bbc5760405162461bcd60e51b815260206004820152602760248201527f50555243484153453a53414c45204e4f5420415641494c41424c4520544f205460448201527f484953204b4559000000000000000000000000000000000000000000000000006064820152608401610b85565b816020015167ffffffffffffffff16421015611c1a5760405162461bcd60e51b815260206004820152601960248201527f50555243484153453a53414c45204e4f542053544152544544000000000000006044820152606401610b85565b81604001518260200151611c2e9190614800565b67ffffffffffffffff16421115611c875760405162461bcd60e51b815260206004820152601560248201527f50555243484153453a53414c45204558504952454400000000000000000000006044820152606401610b85565b81600001516fffffffffffffffffffffffffffffffff163414611cec5760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a494e434f5252454354204d53472e56414c5545000000006044820152606401610b85565b600a546040517ff6e384e40000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff861660248201526044810185905260009173ffffffffffffffffffffffffffffffffffffffff169063f6e384e4906064016020604051808303816000875af1158015611d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da0919061479b565b6fffffffffffffffffffffffffffffffff861660008181526013602090815260408083208b845282529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558151848152339181019190915292935090917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a2611e468360600151348560800151613a85565b50506001805550505050565b6000828152600e60209081526040808320600885901c8452909152812054600160ff84161b1615155b9392505050565b611eb0336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b611eeb5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b611ef58147613ae5565b50565b600081815260208181526040808320815160808101835281548082526001909201546fffffffffffffffffffffffffffffffff811694820185905267ffffffffffffffff70010000000000000000000000000000000082048116948301859052600160c01b90910416606082018190529194908315801590611f8457508367ffffffffffffffff164210155b91505091939590929450565b611fbe336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b611ff95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b60005b8181101561216e5760085460009073ffffffffffffffffffffffffffffffffffffffff1663b723b34e86868686818110612038576120386146f6565b905060200201602081019061204d9190614290565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152600481019290925273ffffffffffffffffffffffffffffffffffffffff1660248201526044016020604051808303816000875af11580156120be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e2919061479b565b9050847f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd8082868686818110612119576121196146f6565b905060200201602081019061212e9190614290565b6040805192835273ffffffffffffffffffffffffffffffffffffffff90911660208301520160405180910390a2508061216681614725565b915050611ffc565b50505050565b6121a2336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6121dd5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6040805160608101825277ffffffffffffffffffffffffffffffffffffffffffffffff948516815267ffffffffffffffff93841660208083019182528284019485526000978852600690529190952094519051909216600160c01b029190921617825551600190910155565b612277336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6122b25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b604080516060810182526fffffffffffffffffffffffffffffffff948516815267ffffffffffffffff93841660208083019182529385168284019081526000978852600490945291909520945185549151925194167fffffffffffffffff00000000000000000000000000000000000000000000000090911617700100000000000000000000000000000000918316919091021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9290911691909102179055565b600260015414156123c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b6002600155333b156124195760405162461bcd60e51b815260206004820152601260248201527f436f6e747261637420666f7262696464656e00000000000000000000000000006044820152606401610b85565b600882901c6000908152600d60205260409020548290600160ff83161b166124d557336000908152600f60209081526040808320600885901c8452909152902054600160ff83161b161561246c82613c0b565b60405160200161247c9190614858565b604051602081830303815290604052906124a95760405162461bcd60e51b8152600401610b85919061489d565b50336000908152600f60209081526040808320600885901c845290915290208054600160ff84161b1790555b600083815260046020908152604091829020825160608101845290546fffffffffffffffffffffffffffffffff8116825267ffffffffffffffff70010000000000000000000000000000000082048116938301849052600160c01b909104169281019290925242101561258a5760405162461bcd60e51b815260206004820152601660248201527f50555243484153453a53414c4520494e414354495645000000000000000000006044820152606401610b85565b806040015167ffffffffffffffff168311156125e85760405162461bcd60e51b815260206004820152601360248201527f50555243484153453a4f564552204c494d4954000000000000000000000000006044820152606401610b85565b8051612606906fffffffffffffffffffffffffffffffff168461475e565b34146126545760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a494e434f5252454354204d53472e56414c5545000000006044820152606401610b85565b60005b8381101561274b576008546040517fb723b34e0000000000000000000000000000000000000000000000000000000081526004810187905233602482015260009173ffffffffffffffffffffffffffffffffffffffff169063b723b34e906044016020604051808303816000875af11580156126d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fb919061479b565b6040805182815233602082015291925087917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a2508061274381614725565b915050612657565b506008546040517f811dd0e2000000000000000000000000000000000000000000000000000000008152600481018690526127e89173ffffffffffffffffffffffffffffffffffffffff169063811dd0e290602401602060405180830381865afa1580156127bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e191906147b4565b85346139dc565b5050600180555050565b60025473ffffffffffffffffffffffffffffffffffffffff163314806128d557506003546040517fb70096130000000000000000000000000000000000000000000000000000000081523360048201523060248201526000357fffffffff0000000000000000000000000000000000000000000000000000000016604482015273ffffffffffffffffffffffffffffffffffffffff9091169063b700961390606401602060405180830381865afa1580156128b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d591906148ee565b6128de57600080fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b7638998019890600090a350565b61297d336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6129b85760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6129c58585858585613d3d565b5050505050565b600c81815481106129dc57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b612a31336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b612a6c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612ae1336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b612b1c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600081815260066020526040902054612b4590600160c01b900467ffffffffffffffff16613a5b565b600091825260066020526040909120805467ffffffffffffffff92909216600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b612bbb336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b612bf65760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60026001541415612c905760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b6002600155333b15612ce45760405162461bcd60e51b815260206004820152601260248201527f436f6e747261637420666f7262696464656e00000000000000000000000000006044820152606401610b85565b600881901c6000908152600d60205260409020548190600160ff83161b16612da057336000908152600f60209081526040808320600885901c8452909152902054600160ff83161b1615612d3782613c0b565b604051602001612d479190614858565b60405160208183030381529060405290612d745760405162461bcd60e51b8152600401610b85919061489d565b50336000908152600f60209081526040808320600885901c845290915290208054600160ff84161b1790555b60008281526020818152604091829020825160808101845281548082526001909201546fffffffffffffffffffffffffffffffff81169382019390935267ffffffffffffffff70010000000000000000000000000000000084048116948201859052600160c01b909304909216606083015290914211801590612e3e575061012c8260400151612e309190614910565b67ffffffffffffffff164210155b8015612e4e5750612e4e33613ea7565b15612ea757803414612ea25760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a494e434f5252454354204d53472e56414c5545000000006044820152606401610b85565b612eb3565b612eb084613f8b565b90505b6008546040517fb723b34e0000000000000000000000000000000000000000000000000000000081526004810186905233602482015260009173ffffffffffffffffffffffffffffffffffffffff169063b723b34e906044016020604051808303816000875af1158015612f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4f919061479b565b6040805182815233602082015291925086917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a26008546040517f811dd0e2000000000000000000000000000000000000000000000000000000008152600481018790526130289173ffffffffffffffffffffffffffffffffffffffff169063811dd0e290602401602060405180830381865afa158015612ffd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302191906147b4565b86846139dc565b505060018055505050565b613061336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61309c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b60009182526014602052604090912060020155565b6130df336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61311a5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6040805160608101825267ffffffffffffffff948516815292841660208085019182526fffffffffffffffffffffffffffffffff9384168584019081526000978852600590915291909520925183549551915183167001000000000000000000000000000000000291851668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090961694169390931793909317909216179055565b6131f4336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61322f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000818152602081815260408083208151608081018352815481526001909101546fffffffffffffffffffffffffffffffff81169382019390935267ffffffffffffffff70010000000000000000000000000000000084048116928201839052600160c01b90930490921660608301524210156132f657805191506133a6565b8060600151816040015161330a9190614800565b67ffffffffffffffff16421061335d578060200151816060015167ffffffffffffffff166133389190614931565b8151613356916fffffffffffffffffffffffffffffffff16906147e9565b91506133a6565b60408101516133769067ffffffffffffffff16426147e9565b81602001516fffffffffffffffffffffffffffffffff16613397919061475e565b81516133a391906147e9565b91505b50919050565b600260015414156133ff5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b60026001556000828152600560209081526040918290208251606081018452905467ffffffffffffffff80821683526801000000000000000082041692820183905270010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16928101929092524210156134bd5760405162461bcd60e51b815260206004820152601560248201527f4d503a20434c41494d494e4720494e41435449564500000000000000000000006044820152606401610b85565b60408101516134de906fffffffffffffffffffffffffffffffff168361475e565b341461352c5760405162461bcd60e51b815260206004820152601260248201527f4d503a57524f4e47204d53472e56414c554500000000000000000000000000006044820152606401610b85565b60095481516040517f3aeca21000000000000000000000000000000000000000000000000000000000815233600482015267ffffffffffffffff90911660248201526044810184905273ffffffffffffffffffffffffffffffffffffffff90911690633aeca21090606401600060405180830381600087803b1580156135b157600080fd5b505af11580156135c5573d6000803e3d6000fd5b5050505060005b828110156136c0576008546040517fb723b34e0000000000000000000000000000000000000000000000000000000081526004810186905233602482015260009173ffffffffffffffffffffffffffffffffffffffff169063b723b34e906044016020604051808303816000875af115801561364c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613670919061479b565b6040805182815233602082015291925086917f4de343637a1e04defe1bf819dc4022be666492089901cbff4e44eaf49bdabd80910160405180910390a250806136b881614725565b9150506135cc565b503415613763576008546040517f811dd0e2000000000000000000000000000000000000000000000000000000008152600481018590526137639173ffffffffffffffffffffffffffffffffffffffff169063811dd0e290602401602060405180830381865afa158015613738573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375c91906147b4565b84346139dc565b50506001805550565b61379a336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b6137d55760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b6137e1600c83836141e1565b505050565b613814336000357fffffffff00000000000000000000000000000000000000000000000000000000166138b5565b61384f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610b85565b600881901c6000908152600d6020526040902054600160ff83161b161561389357600881901c6000908152600d602052604090208054600160ff84161b1916905550565b600881901c6000908152600d602052604090208054600160ff84161b17905550565b60035460009073ffffffffffffffffffffffffffffffffffffffff16801580159061399957506040517fb700961300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527fffffffff000000000000000000000000000000000000000000000000000000008516604483015282169063b700961390606401602060405180830381865afa158015613975573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399991906148ee565b806139be575060025473ffffffffffffffffffffffffffffffffffffffff8581169116145b949350505050565b6000826139d38584614122565b14949350505050565b60008281526010602052604081205415613a0457600083815260106020526040902054613a08565b6007545b90506000612710613a19838561475e565b613a239190614998565b9050613a2f8582613ae5565b6011546129c59073ffffffffffffffffffffffffffffffffffffffff16613a5683866147e9565b613ae5565b6000808267ffffffffffffffff1611613a7c5767ffffffffffffffff613a7f565b60005b92915050565b60008115613a935781613a97565b6007545b90506000612710613aa8838661475e565b613ab29190614998565b9050613abe8582613ae5565b6011546129c59073ffffffffffffffffffffffffffffffffffffffff16613a5683876147e9565b80471015613b355760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b85565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613b8f576040519150601f19603f3d011682016040523d82523d6000602084013e613b94565b606091505b50509050806137e15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b85565b606081613c4b57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613c755780613c5f81614725565b9150613c6e9050600a83614998565b9150613c4f565b60008167ffffffffffffffff811115613c9057613c906149ac565b6040519080825280601f01601f191660200182016040528015613cba576020820181803683370190505b5090505b84156139be57613ccf6001836147e9565b9150613cdc600a866149db565b613ce79060306147d1565b60f81b818381518110613cfc57613cfc6146f6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613d36600a86614998565b9450613cbe565b838167ffffffffffffffff1684026fffffffffffffffffffffffffffffffff1685031115613dd35760405162461bcd60e51b815260206004820152602160248201527f73657441756374696f6e3a20666c6f6f7220707269636520756e646572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610b85565b604080516080810182529485526fffffffffffffffffffffffffffffffff938416602080870191825267ffffffffffffffff948516878401908152938516606088019081526000988952908890529190962094518555945160019094018054915195518316600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff96909316700100000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090921694909316939093179290921792909216179055565b600c54600090815b81811015613f81576000600c8281548110613ecc57613ecc6146f6565b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152909116906370a0823190602401602060405180830381865afa158015613f45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f69919061479b565b1115613f79575060019392505050565b600101613eaf565b5060009392505050565b6000818152602081815260408083208151608081018352815481526001909101546fffffffffffffffffffffffffffffffff81169382019390935267ffffffffffffffff70010000000000000000000000000000000084048116928201839052600160c01b90930490921660608301526140475760405162461bcd60e51b815260206004820152601360248201527f41554354494f4e3a4e4f542043524541544544000000000000000000000000006044820152606401610b85565b806040015167ffffffffffffffff164210156140a55760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a41554354494f4e204e4f542053544152544544000000006044820152606401610b85565b60006140b084613276565b9050803410156141025760405162461bcd60e51b815260206004820152601c60248201527f50555243484153453a494e434f5252454354204d53472e56414c5545000000006044820152606401610b85565b600061410e82346147e9565b1115611e7b57611e7b33613a5683346147e9565b600081815b845181101561418e576000858281518110614144576141446146f6565b6020026020010151905080831161416a576000838152602082905260409020925061417b565b600081815260208490526040902092505b508061418681614725565b915050614127565b509392505050565b8280548282559060005260206000209081019282156141d1579160200282015b828111156141d15782518255916020019190600101906141b6565b506141dd929150614259565b5090565b8280548282559060005260206000209081019282156141d1579160200282015b828111156141d15781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190614201565b5b808211156141dd576000815560010161425a565b73ffffffffffffffffffffffffffffffffffffffff81168114611ef557600080fd5b6000602082840312156142a257600080fd5b8135611e7b8161426e565b80356fffffffffffffffffffffffffffffffff811681146142cd57600080fd5b919050565b803567ffffffffffffffff811681146142cd57600080fd5b60008083601f8401126142fc57600080fd5b50813567ffffffffffffffff81111561431457600080fd5b6020830191508360208260051b850101111561432f57600080fd5b9250929050565b60008060008060008060a0878903121561434f57600080fd5b614358876142ad565b9550614366602088016142d2565b9450614374604088016142d2565b935060608701356143848161426e565b9250608087013567ffffffffffffffff8111156143a057600080fd5b6143ac89828a016142ea565b979a9699509497509295939492505050565b600080604083850312156143d157600080fd5b50508035926020909101359150565b6000806000806000608086880312156143f857600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff81111561442457600080fd5b614430888289016142ea565b969995985093965092949392505050565b60006020828403121561445357600080fd5b5035919050565b60008060006060848603121561446f57600080fd5b8335925061447f602085016142ad565b9150604084013590509250925092565b6000806000604084860312156144a457600080fd5b83359250602084013567ffffffffffffffff8111156144c257600080fd5b6144ce868287016142ea565b9497909650939450505050565b600080600080608085870312156144f157600080fd5b84359350602085013577ffffffffffffffffffffffffffffffffffffffffffffffff8116811461452057600080fd5b925061452e604086016142d2565b9396929550929360600135925050565b6000806000806080858703121561455457600080fd5b84359350614564602086016142ad565b9250614572604086016142d2565b9150614580606086016142d2565b905092959194509250565b600080600080600060a086880312156145a357600080fd5b85359450602086013593506145ba604087016142ad565b92506145c8606087016142d2565b91506145d6608087016142d2565b90509295509295909350565b600080600080608085870312156145f857600080fd5b84359350614608602086016142d2565b9250614616604086016142d2565b9150614580606086016142ad565b6000806020838503121561463757600080fd5b823567ffffffffffffffff81111561464e57600080fd5b61465a858286016142ea565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff808316818114156146bb576146bb614666565b6001019392505050565b60006fffffffffffffffffffffffffffffffff838116908316818110156146ee576146ee614666565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561475757614757614666565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561479657614796614666565b500290565b6000602082840312156147ad57600080fd5b5051919050565b6000602082840312156147c657600080fd5b8151611e7b8161426e565b600082198211156147e4576147e4614666565b500190565b6000828210156147fb576147fb614666565b500390565b600067ffffffffffffffff80831681851680830382111561482357614823614666565b01949350505050565b60005b8381101561484757818101518382015260200161482f565b8381111561216e5750506000910152565b7f416c726561647920626f756768742064726f702000000000000000000000000081526000825161489081601485016020870161482c565b9190910160140192915050565b60208152600082518060208401526148bc81604085016020870161482c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561490057600080fd5b81518015158114611e7b57600080fd5b600067ffffffffffffffff838116908316818110156146ee576146ee614666565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561496057614960614666565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826149a7576149a7614969565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000826149ea576149ea614969565b50069056fea26469706673582212204e3cfb27f74ca445aca154f502e1dc3143a824da6a9570b4743db5827487cb1d64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000046ac8540d698167fcbb9e846511beb8cf8af9bd80000000000000000000000002fea46fbccb5ee07c293fe500353579895abf7d00000000000000000000000009705a7113363a383c8a96689e20286abe6612bb30000000000000000000000000faed6ddef3773f3ee5828383aaeeaca2a94564a000000000000000000000000c5c721caa3cad959818e891b533a34c37946e9bf000000000000000000000000e0faf18f33c307ca812b80c771ad3c9e5f043fe90000000000000000000000008c1927427eaaca6a64e238544adfb95451cc05a1
-----Decoded View---------------
Arg [0] : deployedQuantum (address): 0x46Ac8540d698167FCBb9e846511Beb8CF8af9BD8
Arg [1] : deployedMP (address): 0x2fEa46FbCcB5ee07c293fe500353579895aBf7d0
Arg [2] : deployedKeyRing (address): 0x9705a7113363A383c8A96689e20286AbE6612bb3
Arg [3] : deployedUnlocks (address): 0x0fAED6DDeF3773f3Ee5828383AAeEaCA2a94564a
Arg [4] : admin (address): 0xC5C721caA3cAd959818e891b533a34c37946e9Bf
Arg [5] : treasury (address): 0xe0faf18f33c307Ca812B80c771ad3c9E5f043Fe9
Arg [6] : authority (address): 0x8c1927427eaAcA6A64E238544ADfb95451cc05A1
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000046ac8540d698167fcbb9e846511beb8cf8af9bd8
Arg [1] : 0000000000000000000000002fea46fbccb5ee07c293fe500353579895abf7d0
Arg [2] : 0000000000000000000000009705a7113363a383c8a96689e20286abe6612bb3
Arg [3] : 0000000000000000000000000faed6ddef3773f3ee5828383aaeeaca2a94564a
Arg [4] : 000000000000000000000000c5c721caa3cad959818e891b533a34c37946e9bf
Arg [5] : 000000000000000000000000e0faf18f33c307ca812b80c771ad3c9e5f043fe9
Arg [6] : 0000000000000000000000008c1927427eaaca6a64e238544adfb95451cc05a1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.