From 160392241c49758d93f8c3da79808c6e97b4fa41 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:01:09 +0530 Subject: [PATCH 001/112] Origin Base v0.1 Added --- contracts/OriginsBase.sol | 704 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 704 insertions(+) create mode 100644 contracts/OriginsBase.sol diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol new file mode 100644 index 0000000..ff62a9d --- /dev/null +++ b/contracts/OriginsBase.sol @@ -0,0 +1,704 @@ +pragma solidity ^0.5.17; + +import "./OriginsEvents.sol"; +import "./Interfaces/IOrigins.sol"; + +/** + * @title A contract for Origins platform. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice You can use this contract for creating a sale in the Origins Platform. + */ +contract OriginsBase is IOrigins, OriginsEvents { + + /* Functions */ + + /** + * @notice Setup the required parameters. + * @param _owners The list of owners to be added to the list. + * @param _depositAddress The address of deposit address where all the raised fund will go. (Optional) + */ + constructor(address[] memory _owners, address payable _depositAddress) public OriginsAdmin(_owners) { + if(_depositAddress != address(0)){ + depositAddress = _depositAddress; + emit DepositAddressUpdated(msg.sender, address(0), _depositAddress); + } + } + + /* Public & External Functions */ + + /** + * @notice Function to set the deposit address. + * @param _depositAddress The address of deposit address where all the raised fund will go. + * @dev If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party. + */ + function setDepositAddress(address payable _depositAddress) external onlyOwner { + _setDepositAddress(_depositAddress); + } + + /** + * @notice Function to set the Locked Fund Contract Address. + * @param _lockedFund The address of new the Vesting registry. + */ + function setLockedFund(address _lockedFund) external onlyOwner { + _setLockedFund(_lockedFund); + } + + /** + * @notice Function to create a new tier. + * @param _remainingTokens Contains the remaining tokens for sale. + * @param _saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * @param _saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * @param _unlockedTokenWithdrawTS Contains the timestamp for the waited unlocked tokens to be withdrawn. + * @param _unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock. + * @param _vestOrLockCliff Contains the cliff of the vesting/lock for distribution. + * @param _vestOrLockDuration Contains the duration of the vesting/lock for distribution. + * @param _depositRate Contains the rate of the token w.r.t. the depositing asset. + * @param _depositToken Contains the deposit token address if the deposit type is Token. + * @param _verificationType Contains the method by which verification happens. + * @param _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. + * @param _transferType Contains the type of token transfer after a user buys to get the tokens. + * @return _tierID The newly created tier ID. + * @dev In the future this should be decoupled. + */ + function createTier(uint256 _remainingTokens, uint256 _saleStartTS, uint256 _saleEnd, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _depositRate, address _depositToken, DepositType _depositType, VerificationType _verificationType, SaleEndDurationOrTS _saleEndDurationOrTS, TransferType _transferType) external onlyOwner returns(uint256 _tierID){ + /// @notice `tierCount` should always start at 1, because else default value zero will result in verification process. + tierCount++; + + _tierID = tierCount; + + /// @notice This will revert if any of the below fails. But if none fails, this event should fire first. + emit NewTierCreated(msg.sender, _tierID); + + /// @notice Verification Parameter. + _setTierVerification(_tierID, _verificationType); + + /// @notice Deposit Parameters. + _setTierDeposit(_tierID, _depositRate, _depositToken, _depositType); + + /// @notice Token Amount Limit Parameters (TODO). + /// @dev This is not set here due to stack too deep error. + //_setTierTokenLimit(_tierID, _minAmount, _maxAmount); + // @dev Corresponding _minAmount and _maxAmount parameters has been removed. + + /// @notice Tier Token Amount Parameters. + _setTierTokenAmount(_tierID, _remainingTokens); + + /// @notice Vesting or Locking Parameters. + _setTierVestOrLock(_tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedTokenWithdrawTS, _unlockedBP, _transferType); + + /// @notice Time Parameters. + _setTierTime(_tierID, _saleStartTS, _saleEnd, _saleEndDurationOrTS); + } + + /** + * @notice Function to set the Tier Verification Method. + * @param _tierID The Tier ID which is being updated. + * @param _verificationType The type of verification for the particular sale. + */ + function setTierVerification(uint256 _tierID, VerificationType _verificationType) external onlyOwner { + _setTierVerification(_tierID, _verificationType); + } + + /** + * @notice Function to set the Tier Deposit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _depositRate The rate is the, asset * rate = token. + * @param _depositToken The token for that particular Tier Sale. + * @param _depositType The type of deposit for the particular sale. + */ + function setTierDeposit(uint256 _tierID, uint256 _depositRate, address _depositToken, DepositType _depositType) external onlyOwner { + _setTierDeposit(_tierID, _depositRate, _depositToken, _depositType); + } + + /** + * @notice Function to set the Tier Token Limit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _minAmount The minimum asset amount required to participate in that tier. + * @param _maxAmount The maximum asset amount allowed to participate in that tier. + */ + function setTierTokenLimit(uint256 _tierID, uint256 _minAmount, uint256 _maxAmount) external onlyOwner { + _setTierTokenLimit(_tierID, _minAmount, _maxAmount); + } + + /** + * @notice Function to set the Tier Token Amount Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _remainingTokens The maximum number of tokens allowed to be sold in the tier. + */ + function setTierTokenAmount(uint256 _tierID, uint256 _remainingTokens) external onlyOwner { + _setTierTokenAmount(_tierID, _remainingTokens); + } + + /** + * @notice Function to set the Tier Vest/Lock Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _vestOrLockCliff The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff. + * @param _vestOrLockDuration The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration. + * @param _unlockedTokenWithdrawTS The unlocked token withdraw timestamp. + * @param _unlockedBP The unlocked token amount in BP. + * @param _transferType The Tier Transfer Type for the Tier. + */ + function setTierVestOrLock(uint256 _tierID, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, TransferType _transferType) external onlyOwner { + _setTierVestOrLock(_tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedTokenWithdrawTS, _unlockedBP, _transferType); + } + + /** + * @notice Function to set the Tier Time Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _saleStartTS The Tier Sale Start Timestamp. + * @param _saleEnd The Tier Sale End Duration or Timestamp. + * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. + */ + function setTierTime(uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, SaleEndDurationOrTS _saleEndDurationOrTS) external onlyOwner { + _setTierTime(_tierID, _saleStartTS, _saleEnd, _saleEndDurationOrTS); + } + + /** + * @notice Function to verify a single address with a single tier. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tier for which the address has to be verified. + */ + function addressVerification(address _addressToBeVerified, uint256 _tierID) external onlyVerifier { + _addressVerification(_addressToBeVerified, _tierID); + } + + /** + * @notice Function to verify a single address with multiple tiers. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tiers for which the address has to be verified. + */ + function singleAddressMultipleTierVerification(address _addressToBeVerified, uint256[] calldata _tierID) external onlyVerifier { + for (uint256 index = 0; index < _tierID.length; index++) { + _addressVerification(_addressToBeVerified, _tierID[index]); + } + } + + /** + * @notice Function to verify multiple address with a single tier. + * @param _addressToBeVerified The addresses which has to be veriried for the sale. + * @param _tierID The tier for which the addresses has to be verified. + */ + function multipleAddressSingleTierVerification(address[] calldata _addressToBeVerified, uint256 _tierID) external onlyVerifier { + for (uint256 index = 0; index < _addressToBeVerified.length; index++) { + _addressVerification(_addressToBeVerified[index], _tierID); + } + } + + /** + * @notice Function to verify multiple address with multiple tiers. + * @param _addressToBeVerified The addresses which has to be veriried for the sale. + * @param _tierID The tiers for which the addresses has to be verified. + */ + function multipleAddressAndTierVerification(address[] calldata _addressToBeVerified, uint256[] calldata _tierID) external onlyVerifier { + require(_addressToBeVerified.length == _tierID.length, "OriginsBase: Address and Tier Array length mismatch."); + for (uint256 index = 0; index < _addressToBeVerified.length; index++) { + _addressVerification(_addressToBeVerified[index], _tierID[index]); + } + } + + /** + * @notice Function to buy tokens from sale based on tier. + * @param _tierID The Tier ID from which the token has to be bought. + * @param _amount The amount of token (deposit asset) which will be sent for purchasing. + * @dev If deposit type if RBTC, then _amount can be passed as zero. + */ + function buy(uint256 _tierID, uint256 _amount) public payable { + _buy(_tierID, _amount); + } + + /** + * @notice The function used by the admin or deposit address to withdraw the sale proceedings. + * @dev In the future this could be made to be accessible only to seller, rather than owner. + */ + function withdrawSaleDeposit() external { + _withdrawSaleDeposit(); + } + + /* Internal Functions */ + + /** + * @notice Internal function to set the deposit address. + * @param _depositAddress The address of deposit address where all the raised fund will go. + */ + function _setDepositAddress(address payable _depositAddress) internal { + require(_depositAddress != address(0), "OriginsBase: Deposit Address cannot be zero."); + + emit DepositAddressUpdated(msg.sender, depositAddress, _depositAddress); + + depositAddress = _depositAddress; + } + + /** + * @notice Function to set the Locked Fund Contract Address. + * @param _lockedFund The address of new the Vesting registry. + */ + function _setLockedFund(address _lockedFund) internal { + require(_lockedFund != address(0), "OriginsBase: Locked Fund Address cannot be zero."); + + emit LockedFundUpdated(msg.sender, address(lockedFund), _lockedFund); + + lockedFund = ILockedFund(_lockedFund); + } + + /** + * @notice Internal function to set the Tier Verification Method. + * @param _tierID The Tier ID which is being updated. + * @param _verificationType The type of verification for the particular sale. + */ + function _setTierVerification(uint256 _tierID, VerificationType _verificationType) internal { + tiers[_tierID].verificationType = _verificationType; + + emit TierVerificationUpdated(msg.sender, _tierID, _verificationType); + } + + /** + * @notice Internal function to set the Tier Deposit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _depositRate The rate is the, asset * rate = token. + * @param _depositToken The token for that particular Tier Sale. + * @param _depositType The type of deposit for the particular sale. + */ + function _setTierDeposit(uint256 _tierID, uint256 _depositRate, address _depositToken, DepositType _depositType) internal { + require(_depositRate > 0, "OriginsBase: Deposit Rate cannot be zero."); + if(_depositType == DepositType.Token){ + require(_depositToken != address(0), "OriginsBase: Deposit Token Address cannot be zero."); + } + + tiers[_tierID].depositRate = _depositRate; + tiers[_tierID].depositToken = IERC20(_depositToken); + tiers[_tierID].depositType = _depositType; + + emit TierDepositUpdated(msg.sender, _tierID, _depositRate, _depositToken, _depositType); + } + + /** + * @notice Internal function to set the Tier Token Limit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _minAmount The minimum asset amount required to participate in that tier. + * @param _maxAmount The maximum asset amount allowed to participate in that tier. + */ + function _setTierTokenLimit(uint256 _tierID, uint256 _minAmount, uint256 _maxAmount) internal { + require(_minAmount <= _maxAmount, "OriginsBase: Min Amount cannot be higher than Max Amount."); + + tiers[_tierID].minAmount = _minAmount; + tiers[_tierID].maxAmount = _maxAmount; + + emit TierTokenLimitUpdated(msg.sender, _tierID, _minAmount, _maxAmount); + } + + /** + @notice Internal Function to returns the total remaining tokens in all tier. + @return _totalBal The total balance of tokens in all tier. + */ + function _getTotalRemainingTokens() internal view returns(uint256 _totalBal) { + /// @notice Starting with 1 as Tier Count always starts from 1. + for (uint256 index = 1; index <= tierCount; index++) { + _totalBal = _totalBal.add(tiers[index].remainingTokens); + } + } + + /** + * @notice Internal function to set the Tier Token Amount Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _remainingTokens The maximum number of tokens allowed to be sold in the tier. + * @dev This function assumes the admin is a trusted party (multisig). + */ + function _setTierTokenAmount(uint256 _tierID, uint256 _remainingTokens) internal { + require(_remainingTokens > 0, "OriginsBase: Total token to sell should be higher than zero."); + require(tiers[_tierID].maxAmount.mul(tiers[_tierID].depositRate) <= _remainingTokens, "OriginsBase: Max Amount to buy should not be higher than token availability."); + + uint256 currentBal = token.balanceOf(address(this)); + uint256 requiredBal = _getTotalRemainingTokens().add(_remainingTokens).sub(tiers[_tierID].remainingTokens); + + /// @notice Checking if we have enough token for all tiers. If we have more, then we refund the extra. + if(requiredBal > currentBal){ + bool txStatus = token.transferFrom(msg.sender, address(this), requiredBal.sub(currentBal)); + require(txStatus, "OriginsBase: Not enough token supplied for Token Distribution."); + } + else{ + bool txStatus = token.transfer(msg.sender, currentBal.sub(requiredBal)); + require(txStatus, "OriginsBase: Admin didn't received the tokens correctly."); + } + + tiers[_tierID].remainingTokens = _remainingTokens; + + emit TierTokenAmountUpdated(msg.sender, _tierID, _remainingTokens); + } + + /** + * @notice Internal function to set the Tier Vest/Lock Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _vestOrLockCliff The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff. + * @param _vestOrLockDuration The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration. + * @param _unlockedTokenWithdrawTS The unlocked token withdraw timestamp. + * @param _unlockedBP The unlocked token amount in BP. + * @param _transferType The Tier Transfer Type for the Tier. + */ + function _setTierVestOrLock(uint256 _tierID, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, TransferType _transferType) internal { + /// @notice The below is mainly for TransferType of Vested and Locked, but should not hinder for other types as well. + require(_vestOrLockCliff <= _vestOrLockDuration, "OriginsBase: Cliff has to be <= duration."); + require(_unlockedBP <= MAX_BASIS_POINT, "OriginsBase: The basis point cannot be higher than 10K."); + + tiers[_tierID].vestOrLockCliff = _vestOrLockCliff; + tiers[_tierID].vestOrLockDuration = _vestOrLockDuration; + /// @notice Zero is also an accepted value, which means the unlock time is not yet decided. + tiers[_tierID].unlockedTokenWithdrawTS = _unlockedTokenWithdrawTS; + tiers[_tierID].unlockedBP = _unlockedBP; + tiers[_tierID].transferType = _transferType; + + emit TierVestOrLockUpdated(msg.sender, _tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedTokenWithdrawTS, _unlockedBP, _transferType); + } + + /** + * @notice Internal function to set the Tier Time Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _saleStartTS The Tier Sale Start Timestamp. + * @param _saleEnd The Tier Sale End Duration or Timestamp. + * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. + */ + function _setTierTime(uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, SaleEndDurationOrTS _saleEndDurationOrTS) internal { + if(_saleStartTS !=0 && _saleEnd != 0 && _saleEndDurationOrTS == SaleEndDurationOrTS.Duration) { + require(_saleStartTS.add(_saleEnd) > block.timestamp, "OriginsBase: The sale end duration cannot be past already."); + } + else if((_saleStartTS !=0 || _saleEnd != 0) && _saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp) { + require(_saleStartTS < _saleEnd, "OriginsBase: The sale start TS cannot be after sale end TS."); + require(_saleEnd > block.timestamp, "OriginsBase: The sale end time cannot be past already."); + } + + tiers[_tierID].saleStartTS = _saleStartTS; + tiers[_tierID].saleEnd = _saleEnd; + tiers[_tierID].saleEndDurationOrTS = _saleEndDurationOrTS; + + emit TierTimeUpdated(msg.sender, _tierID, _saleStartTS, _saleEnd, _saleEndDurationOrTS); + } + + /** + * @notice Internal function to verify a single address with a single tier. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tier for which the address has to be verified. + * @dev It purposefully doesn't check if it is an already added address to avoid excess gas usage. + * Also to avoid the interuption when adding multiple address at once. + */ + function _addressVerification(address _addressToBeVerified, uint256 _tierID) internal { + require(_addressToBeVerified != address(0), "OriginsBase: Address to be verified cannot be zero."); + + addressApproved[_addressToBeVerified][_tierID] = true; + + emit AddressVerified(msg.sender, _addressToBeVerified, _tierID); + } + + /** + * @notice Function to check whether a sale on a tier is allowed or not. + * @param _id The Tier ID whose sale status has to be checked. + * @return True if the sale is allowed on that tier, False otherwise. + */ + function _saleAllowed(uint256 _id) internal returns(bool) { + require(tiers[_id].saleStartTS != 0, "OriginsBase: Sale has not started yet."); + require(!tierSaleEnded[_id], "OriginsBase: Sale ended."); + if(tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.None){ + return false; + } + else if(tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.UntilSupply && tiers[_id].remainingTokens == 0) { + tierSaleEnded[_id] = true; + return false; + } + else if(tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp && tiers[_id].saleEnd < block.timestamp) { + tierSaleEnded[_id] = true; + return false; + } + else if(tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.Duration && tiers[_id].saleStartTS.add(tiers[_id].saleEnd) < block.timestamp) { + tierSaleEnded[_id] = true; + return false; + } + /// @notice Here another case of else if could have come based on remaining token. + /// It didn't because on buy, it will check if the remaining amount is higher than but not equal to the deposit. + /// In case it is equal or lesser than deposit amount, then tierSaleEnded should be set there. + return true; + } + + /** + * @notice Internal Function to update the Tier Token Details. + * @param _tierID The Tier whose Token Details are updated. + */ + function _updateTierTokenDetailsAfterBuy(uint256 _tierID) internal { + Tier memory tierDetails = tiers[_tierID]; + + if(tierDetails.remainingTokens < tierDetails.maxAmount) { + if(tierDetails.remainingTokens < tierDetails.minAmount) { + if(tierDetails.remainingTokens == 0) { + tierSaleEnded[_tierID] = true; + emit TierSaleEnded(msg.sender, _tierID); + } + tiers[_tierID].minAmount = 0; + emit TierSaleUpdatedMinimum(msg.sender, _tierID); + } + tiers[_tierID].maxAmount = tierDetails.remainingTokens; + emit TierSaleUpdatedMaximum(msg.sender, _tierID, tierDetails.remainingTokens); + } + } + + /** + * @notice Internal Function to transfer the token during buying. + * @param _tierID The Tier from which the tokens were bought. + * @param _tokensBought The number of tokens bought. + */ + function _tokenTransferOnBuy(uint256 _tierID, uint256 _tokensBought) internal { + Tier memory tierDetails = tiers[_tierID]; + + require(tierDetails.transferType != TransferType.None, "OriginsBase: Transfer Type not set by owner"); + + if(tierDetails.transferType == TransferType.Unlocked){ + tierDetails.depositToken.transfer(msg.sender, _tokensBought); + } + else if(tierDetails.transferType == TransferType.WaitedUnlock) { + /// TODO Call LockedFund Contract to release the token after a certain period. + /// TODO approve LockedFund + revert("Not implemented yet."); + } + else if(tierDetails.transferType == TransferType.Vested) { + token.approve(address(lockedFund), _tokensBought); + lockedFund.depositVested(msg.sender, _tokensBought, tierDetails.vestOrLockCliff, tierDetails.vestOrLockDuration, tierDetails.unlockedBP); + } + else if(tierDetails.transferType == TransferType.Locked) { + /// TODO Call the LockedFund Contract with simple lock on the received token. + /// Don't forget the immediate unlocked amount after the unlockTimestamp. + /// TODO approve LockedFund + revert("Not implemented yet."); + } + } + + /** + * @notice Internal function to update the wallet count and tier token sold stat. + * @notice _tierID The Tier ID whose stat has to be updated. + * @notice _deposit The amount of asset deposited by the user. + * @notice _tokensBoughtByAddress The amount of tokens bought by the user previously. + * @notice _tokensBought The amount of tokens bought during the current buy. + */ + function _updateWalletCount(uint256 _tierID, uint256 _deposit, uint256 _tokensBoughtByAddress, uint256 _tokensBought) internal { + if(_deposit > 0) { + if(_tokensBoughtByAddress == 0){ + participatingWalletCountPerTier[_tierID]++; + } + tokensSoldPerTier[_tierID] = tokensSoldPerTier[_tierID].add(_tokensBought); + } + } + + /** + * @notice Internal function to buy tokens from sale based on tier. + * @param _tierID The Tier ID from which the token has to be bought. + * @param _amount The amount of token (deposit asset) which will be sent for purchasing. + */ + function _buy(uint256 _tierID, uint256 _amount) internal { + /// @notice Checking if token sale is allowed or not. + require(_saleAllowed(_tierID), "OriginsBase: Sale not allowed."); + + /// @notice Getting the required information of the Tier to participate. + Tier memory tierDetails = tiers[_tierID]; + + /// @notice Checking if verification is set and if user has permission. + if(tierDetails.verificationType == VerificationType.None) { + revert("OriginsBase: No one is allowed for sale."); + } + else if(tierDetails.verificationType == VerificationType.ByAddress) { + /// @notice Checking if user is verified based on address. + require(addressApproved[msg.sender][_tierID], "OriginsBase: User not approved for sale."); + } + + /// @notice If user is verified on address or does not need verification, the following steps will be taken. + uint256 tokensBoughtByAddress = tokensBoughtByAddressOnTier[msg.sender][_tierID]; + + /// @notice Checking if the user already reached the maximum amount. + require(tokensBoughtByAddress < tierDetails.maxAmount, "OriginsBase: User already bought maximum allowed."); + + /// @notice Checking which deposit type is selected. + uint256 deposit; + if(tierDetails.depositType == DepositType.RBTC) { + deposit = msg.value; + } + else { + require(_amount != 0, "OriginsBase: Amount cannot be zero."); + require(address(tierDetails.depositToken) != address(0), "OriginsBase: Deposit Token not set by owner."); + bool txStatus = tierDetails.depositToken.transferFrom(msg.sender, address(this), _amount); + require(txStatus, "OriginsBase: Not enough token supplied by user for buying."); + deposit = _amount; + } + + /// @notice Checking what should be the allowed deposit amount. + uint256 refund; + require(deposit >= tierDetails.minAmount, "OriginsBase: Deposit is less than minimum allowed."); + if(tierDetails.maxAmount.sub(tokensBoughtByAddress) <= deposit) { + refund = deposit.add(tokensBoughtByAddress).sub(tierDetails.maxAmount); + deposit = tierDetails.maxAmount.sub(tokensBoughtByAddress); + } + + /// @notice actual buying happens here. + uint256 tokensBought = deposit.mul(tierDetails.depositRate); + tierDetails.remainingTokens = tierDetails.remainingTokens.sub(tokensBought); + tokensBoughtByAddressOnTier[msg.sender][_tierID] = tokensBoughtByAddressOnTier[msg.sender][_tierID].add(tokensBought); + + /// @notice Checking what type of Transfer to do. + _tokenTransferOnBuy(_tierID, tokensBought); + + /// @notice Updating the tier token parameters. + _updateTierTokenDetailsAfterBuy(_tierID); + + /// @notice Updating the stats. + _updateWalletCount(_tierID, deposit, tokensBoughtByAddress, tokensBought); + + /// @notice Refunding the excess funds. + if(refund > 0) { + bool txStatus = tierDetails.depositToken.transfer(msg.sender, refund); + require(txStatus, "OriginsBase: Token refund not received by user correctly."); + } + + emit TokenBuy(msg.sender, _tierID, tokensBought); + + } + + /** + * @notice Internal function used by the admin or deposit address to withdraw the sale proceedings. + * @dev In the future this could be made to be accessible only to seller, rather than owner. + */ + function _withdrawSaleDeposit() internal { + require(checkOwner(msg.sender) || depositAddress == msg.sender, "Only owner or deposit address can call this function."); + /// @notice Checks if deposit address is set or not. + address payable receiver = msg.sender; + if (depositAddress != address(0)) { + receiver = depositAddress; + } + + /// @notice Only withdraw is allowed where sale is ended. Premature withdraw is not allowed. + for (uint256 index = 1; index <= tierCount; index++) { + if(tierSaleEnded[index]){ + uint256 amount = tokensSoldPerTier[index].div(tiers[index].depositRate); + if (tiers[index].depositType == DepositType.RBTC) { + receiver.transfer(amount); + emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.RBTC, amount); + } else { + tiers[index].depositToken.transfer(receiver, amount); + emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.Token, amount); + } + } + } + } + + /* Getter Functions */ + + /** + * @notice Function to read the tier count. + * @return The number of tiers present in the contract. + */ + function getTierCount() public view returns(uint256) { + return tierCount; + } + + /** + * @notice Function to read the deposit address. + * @return The address of the deposit address. + * @dev If zero is returned, any of the owners can withdraw the raised funds. + */ + function getDepositAddress() public view returns(address) { + return depositAddress; + } + + /** + * @notice Function to read the token on sale. + * @return The Token contract address which is being sold in the contract. + */ + function getToken() public view returns(address) { + return address(token); + } + + /** + * @notice Function to read the locked fund contract address. + * @return Address of Locked Fund Contract. + */ + function getLockDetails() public view returns(address) { + return address(lockedFund); + } + + /** + * @notice Function to read a Tier parameter. + * @param _tierID The Tier whose info is to be read. + * @return _minAmount The minimum amount which can be deposited. + * @return _maxAmount The maximum amount which can be deposited. + * @return _remainingTokens Contains the remaining tokens for sale. + * @return _saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * @return _saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * @return _unlockedTokenWithdrawTS Contains the timestamp for the waited unlocked tokens to be withdrawn. + * @return _unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock. + * @return _vestOrLockCliff Contains the cliff of the vesting/lock for distribution. + * @return _vestOrLockDuration Contains the duration of the vesting/lock for distribution. + * @return _depositRate Contains the rate of the token w.r.t. the depositing asset. + */ + function readTierPartA(uint256 _tierID) public view returns(uint256 _minAmount, uint256 _maxAmount, uint256 _remainingTokens, uint256 _saleStartTS, uint256 _saleEnd, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _depositRate) { + Tier memory tier = tiers[_tierID]; + return (tier.minAmount, tier.maxAmount, tier.remainingTokens, tier.saleStartTS, tier.saleEnd, tier.unlockedTokenWithdrawTS, tier.unlockedBP, tier.vestOrLockCliff, tier.vestOrLockDuration, tier.depositRate); + } + + /** + * @notice Function to read a Tier parameter. + * @param _tierID The Tier whose info is to be read. + * @return _depositToken Contains the deposit token address if the deposit type is Token. + * @return _depositType The type of deposit for the particular sale. + * @return _verificationType Contains the method by which verification happens. + * @return _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. + * @return _transferType Contains the type of token transfer after a user buys to get the tokens. + */ + function readTierPartB(uint256 _tierID) public view returns(address _depositToken, DepositType _depositType, VerificationType _verificationType, SaleEndDurationOrTS _saleEndDurationOrTS, TransferType _transferType) { + Tier memory tier = tiers[_tierID]; + return (address(tier.depositToken), tier.depositType, tier.verificationType, tier.saleEndDurationOrTS, tier.transferType); + } + + /** + * @notice Function to read tokens bought by an address on a particular tier. + * @param _addr The address which has to be checked. + * @param _tierID The tier ID for which the address has to be checked. + * @return The amount of tokens bought by the address. + */ + function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) public view returns(uint256) { + return tokensBoughtByAddressOnTier[_addr][_tierID]; + } + + /** + * @notice Function to read participating wallet count per tier. + * @param _tierID The tier ID for which the count has to be checked. + * @return The number of wallets who participated in that Tier. + * @dev Total participation of wallets cannot be determined by this. + * A user can participate on one round and not on other. + * In the future maybe a count on that can be created. + */ + function getParticipatingWalletCountPerTier(uint256 _tierID) public view returns(uint256) { + return participatingWalletCountPerTier[_tierID]; + } + + /** + * @notice Function to read tokens sold per tier. + * @param _tierID The tier ID for which the sold metrics has to be checked. + * @return The amount of tokens sold on that tier. + */ + function getTokensSoldPerTier(uint256 _tierID) public view returns(uint256) { + return tokensSoldPerTier[_tierID]; + } + + /** + * @notice Function to check if a tier sale ended or not. + * @param _tierID The Tier whose info is to be read. + * @return True is sale ended, False otherwise. + * @dev A return of false does not necessary mean the sale is active. It can also be in inactive state. + */ + function checkSaleEnded(uint256 _tierID) public view returns(bool _status) { + return tierSaleEnded[_tierID]; + } + + /** + * @notice Function to read address which are approved for sale in a tier. + * @param _addr The address which has to be checked. + * @param _tierID The tier ID for which the address has to be checked. + * @return True is allowed, False otherwise. + */ + function isAddressApproved(address _addr, uint256 _tierID) public view returns(bool) { + return addressApproved[_addr][_tierID]; + } + +} From a68d8364b728f61c3223c791fee10bc85a4d9c3b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:01:55 +0530 Subject: [PATCH 002/112] Origin Admin Added --- contracts/OriginsAdmin.sol | 227 +++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 contracts/OriginsAdmin.sol diff --git a/contracts/OriginsAdmin.sol b/contracts/OriginsAdmin.sol new file mode 100644 index 0000000..09f7887 --- /dev/null +++ b/contracts/OriginsAdmin.sol @@ -0,0 +1,227 @@ +pragma solidity ^0.5.17; + +/** + * @title An owner contract with granular access for multiple parties. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice You can use this contract for creating multiple owners with different access. + * @dev To add a new role, add the corresponding array and mapping, along with add, remove and get functions. + */ +contract OriginsAdmin { + + /* Storage */ + + address[] private owners; + address[] private verifiers; + + mapping(address => bool) private isOwner; + mapping(address => bool) private isVerifier; + /** + * @notice In the future new list can be added based on the required limit. + * When adding a new list, a new array & mapping has to be created. + * Adding/Removing functions, getter for array and mapping. + * Events for Adding/Removing and modifier to check the validity. + */ + + /* Events */ + + /** + * @notice Emitted when a new owner is added. + * @param _initiator The one who initiates this event. + * @param _newOwner The new owner who has been added recently. + */ + event OwnerAdded(address indexed _initiator, address _newOwner); + + /** + * @notice Emitted when an owner is removed. + * @param _initiator The one who initiates this event. + * @param _removedOwner The owner who has been removed. + */ + event OwnerRemoved(address indexed _initiator, address _removedOwner); + + /** + * @notice Emitted when a verifier is added. + * @param _initiator The one who initiates this event. + * @param _newVerifier The new verifier who has been added recently. + */ + event VerifierAdded(address indexed _initiator, address _newVerifier); + + /** + * @notice Emitted when a verifier is removed. + * @param _initiator The one who initiates this event. + * @param _removedVerifier The verifier who has been removed. + */ + event VerifierRemoved(address indexed _initiator, address _removedVerifier); + + /* Modifiers */ + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(isOwner[msg.sender], "OriginsAdmin: Only owner can call this function."); + _; + } + + /** + * @dev Throws if called by any account other than the verifier. + */ + modifier onlyVerifier() { + require(isVerifier[msg.sender], "OriginsAdmin: Only verifier can call this function."); + _; + } + + /* Functions */ + + /** + * @dev Initializes the contract, setting the deployer as the initial owner. + * @param _owners The owners list. + */ + constructor(address[] memory _owners) internal { + uint256 len = _owners.length; + for (uint256 index = 0; index < len; index++) { + require(!isOwner[_owners[index]], "OriginsAdmin: Each owner can be added only once."); + isOwner[_owners[index]] = true; + owners.push(_owners[index]); + emit OwnerAdded(msg.sender, msg.sender); + } + } + + /** + * @notice The function to add a new owner. + * @param _newOwner The address of the new owner. + * @dev Only callable by an Owner. + */ + function addOwner(address _newOwner) public onlyOwner { + _addOwner(_newOwner); + } + + /** + * @notice The function to remove an owner. + * @param _ownerToRemove The address of the owner which should be removed. + * @dev Only callable by an Owner. + */ + function removeOwner(address _ownerToRemove) public onlyOwner { + _removeOwner(_ownerToRemove); + } + + /** + * @notice The function to add a new verifier. + * @param _newVerifier The address of the new verifier. + * @dev Only callable by an Owner. + */ + function addVerifier(address _newVerifier) public onlyOwner { + _addVerifier(_newVerifier); + } + + /** + * @notice The function to remove an verifier. + * @param _verifierToRemove The address of the verifier which should be removed. + * @dev Only callable by an Owner. + */ + function removeVerifier(address _verifierToRemove) public onlyOwner { + _removeVerifier(_verifierToRemove); + } + + /* Internal Functions */ + + /** + * @notice The internal function to add a new owner. + * @param _newOwner The address of the new owner. + */ + function _addOwner(address _newOwner) internal { + require(_newOwner != address(0), "OriginsAdmin: Invalid Address."); + require(!isOwner[_newOwner], "OriginsAdmin: Address is already an owner."); + isOwner[_newOwner] = true; + owners.push(_newOwner); + + emit OwnerAdded(msg.sender, _newOwner); + } + + /** + * @notice The internal function to remove an owner. + * @param _ownerToRemove The address of the owner which should be removed. + */ + function _removeOwner(address _ownerToRemove) internal { + require(isOwner[_ownerToRemove], "OriginsAdmin: Address is not an owner."); + isOwner[_ownerToRemove] = false; + uint256 len = owners.length; + for(uint256 index = 0; index < len; index++) { + if(_ownerToRemove == owners[index]) { + owners[index] = owners[len - 1]; + break; + } + } + owners.pop(); + + emit OwnerRemoved(msg.sender, _ownerToRemove); + } + + /** + * @notice The internal function to add a new verifier. + * @param _newVerifier The address of the new verifier. + */ + function _addVerifier(address _newVerifier) internal { + require(_newVerifier != address(0), "OriginsAdmin: Invalid Address."); + require(!isVerifier[_newVerifier], "OriginsAdmin: Address is already a verifier."); + isVerifier[_newVerifier] = true; + verifiers.push(_newVerifier); + + emit VerifierAdded(msg.sender, _newVerifier); + } + + /** + * @notice The internal function to remove an verifier. + * @param _verifierToRemove The address of the verifier which should be removed. + */ + function _removeVerifier(address _verifierToRemove) internal { + require(isVerifier[_verifierToRemove], "OriginsAdmin: Address is not a verifier."); + isVerifier[_verifierToRemove] = false; + uint256 len = verifiers.length; + for(uint256 index = 0; index < len; index++) { + if(_verifierToRemove == verifiers[index]) { + verifiers[index] = verifiers[len - 1]; + break; + } + } + verifiers.pop(); + + emit VerifierRemoved(msg.sender, _verifierToRemove); + } + + /* Getter Functions */ + + /** + * @notice Checks if the passed address is an owner or not. + * @param _addr The address to check. + * @return True if Owner, False otherwise. + */ + function checkOwner(address _addr) public view returns (bool) { + return isOwner[_addr]; + } + + /** + * @notice Checks if the passed address is a verifier or not. + * @param _addr The address to check. + * @return True if Verifier, False otherwise. + */ + function checkVerifier(address _addr) public view returns (bool) { + return isVerifier[_addr]; + } + + /** + * @dev Returns the address array of the owners. + * @return The list of owners. + */ + function getOwners() public view returns (address[] memory) { + return owners; + } + + /** + * @dev Returns the address array of the verifier. + * @return The list of verifiers. + */ + function getVerifiers() public view returns (address[] memory) { + return verifiers; + } + +} From 05536d5fd855175aa642e1cbd29bcb837a766eea Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:02:16 +0530 Subject: [PATCH 003/112] Origin Events Added --- contracts/OriginsEvents.sol | 142 ++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 contracts/OriginsEvents.sol diff --git a/contracts/OriginsEvents.sol b/contracts/OriginsEvents.sol new file mode 100644 index 0000000..a06ecb0 --- /dev/null +++ b/contracts/OriginsEvents.sol @@ -0,0 +1,142 @@ +pragma solidity ^0.5.17; + +import "./OriginsStorage.sol"; + +/** + * @title A contract containing all the events of Origins Base. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice You can use this contract for adding events into Origins Base. + */ +contract OriginsEvents is OriginsStorage{ + + /* Events */ + + /** + * @notice Emitted when a new verified address is added. + * @param _initiator The one who initiates this event. + * @param _verifiedAddress The address which was veriried for the sale. + * @param _tierID The tier for which the address was verified. + */ + event AddressVerified(address indexed _initiator, address indexed _verifiedAddress, uint256 _tierID); + + /** + * @notice Emitted when the Deposit Address is updated. + * @param _initiator The one who initiates this event. + * @param _oldDepositAddr The address of the old deposit address. + * @param _newDepositAddr The address of the new deposit address. + */ + event DepositAddressUpdated(address indexed _initiator, address indexed _oldDepositAddr, address indexed _newDepositAddr); + + /** + * @notice Emitted when the Locked Fund is updated. + * @param _initiator The one who initiates this event. + * @param _oldLockedFund The address of the old locked fund address. + * @param _newLockedFund The address of the new locked fund address. + */ + event LockedFundUpdated(address indexed _initiator, address indexed _oldLockedFund, address indexed _newLockedFund); + + /** + * @notice Emitted when a new Tier is created. + * @param _initiator The one who initiates this event. + * @param _tierID The new tier ID which was created. + */ + event NewTierCreated(address indexed _initiator, uint256 _tierID); + + /** + * @notice Emitted when Tier Token Limit Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _minAmount The minimum asset amount required to participate in that tier. + * @param _maxAmount The maximum asset amount allowed to participate in that tier. + */ + event TierTokenLimitUpdated(address indexed _initiator, uint256 _tierID, uint256 _minAmount, uint256 _maxAmount); + + /** + * @notice Emitted when Tier Token Amount Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _remainingTokens The maximum number of tokens allowed to be sold in the tier. + */ + event TierTokenAmountUpdated(address indexed _initiator, uint256 _tierID, uint256 _remainingTokens); + + /** + * @notice Emitted when Tier Time Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _saleStartTS The Tier Sale Start Timestamp. + * @param _saleEnd The Tier Sale End Duration or Timestamp. + * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. + */ + event TierTimeUpdated(address indexed _initiator, uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, SaleEndDurationOrTS indexed _saleEndDurationOrTS); + + /** + * @notice Emitted when Tier Vesting/Lock Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _vestOrLockCliff The Vest/Lock Cliff in Seconds. + * @param _vestOrLockDuration The Vest/Lock Duration in Seconds. + * @param _unlockedTokenWithdrawTS The unlocked token withdraw timestamp. + * @param _unlockedBP The unlocked token amount in BP. + * @param _transferType The Tier Transfer Type for the Tier. + */ + event TierVestOrLockUpdated(address indexed _initiator, uint256 _tierID, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, TransferType indexed _transferType); + + /** + * @notice Emitted when Tier Deposit Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _depositRate The rate is the, asset * rate = token. + * @param _depositToken The token for that particular Tier Sale. + * @param _depositType The type of deposit for the particular sale. + */ + event TierDepositUpdated(address indexed _initiator, uint256 _tierID, uint256 _depositRate, address _depositToken, DepositType indexed _depositType); + + /** + * @notice Emitted when the Tier Verification are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _verificationType The type of verification for the particular sale. + */ + event TierVerificationUpdated(address indexed _initiator, uint256 _tierID, VerificationType _verificationType); + + /** + * @notice Emitted when the Tier Sale Ends. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + */ + event TierSaleEnded(address indexed _initiator, uint256 _tierID); + + /** + * @notice Emitted when the Tier Sale Minimum Deposit Amount is updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + */ + event TierSaleUpdatedMinimum(address indexed _initiator, uint256 _tierID); + + /** + * @notice Emitted when the Tier Sale Maximum Deposit Amount is updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _updatedMaxAmount The updated max amount for the Tier. + */ + event TierSaleUpdatedMaximum(address indexed _initiator, uint256 _tierID, uint256 _updatedMaxAmount); + + /** + * @notice Emitted when a user buys. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _tokensBought The amount of tokens bought. + */ + event TokenBuy(address indexed _initiator, uint256 _tierID, uint256 _tokensBought); + + /** + * @notice Emitted when depositAddress or Owner withdraws a tier proceedings. + * @param _initiator The one who initiates this event. + * @param _receiver The one who receives the proceedings. + * @param _tierID The Tier ID of which the proceeding is withdrawn. + * @param _depositType The type of withdraw (RBTC or Token). + * @param _amount The amount of withdraw. + */ + event ProceedingWithdrawn(address indexed _initiator, address indexed _receiver, uint256 _tierID, DepositType _depositType, uint256 _amount); + +} From d00528da0d28ab65c962f28865d24d9d2e180a72 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:03:18 +0530 Subject: [PATCH 004/112] Origins Storage Added --- contracts/OriginsStorage.sol | 112 +++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 contracts/OriginsStorage.sol diff --git a/contracts/OriginsStorage.sol b/contracts/OriginsStorage.sol new file mode 100644 index 0000000..e5a54ca --- /dev/null +++ b/contracts/OriginsStorage.sol @@ -0,0 +1,112 @@ +pragma solidity ^0.5.17; + +import "./OriginsAdmin.sol"; +import "./Interfaces/IERC20.sol"; +import "./Openzeppelin/SafeMath.sol"; +import "./Interfaces/ILockedFund.sol"; + +/** + * @title A storage contract for Origins Platform. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice This plays as the harddisk for the Origins Platform. + */ +contract OriginsStorage is OriginsAdmin{ + using SafeMath for uint256; + + /* Storage */ + + /// @notice This determines the number of tiers in the system. When creating a tier, it should always start at 1. + uint256 internal tierCount; + /// @notice The maximum allowed Basis Point. + uint256 constant MAX_BASIS_POINT = 10000; + + /// @notice The address to deposit the raised amount. If not set, will be holded in this contract itself, withdrawable by any owner. + address payable internal depositAddress; + /// @notice The token which is being sold. + IERC20 internal token; + /// @notice The Locked Fund contract. + ILockedFund internal lockedFund; + + /** + * @notice The method by which users will be depositing in each tier. + * RBTC - The deposit will be made in RBTC. + * Token - The deposit will be made in any ERC20 Token set in depositToken in Tier Struct. + */ + enum DepositType { RBTC, Token } + /** + * @notice The method by which we determine whether the sale ended or not. + * None - This type is not set, so no one is allowed for sale yet. + * UntilSupply - This type is set to allow sale until each tier runs out of token. + * Duration - This type is set to allow sale until a particular duration. + * Timestamp - This type is set to allow sale until a particular timestamp. + */ + enum SaleEndDurationOrTS { None, UntilSupply, Duration, Timestamp } + /** + * @notice The method by which the verification is happening. + * None - The type is not set, so no one is approved for sale. + * Everyone - This type is set to allow everyone. + * ByAddress - This type is set to allow only verified addresses. + */ + enum VerificationType { None, Everyone, ByAddress } + /** + * @notice The method by which the distribution is happening. + * None - The distribution is not set yet, so tokens remain in the contract. + * Unlocked - The tokens are distributed right away. + * WaitedUnlock - The tokens are withdrawable from this contract after a certain period. + * Vested - The tokens are vested (based on the contracts from Sovryn) for a certain period. + * Locked - The tokens are locked without any benefit based on cliff and duration. + */ + enum TransferType { None, Unlocked, WaitedUnlock, Vested, Locked } + + /// @notice The tiers based on the tier id, taken from tier count. + mapping(uint256 => Tier) internal tiers; + + /// @notice The below would have been added to Struct `Tier` if the parameter list was not reaching the higher limits. + /// @notice The address to tier ID to uint mapping which contains the amount of tokens bought by that particular address. + mapping(address => mapping(uint256 => uint256)) internal tokensBoughtByAddressOnTier; + /// @notice Contains the number of unique wallets who participated in the sale in a particular Tier. + mapping(uint256 => uint256) internal participatingWalletCountPerTier; + /// @notice Contains the amount of tokens sold in a particular Tier. + mapping(uint256 => uint256) internal tokensSoldPerTier; + /// @notice Contains if a tier sale ended or not. + mapping(uint256 => bool) internal tierSaleEnded; + + /// @notice The address to uint to bool mapping to see if the particular address is eligible or not for a tier. + mapping(address => mapping(uint256 => bool)) internal addressApproved; + + /** + * @notice The Tier Structure. + * minAmount - The minimum amount which can be deposited. + * maxAmount - The maximum amount which can be deposited. + * remainingTokens - Contains the remaining tokens for sale. + * saleStartTS - Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * saleEnd - Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * unlockedTokenWithdrawTS - Contains the timestamp for the waited unlocked tokens to be withdrawn. + * unlockBP - Contains the unlock amount in Basis Point for Vesting/Lock. + * vestOrLockCliff - Contains the cliff of the vesting/lock for distribution. + * vestOrLockDuration - Contains the duration of the vesting/lock for distribution. + * depositRate - Contains the rate of the token w.r.t. the depositing asset. + * depositToken - Contains the deposit token address if the deposit type is Token. + * verificationType - Contains the method by which verification happens. + * saleEndDurationOrTS - Contains whether end of sale is by Duration or Timestamp. + * transferType - Contains the type of token transfer after a user buys to get the tokens. + */ + struct Tier { + uint256 minAmount; + uint256 maxAmount; + uint256 remainingTokens; + uint256 saleStartTS; + uint256 saleEnd; + uint256 unlockedTokenWithdrawTS; + uint256 unlockedBP; + uint256 vestOrLockCliff; + uint256 vestOrLockDuration; + uint256 depositRate; + IERC20 depositToken; + DepositType depositType; + VerificationType verificationType; + SaleEndDurationOrTS saleEndDurationOrTS; + TransferType transferType; + } + +} From a6df42e4543c5a66a2b84b84196912f1fd1b0dd2 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:03:41 +0530 Subject: [PATCH 005/112] Locked Fund v0.1 Added --- contracts/LockedFund.sol | 503 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 503 insertions(+) create mode 100644 contracts/LockedFund.sol diff --git a/contracts/LockedFund.sol b/contracts/LockedFund.sol new file mode 100644 index 0000000..d9e19e8 --- /dev/null +++ b/contracts/LockedFund.sol @@ -0,0 +1,503 @@ +pragma solidity ^0.5.17; + +import "./Interfaces/IERC20.sol"; +import "./Interfaces/ILockedFund.sol"; +import "./Openzeppelin/SafeMath.sol"; +import "./Interfaces/IVestingLogic.sol"; +import "./Interfaces/IVestingRegistry.sol"; + +/** + * @title A holding contract for Locked Fund. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice You can use this contract for timed token release from Locked Fund. + * @dev This is not the final form of this contract. + */ +contract LockedFund is ILockedFund { + using SafeMath for uint256; + + /* Storage */ + + /// @notice The time after which waited unlock balance can be withdrawn. + uint256 public waitedTS; + + /// @notice The maximum basis point which is allowed. + uint256 internal constant MAX_BASIS_POINT = 10000; + /// @notice The maximum duration allowed for staking. + uint256 internal constant MAX_DURATION = 37; + /// @notice The interval duration. + uint256 public constant INTERVAL = 4 weeks; + + /// @notice The token contract. + IERC20 public token; + /// @notice The Vesting registry contract. + IVestingRegistry public vestingRegistry; + + /// @notice The vested balances. + mapping(address => uint256) public vestedBalances; + /// @notice The locked user balances. Not used right now. + mapping(address => uint256) public lockedBalances; + /// @notice The waited unlocked user balances. + mapping(address => uint256) public waitedUnlockedBalances; + /// @notice The unlocked user balances. Not used right now. + mapping(address => uint256) public unlockedBalances; + /// @notice The contracts/wallets with admin power. + mapping(address => bool) public isAdmin; + + /// @notice The Cliff specified for an address. + mapping(address => uint256) public cliff; + /// @notice The Duration specified for an address. + mapping(address => uint256) public duration; + + /* Events */ + + /** + * @notice Emitted when a new Admin is added to the admin list. + * @param _initiator The address which initiated this event to be emitted. + * @param _newAdmin The address of the new admin. + */ + event AdminAdded(address indexed _initiator, address indexed _newAdmin); + + /** + * @notice Emitted when an admin is removed from the admin list. + * @param _initiator The address which initiated this event to be emitted. + * @param _removedAdmin The address of the removed admin. + */ + event AdminRemoved(address indexed _initiator, address indexed _removedAdmin); + + /** + * @notice Emitted when Vesting Registry is updated. + * @param _initiator The address which initiated this event to be emitted. + * @param _vestingRegistry The Vesting Registry Contract. + */ + event VestingRegistryUpdated(address indexed _initiator, address indexed _vestingRegistry); + + /** + * @notice Emitted when Waited Timestamp is updated. + * @param _initiator The address which initiated this event to be emitted. + * @param _waitedTS The waited timestamp. + */ + event WaitedTSUpdated(address indexed _initiator, uint256 _waitedTS); + + /** + * @notice Emitted when a new deposit is made. + * @param _initiator The address which initiated this event to be emitted. + * @param _userAddress The user to whose un/locked balance a new deposit was made. + * @param _amount The amount of Token to be added to the un/locked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point) which determines how much will be unlocked immediately. + */ + event VestedDeposited(address indexed _initiator, address indexed _userAddress, uint256 _amount, uint256 _cliff, uint256 _duration, uint256 _basisPoint); + + /** + * @notice Emitted when a user withdraws the fund. + * @param _initiator The address which initiated this event to be emitted. + * @param _userAddress The user whose unlocked balance has to be withdrawn. + * @param _amount The amount of Token withdrawn from the unlocked balance. + */ + event Withdrawn(address indexed _initiator, address indexed _userAddress, uint256 _amount); + + /** + * @notice Emitted when a user creates a vesting for himself. + * @param _initiator The address which initiated this event to be emitted. + * @param _userAddress The user whose unlocked balance has to be withdrawn. + * @param _vesting The Vesting Contract. + */ + event VestingCreated(address indexed _initiator, address indexed _userAddress, address indexed _vesting); + + /** + * @notice Emitted when a user stakes tokens. + * @param _initiator The address which initiated this event to be emitted. + * @param _vesting The Vesting Contract. + * @param _amount The amount of locked tokens staked by the user. + */ + event TokenStaked(address indexed _initiator, address indexed _vesting, uint256 _amount); + + /* Modifiers */ + + /** + * @notice Modifier to check only admin is allowed for certain functions. + */ + modifier onlyAdmin { + require(isAdmin[msg.sender], "Only admin can call this."); + _; + } + + /* Functions */ + + /** + * @notice Setup the required parameters. + * @param _waitedTS The time after which unlocked token balance withdrawal is allowed. + * @param _token The Token Address. + * @param _vestingRegistry The Vesting Registry Address. + * @param _admins The list of Admins to be added. + */ + constructor( + uint256 _waitedTS, + address _token, + address _vestingRegistry, + address[] memory _admins + ) public { + require(_waitedTS != 0, "LockedFund: Waited TS cannot be zero."); + require(_token != address(0), "LockedFund: Invalid Token Address."); + require(_vestingRegistry != address(0), "LockedFund: Vesting registry address is invalid."); + + waitedTS = _waitedTS; + token = IERC20(_token); + vestingRegistry = IVestingRegistry(_vestingRegistry); + + for (uint256 index = 0; index < _admins.length; index++) { + require(_admins[index] != address(0), "LockedFund: Invalid Address."); + isAdmin[_admins[index]] = true; + emit AdminAdded(msg.sender, _admins[index]); + } + } + + /* Public or External Functions */ + + /** + * @notice The function to add a new admin. + * @param _newAdmin The address of the new admin. + * @dev Only callable by an Admin. + */ + function addAdmin(address _newAdmin) external onlyAdmin { + _addAdmin(_newAdmin); + } + + /** + * @notice The function to remove an admin. + * @param _adminToRemove The address of the admin which should be removed. + * @dev Only callable by an Admin. + */ + function removeAdmin(address _adminToRemove) external onlyAdmin { + _removeAdmin(_adminToRemove); + } + + /** + * @notice The function to update the Vesting Registry, Duration and Cliff. + * @param _vestingRegistry The Vesting Registry Address. + */ + function changeVestingRegistry(address _vestingRegistry) public onlyAdmin { + _changeVestingRegistry(_vestingRegistry); + } + + /** + * @notice The function used to update the waitedTS. + * @param _waitedTS The timestamp after which withdrawal is allowed. + */ + function changeWaitedTS(uint256 _waitedTS) public onlyAdmin { + _changeWaitedTS(_waitedTS); + } + + /** + * @notice Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point)which determines how much will be unlocked immediately. + * @dev Future iteration will have choice between waited unlock and immediate unlock. + */ + function depositVested( + address _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint + ) public onlyAdmin { + _depositVested(_userAddress, _amount, _cliff, _duration, _basisPoint); + } + + /** + * @notice A function to withdraw the waited unlocked balance. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function withdrawWaitedUnlockedBalance(address _receiverAddress) external { + _withdrawWaitedUnlockedBalance(msg.sender, _receiverAddress); + } + + /** + * @notice Creates vesting if not already created and Stakes tokens for a user. + * @dev Only use this function if the `duration` is small. + */ + function createVestingAndStake() external { + _createVestingAndStake(msg.sender); + } + + /** + * @notice Creates vesting contract (if it hasn't been created yet) for the calling user. + * @return _vestingAddress The New Vesting Contract Created. + */ + function createVesting() external returns (address _vestingAddress) { + _vestingAddress = _createVesting(msg.sender); + } + + /** + * @notice Stakes tokens for a user who already have a vesting created. + * @dev The user should already have a vesting created, else this function will throw error. + */ + function stakeTokens() external { + IVestingLogic vesting = IVestingLogic(_getVesting(msg.sender)); + + require(cliff[msg.sender] == vesting.cliff() && duration[msg.sender] == vesting.duration(), "LockedFund: Wrong Vesting Schedule."); + + _stakeTokens(msg.sender, address(vesting)); + } + + /** + * @notice Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function withdrawAndStakeTokens(address _receiverAddress) external { + _withdrawWaitedUnlockedBalance(msg.sender, _receiverAddress); + _createVestingAndStake(msg.sender); + } + + /** + * @notice Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created. + * @param _userAddress The address of user tokens will be withdrawn. + */ + function withdrawAndStakeTokensFrom(address _userAddress) external { + _withdrawWaitedUnlockedBalance(_userAddress, _userAddress); + _createVestingAndStake(_userAddress); + } + + /* Internal Functions */ + + /** + * @notice Internal function to add a new admin. + * @param _newAdmin The address of the new admin. + */ + function _addAdmin(address _newAdmin) internal { + require(_newAdmin != address(0), "LockedFund: Invalid Address."); + require(!isAdmin[_newAdmin], "LockedFund: Address is already admin."); + isAdmin[_newAdmin] = true; + + emit AdminAdded(msg.sender, _newAdmin); + } + + /** + * @notice Internal function to remove an admin. + * @param _adminToRemove The address of the admin which should be removed. + * @dev Only callable by an Admin. + */ + function _removeAdmin(address _adminToRemove) public onlyAdmin { + require(isAdmin[_adminToRemove], "LockedFund: Address is not an admin."); + isAdmin[_adminToRemove] = false; + + emit AdminRemoved(msg.sender, _adminToRemove); + } + + /** + * @notice Internal function to update the Vesting Registry, Duration and Cliff. + * @param _vestingRegistry The Vesting Registry Address. + */ + function _changeVestingRegistry(address _vestingRegistry) internal { + require(_vestingRegistry != address(0), "LockedFund: Vesting registry address is invalid."); + + vestingRegistry = IVestingRegistry(_vestingRegistry); + + emit VestingRegistryUpdated(msg.sender, _vestingRegistry); + } + + /** + * @notice Internal function used to update the waitedTS. + * @param _waitedTS The timestamp after which withdrawal is allowed. + */ + function _changeWaitedTS(uint256 _waitedTS) internal { + require(_waitedTS != 0, "LockedFund: Waited TS cannot be zero."); + + waitedTS = _waitedTS; + + emit WaitedTSUpdated(msg.sender, _waitedTS); + } + + /** + * @notice Internal function to add Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point)which determines how much will be unlocked immediately. + */ + function _depositVested( + address _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint + ) internal { + /// If duration is also zero, then it is similar to Unlocked Token. + require(_duration != 0, "LockedFund: Duration cannot be zero."); + require(_duration < MAX_DURATION, "LockedFund: Duration is too long."); + + // MAX_BASIS_POINT is not included because if 100% is unlocked, then this function is not required to be used. + require(_basisPoint < MAX_BASIS_POINT, "LockedFund: Basis Point has to be less than 10000."); + bool txStatus = token.transferFrom(msg.sender, address(this), _amount); + require(txStatus, "LockedFund: Token transfer was not successful. Check receiver address."); + + uint256 waitedUnlockedBal = _amount.mul(_basisPoint).div(MAX_BASIS_POINT); + + waitedUnlockedBalances[_userAddress] = waitedUnlockedBalances[_userAddress].add(waitedUnlockedBal); + vestedBalances[_userAddress] = vestedBalances[_userAddress].add(_amount).sub(waitedUnlockedBal); + + cliff[_userAddress] = _cliff * INTERVAL; + duration[_userAddress] = _duration * INTERVAL; + + emit VestedDeposited(msg.sender, _userAddress, _amount, _cliff, _duration, _basisPoint); + } + + /** + * @notice A function to withdraw the waited unlocked balance. + * @param _sender The one who initiates the call, from this user the balance will be taken. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function _withdrawWaitedUnlockedBalance(address _sender, address _receiverAddress) internal { + require(waitedTS != 0, "LockedFund: Waited TS not set yet."); + require(waitedTS < block.timestamp, "LockedFund: Wait Timestamp not yet passed."); + + address userAddr = _receiverAddress; + if (_receiverAddress == address(0)) { + userAddr = _sender; + } + + uint256 amount = waitedUnlockedBalances[_sender]; + waitedUnlockedBalances[_sender] = 0; + + bool txStatus = token.transfer(userAddr, amount); + require(txStatus, "LockedFund: Token transfer was not successful. Check receiver address."); + + emit Withdrawn(_sender, userAddr, amount); + } + + /** + * @notice Creates a Vesting Contract for a user. + * @param _tokenOwner The owner of the vesting contract. + * @return _vestingAddress The Vesting Contract Address. + * @dev Does not do anything if Vesting Contract was already created. + */ + function _createVesting(address _tokenOwner) internal returns (address _vestingAddress) { + require(cliff[msg.sender] != 0 && duration[msg.sender] != 0, "LockedFund: Cliff and/or Duration not set."); + /// Here zero is given in place of amount, as amount is not really used in `vestingRegistry.createVesting()`. + vestingRegistry.createVesting(_tokenOwner, 0, cliff[_tokenOwner], duration[_tokenOwner]); + _vestingAddress = _getVesting(_tokenOwner); + emit VestingCreated(msg.sender, _tokenOwner, _vestingAddress); + } + + /** + * @notice Internal function to create vesting if not already created and Stakes tokens for a user. + */ + function _createVestingAndStake(address _sender) internal { + address vestingAddr = _getVesting(_sender); + + if (vestingAddr == address(0)) { + vestingAddr = _createVesting(_sender); + } + + _stakeTokens(_sender, vestingAddr); + } + + /** + * @notice Returns the Vesting Contract Address. + * @param _tokenOwner The owner of the vesting contract. + * @return _vestingAddress The Vesting Contract Address. + */ + function _getVesting(address _tokenOwner) internal view returns (address _vestingAddress) { + return vestingRegistry.getVesting(_tokenOwner); + } + + /** + * @notice Stakes the tokens in a particular vesting contract. + * @param _vesting The Vesting Contract Address. + */ + function _stakeTokens(address _sender, address _vesting) internal { + uint256 amount = lockedBalances[_sender]; + lockedBalances[_sender] = 0; + + require(token.approve(_vesting, amount), "LockedFund: Approve failed."); + IVestingLogic(_vesting).stakeTokens(amount); + + emit TokenStaked(_sender, _vesting, amount); + } + + /* Getter or Read Functions */ + + /** + * @notice Function to read the waited timestamp. + * @return The waited timestamp. + */ + function getWaitedTS() external view returns (uint256) { + return waitedTS; + } + + /** + * @notice Function to read the token on sale. + * @return The Token contract address which is being sold in the contract. + */ + function getToken() public view returns(address) { + return address(token); + } + + /** + * @notice Function to read the vesting registry. + * @return Address of Vesting Registry. + */ + function getVestingDetails() public view returns(address) { + return address(vestingRegistry); + } + + /** + * @notice The function to get the vested balance of a user. + * @param _addr The address of the user to check the vested balance. + * @return _balance The vested balance of the address `_addr`. + */ + function vestedBalance(address _addr) external view returns (uint256 _balance) { + return vestedBalances[_addr]; + } + + /** + * @notice The function to get the locked balance of a user. + * @param _addr The address of the user to check the locked balance. + * @return _balance The locked balance of the address `_addr`. + */ + function getLockedBalance(address _addr) external view returns (uint256 _balance) { + return lockedBalances[_addr]; + } + + /** + * @notice The function to get the waited unlocked balance of a user. + * @param _addr The address of the user to check the waited unlocked balance. + * @return _balance The waited unlocked balance of the address `_addr`. + */ + function getWaitedUnlockedBalance(address _addr) external view returns (uint256 _balance) { + return waitedUnlockedBalances[_addr]; + } + + /** + * @notice The function to get the unlocked balance of a user. + * @param _addr The address of the user to check the unlocked balance. + * @return _balance The unlocked balance of the address `_addr`. + */ + function getUnlockedBalance(address _addr) external view returns (uint256 _balance) { + return unlockedBalances[_addr]; + } + + /** + * @notice The function to check is an address is admin or not. + * @param _addr The address of the user to check the admin status. + * @return _status True if admin, False otherwise. + */ + function adminStatus(address _addr) external view returns (bool _status) { + return isAdmin[_addr]; + } + + /** + * @notice Function to read the cliff and duration of a user. + * @param _addr The address whose cliff and duration has to be found. + * @return The cliff of the user vesting/lock. + * @return The duration of the user vesting/lock. + */ + function getCliffAndDuration(address _addr) external view returns(uint256, uint256) { + return (cliff[_addr], duration[_addr]); + } +} From 8f0e0837f58044fe5da7fd004af807b395c3ec4e Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:04:28 +0530 Subject: [PATCH 006/112] Openzeppelin Helpers Added --- contracts/Openzeppelin/Address.sol | 73 +++++++ contracts/Openzeppelin/Context.sol | 28 +++ contracts/Openzeppelin/ERC20.sol | 242 +++++++++++++++++++++ contracts/Openzeppelin/ERC20Detailed.sol | 58 +++++ contracts/Openzeppelin/IERC20_.sol | 80 +++++++ contracts/Openzeppelin/Ownable.sol | 66 ++++++ contracts/Openzeppelin/ReentrancyGuard.sol | 36 +++ contracts/Openzeppelin/SafeMath.sol | 198 +++++++++++++++++ 8 files changed, 781 insertions(+) create mode 100644 contracts/Openzeppelin/Address.sol create mode 100644 contracts/Openzeppelin/Context.sol create mode 100644 contracts/Openzeppelin/ERC20.sol create mode 100644 contracts/Openzeppelin/ERC20Detailed.sol create mode 100644 contracts/Openzeppelin/IERC20_.sol create mode 100644 contracts/Openzeppelin/Ownable.sol create mode 100644 contracts/Openzeppelin/ReentrancyGuard.sol create mode 100644 contracts/Openzeppelin/SafeMath.sol diff --git a/contracts/Openzeppelin/Address.sol b/contracts/Openzeppelin/Address.sol new file mode 100644 index 0000000..4b03e3a --- /dev/null +++ b/contracts/Openzeppelin/Address.sol @@ -0,0 +1,73 @@ +pragma solidity >=0.5.0 <0.6.0; + +/** + * @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 + * ==== + */ + function isContract(address account) internal view returns (bool) { + // According to EIP-1052, 0x0 is the value returned for not-yet created accounts + // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned + // for accounts without code, i.e. `keccak256('')` + bytes32 codehash; + bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; + // solhint-disable-next-line no-inline-assembly + assembly { + codehash := extcodehash(account) + } + return (codehash != accountHash && codehash != 0x0); + } + + /** + * @dev Converts an `address` into `address payable`. Note that this is + * simply a type cast: the actual underlying value is not changed. + * + * _Available since v2.4.0._ + */ + function toPayable(address account) internal pure returns (address payable) { + return address(uint160(account)); + } + + /** + * @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]. + * + * _Available since v2.4.0._ + */ + function sendValue(address recipient, uint256 amount) internal { + require(address(this).balance >= amount, "Address: insufficient balance"); + + // solhint-disable-next-line avoid-call-value + (bool success, ) = recipient.call.value(amount)(""); + require(success, "Address: unable to send value, recipient may have reverted"); + } +} diff --git a/contracts/Openzeppelin/Context.sol b/contracts/Openzeppelin/Context.sol new file mode 100644 index 0000000..6328c70 --- /dev/null +++ b/contracts/Openzeppelin/Context.sol @@ -0,0 +1,28 @@ +pragma solidity >=0.5.0 <0.6.0; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +contract Context { + // Empty internal constructor, to prevent people from mistakenly deploying + // an instance of this contract, which should be used via inheritance. + constructor() internal {} + + // solhint-disable-previous-line no-empty-blocks + + function _msgSender() internal view returns (address payable) { + return msg.sender; + } + + function _msgData() internal view returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/contracts/Openzeppelin/ERC20.sol b/contracts/Openzeppelin/ERC20.sol new file mode 100644 index 0000000..31255a4 --- /dev/null +++ b/contracts/Openzeppelin/ERC20.sol @@ -0,0 +1,242 @@ +pragma solidity ^0.5.0; + +import "./Context.sol"; +import "./IERC20_.sol"; +import "./SafeMath.sol"; + +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using {_mint}. + * For a generic mechanism see {ERC20Mintable}. + * + * TIP: For a detailed writeup see our guide + * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * We have followed general OpenZeppelin guidelines: functions revert instead + * of returning `false` on failure. This behavior is nonetheless conventional + * and does not conflict with the expectations of ERC20 applications. + * + * Additionally, an {Approval} event is emitted on calls to {transferFrom}. + * This allows applications to reconstruct the allowance for all accounts just + * by listening to said events. Other implementations of the EIP may not emit + * these events, as it isn't required by the specification. + * + * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} + * functions have been added to mitigate the well-known issues around setting + * allowances. See {IERC20-approve}. + */ +contract ERC20 is Context, IERC20_ { + using SafeMath for uint256; + + mapping(address => uint256) private _balances; + + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 private _totalSupply; + + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public view returns (uint256) { + return _totalSupply; + } + + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public view returns (uint256) { + return _balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `recipient` cannot be the zero address. + * - the caller must have a balance of at least `amount`. + */ + function transfer(address recipient, uint256 amount) public returns (bool) { + _transfer(_msgSender(), recipient, amount); + return true; + } + + /** + * @dev See {IERC20-allowance}. + */ + function allowance(address owner, address spender) public view returns (uint256) { + return _allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 amount) public returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /** + * @dev See {IERC20-transferFrom}. + * + * Emits an {Approval} event indicating the updated allowance. This is not + * required by the EIP. See the note at the beginning of {ERC20}; + * + * Requirements: + * - `sender` and `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + * - the caller must have allowance for `sender`'s tokens of at least + * `amount`. + */ + function transferFrom( + address sender, + address recipient, + uint256 amount + ) public returns (bool) { + _transfer(sender, recipient, amount); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); + return true; + } + + /** + * @dev Atomically increases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); + return true; + } + + /** + * @dev Atomically decreases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `spender` must have allowance for the caller of at least + * `subtractedValue`. + */ + function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); + return true; + } + + /** + * @dev Moves tokens `amount` from `sender` to `recipient`. + * + * This is internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * Requirements: + * + * - `sender` cannot be the zero address. + * - `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + */ + function _transfer( + address sender, + address recipient, + uint256 amount + ) internal { + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); + emit Transfer(sender, recipient, amount); + } + + /** @dev Creates `amount` tokens and assigns them to `account`, increasing + * the total supply. + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * Requirements + * + * - `to` cannot be the zero address. + */ + function _mint(address account, uint256 amount) internal { + require(account != address(0), "ERC20: mint to the zero address"); + + _totalSupply = _totalSupply.add(amount); + _balances[account] = _balances[account].add(amount); + emit Transfer(address(0), account, amount); + } + + /** + * @dev Destroys `amount` tokens from `account`, reducing the + * total supply. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * Requirements + * + * - `account` cannot be the zero address. + * - `account` must have at least `amount` tokens. + */ + function _burn(address account, uint256 amount) internal { + require(account != address(0), "ERC20: burn from the zero address"); + + _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); + _totalSupply = _totalSupply.sub(amount); + emit Transfer(account, address(0), amount); + } + + /** + * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. + * + * This is internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + */ + function _approve( + address owner, + address spender, + uint256 amount + ) internal { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @dev Destroys `amount` tokens from `account`.`amount` is then deducted + * from the caller's allowance. + * + * See {_burn} and {_approve}. + */ + function _burnFrom(address account, uint256 amount) internal { + _burn(account, amount); + _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); + } +} diff --git a/contracts/Openzeppelin/ERC20Detailed.sol b/contracts/Openzeppelin/ERC20Detailed.sol new file mode 100644 index 0000000..0afdbc5 --- /dev/null +++ b/contracts/Openzeppelin/ERC20Detailed.sol @@ -0,0 +1,58 @@ +pragma solidity ^0.5.0; + +import "./IERC20_.sol"; + +/** + * @dev Optional functions from the ERC20 standard. + */ +contract ERC20Detailed is IERC20_ { + string private _name; + string private _symbol; + uint8 private _decimals; + + /** + * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of + * these values are immutable: they can only be set once during + * construction. + */ + constructor( + string memory name, + string memory symbol, + uint8 decimals + ) public { + _name = name; + _symbol = symbol; + _decimals = decimals; + } + + /** + * @dev Returns the name of the token. + */ + function name() public view returns (string memory) { + return _name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view returns (string memory) { + return _symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * For example, if `decimals` equals `2`, a balance of `505` tokens should + * be displayed to a user as `5,05` (`505 / 10 ** 2`). + * + * Tokens usually opt for a value of 18, imitating the relationship between + * Ether and Wei. + * + * NOTE: This information is only used for _display_ purposes: it in + * no way affects any of the arithmetic of the contract, including + * {IERC20-balanceOf} and {IERC20-transfer}. + */ + function decimals() public view returns (uint8) { + return _decimals; + } +} diff --git a/contracts/Openzeppelin/IERC20_.sol b/contracts/Openzeppelin/IERC20_.sol new file mode 100644 index 0000000..6f1c85e --- /dev/null +++ b/contracts/Openzeppelin/IERC20_.sol @@ -0,0 +1,80 @@ +pragma solidity ^0.5.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. Does not include + * the optional functions; to access them see {ERC20Detailed}. + */ +interface IERC20_ { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/contracts/Openzeppelin/Ownable.sol b/contracts/Openzeppelin/Ownable.sol new file mode 100644 index 0000000..79f1cc6 --- /dev/null +++ b/contracts/Openzeppelin/Ownable.sol @@ -0,0 +1,66 @@ +pragma solidity >=0.5.0 <0.6.0; + +import "./Context.sol"; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() internal { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(isOwner(), "unauthorized"); + _; + } + + /** + * @dev Returns true if the caller is the current owner. + */ + function isOwner() public view returns (bool) { + return _msgSender() == _owner; + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public onlyOwner { + _transferOwnership(newOwner); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + */ + function _transferOwnership(address newOwner) internal { + require(newOwner != address(0), "Ownable: new owner is the zero address"); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/contracts/Openzeppelin/ReentrancyGuard.sol b/contracts/Openzeppelin/ReentrancyGuard.sol new file mode 100644 index 0000000..1b10584 --- /dev/null +++ b/contracts/Openzeppelin/ReentrancyGuard.sol @@ -0,0 +1,36 @@ +pragma solidity >=0.5.0 <0.6.0; + +/** + * @title Helps contracts guard against reentrancy attacks. + * @author Remco Bloemen , Eenae + * @dev If you mark a function `nonReentrant`, you should also + * mark it `external`. + */ +contract ReentrancyGuard { + /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs. + /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056 + uint256 internal constant REENTRANCY_GUARD_FREE = 1; + + /// @dev Constant for locked guard state + uint256 internal constant REENTRANCY_GUARD_LOCKED = 2; + + /** + * @dev We use a single lock for the whole contract. + */ + uint256 internal reentrancyLock = REENTRANCY_GUARD_FREE; + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * If you mark a function `nonReentrant`, you should also + * mark it `external`. Calling one `nonReentrant` function from + * another is not supported. Instead, you can implement a + * `private` function doing the actual work, and an `external` + * wrapper marked as `nonReentrant`. + */ + modifier nonReentrant() { + require(reentrancyLock == REENTRANCY_GUARD_FREE, "nonReentrant"); + reentrancyLock = REENTRANCY_GUARD_LOCKED; + _; + reentrancyLock = REENTRANCY_GUARD_FREE; + } +} diff --git a/contracts/Openzeppelin/SafeMath.sol b/contracts/Openzeppelin/SafeMath.sol new file mode 100644 index 0000000..c94909f --- /dev/null +++ b/contracts/Openzeppelin/SafeMath.sol @@ -0,0 +1,198 @@ +pragma solidity >=0.5.0 <0.6.0; + +/** + * @dev Wrappers over Solidity's arithmetic operations with added overflow + * checks. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * `SafeMath` restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + */ +library SafeMath { + /** + * @dev Returns the addition of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * - Addition cannot overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, "SafeMath: addition overflow"); + + return c; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot overflow. + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + return sub(a, b, "SafeMath: subtraction overflow"); + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting with custom message on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot overflow. + * + * _Available since v2.4.0._ + */ + function sub( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + require(b <= a, errorMessage); + uint256 c = a - b; + + return c; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * - Multiplication cannot overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b, "SafeMath: multiplication overflow"); + + return c; + } + + /** + * @dev Returns the integer division of two unsigned integers. Reverts on + * division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + return div(a, b, "SafeMath: division by zero"); + } + + /** + * @dev Returns the integer division of two unsigned integers. Reverts with custom message on + * division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + * + * _Available since v2.4.0._ + */ + function div( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + // Solidity only automatically asserts when dividing by 0 + require(b != 0, errorMessage); + uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } + + /** + * @dev Integer division of two numbers, rounding up and truncating the quotient + */ + function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { + return divCeil(a, b, "SafeMath: division by zero"); + } + + /** + * @dev Integer division of two numbers, rounding up and truncating the quotient + */ + function divCeil( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + // Solidity only automatically asserts when dividing by 0 + require(b != 0, errorMessage); + + if (a == 0) { + return 0; + } + uint256 c = ((a - 1) / b) + 1; + + return c; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + return mod(a, b, "SafeMath: modulo by zero"); + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts with custom message when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + * + * _Available since v2.4.0._ + */ + function mod( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + require(b != 0, errorMessage); + return a % b; + } + + function min256(uint256 _a, uint256 _b) internal pure returns (uint256) { + return _a < _b ? _a : _b; + } +} From c3fbb5d178067a27764e73e00598acbd069e524b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:05:16 +0530 Subject: [PATCH 007/112] Interfaces Added --- contracts/Interfaces/IERC20.sol | 31 ++++++++ contracts/Interfaces/ILockedFund.sol | 90 +++++++++++++++++++++++ contracts/Interfaces/IOrigins.sol | 11 +++ contracts/Interfaces/IVestingLogic.sol | 35 +++++++++ contracts/Interfaces/IVestingRegistry.sol | 30 ++++++++ 5 files changed, 197 insertions(+) create mode 100644 contracts/Interfaces/IERC20.sol create mode 100644 contracts/Interfaces/ILockedFund.sol create mode 100644 contracts/Interfaces/IOrigins.sol create mode 100644 contracts/Interfaces/IVestingLogic.sol create mode 100644 contracts/Interfaces/IVestingRegistry.sol diff --git a/contracts/Interfaces/IERC20.sol b/contracts/Interfaces/IERC20.sol new file mode 100644 index 0000000..268d593 --- /dev/null +++ b/contracts/Interfaces/IERC20.sol @@ -0,0 +1,31 @@ +/** + * Copyright 2017-2021, bZeroX, LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0. + */ + +pragma solidity >=0.5.0 <0.6.0; + +contract IERC20 { + string public name; + uint8 public decimals; + string public symbol; + + function totalSupply() public view returns (uint256); + + function balanceOf(address _who) public view returns (uint256); + + function allowance(address _owner, address _spender) public view returns (uint256); + + function approve(address _spender, uint256 _value) public returns (bool); + + function transfer(address _to, uint256 _value) public returns (bool); + + function transferFrom( + address _from, + address _to, + uint256 _value + ) public returns (bool); + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/contracts/Interfaces/ILockedFund.sol b/contracts/Interfaces/ILockedFund.sol new file mode 100644 index 0000000..dcade20 --- /dev/null +++ b/contracts/Interfaces/ILockedFund.sol @@ -0,0 +1,90 @@ +pragma solidity ^0.5.17; + +/** + * @title An interface of Locked Fund Contract. + * @author Franklin Richards - powerhousefrank@protonmail.com + */ +contract ILockedFund { + + /* Functions */ + + /** + * @notice The function to add a new admin. + * @param _newAdmin The address of the new admin. + * @dev Only callable by an Admin. + */ + function addAdmin(address _newAdmin) external; + + /** + * @notice The function to remove an admin. + * @param _adminToRemove The address of the admin which should be removed. + * @dev Only callable by an Admin. + */ + function removeAdmin(address _adminToRemove) external; + + /** + * @notice The function to update the Vesting Registry, Duration and Cliff. + * @param _vestingRegistry The Vesting Registry Address. + */ + function changeVestingRegistry(address _vestingRegistry) public; + + /** + * @notice The function used to update the waitedTS. + * @param _waitedTS The timestamp after which withdrawal is allowed. + */ + function changeWaitedTS(uint256 _waitedTS) public; + + /** + * @notice Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point)which determines how much will be unlocked immediately. + * @dev Future iteration will have choice between waited unlock and immediate unlock. + */ + function depositVested( + address _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint + ) public; + + /** + * @notice A function to withdraw the waited unlocked balance. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function withdrawWaitedUnlockedBalance(address _receiverAddress) external; + + /** + * @notice Creates vesting if not already created and Stakes tokens for a user. + * @dev Only use this function if the `duration` is small. + */ + function createVestingAndStake() external; + + /** + * @notice Creates vesting contract (if it hasn't been created yet) for the calling user. + * @return _vestingAddress The New Vesting Contract Created. + */ + function createVesting() external returns (address _vestingAddress); + + /** + * @notice Stakes tokens for a user who already have a vesting created. + * @dev The user should already have a vesting created, else this function will throw error. + */ + function stakeTokens() external; + + /** + * @notice Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function withdrawAndStakeTokens(address _receiverAddress) external; + + /** + * @notice Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created. + * @param _userAddress The address of user tokens will be withdrawn. + */ + function withdrawAndStakeTokensFrom(address _userAddress) external; + +} diff --git a/contracts/Interfaces/IOrigins.sol b/contracts/Interfaces/IOrigins.sol new file mode 100644 index 0000000..c44efa8 --- /dev/null +++ b/contracts/Interfaces/IOrigins.sol @@ -0,0 +1,11 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface of the Origins Platform. + * @author Franklin Richards - powerhousefrank@protonmail.com + */ +contract IOrigins { + + /// TODO + +} diff --git a/contracts/Interfaces/IVestingLogic.sol b/contracts/Interfaces/IVestingLogic.sol new file mode 100644 index 0000000..1743a16 --- /dev/null +++ b/contracts/Interfaces/IVestingLogic.sol @@ -0,0 +1,35 @@ +pragma solidity ^0.5.17; + +/** + * @title Vesting Storage Contract (Incomplete). + * @notice This contract is just the required storage fromm vesting for LockedFund. + */ +contract VestingStorage { + /// @notice The cliff. After this time period the tokens begin to unlock. + uint256 public cliff; + + /// @notice The duration. After this period all tokens will have been unlocked. + uint256 public duration; +} + +/** + * TODO + */ +contract IVestingLogic is VestingStorage{ + + /* Functions */ + + /** + * @notice Stakes tokens according to the vesting schedule. + * @param _amount The amount of tokens to stake. + * */ + function stakeTokens(uint256 _amount) public ; + + /** + * @notice Withdraws unlocked tokens from the staking contract and + * forwards them to an address specified by the token owner. + * @param receiver The receiving address. + * */ + function withdrawTokens(address receiver) public ; + +} \ No newline at end of file diff --git a/contracts/Interfaces/IVestingRegistry.sol b/contracts/Interfaces/IVestingRegistry.sol new file mode 100644 index 0000000..cb4e659 --- /dev/null +++ b/contracts/Interfaces/IVestingRegistry.sol @@ -0,0 +1,30 @@ +pragma solidity ^0.5.17; + +/** + * TODO + */ +contract IVestingRegistry { + + /** + * @notice creates Vesting contract + * @param _tokenOwner the owner of the tokens + * @param _amount the amount to be staked + * @param _cliff the cliff in seconds + * @param _duration the total duration in seconds + */ + function createVesting(address _tokenOwner, uint256 _amount, uint256 _cliff, uint256 _duration) public ; + + /** + * @notice stakes tokens according to the vesting schedule + * @param _vesting the address of Vesting contract + * @param _amount the amount of tokens to stake + */ + function stakeTokens(address _vesting, uint256 _amount) public ; + + /** + * @notice returns vesting contract address for the given token owner + * @param _tokenOwner the owner of the tokens + */ + function getVesting(address _tokenOwner) public view returns (address); + +} \ No newline at end of file From a2036bb3027010d3e23778e1569c8dec83ded8e4 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:07:13 +0530 Subject: [PATCH 008/112] Added artifacts for FE --- .../Interfaces/IERC20.sol/IERC20.json | 251 ++++ .../ILockedFund.sol/ILockedFund.json | 184 +++ .../Interfaces/IOrigins.sol/IOrigins.json | 10 + .../IVestingLogic.sol/IVestingLogic.json | 71 + .../IVestingLogic.sol/VestingStorage.json | 41 + .../IVestingRegistry.json | 82 + .../contracts/LockedFund.sol/LockedFund.json | 803 ++++++++++ .../Openzeppelin/Address.sol/Address.json | 10 + .../Openzeppelin/Context.sol/Context.json | 17 + .../Openzeppelin/ERC20.sol/ERC20.json | 258 ++++ .../ERC20Detailed.sol/ERC20Detailed.json | 273 ++++ .../Openzeppelin/IERC20_.sol/IERC20_.json | 206 +++ .../Openzeppelin/Ownable.sol/Ownable.json | 81 + .../ReentrancyGuard.sol/ReentrancyGuard.json | 10 + .../Openzeppelin/SafeMath.sol/SafeMath.json | 10 + .../OriginsAdmin.sol/OriginsAdmin.json | 231 +++ .../OriginsBase.sol/OriginsBase.json | 1326 +++++++++++++++++ .../OriginsEvents.sol/OriginsEvents.json | 642 ++++++++ .../OriginsStorage.sol/OriginsStorage.json | 219 +++ 19 files changed, 4725 insertions(+) create mode 100644 artifacts/contracts/Interfaces/IERC20.sol/IERC20.json create mode 100644 artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json create mode 100644 artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json create mode 100644 artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json create mode 100644 artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json create mode 100644 artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json create mode 100644 artifacts/contracts/LockedFund.sol/LockedFund.json create mode 100644 artifacts/contracts/Openzeppelin/Address.sol/Address.json create mode 100644 artifacts/contracts/Openzeppelin/Context.sol/Context.json create mode 100644 artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json create mode 100644 artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json create mode 100644 artifacts/contracts/Openzeppelin/IERC20_.sol/IERC20_.json create mode 100644 artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json create mode 100644 artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json create mode 100644 artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json create mode 100644 artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json create mode 100644 artifacts/contracts/OriginsBase.sol/OriginsBase.json create mode 100644 artifacts/contracts/OriginsEvents.sol/OriginsEvents.json create mode 100644 artifacts/contracts/OriginsStorage.sol/OriginsStorage.json diff --git a/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json b/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json new file mode 100644 index 0000000..5cd6953 --- /dev/null +++ b/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json @@ -0,0 +1,251 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IERC20", + "sourceName": "contracts/Interfaces/IERC20.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_who", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json b/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json new file mode 100644 index 0000000..001e5ce --- /dev/null +++ b/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json @@ -0,0 +1,184 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ILockedFund", + "sourceName": "contracts/Interfaces/ILockedFund.sol", + "abi": [ + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_vestingRegistry", + "type": "address" + } + ], + "name": "changeVestingRegistry", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_waitedTS", + "type": "uint256" + } + ], + "name": "changeWaitedTS", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "createVesting", + "outputs": [ + { + "internalType": "address", + "name": "_vestingAddress", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "createVestingAndStake", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_userAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_cliff", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_basisPoint", + "type": "uint256" + } + ], + "name": "depositVested", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_adminToRemove", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "stakeTokens", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_receiverAddress", + "type": "address" + } + ], + "name": "withdrawAndStakeTokens", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_userAddress", + "type": "address" + } + ], + "name": "withdrawAndStakeTokensFrom", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_receiverAddress", + "type": "address" + } + ], + "name": "withdrawWaitedUnlockedBalance", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json b/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json new file mode 100644 index 0000000..9b698fe --- /dev/null +++ b/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IOrigins", + "sourceName": "contracts/Interfaces/IOrigins.sol", + "abi": [], + "bytecode": "0x6080604052348015600f57600080fd5b50603e80601d6000396000f3fe6080604052600080fdfea265627a7a72315820563c295cb97e14be9c42083c5236cc9c95740e44c4382c01325b5405c18549eb64736f6c63430005110032", + "deployedBytecode": "0x6080604052600080fdfea265627a7a72315820563c295cb97e14be9c42083c5236cc9c95740e44c4382c01325b5405c18549eb64736f6c63430005110032", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json b/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json new file mode 100644 index 0000000..44bc026 --- /dev/null +++ b/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json @@ -0,0 +1,71 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IVestingLogic", + "sourceName": "contracts/Interfaces/IVestingLogic.sol", + "abi": [ + { + "constant": true, + "inputs": [], + "name": "cliff", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "duration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "stakeTokens", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "withdrawTokens", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json b/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json new file mode 100644 index 0000000..33bdc95 --- /dev/null +++ b/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json @@ -0,0 +1,41 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VestingStorage", + "sourceName": "contracts/Interfaces/IVestingLogic.sol", + "abi": [ + { + "constant": true, + "inputs": [], + "name": "cliff", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "duration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630fb5a6b414603757806313d033c014604f575b600080fd5b603d6055565b60408051918252519081900360200190f35b603d605b565b60015481565b6000548156fea265627a7a72315820bf3475cae20a692d605e5ffe2e2427ac41aec3ad12ae46d0d23af985351d2a8064736f6c63430005110032", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060325760003560e01c80630fb5a6b414603757806313d033c014604f575b600080fd5b603d6055565b60408051918252519081900360200190f35b603d605b565b60015481565b6000548156fea265627a7a72315820bf3475cae20a692d605e5ffe2e2427ac41aec3ad12ae46d0d23af985351d2a8064736f6c63430005110032", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json b/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json new file mode 100644 index 0000000..6263d94 --- /dev/null +++ b/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json @@ -0,0 +1,82 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IVestingRegistry", + "sourceName": "contracts/Interfaces/IVestingRegistry.sol", + "abi": [ + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_tokenOwner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_cliff", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_duration", + "type": "uint256" + } + ], + "name": "createVesting", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_tokenOwner", + "type": "address" + } + ], + "name": "getVesting", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_vesting", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "stakeTokens", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/LockedFund.sol/LockedFund.json b/artifacts/contracts/LockedFund.sol/LockedFund.json new file mode 100644 index 0000000..40c920f --- /dev/null +++ b/artifacts/contracts/LockedFund.sol/LockedFund.json @@ -0,0 +1,803 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LockedFund", + "sourceName": "contracts/LockedFund.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_waitedTS", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "address", + "name": "_vestingRegistry", + "type": "address" + }, + { + "internalType": "address[]", + "name": "_admins", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "AdminAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_removedAdmin", + "type": "address" + } + ], + "name": "AdminRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_vesting", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokenStaked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_userAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_cliff", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_duration", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_basisPoint", + "type": "uint256" + } + ], + "name": "VestedDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_userAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_vesting", + "type": "address" + } + ], + "name": "VestingCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_vestingRegistry", + "type": "address" + } + ], + "name": "VestingRegistryUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_waitedTS", + "type": "uint256" + } + ], + "name": "WaitedTSUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_userAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "constant": true, + "inputs": [], + "name": "INTERVAL", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_adminToRemove", + "type": "address" + } + ], + "name": "_removeAdmin", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "adminStatus", + "outputs": [ + { + "internalType": "bool", + "name": "_status", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_vestingRegistry", + "type": "address" + } + ], + "name": "changeVestingRegistry", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_waitedTS", + "type": "uint256" + } + ], + "name": "changeWaitedTS", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "cliff", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "createVesting", + "outputs": [ + { + "internalType": "address", + "name": "_vestingAddress", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "createVestingAndStake", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_userAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_cliff", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_basisPoint", + "type": "uint256" + } + ], + "name": "depositVested", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "duration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "getCliffAndDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "getLockedBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "_balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "getUnlockedBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "_balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getVestingDetails", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getWaitedTS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "getWaitedUnlockedBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "_balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "lockedBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_adminToRemove", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "stakeTokens", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "unlockedBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "vestedBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "_balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "vestedBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "vestingRegistry", + "outputs": [ + { + "internalType": "contract IVestingRegistry", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "waitedTS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "waitedUnlockedBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_receiverAddress", + "type": "address" + } + ], + "name": "withdrawAndStakeTokens", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_userAddress", + "type": "address" + } + ], + "name": "withdrawAndStakeTokensFrom", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_receiverAddress", + "type": "address" + } + ], + "name": "withdrawWaitedUnlockedBalance", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b5060405162001e1a38038062001e1a833981810160405260808110156200003757600080fd5b8151602083015160408085015160608601805192519496939591949391820192846401000000008211156200006b57600080fd5b9083019060208201858111156200008157600080fd5b82518660208202830111640100000000821117156200009f57600080fd5b82525081516020918201928201910280838360005b83811015620000ce578181015183820152602001620000b4565b5050505090500160405250505083600014156200011d5760405162461bcd60e51b815260040180806020018281038252602581526020018062001da36025913960400191505060405180910390fd5b6001600160a01b038316620001645760405162461bcd60e51b815260040180806020018281038252602281526020018062001dc86022913960400191505060405180910390fd5b6001600160a01b038216620001ab5760405162461bcd60e51b815260040180806020018281038252603081526020018062001dea6030913960400191505060405180910390fd5b6000848155600180546001600160a01b038087166001600160a01b03199283161790925560028054928616929091169190911790555b8151811015620003175760006001600160a01b03168282815181106200020357fe5b60200260200101516001600160a01b0316141562000268576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600760008484815181106200027b57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550818181518110620002c757fe5b60200260200101516001600160a01b0316336001600160a01b03167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a3600101620001e1565b5050505050611a77806200032c6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806389facb201161010f578063c4086893116100a2578063ce46643b11610071578063ce46643b14610599578063e5545864146105a1578063ec3ea7d4146105c7578063fc0c546a146105ed576101f0565b8063c40868931461051f578063cb3fdb6114610545578063cc6f03331461056b578063cdce101b14610573576101f0565b80639114557e116100de5780639114557e146104a5578063aaba2c0d146104cb578063b36760a3146104f1578063c227cbd814610517576101f0565b806389facb20146104525780638c8ba66d1461045a5780638efd94f314610480578063904c5b8f1461049d576101f0565b80634558269f1161018757806361ade4261161015657806361ade426146103c057806370480275146103e657806377a69b521461040c578063849a681714610414576101f0565b80634558269f1461034b5780634c2a295c1461035357806355e715cf1461035b578063594092db14610381576101f0565b806324276777116101c3578063242767771461029f57806324d7806c146102c55780632b6df82a146102ff5780633e4a89d114610325576101f0565b80630483a7f6146101f5578063129de5bf1461022d5780631785f53c1461025357806321df0da71461027b575b600080fd5b61021b6004803603602081101561020b57600080fd5b50356001600160a01b03166105f5565b60408051918252519081900360200190f35b61021b6004803603602081101561024357600080fd5b50356001600160a01b0316610607565b6102796004803603602081101561026957600080fd5b50356001600160a01b0316610622565b005b610283610680565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102b557600080fd5b50356001600160a01b031661068f565b6102eb600480360360208110156102db57600080fd5b50356001600160a01b03166106a1565b604080519115158252519081900360200190f35b6102796004803603602081101561031557600080fd5b50356001600160a01b03166106b6565b6102eb6004803603602081101561033b57600080fd5b50356001600160a01b03166106c9565b6102796106e7565b61021b6106f2565b6102796004803603602081101561037157600080fd5b50356001600160a01b03166106f8565b6103a76004803603602081101561039757600080fd5b50356001600160a01b0316610702565b6040805192835260208301919091528051918290030190f35b610279600480360360208110156103d657600080fd5b50356001600160a01b031661072a565b610279600480360360208110156103fc57600080fd5b50356001600160a01b031661081d565b61021b610878565b610279600480360360a081101561042a57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013561087e565b61021b6108e4565b61021b6004803603602081101561047057600080fd5b50356001600160a01b03166108eb565b6102796004803603602081101561049657600080fd5b50356108fd565b610283610958565b61021b600480360360208110156104bb57600080fd5b50356001600160a01b0316610967565b61021b600480360360208110156104e157600080fd5b50356001600160a01b0316610982565b61021b6004803603602081101561050757600080fd5b50356001600160a01b031661099d565b6102836109af565b61021b6004803603602081101561053557600080fd5b50356001600160a01b03166109be565b61021b6004803603602081101561055b57600080fd5b50356001600160a01b03166109d9565b6102836109eb565b61021b6004803603602081101561058957600080fd5b50356001600160a01b03166109fb565b610279610a0d565b610279600480360360208110156105b757600080fd5b50356001600160a01b0316610b53565b610279600480360360208110156105dd57600080fd5b50356001600160a01b0316610b66565b610283610bc1565b60046020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b3360009081526007602052604090205460ff16610674576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161072a565b50565b6001546001600160a01b031690565b60056020526000908152604090205481565b60076020526000908152604090205460ff1681565b6106c08182610bd0565b61067d81610d84565b6001600160a01b031660009081526007602052604090205460ff1690565b6106f033610d84565b565b60005490565b61067d3382610bd0565b6001600160a01b03166000908152600860209081526040808320546009909252909120549091565b3360009081526007602052604090205460ff1661077c576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166107d35760405162461bcd60e51b81526004018080602001828103825260248152602001806118746024913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b3360009081526007602052604090205460ff1661086f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81610db9565b60005481565b3360009081526007602052604090205460ff166108d0576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6108dd8585858585610eb9565b5050505050565b6224ea0081565b60066020526000908152604090205481565b3360009081526007602052604090205460ff1661094f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161115d565b6002546001600160a01b031681565b6001600160a01b031660009081526003602052604090205490565b6001600160a01b031660009081526005602052604090205490565b60096020526000908152604090205481565b6002546001600160a01b031690565b6001600160a01b031660009081526004602052604090205490565b60036020526000908152604090205481565b60006109f6336111d7565b905090565b60086020526000908152604090205481565b6000610a183361132b565b9050806001600160a01b03166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b505133600090815260086020526040902054148015610b0e5750806001600160a01b0316630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6020811015610afa57600080fd5b505133600090815260096020526040902054145b610b495760405162461bcd60e51b81526004018080602001828103825260238152602001806119f06023913960400191505060405180910390fd5b61067d33826113ae565b610b5d3382610bd0565b61067d33610d84565b3360009081526007602052604090205460ff16610bb8576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81611540565b6001546001600160a01b031681565b600054610c0e5760405162461bcd60e51b815260040180806020018281038252602281526020018061197f6022913960400191505060405180910390fd5b4260005410610c4e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806118bc602a913960400191505060405180910390fd5b806001600160a01b038116610c605750815b6001600160a01b038084166000908152600560209081526040808320805490849055600154825163a9059cbb60e01b815287871660048201526024810183905292519195169263a9059cbb926044808201939182900301818787803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b5051905080610d325760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b826001600160a01b0316856001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6000610d8f8261132b565b90506001600160a01b038116610dab57610da8826111d7565b90505b610db582826113ae565b5050565b6001600160a01b038116610e14576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610e6c5760405162461bcd60e51b81526004018080602001828103825260258152602001806119a16025913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b81610ef55760405162461bcd60e51b81526004018080602001828103825260248152602001806118986024913960400191505060405180910390fd5b60258210610f345760405162461bcd60e51b81526004018080602001828103825260218152602001806119396021913960400191505060405180910390fd5b6127108110610f745760405162461bcd60e51b81526004018080602001828103825260328152602001806118e66032913960400191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050506040513d6020811015610ff757600080fd5b50519050806110375760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b600061105b61271061104f888663ffffffff6115d116565b9063ffffffff61163316565b6001600160a01b038816600090815260056020526040902054909150611087908263ffffffff61167516565b6001600160a01b0388166000908152600560209081526040808320939093556003905220546110ce9082906110c2908963ffffffff61167516565b9063ffffffff6116cf16565b6001600160a01b038816600081815260036020908152604080832094909455600881528382206224ea008a810290915560098252918490209188029091558251898152908101889052808301879052606081018690529151909133917fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a9181900360800190a350505050505050565b806111995760405162461bcd60e51b815260040180806020018281038252602581526020018061195a6025913960400191505060405180910390fd5b600081905560408051828152905133917f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94919081900360200190a250565b336000908152600860205260408120541580159061120357503360009081526009602052604090205415155b61123e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119c6602a913960400191505060405180910390fd5b6002546001600160a01b038381166000818152600860209081526040808320546009909252808320548151630665a06f60e01b815260048101959095526024850184905260448501929092526064840191909152519290931692630665a06f9260848084019382900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b505050506112da8261132b565b9050806001600160a01b0316826001600160a01b0316336001600160a01b03167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6002546040805163cc49ede760e01b81526001600160a01b0384811660048301529151600093929092169163cc49ede791602480820192602092909190829003018186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b505192915050565b6001600160a01b038083166000908152600460208181526040808420805490859055600154825163095ea7b360e01b8152888816958101959095526024850182905291519095919091169363095ea7b3936044808201949392918390030190829087803b15801561141e57600080fd5b505af1158015611432573d6000803e3d6000fd5b505050506040513d602081101561144857600080fd5b505161149b576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656446756e643a20417070726f7665206661696c65642e0000000000604482015290519081900360640190fd5b816001600160a01b0316637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506040805184815290516001600160a01b038087169450871692507f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b9181900360200190a3505050565b6001600160a01b0381166115855760405162461bcd60e51b8152600401808060200182810382526030815260200180611a136030913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e790600090a350565b6000826115e05750600061162d565b828202828482816115ed57fe5b041461162a5760405162461bcd60e51b81526004018080602001828103825260218152602001806119186021913960400191505060405180910390fd5b90505b92915050565b600061162a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611711565b60008282018381101561162a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061162a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b3565b6000818361179d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561176257818101518382015260200161174a565b50505050905090810190601f16801561178f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816117a957fe5b0495945050505050565b600081848411156118055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561176257818101518382015260200161174a565b50505090039056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4f6e6c792061646d696e2063616e2063616c6c20746869732e000000000000004c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a7231582037112f7bf95aa5fb33056f5be64387b152c40393a8f5c489a64401b1995b3af464736f6c634300051100324c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20496e76616c696420546f6b656e20416464726573732e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642e", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806389facb201161010f578063c4086893116100a2578063ce46643b11610071578063ce46643b14610599578063e5545864146105a1578063ec3ea7d4146105c7578063fc0c546a146105ed576101f0565b8063c40868931461051f578063cb3fdb6114610545578063cc6f03331461056b578063cdce101b14610573576101f0565b80639114557e116100de5780639114557e146104a5578063aaba2c0d146104cb578063b36760a3146104f1578063c227cbd814610517576101f0565b806389facb20146104525780638c8ba66d1461045a5780638efd94f314610480578063904c5b8f1461049d576101f0565b80634558269f1161018757806361ade4261161015657806361ade426146103c057806370480275146103e657806377a69b521461040c578063849a681714610414576101f0565b80634558269f1461034b5780634c2a295c1461035357806355e715cf1461035b578063594092db14610381576101f0565b806324276777116101c3578063242767771461029f57806324d7806c146102c55780632b6df82a146102ff5780633e4a89d114610325576101f0565b80630483a7f6146101f5578063129de5bf1461022d5780631785f53c1461025357806321df0da71461027b575b600080fd5b61021b6004803603602081101561020b57600080fd5b50356001600160a01b03166105f5565b60408051918252519081900360200190f35b61021b6004803603602081101561024357600080fd5b50356001600160a01b0316610607565b6102796004803603602081101561026957600080fd5b50356001600160a01b0316610622565b005b610283610680565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102b557600080fd5b50356001600160a01b031661068f565b6102eb600480360360208110156102db57600080fd5b50356001600160a01b03166106a1565b604080519115158252519081900360200190f35b6102796004803603602081101561031557600080fd5b50356001600160a01b03166106b6565b6102eb6004803603602081101561033b57600080fd5b50356001600160a01b03166106c9565b6102796106e7565b61021b6106f2565b6102796004803603602081101561037157600080fd5b50356001600160a01b03166106f8565b6103a76004803603602081101561039757600080fd5b50356001600160a01b0316610702565b6040805192835260208301919091528051918290030190f35b610279600480360360208110156103d657600080fd5b50356001600160a01b031661072a565b610279600480360360208110156103fc57600080fd5b50356001600160a01b031661081d565b61021b610878565b610279600480360360a081101561042a57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013561087e565b61021b6108e4565b61021b6004803603602081101561047057600080fd5b50356001600160a01b03166108eb565b6102796004803603602081101561049657600080fd5b50356108fd565b610283610958565b61021b600480360360208110156104bb57600080fd5b50356001600160a01b0316610967565b61021b600480360360208110156104e157600080fd5b50356001600160a01b0316610982565b61021b6004803603602081101561050757600080fd5b50356001600160a01b031661099d565b6102836109af565b61021b6004803603602081101561053557600080fd5b50356001600160a01b03166109be565b61021b6004803603602081101561055b57600080fd5b50356001600160a01b03166109d9565b6102836109eb565b61021b6004803603602081101561058957600080fd5b50356001600160a01b03166109fb565b610279610a0d565b610279600480360360208110156105b757600080fd5b50356001600160a01b0316610b53565b610279600480360360208110156105dd57600080fd5b50356001600160a01b0316610b66565b610283610bc1565b60046020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b3360009081526007602052604090205460ff16610674576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161072a565b50565b6001546001600160a01b031690565b60056020526000908152604090205481565b60076020526000908152604090205460ff1681565b6106c08182610bd0565b61067d81610d84565b6001600160a01b031660009081526007602052604090205460ff1690565b6106f033610d84565b565b60005490565b61067d3382610bd0565b6001600160a01b03166000908152600860209081526040808320546009909252909120549091565b3360009081526007602052604090205460ff1661077c576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166107d35760405162461bcd60e51b81526004018080602001828103825260248152602001806118746024913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b3360009081526007602052604090205460ff1661086f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81610db9565b60005481565b3360009081526007602052604090205460ff166108d0576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6108dd8585858585610eb9565b5050505050565b6224ea0081565b60066020526000908152604090205481565b3360009081526007602052604090205460ff1661094f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161115d565b6002546001600160a01b031681565b6001600160a01b031660009081526003602052604090205490565b6001600160a01b031660009081526005602052604090205490565b60096020526000908152604090205481565b6002546001600160a01b031690565b6001600160a01b031660009081526004602052604090205490565b60036020526000908152604090205481565b60006109f6336111d7565b905090565b60086020526000908152604090205481565b6000610a183361132b565b9050806001600160a01b03166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b505133600090815260086020526040902054148015610b0e5750806001600160a01b0316630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6020811015610afa57600080fd5b505133600090815260096020526040902054145b610b495760405162461bcd60e51b81526004018080602001828103825260238152602001806119f06023913960400191505060405180910390fd5b61067d33826113ae565b610b5d3382610bd0565b61067d33610d84565b3360009081526007602052604090205460ff16610bb8576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81611540565b6001546001600160a01b031681565b600054610c0e5760405162461bcd60e51b815260040180806020018281038252602281526020018061197f6022913960400191505060405180910390fd5b4260005410610c4e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806118bc602a913960400191505060405180910390fd5b806001600160a01b038116610c605750815b6001600160a01b038084166000908152600560209081526040808320805490849055600154825163a9059cbb60e01b815287871660048201526024810183905292519195169263a9059cbb926044808201939182900301818787803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b5051905080610d325760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b826001600160a01b0316856001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6000610d8f8261132b565b90506001600160a01b038116610dab57610da8826111d7565b90505b610db582826113ae565b5050565b6001600160a01b038116610e14576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610e6c5760405162461bcd60e51b81526004018080602001828103825260258152602001806119a16025913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b81610ef55760405162461bcd60e51b81526004018080602001828103825260248152602001806118986024913960400191505060405180910390fd5b60258210610f345760405162461bcd60e51b81526004018080602001828103825260218152602001806119396021913960400191505060405180910390fd5b6127108110610f745760405162461bcd60e51b81526004018080602001828103825260328152602001806118e66032913960400191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050506040513d6020811015610ff757600080fd5b50519050806110375760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b600061105b61271061104f888663ffffffff6115d116565b9063ffffffff61163316565b6001600160a01b038816600090815260056020526040902054909150611087908263ffffffff61167516565b6001600160a01b0388166000908152600560209081526040808320939093556003905220546110ce9082906110c2908963ffffffff61167516565b9063ffffffff6116cf16565b6001600160a01b038816600081815260036020908152604080832094909455600881528382206224ea008a810290915560098252918490209188029091558251898152908101889052808301879052606081018690529151909133917fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a9181900360800190a350505050505050565b806111995760405162461bcd60e51b815260040180806020018281038252602581526020018061195a6025913960400191505060405180910390fd5b600081905560408051828152905133917f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94919081900360200190a250565b336000908152600860205260408120541580159061120357503360009081526009602052604090205415155b61123e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119c6602a913960400191505060405180910390fd5b6002546001600160a01b038381166000818152600860209081526040808320546009909252808320548151630665a06f60e01b815260048101959095526024850184905260448501929092526064840191909152519290931692630665a06f9260848084019382900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b505050506112da8261132b565b9050806001600160a01b0316826001600160a01b0316336001600160a01b03167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6002546040805163cc49ede760e01b81526001600160a01b0384811660048301529151600093929092169163cc49ede791602480820192602092909190829003018186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b505192915050565b6001600160a01b038083166000908152600460208181526040808420805490859055600154825163095ea7b360e01b8152888816958101959095526024850182905291519095919091169363095ea7b3936044808201949392918390030190829087803b15801561141e57600080fd5b505af1158015611432573d6000803e3d6000fd5b505050506040513d602081101561144857600080fd5b505161149b576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656446756e643a20417070726f7665206661696c65642e0000000000604482015290519081900360640190fd5b816001600160a01b0316637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506040805184815290516001600160a01b038087169450871692507f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b9181900360200190a3505050565b6001600160a01b0381166115855760405162461bcd60e51b8152600401808060200182810382526030815260200180611a136030913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e790600090a350565b6000826115e05750600061162d565b828202828482816115ed57fe5b041461162a5760405162461bcd60e51b81526004018080602001828103825260218152602001806119186021913960400191505060405180910390fd5b90505b92915050565b600061162a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611711565b60008282018381101561162a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061162a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b3565b6000818361179d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561176257818101518382015260200161174a565b50505050905090810190601f16801561178f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816117a957fe5b0495945050505050565b600081848411156118055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561176257818101518382015260200161174a565b50505090039056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4f6e6c792061646d696e2063616e2063616c6c20746869732e000000000000004c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a7231582037112f7bf95aa5fb33056f5be64387b152c40393a8f5c489a64401b1995b3af464736f6c63430005110032", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Openzeppelin/Address.sol/Address.json b/artifacts/contracts/Openzeppelin/Address.sol/Address.json new file mode 100644 index 0000000..306abec --- /dev/null +++ b/artifacts/contracts/Openzeppelin/Address.sol/Address.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Address", + "sourceName": "contracts/Openzeppelin/Address.sol", + "abi": [], + "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723158205937740270c64775b05a5ffa30d0311e2674bb6aa0227c96dadead14f1cd0de364736f6c63430005110032", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723158205937740270c64775b05a5ffa30d0311e2674bb6aa0227c96dadead14f1cd0de364736f6c63430005110032", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Openzeppelin/Context.sol/Context.json b/artifacts/contracts/Openzeppelin/Context.sol/Context.json new file mode 100644 index 0000000..b861471 --- /dev/null +++ b/artifacts/contracts/Openzeppelin/Context.sol/Context.json @@ -0,0 +1,17 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Context", + "sourceName": "contracts/Openzeppelin/Context.sol", + "abi": [ + { + "inputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json b/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json new file mode 100644 index 0000000..ed43432 --- /dev/null +++ b/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json @@ -0,0 +1,258 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC20", + "sourceName": "contracts/Openzeppelin/ERC20.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405261083b806100136000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a0823114610149578063a457c2d71461016f578063a9059cbb1461019b578063dd62ed3e146101c757610088565b8063095ea7b31461008d57806318160ddd146100cd57806323b872dd146100e7578063395093511461011d575b600080fd5b6100b9600480360360408110156100a357600080fd5b506001600160a01b0381351690602001356101f5565b604080519115158252519081900360200190f35b6100d5610212565b60408051918252519081900360200190f35b6100b9600480360360608110156100fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610218565b6100b96004803603604081101561013357600080fd5b506001600160a01b0381351690602001356102a5565b6100d56004803603602081101561015f57600080fd5b50356001600160a01b03166102f9565b6100b96004803603604081101561018557600080fd5b506001600160a01b038135169060200135610314565b6100b9600480360360408110156101b157600080fd5b506001600160a01b038135169060200135610382565b6100d5600480360360408110156101dd57600080fd5b506001600160a01b0381358116916020013516610396565b60006102096102026103c1565b84846103c5565b50600192915050565b60025490565b60006102258484846104b1565b61029b846102316103c1565b61029685604051806060016040528060288152602001610771602891396001600160a01b038a1660009081526001602052604081209061026f6103c1565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61060d16565b6103c5565b5060019392505050565b60006102096102b26103c1565b8461029685600160006102c36103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6106a416565b6001600160a01b031660009081526020819052604090205490565b60006102096103216103c1565b84610296856040518060600160405280602581526020016107e2602591396001600061034b6103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61060d16565b600061020961038f6103c1565b84846104b1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661040a5760405162461bcd60e51b81526004018080602001828103825260248152602001806107be6024913960400191505060405180910390fd5b6001600160a01b03821661044f5760405162461bcd60e51b81526004018080602001828103825260228152602001806107296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166104f65760405162461bcd60e51b81526004018080602001828103825260258152602001806107996025913960400191505060405180910390fd5b6001600160a01b03821661053b5760405162461bcd60e51b81526004018080602001828103825260238152602001806107066023913960400191505060405180910390fd5b61057e8160405180606001604052806026815260200161074b602691396001600160a01b038616600090815260208190526040902054919063ffffffff61060d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105b3908263ffffffff6106a416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561069c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610661578181015183820152602001610649565b50505050905090810190601f16801561068e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156106fe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202b065b6405111e5e88a2151ff2c365680198043a1a70f31cdde369fba031945a64736f6c63430005110032", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a0823114610149578063a457c2d71461016f578063a9059cbb1461019b578063dd62ed3e146101c757610088565b8063095ea7b31461008d57806318160ddd146100cd57806323b872dd146100e7578063395093511461011d575b600080fd5b6100b9600480360360408110156100a357600080fd5b506001600160a01b0381351690602001356101f5565b604080519115158252519081900360200190f35b6100d5610212565b60408051918252519081900360200190f35b6100b9600480360360608110156100fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610218565b6100b96004803603604081101561013357600080fd5b506001600160a01b0381351690602001356102a5565b6100d56004803603602081101561015f57600080fd5b50356001600160a01b03166102f9565b6100b96004803603604081101561018557600080fd5b506001600160a01b038135169060200135610314565b6100b9600480360360408110156101b157600080fd5b506001600160a01b038135169060200135610382565b6100d5600480360360408110156101dd57600080fd5b506001600160a01b0381358116916020013516610396565b60006102096102026103c1565b84846103c5565b50600192915050565b60025490565b60006102258484846104b1565b61029b846102316103c1565b61029685604051806060016040528060288152602001610771602891396001600160a01b038a1660009081526001602052604081209061026f6103c1565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61060d16565b6103c5565b5060019392505050565b60006102096102b26103c1565b8461029685600160006102c36103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6106a416565b6001600160a01b031660009081526020819052604090205490565b60006102096103216103c1565b84610296856040518060600160405280602581526020016107e2602591396001600061034b6103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61060d16565b600061020961038f6103c1565b84846104b1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661040a5760405162461bcd60e51b81526004018080602001828103825260248152602001806107be6024913960400191505060405180910390fd5b6001600160a01b03821661044f5760405162461bcd60e51b81526004018080602001828103825260228152602001806107296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166104f65760405162461bcd60e51b81526004018080602001828103825260258152602001806107996025913960400191505060405180910390fd5b6001600160a01b03821661053b5760405162461bcd60e51b81526004018080602001828103825260238152602001806107066023913960400191505060405180910390fd5b61057e8160405180606001604052806026815260200161074b602691396001600160a01b038616600090815260208190526040902054919063ffffffff61060d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105b3908263ffffffff6106a416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561069c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610661578181015183820152602001610649565b50505050905090810190601f16801561068e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156106fe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202b065b6405111e5e88a2151ff2c365680198043a1a70f31cdde369fba031945a64736f6c63430005110032", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json b/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json new file mode 100644 index 0000000..9019a60 --- /dev/null +++ b/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json @@ -0,0 +1,273 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC20Detailed", + "sourceName": "contracts/Openzeppelin/ERC20Detailed.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Openzeppelin/IERC20_.sol/IERC20_.json b/artifacts/contracts/Openzeppelin/IERC20_.sol/IERC20_.json new file mode 100644 index 0000000..5c8bb1d --- /dev/null +++ b/artifacts/contracts/Openzeppelin/IERC20_.sol/IERC20_.json @@ -0,0 +1,206 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IERC20_", + "sourceName": "contracts/Openzeppelin/IERC20_.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json b/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json new file mode 100644 index 0000000..494672e --- /dev/null +++ b/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json @@ -0,0 +1,81 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Ownable", + "sourceName": "contracts/Openzeppelin/Ownable.sol", + "abi": [ + { + "inputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "constant": true, + "inputs": [], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json b/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json new file mode 100644 index 0000000..4ab44f7 --- /dev/null +++ b/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ReentrancyGuard", + "sourceName": "contracts/Openzeppelin/ReentrancyGuard.sol", + "abi": [], + "bytecode": "0x60806040526001600055348015601457600080fd5b50603e8060226000396000f3fe6080604052600080fdfea265627a7a723158203788d8b2241852354e8f19939d533dabc145e0bae35eca067031c2bfa406146064736f6c63430005110032", + "deployedBytecode": "0x6080604052600080fdfea265627a7a723158203788d8b2241852354e8f19939d533dabc145e0bae35eca067031c2bfa406146064736f6c63430005110032", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json b/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json new file mode 100644 index 0000000..31bcc6c --- /dev/null +++ b/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SafeMath", + "sourceName": "contracts/Openzeppelin/SafeMath.sol", + "abi": [], + "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72315820afbfb598f394b83d986407677d26d9a954705283684f0c5d4d9de47c9f54693864736f6c63430005110032", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72315820afbfb598f394b83d986407677d26d9a954705283684f0c5d4d9de47c9f54693864736f6c63430005110032", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json b/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json new file mode 100644 index 0000000..7ced857 --- /dev/null +++ b/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json @@ -0,0 +1,231 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OriginsAdmin", + "sourceName": "contracts/OriginsAdmin.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address[]", + "name": "_owners", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "OwnerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_removedOwner", + "type": "address" + } + ], + "name": "OwnerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newVerifier", + "type": "address" + } + ], + "name": "VerifierAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_removedVerifier", + "type": "address" + } + ], + "name": "VerifierRemoved", + "type": "event" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "addOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newVerifier", + "type": "address" + } + ], + "name": "addVerifier", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "checkOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "checkVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getVerifiers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_ownerToRemove", + "type": "address" + } + ], + "name": "removeOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_verifierToRemove", + "type": "address" + } + ], + "name": "removeVerifier", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/OriginsBase.sol/OriginsBase.json b/artifacts/contracts/OriginsBase.sol/OriginsBase.json new file mode 100644 index 0000000..dd0bea7 --- /dev/null +++ b/artifacts/contracts/OriginsBase.sol/OriginsBase.json @@ -0,0 +1,1326 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OriginsBase", + "sourceName": "contracts/OriginsBase.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address[]", + "name": "_owners", + "type": "address[]" + }, + { + "internalType": "address payable", + "name": "_depositAddress", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_verifiedAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "AddressVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_oldDepositAddr", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_newDepositAddr", + "type": "address" + } + ], + "name": "DepositAddressUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_oldLockedFund", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_newLockedFund", + "type": "address" + } + ], + "name": "LockedFundUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "NewTierCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "OwnerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_removedOwner", + "type": "address" + } + ], + "name": "OwnerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum OriginsStorage.DepositType", + "name": "_depositType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "ProceedingWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_depositRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "_depositToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum OriginsStorage.DepositType", + "name": "_depositType", + "type": "uint8" + } + ], + "name": "TierDepositUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "TierSaleEnded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_updatedMaxAmount", + "type": "uint256" + } + ], + "name": "TierSaleUpdatedMaximum", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "TierSaleUpdatedMinimum", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_saleStartTS", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_saleEnd", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "enum OriginsStorage.SaleEndDurationOrTS", + "name": "_saleEndDurationOrTS", + "type": "uint8" + } + ], + "name": "TierTimeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_remainingTokens", + "type": "uint256" + } + ], + "name": "TierTokenAmountUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_maxAmount", + "type": "uint256" + } + ], + "name": "TierTokenLimitUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum OriginsStorage.VerificationType", + "name": "_verificationType", + "type": "uint8" + } + ], + "name": "TierVerificationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_vestOrLockCliff", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_vestOrLockDuration", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_unlockedTokenWithdrawTS", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_unlockedBP", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "enum OriginsStorage.TransferType", + "name": "_transferType", + "type": "uint8" + } + ], + "name": "TierVestOrLockUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tokensBought", + "type": "uint256" + } + ], + "name": "TokenBuy", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newVerifier", + "type": "address" + } + ], + "name": "VerifierAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_removedVerifier", + "type": "address" + } + ], + "name": "VerifierRemoved", + "type": "event" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "addOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newVerifier", + "type": "address" + } + ], + "name": "addVerifier", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_addressToBeVerified", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "addressVerification", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "buy", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "checkOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "checkSaleEnded", + "outputs": [ + { + "internalType": "bool", + "name": "_status", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "checkVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_remainingTokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_saleStartTS", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_saleEnd", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_unlockedTokenWithdrawTS", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_unlockedBP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_vestOrLockCliff", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_vestOrLockDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_depositRate", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_depositToken", + "type": "address" + }, + { + "internalType": "enum OriginsStorage.DepositType", + "name": "_depositType", + "type": "uint8" + }, + { + "internalType": "enum OriginsStorage.VerificationType", + "name": "_verificationType", + "type": "uint8" + }, + { + "internalType": "enum OriginsStorage.SaleEndDurationOrTS", + "name": "_saleEndDurationOrTS", + "type": "uint8" + }, + { + "internalType": "enum OriginsStorage.TransferType", + "name": "_transferType", + "type": "uint8" + } + ], + "name": "createTier", + "outputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getDepositAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getLockDetails", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "getParticipatingWalletCountPerTier", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getTierCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "getTokensBoughtByAddressOnTier", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "getTokensSoldPerTier", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getVerifiers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "isAddressApproved", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address[]", + "name": "_addressToBeVerified", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_tierID", + "type": "uint256[]" + } + ], + "name": "multipleAddressAndTierVerification", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address[]", + "name": "_addressToBeVerified", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "multipleAddressSingleTierVerification", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "readTierPartA", + "outputs": [ + { + "internalType": "uint256", + "name": "_minAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_remainingTokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_saleStartTS", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_saleEnd", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_unlockedTokenWithdrawTS", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_unlockedBP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_vestOrLockCliff", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_vestOrLockDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_depositRate", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "readTierPartB", + "outputs": [ + { + "internalType": "address", + "name": "_depositToken", + "type": "address" + }, + { + "internalType": "enum OriginsStorage.DepositType", + "name": "_depositType", + "type": "uint8" + }, + { + "internalType": "enum OriginsStorage.VerificationType", + "name": "_verificationType", + "type": "uint8" + }, + { + "internalType": "enum OriginsStorage.SaleEndDurationOrTS", + "name": "_saleEndDurationOrTS", + "type": "uint8" + }, + { + "internalType": "enum OriginsStorage.TransferType", + "name": "_transferType", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_ownerToRemove", + "type": "address" + } + ], + "name": "removeOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_verifierToRemove", + "type": "address" + } + ], + "name": "removeVerifier", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address payable", + "name": "_depositAddress", + "type": "address" + } + ], + "name": "setDepositAddress", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_lockedFund", + "type": "address" + } + ], + "name": "setLockedFund", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_depositRate", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_depositToken", + "type": "address" + }, + { + "internalType": "enum OriginsStorage.DepositType", + "name": "_depositType", + "type": "uint8" + } + ], + "name": "setTierDeposit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_saleStartTS", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_saleEnd", + "type": "uint256" + }, + { + "internalType": "enum OriginsStorage.SaleEndDurationOrTS", + "name": "_saleEndDurationOrTS", + "type": "uint8" + } + ], + "name": "setTierTime", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_remainingTokens", + "type": "uint256" + } + ], + "name": "setTierTokenAmount", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxAmount", + "type": "uint256" + } + ], + "name": "setTierTokenLimit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "internalType": "enum OriginsStorage.VerificationType", + "name": "_verificationType", + "type": "uint8" + } + ], + "name": "setTierVerification", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_vestOrLockCliff", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_vestOrLockDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_unlockedTokenWithdrawTS", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_unlockedBP", + "type": "uint256" + }, + { + "internalType": "enum OriginsStorage.TransferType", + "name": "_transferType", + "type": "uint8" + } + ], + "name": "setTierVestOrLock", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_addressToBeVerified", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_tierID", + "type": "uint256[]" + } + ], + "name": "singleAddressMultipleTierVerification", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "withdrawSaleDeposit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b506040516200469c3803806200469c833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82518660208202830111640100000000821117156200008c57600080fd5b82525081516020918201928201910280838360005b83811015620000bb578181015183820152602001620000a1565b50505050919091016040525060200151835190925083915060005b81811015620002325760026000848381518110620000f057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615620001555760405162461bcd60e51b81526004018080602001828103825260308152602001806200466c6030913960400191505060405180910390fd5b6001600260008584815181106200016857fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000838281518110620001b657fe5b602090810291909101810151825460018101845560009384529282902090920180546001600160a01b0319166001600160a01b03909316929092179091556040805133808252915191927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92918290030190a2600101620000d6565b5050506001600160a01b038116156200029157600580546001600160a01b0319166001600160a01b03831690811790915560405160009033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc50908390a45b50506143c980620002a36000396000f3fe6080604052600436106101f95760003560e01c8063836e386d1161010d578063b3ce74c7116100a0578063e0e3671c1161006f578063e0e3671c146109ed578063e87471a514610a20578063ea4ba2fa14610a53578063ee56797514610a9e578063fdc704d714610ab3576101f9565b8063b3ce74c7146108c1578063ca2dfd0a146108fa578063d6febde81461092d578063d96e9de314610950576101f9565b8063a0e67e2b116100dc578063a0e67e2b1461079a578063a935e766146107ff578063ab18af2714610814578063af7cea7d14610847576101f9565b8063836e386d146106235780638acb0e6b146106615780638e1ba962146106ec5780639000b3d614610767576101f9565b806321df0da7116101905780636e1b400b1161015f5780636e1b400b1461053c5780637065cb481461055157806376d73a76146105845780637baec6ae146105ba5780638259ab11146105f3576101f9565b806321df0da71461049757806343a40e3f146104ac57806365e168d3146104df57806367184e2814610527576101f9565b806315cccf8e116101cc57806315cccf8e146103d157806316a6288914610410578063173825d91461043a578063194e13621461046d576101f9565b80630487e0b2146101fe57806309d5ff14146102495780631291e84f146102d357806312b0d400146103a0575b600080fd5b34801561020a57600080fd5b506102376004803603604081101561022157600080fd5b506001600160a01b038135169060200135610ae6565b60408051918252519081900360200190f35b34801561025557600080fd5b5061023760048036036101a081101561026d57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906001600160a01b03610100820135169060ff610120820135811691610140810135821691610160820135811691610180013516610b11565b3480156102df57600080fd5b5061039e600480360360408110156102f657600080fd5b810190602081018135600160201b81111561031057600080fd5b82018360208201111561032257600080fd5b803590602001918460208302840111600160201b8311171561034357600080fd5b919390929091602081019035600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b509092509050610beb565b005b3480156103ac57600080fd5b506103b5610cc8565b604080516001600160a01b039092168252519081900360200190f35b3480156103dd57600080fd5b5061039e600480360360808110156103f457600080fd5b508035906020810135906040810135906060013560ff16610cd7565b34801561041c57600080fd5b506102376004803603602081101561043357600080fd5b5035610d37565b34801561044657600080fd5b5061039e6004803603602081101561045d57600080fd5b50356001600160a01b0316610d4c565b34801561047957600080fd5b506102376004803603602081101561049057600080fd5b5035610da6565b3480156104a357600080fd5b506103b5610db8565b3480156104b857600080fd5b5061039e600480360360408110156104cf57600080fd5b508035906020013560ff16610dc7565b3480156104eb57600080fd5b5061039e6004803603608081101561050257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610e23565b34801561053357600080fd5b50610237610e7d565b34801561054857600080fd5b506103b5610e83565b34801561055d57600080fd5b5061039e6004803603602081101561057457600080fd5b50356001600160a01b0316610e92565b34801561059057600080fd5b5061039e600480360360608110156105a757600080fd5b5080359060208101359060400135610ee9565b3480156105c657600080fd5b5061039e600480360360408110156105dd57600080fd5b506001600160a01b038135169060200135610f47565b3480156105ff57600080fd5b5061039e6004803603604081101561061657600080fd5b5080359060200135610f9f565b34801561062f57600080fd5b5061064d6004803603602081101561064657600080fd5b5035610ff7565b604080519115158252519081900360200190f35b34801561066d57600080fd5b5061039e6004803603604081101561068457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b50909250905061100c565b3480156106f857600080fd5b5061039e6004803603604081101561070f57600080fd5b810190602081018135600160201b81111561072957600080fd5b82018360208201111561073b57600080fd5b803590602001918460208302840111600160201b8311171561075c57600080fd5b91935091503561107d565b34801561077357600080fd5b5061039e6004803603602081101561078a57600080fd5b50356001600160a01b0316611103565b3480156107a657600080fd5b506107af61115a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107eb5781810151838201526020016107d3565b505050509050019250505060405180910390f35b34801561080b57600080fd5b506107af6111bc565b34801561082057600080fd5b5061039e6004803603602081101561083757600080fd5b50356001600160a01b031661121c565b34801561085357600080fd5b506108716004803603602081101561086a57600080fd5b5035611273565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b3480156108cd57600080fd5b5061064d600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611427565b34801561090657600080fd5b5061039e6004803603602081101561091d57600080fd5b50356001600160a01b0316611452565b61039e6004803603604081101561094357600080fd5b50803590602001356114a9565b34801561095c57600080fd5b5061097a6004803603602081101561097357600080fd5b50356114b3565b6040516001600160a01b03861681526020810185600181111561099957fe5b60ff1681526020018460028111156109ad57fe5b60ff1681526020018360038111156109c157fe5b60ff1681526020018260048111156109d557fe5b60ff1681526020019550505050505060405180910390f35b3480156109f957600080fd5b5061064d60048036036020811015610a1057600080fd5b50356001600160a01b0316611638565b348015610a2c57600080fd5b5061039e60048036036020811015610a4357600080fd5b50356001600160a01b0316611656565b348015610a5f57600080fd5b5061039e600480360360c0811015610a7657600080fd5b5080359060208101359060408101359060608101359060808101359060a0013560ff166116ad565b348015610aaa57600080fd5b5061039e611711565b348015610abf57600080fd5b5061064d60048036036020811015610ad657600080fd5b50356001600160a01b031661171b565b6001600160a01b03821660009081526009602090815260408083208484529091529020545b92915050565b3360009081526002602052604081205460ff16610b5f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b50600480546001019081905560408051828152905133917eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b919081900360200190a2610baa8185611739565b610bb6818888886117c7565b610bc0818f61190e565b610bce818a8a8e8e87611ca7565b610bda818e8e86611ddd565b9d9c50505050505050505050505050565b3360009081526003602052604090205460ff16610c395760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b828114610c775760405162461bcd60e51b8152600401808060200182810382526034815260200180613e366034913960400191505060405180910390fd5b60005b83811015610cc157610cb9858583818110610c9157fe5b905060200201356001600160a01b0316848484818110610cad57fe5b90506020020135611f99565b600101610c7a565b5050505050565b6005546001600160a01b031690565b3360009081526002602052604090205460ff16610d255760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d3184848484611ddd565b50505050565b6000818152600b60205260409020545b919050565b3360009081526002602052604090205460ff16610d9a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612043565b50565b6000908152600a602052604090205490565b6006546001600160a01b031690565b3360009081526002602052604090205460ff16610e155760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f8282611739565b5050565b3360009081526002602052604090205460ff16610e715760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d31848484846117c7565b60045490565b6007546001600160a01b031690565b3360009081526002602052604090205460ff16610ee05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816121d4565b3360009081526002602052604090205460ff16610f375760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610f42838383612323565b505050565b3360009081526003602052604090205460ff16610f955760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b610e1f8282611f99565b3360009081526002602052604090205460ff16610fed5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f828261190e565b6000908152600c602052604090205460ff1690565b3360009081526003602052604090205460ff1661105a5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b81811015610d315761107584848484818110610cad57fe5b60010161105d565b3360009081526003602052604090205460ff166110cb5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b82811015610d31576110fb8484838181106110e557fe5b905060200201356001600160a01b031683611f99565b6001016110ce565b3360009081526002602052604090205460ff166111515760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816123c2565b606060008054806020026020016040519081016040528092919081815260200182805480156111b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611194575b5050505050905090565b606060018054806020026020016040519081016040528092919081815260200182805480156111b2576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611194575050505050905090565b3360009081526002602052604090205460ff1661126a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612510565b60008060008060008060008060008061128a613c88565b60008c81526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561133957fe5b600181111561134457fe5b8152602001600a820160159054906101000a900460ff16600281111561136657fe5b600281111561137157fe5b8152602001600a820160169054906101000a900460ff16600381111561139357fe5b600381111561139e57fe5b8152602001600a820160179054906101000a900460ff1660048111156113c057fe5b60048111156113cb57fe5b815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b6001600160a01b03919091166000908152600d60209081526040808320938352929052205460ff1690565b3360009081526002602052604090205460ff166114a05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816125b3565b610e1f8282612746565b60008060008060006114c3613c88565b60008781526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561157257fe5b600181111561157d57fe5b8152602001600a820160159054906101000a900460ff16600281111561159f57fe5b60028111156115aa57fe5b8152602001600a820160169054906101000a900460ff1660038111156115cc57fe5b60038111156115d757fe5b8152602001600a820160179054906101000a900460ff1660048111156115f957fe5b600481111561160457fe5b9052506101408101516101608201516101808301516101a08401516101c090940151929b919a509850919650945092505050565b6001600160a01b031660009081526002602052604090205460ff1690565b3360009081526002602052604090205460ff166116a45760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612db8565b3360009081526002602052604090205460ff166116fb5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b611709868686868686611ca7565b505050505050565b611719612e5b565b565b6001600160a01b031660009081526003602052604090205460ff1690565b6000828152600860205260409020600a01805482919060ff60a81b1916600160a81b83600281111561176757fe5b0217905550336001600160a01b03167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a482378383604051808381526020018260028111156117af57fe5b60ff1681526020019250505060405180910390a25050565b600083116118065760405162461bcd60e51b815260040180806020018281038252602981526020018061425e6029913960400191505060405180910390fd5b600181600181111561181457fe5b141561185f576001600160a01b03821661185f5760405162461bcd60e51b81526004018080602001828103825260328152602001806140a86032913960400191505060405180910390fd5b600084815260086020526040902060098101849055600a0180546001600160a01b0319166001600160a01b0384161780825582919060ff60a01b1916600160a01b8360018111156118ac57fe5b02179055508060018111156118bd57fe5b60408051868152602081018690526001600160a01b03851681830152905133917f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7919081900360600190a350505050565b6000811161194d5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e6a603c913960400191505060405180910390fd5b600082815260086020526040902060098101546001909101548291611978919063ffffffff6130e416565b11156119b55760405162461bcd60e51b815260040180806020018281038252604c8152602001806142c1604c913960600191505060405180910390fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d6020811015611a2a57600080fd5b505160008481526008602052604081206002015491925090611a6a90611a5e85611a52613144565b9063ffffffff61318316565b9063ffffffff6131dd16565b905081811115611b72576006546000906001600160a01b03166323b872dd3330611a9a868863ffffffff6131dd16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b505050506040513d6020811015611b2c57600080fd5b5051905080611b6c5760405162461bcd60e51b815260040180806020018281038252603e8152602001806141ea603e913960400191505060405180910390fd5b50611c52565b6006546000906001600160a01b031663a9059cbb33611b97868663ffffffff6131dd16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b5051905080611c505760405162461bcd60e51b8152600401808060200182810382526038815260200180613fdf6038913960400191505060405180910390fd5b505b6000848152600860209081526040918290206002018590558151868152908101859052815133927fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca95928290030190a250505050565b83851115611ce65760405162461bcd60e51b8152600401808060200182810382526029815260200180613fb66029913960400191505060405180910390fd5b612710821115611d275760405162461bcd60e51b81526004018080602001828103825260378152602001806140386037913960400191505060405180910390fd5b6000868152600860208190526040909120600781018790559081018590556005810184905560068101839055600a01805482919060ff60b81b1916600160b81b836004811115611d7357fe5b0217905550806004811115611d8457fe5b60408051888152602081018890528082018790526060810186905260808101859052905133917f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e3919081900360a00190a3505050505050565b8215801590611deb57508115155b8015611e0257506002816003811115611e0057fe5b145b15611e595742611e18848463ffffffff61318316565b11611e545760405162461bcd60e51b815260040180806020018281038252603a815260200180614287603a913960400191505060405180910390fd5b611efe565b82151580611e6657508115155b8015611e7d57506003816003811115611e7b57fe5b145b15611efe57818310611ec05760405162461bcd60e51b815260040180806020018281038252603b815260200180613dcf603b913960400191505060405180910390fd5b428211611efe5760405162461bcd60e51b81526004018080602001828103825260368152602001806142286036913960400191505060405180910390fd5b6000848152600860205260409020600380820185905560048201849055600a9091018054839260ff60b01b1990911690600160b01b908490811115611f3f57fe5b0217905550806003811115611f5057fe5b6040805186815260208101869052808201859052905133917f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f582650919081900360600190a350505050565b6001600160a01b038216611fde5760405162461bcd60e51b8152600401808060200182810382526033815260200180613ea66033913960400191505060405180910390fd5b6001600160a01b0382166000818152600d60209081526040808320858452825291829020805460ff191660011790558151848152915133927fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f492908290030190a35050565b6001600160a01b03811660009081526002602052604090205460ff1661209a5760405162461bcd60e51b815260040180806020018281038252602681526020018061430d6026913960400191505060405180910390fd5b6001600160a01b0381166000908152600260205260408120805460ff191690558054905b8181101561216157600081815481106120d357fe5b6000918252602090912001546001600160a01b0384811691161415612159576000600183038154811061210257fe5b600091825260208220015481546001600160a01b0390911691908390811061212657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612161565b6001016120be565b50600080548061216d57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f93003679928290030190a25050565b6001600160a01b03811661222f576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156122875760405162461bcd60e51b815260040180806020018281038252602a815260200180613da5602a913960400191505060405180910390fd5b6001600160a01b0381166000818152600260209081526040808320805460ff19166001908117909155835490810184559280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390920180546001600160a01b031916841790558151928352905133927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92908290030190a250565b808211156123625760405162461bcd60e51b815260040180806020018281038252603981526020018061406f6039913960400191505060405180910390fd5b6000838152600860209081526040918290208481556001018390558151858152908101849052808201839052905133917fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c919081900360600190a2505050565b6001600160a01b03811661241d576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16156124755760405162461bcd60e51b815260040180806020018281038252602c815260200180613ed9602c913960400191505060405180910390fd5b6001600160a01b0381166000818152600360209081526040808320805460ff191660019081179091558054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b031916841790558151928352905133927fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e92908290030190a250565b6001600160a01b0381166125555760405162461bcd60e51b815260040180806020018281038252602c815260200180613e0a602c913960400191505060405180910390fd5b6005546040516001600160a01b0380841692169033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5090600090a4600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604090205460ff1661260a5760405162461bcd60e51b81526004018080602001828103825260288152602001806141976028913960400191505060405180910390fd5b6001600160a01b0381166000908152600360205260408120805460ff19169055600154905b818110156126d3576001818154811061264457fe5b6000918252602090912001546001600160a01b03848116911614156126cb5760018083038154811061267257fe5b600091825260209091200154600180546001600160a01b03909216918390811061269857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506126d3565b60010161262f565b5060018054806126df57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed6928290030190a25050565b61274f8261321f565b6127a0576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6127a8613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561285757fe5b600181111561286257fe5b8152602001600a820160159054906101000a900460ff16600281111561288457fe5b600281111561288f57fe5b8152602001600a820160169054906101000a900460ff1660038111156128b157fe5b60038111156128bc57fe5b8152602001600a820160179054906101000a900460ff1660048111156128de57fe5b60048111156128e957fe5b90525090506000816101800151600281111561290157fe5b141561293e5760405162461bcd60e51b815260040180806020018281038252602881526020018061436d6028913960400191505060405180910390fd5b6002816101800151600281111561295157fe5b14156129b057336000908152600d6020908152604080832086845290915290205460ff166129b05760405162461bcd60e51b8152600401808060200182810382526028815260200180613f686028913960400191505060405180910390fd5b336000908152600960209081526040808320868452825290912054908201518110612a0c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613f056031913960400191505060405180910390fd5b6000808361016001516001811115612a2057fe5b1415612a2d575034612b7e565b83612a695760405162461bcd60e51b81526004018080602001828103825260238152602001806141486023913960400191505060405180910390fd5b6101408301516001600160a01b0316612ab35760405162461bcd60e51b815260040180806020018281038252602c81526020018061416b602c913960400191505060405180910390fd5b610140830151604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015612b0f57600080fd5b505af1158015612b23573d6000803e3d6000fd5b505050506040513d6020811015612b3957600080fd5b5051905080612b795760405162461bcd60e51b815260040180806020018281038252603a815260200180614333603a913960400191505060405180910390fd5b849150505b8251600090821015612bc15760405162461bcd60e51b8152600401808060200182810382526032815260200180613f366032913960400191505060405180910390fd5b60208401518290612bd8908563ffffffff6131dd16565b11612c11576020840151612bf690611a5e848663ffffffff61318316565b6020850151909150612c0e908463ffffffff6131dd16565b91505b6000612c2b856101200151846130e490919063ffffffff16565b6040860151909150612c43908263ffffffff6131dd16565b604080870191909152336000908152600960209081528282208a835290522054612c73908263ffffffff61318316565b3360009081526009602090815260408083208b8452909152902055612c988782613463565b612ca18761388f565b612cad87848684613af5565b8115612d75576101408501516040805163a9059cbb60e01b81523360048201526024810185905290516000926001600160a01b03169163a9059cbb91604480830192602092919082900301818787803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506040513d6020811015612d3357600080fd5b5051905080612d735760405162461bcd60e51b815260040180806020018281038252603981526020018061410f6039913960400191505060405180910390fd5b505b6040805188815260208101839052815133927f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba0928290030190a250505050505050565b6001600160a01b038116612dfd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d756030913960400191505060405180910390fd5b6007546040516001600160a01b0380841692169033907f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce190600090a4600780546001600160a01b0319166001600160a01b0392909216919091179055565b612e6433611638565b80612e7957506005546001600160a01b031633145b612eb45760405162461bcd60e51b81526004018080602001828103825260358152602001806140da6035913960400191505060405180910390fd5b60055433906001600160a01b031615612ed557506005546001600160a01b03165b60015b6004548111610e1f576000818152600c602052604090205460ff16156130dc57600081815260086020908152604080832060090154600b909252822054612f249163ffffffff613b4a16565b9050600080838152600860205260409020600a0154600160a01b900460ff166001811115612f4e57fe5b1415612ffa576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612f8a573d6000803e3d6000fd5b50826001600160a01b0316336001600160a01b03167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c8460008560405180848152602001836001811115612fda57fe5b60ff168152602001828152602001935050505060405180910390a36130da565b6000828152600860209081526040808320600a0154815163a9059cbb60e01b81526001600160a01b038881166004830152602482018790529251929091169363a9059cbb9360448084019491939192918390030190829087803b15801561306057600080fd5b505af1158015613074573d6000803e3d6000fd5b505050506040513d602081101561308a57600080fd5b5050604080518381526001602082015280820183905290516001600160a01b0385169133917fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c9181900360600190a35b505b600101612ed8565b6000826130f357506000610b0b565b8282028284828161310057fe5b041461313d5760405162461bcd60e51b81526004018080602001828103825260218152602001806140176021913960400191505060405180910390fd5b9392505050565b600060015b600454811161317f5760008181526008602052604090206002015461317590839063ffffffff61318316565b9150600101613149565b5090565b60008282018381101561313d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061313d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8c565b60008181526008602052604081206003015461326c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613f906026913960400191505060405180910390fd5b6000828152600c602052604090205460ff16156132d0576040805162461bcd60e51b815260206004820152601860248201527f4f726967696e73426173653a2053616c6520656e6465642e0000000000000000604482015290519081900360640190fd5b600080838152600860205260409020600a0154600160b01b900460ff1660038111156132f857fe5b141561330657506000610d47565b60016000838152600860205260409020600a0154600160b01b900460ff16600381111561332f57fe5b14801561334b5750600082815260086020526040902060020154155b1561336f57506000818152600c60205260408120805460ff19166001179055610d47565b60036000838152600860205260409020600a0154600160b01b900460ff16600381111561339857fe5b1480156133b5575060008281526008602052604090206004015442115b156133d957506000818152600c60205260408120805460ff19166001179055610d47565b60026000838152600860205260409020600a0154600160b01b900460ff16600381111561340257fe5b1480156134375750600082815260086020526040902060048101546003909101544291613435919063ffffffff61318316565b105b1561345b57506000818152600c60205260408120805460ff19166001179055610d47565b506001919050565b61346b613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561351a57fe5b600181111561352557fe5b8152602001600a820160159054906101000a900460ff16600281111561354757fe5b600281111561355257fe5b8152602001600a820160169054906101000a900460ff16600381111561357457fe5b600381111561357f57fe5b8152602001600a820160179054906101000a900460ff1660048111156135a157fe5b60048111156135ac57fe5b90525090506000816101c0015160048111156135c457fe5b14156136015760405162461bcd60e51b815260040180806020018281038252602b8152602001806141bf602b913960400191505060405180910390fd5b6001816101c00151600481111561361457fe5b14156136a3576101408101516040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50610f429050565b6002816101c0015160048111156136b657fe5b1415613700576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b6003816101c00151600481111561371357fe5b1415613832576006546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561377257600080fd5b505af1158015613786573d6000803e3d6000fd5b505050506040513d602081101561379c57600080fd5b505060075460e082015161010083015160c08401516040805163849a681760e01b815233600482015260248101889052604481019490945260648401929092526084830152516001600160a01b039092169163849a68179160a48082019260009290919082900301818387803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b50505050610f42565b6004816101c00151600481111561384557fe5b1415610f42576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b613897613c88565b60008281526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561394657fe5b600181111561395157fe5b8152602001600a820160159054906101000a900460ff16600281111561397357fe5b600281111561397e57fe5b8152602001600a820160169054906101000a900460ff1660038111156139a057fe5b60038111156139ab57fe5b8152602001600a820160179054906101000a900460ff1660048111156139cd57fe5b60048111156139d857fe5b815250509050806020015181604001511015610e1f57805160408201511015613a9c576040810151613a54576000828152600c6020908152604091829020805460ff191660011790558151848152915133927f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c492908290030190a25b6000828152600860209081526040808320929092558151848152915133927f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a7892908290030190a25b6040808201805160008581526008602090815290849020600101919091559051825185815291820152815133927f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445928290030190a25050565b8215610d315781613b16576000848152600a60205260409020805460010190555b6000848152600b6020526040902054613b35908263ffffffff61318316565b6000858152600b602052604090205550505050565b600061313d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c23565b60008184841115613c1b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be0578181015183820152602001613bc8565b50505050905090810190601f168015613c0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c725760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be0578181015183820152602001613bc8565b506000838581613c7e57fe5b0495945050505050565b604051806101e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001811115613cf757fe5b81526020016000815260200160008152602001600090529056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158201af36c62015c55f48b1b93810fd5dacf4fb278b800aee7e218cc1503740f4c5964736f6c634300051100324f726967696e7341646d696e3a2045616368206f776e65722063616e206265206164646564206f6e6c79206f6e63652e", + "deployedBytecode": "0x6080604052600436106101f95760003560e01c8063836e386d1161010d578063b3ce74c7116100a0578063e0e3671c1161006f578063e0e3671c146109ed578063e87471a514610a20578063ea4ba2fa14610a53578063ee56797514610a9e578063fdc704d714610ab3576101f9565b8063b3ce74c7146108c1578063ca2dfd0a146108fa578063d6febde81461092d578063d96e9de314610950576101f9565b8063a0e67e2b116100dc578063a0e67e2b1461079a578063a935e766146107ff578063ab18af2714610814578063af7cea7d14610847576101f9565b8063836e386d146106235780638acb0e6b146106615780638e1ba962146106ec5780639000b3d614610767576101f9565b806321df0da7116101905780636e1b400b1161015f5780636e1b400b1461053c5780637065cb481461055157806376d73a76146105845780637baec6ae146105ba5780638259ab11146105f3576101f9565b806321df0da71461049757806343a40e3f146104ac57806365e168d3146104df57806367184e2814610527576101f9565b806315cccf8e116101cc57806315cccf8e146103d157806316a6288914610410578063173825d91461043a578063194e13621461046d576101f9565b80630487e0b2146101fe57806309d5ff14146102495780631291e84f146102d357806312b0d400146103a0575b600080fd5b34801561020a57600080fd5b506102376004803603604081101561022157600080fd5b506001600160a01b038135169060200135610ae6565b60408051918252519081900360200190f35b34801561025557600080fd5b5061023760048036036101a081101561026d57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906001600160a01b03610100820135169060ff610120820135811691610140810135821691610160820135811691610180013516610b11565b3480156102df57600080fd5b5061039e600480360360408110156102f657600080fd5b810190602081018135600160201b81111561031057600080fd5b82018360208201111561032257600080fd5b803590602001918460208302840111600160201b8311171561034357600080fd5b919390929091602081019035600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b509092509050610beb565b005b3480156103ac57600080fd5b506103b5610cc8565b604080516001600160a01b039092168252519081900360200190f35b3480156103dd57600080fd5b5061039e600480360360808110156103f457600080fd5b508035906020810135906040810135906060013560ff16610cd7565b34801561041c57600080fd5b506102376004803603602081101561043357600080fd5b5035610d37565b34801561044657600080fd5b5061039e6004803603602081101561045d57600080fd5b50356001600160a01b0316610d4c565b34801561047957600080fd5b506102376004803603602081101561049057600080fd5b5035610da6565b3480156104a357600080fd5b506103b5610db8565b3480156104b857600080fd5b5061039e600480360360408110156104cf57600080fd5b508035906020013560ff16610dc7565b3480156104eb57600080fd5b5061039e6004803603608081101561050257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610e23565b34801561053357600080fd5b50610237610e7d565b34801561054857600080fd5b506103b5610e83565b34801561055d57600080fd5b5061039e6004803603602081101561057457600080fd5b50356001600160a01b0316610e92565b34801561059057600080fd5b5061039e600480360360608110156105a757600080fd5b5080359060208101359060400135610ee9565b3480156105c657600080fd5b5061039e600480360360408110156105dd57600080fd5b506001600160a01b038135169060200135610f47565b3480156105ff57600080fd5b5061039e6004803603604081101561061657600080fd5b5080359060200135610f9f565b34801561062f57600080fd5b5061064d6004803603602081101561064657600080fd5b5035610ff7565b604080519115158252519081900360200190f35b34801561066d57600080fd5b5061039e6004803603604081101561068457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b50909250905061100c565b3480156106f857600080fd5b5061039e6004803603604081101561070f57600080fd5b810190602081018135600160201b81111561072957600080fd5b82018360208201111561073b57600080fd5b803590602001918460208302840111600160201b8311171561075c57600080fd5b91935091503561107d565b34801561077357600080fd5b5061039e6004803603602081101561078a57600080fd5b50356001600160a01b0316611103565b3480156107a657600080fd5b506107af61115a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107eb5781810151838201526020016107d3565b505050509050019250505060405180910390f35b34801561080b57600080fd5b506107af6111bc565b34801561082057600080fd5b5061039e6004803603602081101561083757600080fd5b50356001600160a01b031661121c565b34801561085357600080fd5b506108716004803603602081101561086a57600080fd5b5035611273565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b3480156108cd57600080fd5b5061064d600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611427565b34801561090657600080fd5b5061039e6004803603602081101561091d57600080fd5b50356001600160a01b0316611452565b61039e6004803603604081101561094357600080fd5b50803590602001356114a9565b34801561095c57600080fd5b5061097a6004803603602081101561097357600080fd5b50356114b3565b6040516001600160a01b03861681526020810185600181111561099957fe5b60ff1681526020018460028111156109ad57fe5b60ff1681526020018360038111156109c157fe5b60ff1681526020018260048111156109d557fe5b60ff1681526020019550505050505060405180910390f35b3480156109f957600080fd5b5061064d60048036036020811015610a1057600080fd5b50356001600160a01b0316611638565b348015610a2c57600080fd5b5061039e60048036036020811015610a4357600080fd5b50356001600160a01b0316611656565b348015610a5f57600080fd5b5061039e600480360360c0811015610a7657600080fd5b5080359060208101359060408101359060608101359060808101359060a0013560ff166116ad565b348015610aaa57600080fd5b5061039e611711565b348015610abf57600080fd5b5061064d60048036036020811015610ad657600080fd5b50356001600160a01b031661171b565b6001600160a01b03821660009081526009602090815260408083208484529091529020545b92915050565b3360009081526002602052604081205460ff16610b5f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b50600480546001019081905560408051828152905133917eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b919081900360200190a2610baa8185611739565b610bb6818888886117c7565b610bc0818f61190e565b610bce818a8a8e8e87611ca7565b610bda818e8e86611ddd565b9d9c50505050505050505050505050565b3360009081526003602052604090205460ff16610c395760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b828114610c775760405162461bcd60e51b8152600401808060200182810382526034815260200180613e366034913960400191505060405180910390fd5b60005b83811015610cc157610cb9858583818110610c9157fe5b905060200201356001600160a01b0316848484818110610cad57fe5b90506020020135611f99565b600101610c7a565b5050505050565b6005546001600160a01b031690565b3360009081526002602052604090205460ff16610d255760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d3184848484611ddd565b50505050565b6000818152600b60205260409020545b919050565b3360009081526002602052604090205460ff16610d9a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612043565b50565b6000908152600a602052604090205490565b6006546001600160a01b031690565b3360009081526002602052604090205460ff16610e155760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f8282611739565b5050565b3360009081526002602052604090205460ff16610e715760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d31848484846117c7565b60045490565b6007546001600160a01b031690565b3360009081526002602052604090205460ff16610ee05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816121d4565b3360009081526002602052604090205460ff16610f375760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610f42838383612323565b505050565b3360009081526003602052604090205460ff16610f955760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b610e1f8282611f99565b3360009081526002602052604090205460ff16610fed5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f828261190e565b6000908152600c602052604090205460ff1690565b3360009081526003602052604090205460ff1661105a5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b81811015610d315761107584848484818110610cad57fe5b60010161105d565b3360009081526003602052604090205460ff166110cb5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b82811015610d31576110fb8484838181106110e557fe5b905060200201356001600160a01b031683611f99565b6001016110ce565b3360009081526002602052604090205460ff166111515760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816123c2565b606060008054806020026020016040519081016040528092919081815260200182805480156111b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611194575b5050505050905090565b606060018054806020026020016040519081016040528092919081815260200182805480156111b2576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611194575050505050905090565b3360009081526002602052604090205460ff1661126a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612510565b60008060008060008060008060008061128a613c88565b60008c81526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561133957fe5b600181111561134457fe5b8152602001600a820160159054906101000a900460ff16600281111561136657fe5b600281111561137157fe5b8152602001600a820160169054906101000a900460ff16600381111561139357fe5b600381111561139e57fe5b8152602001600a820160179054906101000a900460ff1660048111156113c057fe5b60048111156113cb57fe5b815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b6001600160a01b03919091166000908152600d60209081526040808320938352929052205460ff1690565b3360009081526002602052604090205460ff166114a05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816125b3565b610e1f8282612746565b60008060008060006114c3613c88565b60008781526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561157257fe5b600181111561157d57fe5b8152602001600a820160159054906101000a900460ff16600281111561159f57fe5b60028111156115aa57fe5b8152602001600a820160169054906101000a900460ff1660038111156115cc57fe5b60038111156115d757fe5b8152602001600a820160179054906101000a900460ff1660048111156115f957fe5b600481111561160457fe5b9052506101408101516101608201516101808301516101a08401516101c090940151929b919a509850919650945092505050565b6001600160a01b031660009081526002602052604090205460ff1690565b3360009081526002602052604090205460ff166116a45760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612db8565b3360009081526002602052604090205460ff166116fb5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b611709868686868686611ca7565b505050505050565b611719612e5b565b565b6001600160a01b031660009081526003602052604090205460ff1690565b6000828152600860205260409020600a01805482919060ff60a81b1916600160a81b83600281111561176757fe5b0217905550336001600160a01b03167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a482378383604051808381526020018260028111156117af57fe5b60ff1681526020019250505060405180910390a25050565b600083116118065760405162461bcd60e51b815260040180806020018281038252602981526020018061425e6029913960400191505060405180910390fd5b600181600181111561181457fe5b141561185f576001600160a01b03821661185f5760405162461bcd60e51b81526004018080602001828103825260328152602001806140a86032913960400191505060405180910390fd5b600084815260086020526040902060098101849055600a0180546001600160a01b0319166001600160a01b0384161780825582919060ff60a01b1916600160a01b8360018111156118ac57fe5b02179055508060018111156118bd57fe5b60408051868152602081018690526001600160a01b03851681830152905133917f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7919081900360600190a350505050565b6000811161194d5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e6a603c913960400191505060405180910390fd5b600082815260086020526040902060098101546001909101548291611978919063ffffffff6130e416565b11156119b55760405162461bcd60e51b815260040180806020018281038252604c8152602001806142c1604c913960600191505060405180910390fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d6020811015611a2a57600080fd5b505160008481526008602052604081206002015491925090611a6a90611a5e85611a52613144565b9063ffffffff61318316565b9063ffffffff6131dd16565b905081811115611b72576006546000906001600160a01b03166323b872dd3330611a9a868863ffffffff6131dd16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b505050506040513d6020811015611b2c57600080fd5b5051905080611b6c5760405162461bcd60e51b815260040180806020018281038252603e8152602001806141ea603e913960400191505060405180910390fd5b50611c52565b6006546000906001600160a01b031663a9059cbb33611b97868663ffffffff6131dd16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b5051905080611c505760405162461bcd60e51b8152600401808060200182810382526038815260200180613fdf6038913960400191505060405180910390fd5b505b6000848152600860209081526040918290206002018590558151868152908101859052815133927fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca95928290030190a250505050565b83851115611ce65760405162461bcd60e51b8152600401808060200182810382526029815260200180613fb66029913960400191505060405180910390fd5b612710821115611d275760405162461bcd60e51b81526004018080602001828103825260378152602001806140386037913960400191505060405180910390fd5b6000868152600860208190526040909120600781018790559081018590556005810184905560068101839055600a01805482919060ff60b81b1916600160b81b836004811115611d7357fe5b0217905550806004811115611d8457fe5b60408051888152602081018890528082018790526060810186905260808101859052905133917f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e3919081900360a00190a3505050505050565b8215801590611deb57508115155b8015611e0257506002816003811115611e0057fe5b145b15611e595742611e18848463ffffffff61318316565b11611e545760405162461bcd60e51b815260040180806020018281038252603a815260200180614287603a913960400191505060405180910390fd5b611efe565b82151580611e6657508115155b8015611e7d57506003816003811115611e7b57fe5b145b15611efe57818310611ec05760405162461bcd60e51b815260040180806020018281038252603b815260200180613dcf603b913960400191505060405180910390fd5b428211611efe5760405162461bcd60e51b81526004018080602001828103825260368152602001806142286036913960400191505060405180910390fd5b6000848152600860205260409020600380820185905560048201849055600a9091018054839260ff60b01b1990911690600160b01b908490811115611f3f57fe5b0217905550806003811115611f5057fe5b6040805186815260208101869052808201859052905133917f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f582650919081900360600190a350505050565b6001600160a01b038216611fde5760405162461bcd60e51b8152600401808060200182810382526033815260200180613ea66033913960400191505060405180910390fd5b6001600160a01b0382166000818152600d60209081526040808320858452825291829020805460ff191660011790558151848152915133927fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f492908290030190a35050565b6001600160a01b03811660009081526002602052604090205460ff1661209a5760405162461bcd60e51b815260040180806020018281038252602681526020018061430d6026913960400191505060405180910390fd5b6001600160a01b0381166000908152600260205260408120805460ff191690558054905b8181101561216157600081815481106120d357fe5b6000918252602090912001546001600160a01b0384811691161415612159576000600183038154811061210257fe5b600091825260208220015481546001600160a01b0390911691908390811061212657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612161565b6001016120be565b50600080548061216d57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f93003679928290030190a25050565b6001600160a01b03811661222f576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156122875760405162461bcd60e51b815260040180806020018281038252602a815260200180613da5602a913960400191505060405180910390fd5b6001600160a01b0381166000818152600260209081526040808320805460ff19166001908117909155835490810184559280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390920180546001600160a01b031916841790558151928352905133927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92908290030190a250565b808211156123625760405162461bcd60e51b815260040180806020018281038252603981526020018061406f6039913960400191505060405180910390fd5b6000838152600860209081526040918290208481556001018390558151858152908101849052808201839052905133917fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c919081900360600190a2505050565b6001600160a01b03811661241d576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16156124755760405162461bcd60e51b815260040180806020018281038252602c815260200180613ed9602c913960400191505060405180910390fd5b6001600160a01b0381166000818152600360209081526040808320805460ff191660019081179091558054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b031916841790558151928352905133927fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e92908290030190a250565b6001600160a01b0381166125555760405162461bcd60e51b815260040180806020018281038252602c815260200180613e0a602c913960400191505060405180910390fd5b6005546040516001600160a01b0380841692169033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5090600090a4600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604090205460ff1661260a5760405162461bcd60e51b81526004018080602001828103825260288152602001806141976028913960400191505060405180910390fd5b6001600160a01b0381166000908152600360205260408120805460ff19169055600154905b818110156126d3576001818154811061264457fe5b6000918252602090912001546001600160a01b03848116911614156126cb5760018083038154811061267257fe5b600091825260209091200154600180546001600160a01b03909216918390811061269857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506126d3565b60010161262f565b5060018054806126df57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed6928290030190a25050565b61274f8261321f565b6127a0576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6127a8613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561285757fe5b600181111561286257fe5b8152602001600a820160159054906101000a900460ff16600281111561288457fe5b600281111561288f57fe5b8152602001600a820160169054906101000a900460ff1660038111156128b157fe5b60038111156128bc57fe5b8152602001600a820160179054906101000a900460ff1660048111156128de57fe5b60048111156128e957fe5b90525090506000816101800151600281111561290157fe5b141561293e5760405162461bcd60e51b815260040180806020018281038252602881526020018061436d6028913960400191505060405180910390fd5b6002816101800151600281111561295157fe5b14156129b057336000908152600d6020908152604080832086845290915290205460ff166129b05760405162461bcd60e51b8152600401808060200182810382526028815260200180613f686028913960400191505060405180910390fd5b336000908152600960209081526040808320868452825290912054908201518110612a0c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613f056031913960400191505060405180910390fd5b6000808361016001516001811115612a2057fe5b1415612a2d575034612b7e565b83612a695760405162461bcd60e51b81526004018080602001828103825260238152602001806141486023913960400191505060405180910390fd5b6101408301516001600160a01b0316612ab35760405162461bcd60e51b815260040180806020018281038252602c81526020018061416b602c913960400191505060405180910390fd5b610140830151604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015612b0f57600080fd5b505af1158015612b23573d6000803e3d6000fd5b505050506040513d6020811015612b3957600080fd5b5051905080612b795760405162461bcd60e51b815260040180806020018281038252603a815260200180614333603a913960400191505060405180910390fd5b849150505b8251600090821015612bc15760405162461bcd60e51b8152600401808060200182810382526032815260200180613f366032913960400191505060405180910390fd5b60208401518290612bd8908563ffffffff6131dd16565b11612c11576020840151612bf690611a5e848663ffffffff61318316565b6020850151909150612c0e908463ffffffff6131dd16565b91505b6000612c2b856101200151846130e490919063ffffffff16565b6040860151909150612c43908263ffffffff6131dd16565b604080870191909152336000908152600960209081528282208a835290522054612c73908263ffffffff61318316565b3360009081526009602090815260408083208b8452909152902055612c988782613463565b612ca18761388f565b612cad87848684613af5565b8115612d75576101408501516040805163a9059cbb60e01b81523360048201526024810185905290516000926001600160a01b03169163a9059cbb91604480830192602092919082900301818787803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506040513d6020811015612d3357600080fd5b5051905080612d735760405162461bcd60e51b815260040180806020018281038252603981526020018061410f6039913960400191505060405180910390fd5b505b6040805188815260208101839052815133927f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba0928290030190a250505050505050565b6001600160a01b038116612dfd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d756030913960400191505060405180910390fd5b6007546040516001600160a01b0380841692169033907f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce190600090a4600780546001600160a01b0319166001600160a01b0392909216919091179055565b612e6433611638565b80612e7957506005546001600160a01b031633145b612eb45760405162461bcd60e51b81526004018080602001828103825260358152602001806140da6035913960400191505060405180910390fd5b60055433906001600160a01b031615612ed557506005546001600160a01b03165b60015b6004548111610e1f576000818152600c602052604090205460ff16156130dc57600081815260086020908152604080832060090154600b909252822054612f249163ffffffff613b4a16565b9050600080838152600860205260409020600a0154600160a01b900460ff166001811115612f4e57fe5b1415612ffa576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612f8a573d6000803e3d6000fd5b50826001600160a01b0316336001600160a01b03167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c8460008560405180848152602001836001811115612fda57fe5b60ff168152602001828152602001935050505060405180910390a36130da565b6000828152600860209081526040808320600a0154815163a9059cbb60e01b81526001600160a01b038881166004830152602482018790529251929091169363a9059cbb9360448084019491939192918390030190829087803b15801561306057600080fd5b505af1158015613074573d6000803e3d6000fd5b505050506040513d602081101561308a57600080fd5b5050604080518381526001602082015280820183905290516001600160a01b0385169133917fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c9181900360600190a35b505b600101612ed8565b6000826130f357506000610b0b565b8282028284828161310057fe5b041461313d5760405162461bcd60e51b81526004018080602001828103825260218152602001806140176021913960400191505060405180910390fd5b9392505050565b600060015b600454811161317f5760008181526008602052604090206002015461317590839063ffffffff61318316565b9150600101613149565b5090565b60008282018381101561313d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061313d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8c565b60008181526008602052604081206003015461326c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613f906026913960400191505060405180910390fd5b6000828152600c602052604090205460ff16156132d0576040805162461bcd60e51b815260206004820152601860248201527f4f726967696e73426173653a2053616c6520656e6465642e0000000000000000604482015290519081900360640190fd5b600080838152600860205260409020600a0154600160b01b900460ff1660038111156132f857fe5b141561330657506000610d47565b60016000838152600860205260409020600a0154600160b01b900460ff16600381111561332f57fe5b14801561334b5750600082815260086020526040902060020154155b1561336f57506000818152600c60205260408120805460ff19166001179055610d47565b60036000838152600860205260409020600a0154600160b01b900460ff16600381111561339857fe5b1480156133b5575060008281526008602052604090206004015442115b156133d957506000818152600c60205260408120805460ff19166001179055610d47565b60026000838152600860205260409020600a0154600160b01b900460ff16600381111561340257fe5b1480156134375750600082815260086020526040902060048101546003909101544291613435919063ffffffff61318316565b105b1561345b57506000818152600c60205260408120805460ff19166001179055610d47565b506001919050565b61346b613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561351a57fe5b600181111561352557fe5b8152602001600a820160159054906101000a900460ff16600281111561354757fe5b600281111561355257fe5b8152602001600a820160169054906101000a900460ff16600381111561357457fe5b600381111561357f57fe5b8152602001600a820160179054906101000a900460ff1660048111156135a157fe5b60048111156135ac57fe5b90525090506000816101c0015160048111156135c457fe5b14156136015760405162461bcd60e51b815260040180806020018281038252602b8152602001806141bf602b913960400191505060405180910390fd5b6001816101c00151600481111561361457fe5b14156136a3576101408101516040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50610f429050565b6002816101c0015160048111156136b657fe5b1415613700576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b6003816101c00151600481111561371357fe5b1415613832576006546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561377257600080fd5b505af1158015613786573d6000803e3d6000fd5b505050506040513d602081101561379c57600080fd5b505060075460e082015161010083015160c08401516040805163849a681760e01b815233600482015260248101889052604481019490945260648401929092526084830152516001600160a01b039092169163849a68179160a48082019260009290919082900301818387803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b50505050610f42565b6004816101c00151600481111561384557fe5b1415610f42576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b613897613c88565b60008281526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561394657fe5b600181111561395157fe5b8152602001600a820160159054906101000a900460ff16600281111561397357fe5b600281111561397e57fe5b8152602001600a820160169054906101000a900460ff1660038111156139a057fe5b60038111156139ab57fe5b8152602001600a820160179054906101000a900460ff1660048111156139cd57fe5b60048111156139d857fe5b815250509050806020015181604001511015610e1f57805160408201511015613a9c576040810151613a54576000828152600c6020908152604091829020805460ff191660011790558151848152915133927f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c492908290030190a25b6000828152600860209081526040808320929092558151848152915133927f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a7892908290030190a25b6040808201805160008581526008602090815290849020600101919091559051825185815291820152815133927f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445928290030190a25050565b8215610d315781613b16576000848152600a60205260409020805460010190555b6000848152600b6020526040902054613b35908263ffffffff61318316565b6000858152600b602052604090205550505050565b600061313d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c23565b60008184841115613c1b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be0578181015183820152602001613bc8565b50505050905090810190601f168015613c0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c725760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be0578181015183820152602001613bc8565b506000838581613c7e57fe5b0495945050505050565b604051806101e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001811115613cf757fe5b81526020016000815260200160008152602001600090529056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158201af36c62015c55f48b1b93810fd5dacf4fb278b800aee7e218cc1503740f4c5964736f6c63430005110032", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json b/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json new file mode 100644 index 0000000..ce9ad16 --- /dev/null +++ b/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json @@ -0,0 +1,642 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OriginsEvents", + "sourceName": "contracts/OriginsEvents.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_verifiedAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "AddressVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_oldDepositAddr", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_newDepositAddr", + "type": "address" + } + ], + "name": "DepositAddressUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_oldLockedFund", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_newLockedFund", + "type": "address" + } + ], + "name": "LockedFundUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "NewTierCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "OwnerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_removedOwner", + "type": "address" + } + ], + "name": "OwnerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum OriginsStorage.DepositType", + "name": "_depositType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "ProceedingWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_depositRate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "_depositToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum OriginsStorage.DepositType", + "name": "_depositType", + "type": "uint8" + } + ], + "name": "TierDepositUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "TierSaleEnded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_updatedMaxAmount", + "type": "uint256" + } + ], + "name": "TierSaleUpdatedMaximum", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + } + ], + "name": "TierSaleUpdatedMinimum", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_saleStartTS", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_saleEnd", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "enum OriginsStorage.SaleEndDurationOrTS", + "name": "_saleEndDurationOrTS", + "type": "uint8" + } + ], + "name": "TierTimeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_remainingTokens", + "type": "uint256" + } + ], + "name": "TierTokenAmountUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_maxAmount", + "type": "uint256" + } + ], + "name": "TierTokenLimitUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum OriginsStorage.VerificationType", + "name": "_verificationType", + "type": "uint8" + } + ], + "name": "TierVerificationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_vestOrLockCliff", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_vestOrLockDuration", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_unlockedTokenWithdrawTS", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_unlockedBP", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "enum OriginsStorage.TransferType", + "name": "_transferType", + "type": "uint8" + } + ], + "name": "TierVestOrLockUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tierID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_tokensBought", + "type": "uint256" + } + ], + "name": "TokenBuy", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newVerifier", + "type": "address" + } + ], + "name": "VerifierAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_removedVerifier", + "type": "address" + } + ], + "name": "VerifierRemoved", + "type": "event" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "addOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newVerifier", + "type": "address" + } + ], + "name": "addVerifier", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "checkOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "checkVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getVerifiers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_ownerToRemove", + "type": "address" + } + ], + "name": "removeOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_verifierToRemove", + "type": "address" + } + ], + "name": "removeVerifier", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json b/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json new file mode 100644 index 0000000..3438a09 --- /dev/null +++ b/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json @@ -0,0 +1,219 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OriginsStorage", + "sourceName": "contracts/OriginsStorage.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "OwnerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_removedOwner", + "type": "address" + } + ], + "name": "OwnerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_newVerifier", + "type": "address" + } + ], + "name": "VerifierAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_removedVerifier", + "type": "address" + } + ], + "name": "VerifierRemoved", + "type": "event" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "addOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_newVerifier", + "type": "address" + } + ], + "name": "addVerifier", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "checkOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "checkVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getVerifiers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_ownerToRemove", + "type": "address" + } + ], + "name": "removeOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_verifierToRemove", + "type": "address" + } + ], + "name": "removeVerifier", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} From 632552460dff9a649cc0f7d13541cd52aa12dc7f Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:07:58 +0530 Subject: [PATCH 009/112] Updated package.json and lock file --- package-lock.json | 36761 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 82 + 2 files changed, 36843 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5219bc0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,36761 @@ +{ + "name": "origins", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "101": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/101/-/101-1.6.3.tgz", + "integrity": "sha512-4dmQ45yY0Dx24Qxp+zAsNLlMF6tteCyfVzgbulvSyC7tCyd3V8sW76sS0tHq8NpcbXfWTKasfyfzU1Kd86oKzw==", + "dev": true, + "requires": { + "clone": "^1.0.2", + "deep-eql": "^0.1.3", + "keypather": "^1.10.2" + }, + "dependencies": { + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + } + }, + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "@apollo/client": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.3.19.tgz", + "integrity": "sha512-vzljWLPP0GwocfBhUopzDCUwsiaNTtii1eu8qDybAXqwj4/ZhnIM46c6dNQmnVcJpAIFRIsNCOxM4OlMDySJug==", + "dev": true, + "optional": true, + "requires": { + "@graphql-typed-document-node/core": "^3.0.0", + "@types/zen-observable": "^0.8.0", + "@wry/context": "^0.6.0", + "@wry/equality": "^0.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graphql-tag": "^2.12.0", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.16.0", + "prop-types": "^15.7.2", + "symbol-observable": "^2.0.0", + "ts-invariant": "^0.7.0", + "tslib": "^1.10.0", + "zen-observable": "^0.8.14" + }, + "dependencies": { + "@wry/equality": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.4.0.tgz", + "integrity": "sha512-DxN/uawWfhRbgYE55zVCPOoe+jvsQ4m7PT1Wlxjyb/LCCLuU1UsucV2BbCxFAX8bjcSueFBbB5Qfj1Zfe8e7Fw==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "dev": true, + "optional": true + }, + "ts-invariant": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.7.3.tgz", + "integrity": "sha512-UWDDeovyUTIMWj+45g5nhnl+8oo+GhxL5leTaHn5c8FkQWfh8v66gccLd2/YzVmV5hoQUjCEjhrXnQqVDJdvKA==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "@apollo/protobufjs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", + "integrity": "sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ==", + "dev": true, + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true, + "optional": true + } + } + }, + "@apollographql/apollo-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.1.tgz", + "integrity": "sha512-ZII+/xUFfb9ezDU2gad114+zScxVFMVlZ91f8fGApMzlS1kkqoyLnC4AJaQ1Ya/X+b63I20B4Gd+eCL8QuB4sA==", + "dev": true, + "optional": true + }, + "@apollographql/graphql-playground-html": { + "version": "1.6.27", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz", + "integrity": "sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw==", + "dev": true, + "optional": true, + "requires": { + "xss": "^1.0.8" + } + }, + "@apollographql/graphql-upload-8-fork": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz", + "integrity": "sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g==", + "dev": true, + "optional": true, + "requires": { + "@types/express": "*", + "@types/fs-capacitor": "*", + "@types/koa": "*", + "busboy": "^0.3.1", + "fs-capacitor": "^2.0.4", + "http-errors": "^1.7.3", + "object-path": "^0.11.4" + }, + "dependencies": { + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "dev": true, + "optional": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "optional": true + } + } + }, + "@ardatan/aggregate-error": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", + "integrity": "sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==", + "dev": true, + "optional": true, + "requires": { + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz", + "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==", + "dev": true, + "optional": true + }, + "@babel/core": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", + "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.3", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.3", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/parser": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", + "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "dev": true, + "optional": true + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "optional": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "optional": true + } + } + }, + "@babel/generator": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", + "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz", + "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==", + "dev": true, + "optional": true, + "requires": { + "@babel/compat-data": "^7.14.4", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz", + "integrity": "sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.14.4", + "@babel/helper-split-export-declaration": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", + "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/parser": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", + "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "dev": true, + "optional": true + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "optional": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "optional": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true, + "optional": true + }, + "@babel/helper-replace-supers": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz", + "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/parser": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", + "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "dev": true, + "optional": true + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "optional": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "optional": true + } + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true, + "optional": true + }, + "@babel/helpers": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "dev": true, + "optional": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/parser": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", + "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "dev": true, + "optional": true + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "optional": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "optional": true + } + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", + "dev": true, + "optional": true + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz", + "integrity": "sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA==", + "dev": true, + "optional": true, + "requires": { + "@babel/compat-data": "^7.14.4", + "@babel/helper-compilation-targets": "^7.14.4", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.2" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", + "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz", + "integrity": "sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz", + "integrity": "sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.14.4", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "optional": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz", + "integrity": "sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz", + "integrity": "sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-flow": "^7.12.13" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.13.12", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", + "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.2.tgz", + "integrity": "sha512-zCubvP+jjahpnFJvPaHPiGVfuVUjXHhFvJKQdNnsmSsiU9kR/rCZ41jHc++tERD2zV+p7Hr6is+t5b6iWTCqSw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.3.tgz", + "integrity": "sha512-uuxuoUNVhdgYzERiHHFkE4dWoJx+UFVyuAl0aqN8P2/AKFHwqgUC5w2+4/PjpKXJsFgBlYAFXlUmDQ3k3DUkXw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.14.2" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/runtime": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + } + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "optional": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "optional": true + } + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@consento/sync-randombytes": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@consento/sync-randombytes/-/sync-randombytes-1.0.5.tgz", + "integrity": "sha512-mPJ2XvrTLQGEdhleDuSIkWtVWnvmhREOC1FjorV1nlK49t/52Z9X1d618gTj6nlQghRLiYvcd8oL4vZ2YZuDIQ==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.4.3", + "seedrandom": "^3.0.5" + } + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@ethereumjs/block": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.3.0.tgz", + "integrity": "sha512-WoefY9Rs4W8vZTxG9qwntAlV61xsSv0NPoXmHO7x3SH16dwJQtU15YvahPCz4HEEXbu7GgGgNgu0pv8JY7VauA==", + "dev": true, + "requires": { + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/tx": "^3.2.0", + "ethereumjs-util": "^7.0.10", + "merkle-patricia-tree": "^4.2.0" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ethereumjs-util": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", + "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + } + } + }, + "@ethereumjs/blockchain": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.3.0.tgz", + "integrity": "sha512-B0Y5QDZcRDQISPilv3m8nzk97QmC98DnSE9WxzGpCxfef22Mw7xhwGipci5Iy0dVC2Np2Cr5d3F6bHAR7+yVmQ==", + "dev": true, + "requires": { + "@ethereumjs/block": "^3.3.0", + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/ethash": "^1.0.0", + "debug": "^2.2.0", + "ethereumjs-util": "^7.0.10", + "level-mem": "^5.0.1", + "lru-cache": "^5.1.1", + "rlp": "^2.2.4", + "semaphore-async-await": "^1.5.1" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ethereumjs-util": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", + "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + } + } + }, + "@ethereumjs/common": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.3.0.tgz", + "integrity": "sha512-Fmi15MdVptsC85n6NcUXIFiiXCXWEfZNgPWP+OGAQOC6ZtdzoNawtxH/cYpIgEgSuIzfOeX3VKQP/qVI1wISHg==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.0.10" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ethereumjs-util": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", + "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + } + } + }, + "@ethereumjs/ethash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.0.0.tgz", + "integrity": "sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw==", + "dev": true, + "requires": { + "@types/levelup": "^4.3.0", + "buffer-xor": "^2.0.1", + "ethereumjs-util": "^7.0.7", + "miller-rabin": "^4.0.0" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "buffer-xor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", + "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-util": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", + "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + } + } + }, + "@ethereumjs/tx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.2.0.tgz", + "integrity": "sha512-D3X/XtZ3ldUg34hr99Jvj7NxW3NxVKdUKrwQnEWlAp4CmCQpvYoyn7NF4lk34rHEt7ScS+Agu01pcDHoOcd19A==", + "dev": true, + "requires": { + "@ethereumjs/common": "^2.3.0", + "ethereumjs-util": "^7.0.10" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ethereumjs-util": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", + "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + } + } + }, + "@ethereumjs/vm": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.4.0.tgz", + "integrity": "sha512-0Mv51inp5S/mh+fKP0H90byT/5DdFirChUFUMhEjDlIBnHK55o/liKZ+0iNSLm6ZxX8iPs7urp11/UCoxPJfLA==", + "dev": true, + "requires": { + "@ethereumjs/block": "^3.3.0", + "@ethereumjs/blockchain": "^5.3.0", + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/tx": "^3.2.0", + "async-eventemitter": "^0.2.4", + "core-js-pure": "^3.0.1", + "debug": "^2.2.0", + "ethereumjs-util": "^7.0.10", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "merkle-patricia-tree": "^4.2.0", + "rustbn.js": "~0.2.0", + "util.promisify": "^1.0.1" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ethereumjs-util": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", + "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + } + } + }, + "@ethersproject/abi": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", + "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz", + "integrity": "sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/networks": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "@ethersproject/web": "^5.3.0" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz", + "integrity": "sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0" + } + }, + "@ethersproject/address": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.3.0.tgz", + "integrity": "sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/rlp": "^5.3.0" + } + }, + "@ethersproject/base64": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.3.0.tgz", + "integrity": "sha512-JIqgtOmgKcbc2sjGWTXyXktqUhvFUDte8fPVsAaOrcPiJf6YotNF+nsrOYGC9pbHBEGSuSBp3QR0varkO8JHEw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0" + } + }, + "@ethersproject/basex": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.3.0.tgz", + "integrity": "sha512-8J4nS6t/SOnoCgr3DF5WCSRLC5YwTKYpZWJqeyYQLX+86TwPhtzvHXacODzcDII9tWKhVg6g0Bka8JCBWXsCiQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/properties": "^5.3.0" + } + }, + "@ethersproject/bignumber": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.3.0.tgz", + "integrity": "sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "bn.js": "^4.11.9" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "@ethersproject/bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.3.0.tgz", + "integrity": "sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/constants": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.3.0.tgz", + "integrity": "sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0" + } + }, + "@ethersproject/contracts": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.3.0.tgz", + "integrity": "sha512-eDyQ8ltykvyQqnGZxb/c1e0OnEtzqXhNNC4BX8nhYBCaoBrYYuK/1fLmyEvc5+XUMoxNhwpYkoSSwvPLci7/Zg==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.3.0", + "@ethersproject/abstract-provider": "^5.3.0", + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/transactions": "^5.3.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.3.0.tgz", + "integrity": "sha512-NaT4UacjOwca8qCG/gv8k+DgTcWu49xlrvdhr/p8PTFnoS8e3aMWqjI3znFME5Txa/QWXDrg2/heufIUue9rtw==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + } + } + }, + "@ethersproject/hash": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.3.0.tgz", + "integrity": "sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + }, + "@ethersproject/hdnode": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.3.0.tgz", + "integrity": "sha512-zLmmtLNoDMGoYRdjOab01Zqkvp+TmZyCGDAMQF1Bs3yZyBs/kzTNi1qJjR1jVUcPP5CWGtjFwY8iNG8oNV9J8g==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/basex": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/pbkdf2": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/sha2": "^5.3.0", + "@ethersproject/signing-key": "^5.3.0", + "@ethersproject/strings": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "@ethersproject/wordlists": "^5.3.0" + } + }, + "@ethersproject/json-wallets": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.3.0.tgz", + "integrity": "sha512-/xwbqaIb5grUIGNmeEaz8GdcpmDr++X8WT4Jqcclnxow8PXCUHFeDxjf3O+nSuoqOYG/Ds0+BI5xuQKbva6Xkw==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/hdnode": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/pbkdf2": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/random": "^5.3.0", + "@ethersproject/strings": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + }, + "dependencies": { + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + } + } + }, + "@ethersproject/keccak256": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.3.0.tgz", + "integrity": "sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "js-sha3": "0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + } + } + }, + "@ethersproject/logger": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.3.0.tgz", + "integrity": "sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA==", + "dev": true + }, + "@ethersproject/networks": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.3.0.tgz", + "integrity": "sha512-XGbD9MMgqrR7SYz8o6xVgdG+25v7YT5vQG8ZdlcLj2I7elOBM7VNeQrnxfSN7rWQNcqu2z80OM29gGbQz+4Low==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/pbkdf2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.3.0.tgz", + "integrity": "sha512-Q9ChVU6gBFiex0FSdtzo4b0SAKz3ZYcYVFLrEWHL0FnHvNk3J3WgAtRNtBQGQYn/T5wkoTdZttMbfBkFlaiWcA==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/sha2": "^5.3.0" + } + }, + "@ethersproject/properties": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.3.0.tgz", + "integrity": "sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/providers": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.3.0.tgz", + "integrity": "sha512-HtL+DEbzPcRyfrkrMay7Rk/4he+NbUpzI/wHXP4Cqtra82nQOnqqCgTQc4HbdDrl75WVxG/JRMFhyneIPIMZaA==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.3.0", + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/basex": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/networks": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/random": "^5.3.0", + "@ethersproject/rlp": "^5.3.0", + "@ethersproject/sha2": "^5.3.0", + "@ethersproject/strings": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "@ethersproject/web": "^5.3.0", + "bech32": "1.1.4", + "ws": "7.4.6" + }, + "dependencies": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true + } + } + }, + "@ethersproject/random": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.3.0.tgz", + "integrity": "sha512-A5SL/4inutSwt3Fh2OD0x2gz+x6GHmuUnIPkR7zAiTidMD2N8F6tZdMF1hlQKWVCcVMWhEQg8mWijhEzm6BBYw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/rlp": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.3.0.tgz", + "integrity": "sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/sha2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.3.0.tgz", + "integrity": "sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "hash.js": "1.1.7" + } + }, + "@ethersproject/signing-key": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.3.0.tgz", + "integrity": "sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "@ethersproject/solidity": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.3.0.tgz", + "integrity": "sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/sha2": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + }, + "@ethersproject/strings": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.3.0.tgz", + "integrity": "sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/transactions": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.3.0.tgz", + "integrity": "sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/rlp": "^5.3.0", + "@ethersproject/signing-key": "^5.3.0" + } + }, + "@ethersproject/units": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.3.0.tgz", + "integrity": "sha512-BkfccZGwfJ6Ob+AelpIrgAzuNhrN2VLp3AILnkqTOv+yBdsc83V4AYf25XC/u0rHnWl6f4POaietPwlMqP2vUg==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/wallet": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.3.0.tgz", + "integrity": "sha512-boYBLydG6671p9QoG6EinNnNzbm7DNOjVT20eV8J6HQEq4aUaGiA2CytF2vK+2rOEWbzhZqoNDt6AlkE1LlsTg==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.3.0", + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/hdnode": "^5.3.0", + "@ethersproject/json-wallets": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/random": "^5.3.0", + "@ethersproject/signing-key": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "@ethersproject/wordlists": "^5.3.0" + } + }, + "@ethersproject/web": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.3.0.tgz", + "integrity": "sha512-Ni6/DHnY6k/TD41LEkv0RQDx4jqWz5e/RZvrSecsxGYycF+MFy2z++T/yGc2peRunLOTIFwEksgEGGlbwfYmhQ==", + "dev": true, + "requires": { + "@ethersproject/base64": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + }, + "@ethersproject/wordlists": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.3.0.tgz", + "integrity": "sha512-JcwumCZcsUxgWpiFU/BRy6b4KlTRdOmYvOKZcAw/3sdF93/pZyPW5Od2hFkHS8oWp4xS06YQ+qHqQhdcxdHafQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + }, + "@graphql-tools/batch-delegate": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-delegate/-/batch-delegate-6.2.6.tgz", + "integrity": "sha512-QUoE9pQtkdNPFdJHSnBhZtUfr3M7pIRoXoMR+TG7DK2Y62ISKbT/bKtZEUU1/2v5uqd5WVIvw9dF8gHDSJAsSA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/delegate": "^6.2.4", + "dataloader": "2.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/batch-execute": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-7.1.2.tgz", + "integrity": "sha512-IuR2SB2MnC2ztA/XeTMTfWcA0Wy7ZH5u+nDkDNLAdX+AaSyDnsQS35sCmHqG0VOGTl7rzoyBWLCKGwSJplgtwg==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.7.0", + "dataloader": "2.0.0", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + } + } + }, + "@graphql-tools/code-file-loader": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-6.3.1.tgz", + "integrity": "sha512-ZJimcm2ig+avgsEOWWVvAaxZrXXhiiSZyYYOJi0hk9wh5BxZcLUNKkTp6EFnZE/jmGUwuos3pIjUD3Hwi3Bwhg==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/graphql-tag-pluck": "^6.5.1", + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/delegate": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-6.2.4.tgz", + "integrity": "sha512-mXe6DfoWmq49kPcDrpKHgC2DSWcD5q0YCaHHoXYPAOlnLH8VMTY8BxcE8y/Do2eyg+GLcwAcrpffVszWMwqw0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "dataloader": "2.0.0", + "is-promise": "4.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/git-loader": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-6.2.6.tgz", + "integrity": "sha512-ooQTt2CaG47vEYPP3CPD+nbA0F+FYQXfzrB1Y1ABN9K3d3O2RK3g8qwslzZaI8VJQthvKwt0A95ZeE4XxteYfw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/graphql-tag-pluck": "^6.2.6", + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/github-loader": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-6.2.5.tgz", + "integrity": "sha512-DLuQmYeNNdPo8oWus8EePxWCfCAyUXPZ/p1PWqjrX/NGPyH2ZObdqtDAfRHztljt0F/qkBHbGHCEk2TKbRZTRw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/graphql-tag-pluck": "^6.2.6", + "@graphql-tools/utils": "^7.0.0", + "cross-fetch": "3.0.6", + "tslib": "~2.0.1" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/graphql-file-loader": { + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.2.7.tgz", + "integrity": "sha512-5k2SNz0W87tDcymhEMZMkd6/vs6QawDyjQXWtqkuLTBF3vxjxPD1I4dwHoxgWPIjjANhXybvulD7E+St/7s9TQ==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/import": "^6.2.6", + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/graphql-tag-pluck": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-6.5.1.tgz", + "integrity": "sha512-7qkm82iFmcpb8M6/yRgzjShtW6Qu2OlCSZp8uatA3J0eMl87TxyJoUmL3M3UMMOSundAK8GmoyNVFUrueueV5Q==", + "dev": true, + "optional": true, + "requires": { + "@babel/parser": "7.12.16", + "@babel/traverse": "7.12.13", + "@babel/types": "7.12.13", + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/import": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.3.1.tgz", + "integrity": "sha512-1szR19JI6WPibjYurMLdadHKZoG9C//8I/FZ0Dt4vJSbrMdVNp8WFxg4QnZrDeMG4MzZc90etsyF5ofKjcC+jw==", + "dev": true, + "optional": true, + "requires": { + "resolve-from": "5.0.0", + "tslib": "~2.2.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/json-file-loader": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-6.2.6.tgz", + "integrity": "sha512-CnfwBSY5926zyb6fkDBHnlTblHnHI4hoBALFYXnrg0Ev4yWU8B04DZl/pBRUc459VNgO2x8/mxGIZj2hPJG1EA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/links": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-6.2.5.tgz", + "integrity": "sha512-XeGDioW7F+HK6HHD/zCeF0HRC9s12NfOXAKv1HC0J7D50F4qqMvhdS/OkjzLoBqsgh/Gm8icRc36B5s0rOA9ig==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.0.0", + "apollo-link": "1.2.14", + "apollo-upload-client": "14.1.2", + "cross-fetch": "3.0.6", + "form-data": "3.0.0", + "is-promise": "4.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/load": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-6.2.8.tgz", + "integrity": "sha512-JpbyXOXd8fJXdBh2ta0Q4w8ia6uK5FHzrTNmcvYBvflFuWly2LDTk2abbSl81zKkzswQMEd2UIYghXELRg8eTA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/merge": "^6.2.12", + "@graphql-tools/utils": "^7.5.0", + "globby": "11.0.3", + "import-from": "3.0.0", + "is-glob": "4.0.1", + "p-limit": "3.1.0", + "tslib": "~2.2.0", + "unixify": "1.0.0", + "valid-url": "1.0.9" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "optional": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "optional": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "optional": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "optional": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "optional": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "optional": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "optional": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "optional": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@graphql-tools/load-files": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/load-files/-/load-files-6.3.2.tgz", + "integrity": "sha512-3mgwEKZ8yy7CD/uVs9yeXR3r+GwjlTKRG5bC75xdJFN8WbzbcHjIJiTXfWSAYqbfSTam0hWnRdWghagzFSo5kQ==", + "dev": true, + "optional": true, + "requires": { + "globby": "11.0.3", + "tslib": "~2.1.0", + "unixify": "1.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "optional": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "optional": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "optional": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "optional": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "optional": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "optional": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "optional": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/merge": { + "version": "6.2.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-6.2.14.tgz", + "integrity": "sha512-RWT4Td0ROJai2eR66NHejgf8UwnXJqZxXgDWDI+7hua5vNA2OW8Mf9K1Wav1ZkjWnuRp4ztNtkZGie5ISw55ow==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/schema": "^7.0.0", + "@graphql-tools/utils": "^7.7.0", + "tslib": "~2.2.0" + }, + "dependencies": { + "@graphql-tools/schema": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-7.1.5.tgz", + "integrity": "sha512-uyn3HSNSckf4mvQSq0Q07CPaVZMNFCYEVxroApOaw802m9DcZPgf9XVPy/gda5GWj9AhbijfRYVTZQgHnJ4CXA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.1.2", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + } + }, + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + } + } + }, + "@graphql-tools/mock": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/mock/-/mock-6.2.4.tgz", + "integrity": "sha512-O5Zvq/mcDZ7Ptky0IZ4EK9USmxV6FEVYq0Jxv2TI80kvxbCjt0tbEpZ+r1vIt1gZOXlAvadSHYyzWnUPh+1vkQ==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/module-loader": { + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/module-loader/-/module-loader-6.2.7.tgz", + "integrity": "sha512-ItAAbHvwfznY9h1H9FwHYDstTcm22Dr5R9GZtrWlpwqj0jaJGcBxsMB9jnK9kFqkbtFYEe4E/NsSnxsS4/vViQ==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.5.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/relay-operation-optimizer": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.3.0.tgz", + "integrity": "sha512-Or3UgRvkY9Fq1AAx7q38oPqFmTepLz7kp6wDHKyR0ceG7AvHv5En22R12mAeISInbhff4Rpwgf6cE8zHRu6bCw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.1.0", + "relay-compiler": "10.1.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/resolvers-composition": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/resolvers-composition/-/resolvers-composition-6.2.8.tgz", + "integrity": "sha512-/2xedRZYhvts88x9Rv/VWrk69wpl84M7cuYZ4aAacqxnXNm7zxT+MqeL54lsRhq2Kb2yjEhtfguEiqOn+kV8Xg==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.9.1", + "lodash": "4.17.21", + "tslib": "~2.2.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + } + } + }, + "@graphql-tools/schema": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.2.4.tgz", + "integrity": "sha512-rh+14lSY1q8IPbEv2J9x8UBFJ5NrDX9W5asXEUlPp+7vraLp/Tiox4GXdgyA92JhwpYco3nTf5Bo2JDMt1KnAQ==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^6.2.4", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/stitch": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/stitch/-/stitch-6.2.4.tgz", + "integrity": "sha512-0C7PNkS7v7iAc001m7c1LPm5FUB0/DYw+s3OyCii6YYYHY8NwdI0roeOyeDGFJkFubWBQfjc3hoSyueKtU73mw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/batch-delegate": "^6.2.4", + "@graphql-tools/delegate": "^6.2.4", + "@graphql-tools/merge": "^6.2.4", + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "@graphql-tools/wrap": "^6.2.4", + "is-promise": "4.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/url-loader": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-6.10.1.tgz", + "integrity": "sha512-DSDrbhQIv7fheQ60pfDpGD256ixUQIR6Hhf9Z5bRjVkXOCvO5XrkwoWLiU7iHL81GB1r0Ba31bf+sl+D4nyyfw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/delegate": "^7.0.1", + "@graphql-tools/utils": "^7.9.0", + "@graphql-tools/wrap": "^7.0.4", + "@microsoft/fetch-event-source": "2.0.1", + "@types/websocket": "1.0.2", + "abort-controller": "3.0.0", + "cross-fetch": "3.1.4", + "extract-files": "9.0.0", + "form-data": "4.0.0", + "graphql-ws": "^4.4.1", + "is-promise": "4.0.0", + "isomorphic-ws": "4.0.1", + "lodash": "4.17.21", + "meros": "1.1.4", + "subscriptions-transport-ws": "^0.9.18", + "sync-fetch": "0.3.0", + "tslib": "~2.2.0", + "valid-url": "1.0.9", + "ws": "7.4.5" + }, + "dependencies": { + "@graphql-tools/delegate": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-7.1.5.tgz", + "integrity": "sha512-bQu+hDd37e+FZ0CQGEEczmRSfQRnnXeUxI/0miDV+NV/zCbEdIJj5tYFNrKT03W6wgdqx8U06d8L23LxvGri/g==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "@graphql-tools/batch-execute": "^7.1.2", + "@graphql-tools/schema": "^7.1.5", + "@graphql-tools/utils": "^7.7.1", + "dataloader": "2.0.0", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + } + }, + "@graphql-tools/schema": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-7.1.5.tgz", + "integrity": "sha512-uyn3HSNSckf4mvQSq0Q07CPaVZMNFCYEVxroApOaw802m9DcZPgf9XVPy/gda5GWj9AhbijfRYVTZQgHnJ4CXA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.1.2", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + } + }, + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "@graphql-tools/wrap": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-7.0.8.tgz", + "integrity": "sha512-1NDUymworsOlb53Qfh7fonDi2STvqCtbeE68ntKY9K/Ju/be2ZNxrFSbrBHwnxWcN9PjISNnLcAyJ1L5tCUyhg==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/delegate": "^7.1.5", + "@graphql-tools/schema": "^7.1.5", + "@graphql-tools/utils": "^7.8.1", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "dev": true, + "optional": true, + "requires": { + "node-fetch": "2.6.1" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/utils": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.4.tgz", + "integrity": "sha512-ybgZ9EIJE3JMOtTrTd2VcIpTXtDrn2q6eiYkeYMKRVh3K41+LZa6YnR2zKERTXqTWqhobROwLt4BZbw2O3Aeeg==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.1", + "tslib": "~2.0.1" + }, + "dependencies": { + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/wrap": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-6.2.4.tgz", + "integrity": "sha512-cyQgpybolF9DjL2QNOvTS1WDCT/epgYoiA8/8b3nwv5xmMBQ6/6nYnZwityCZ7njb7MMyk7HBEDNNlP9qNJDcA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/delegate": "^6.2.4", + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "is-promise": "4.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-typed-document-node/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz", + "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==", + "dev": true, + "optional": true + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "@improbable-eng/grpc-web": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.13.0.tgz", + "integrity": "sha512-vaxxT+Qwb7GPqDQrBV4vAAfH0HywgOLw6xGIKXd9Q8hcV63CQhmS3p4+pZ9/wVvt4Ph3ZDK9fdC983b9aGMUFg==", + "dev": true, + "optional": true, + "requires": { + "browser-headers": "^0.4.0" + } + }, + "@josephg/resolvable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", + "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==", + "dev": true, + "optional": true + }, + "@ledgerhq/devices": { + "version": "5.51.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.51.1.tgz", + "integrity": "sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA==", + "dev": true, + "optional": true, + "requires": { + "@ledgerhq/errors": "^5.50.0", + "@ledgerhq/logs": "^5.50.0", + "rxjs": "6", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@ledgerhq/errors": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.50.0.tgz", + "integrity": "sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow==", + "dev": true, + "optional": true + }, + "@ledgerhq/hw-transport": { + "version": "5.51.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz", + "integrity": "sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw==", + "dev": true, + "optional": true, + "requires": { + "@ledgerhq/devices": "^5.51.1", + "@ledgerhq/errors": "^5.50.0", + "events": "^3.3.0" + } + }, + "@ledgerhq/hw-transport-webusb": { + "version": "5.53.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-5.53.1.tgz", + "integrity": "sha512-A/f+xcrkIAZiJrvPpDvsrjxQX4cI2kbdiunQkwsYmOG3Bp4z89ZnsBiC7YBst4n2/g+QgTg0/KPVtODU5djooQ==", + "dev": true, + "optional": true, + "requires": { + "@ledgerhq/devices": "^5.51.1", + "@ledgerhq/errors": "^5.50.0", + "@ledgerhq/hw-transport": "^5.51.1", + "@ledgerhq/logs": "^5.50.0" + } + }, + "@ledgerhq/logs": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.50.0.tgz", + "integrity": "sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==", + "dev": true, + "optional": true + }, + "@microsoft/fetch-event-source": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz", + "integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==", + "dev": true, + "optional": true + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@multiformats/base-x": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", + "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==", + "dev": true, + "optional": true + }, + "@nodefactory/filsnap-adapter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@nodefactory/filsnap-adapter/-/filsnap-adapter-0.2.2.tgz", + "integrity": "sha512-nbaYMwVopOXN2bWOdDY3il6gGL9qMuCmMN4WPuoxzJjSnAMJNqEeSe6MNNJ/fYBLipZcJfAtirNXRrFLFN+Tvw==", + "dev": true, + "optional": true + }, + "@nodefactory/filsnap-types": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@nodefactory/filsnap-types/-/filsnap-types-0.2.2.tgz", + "integrity": "sha512-XT1tE2vrYF2D0tSNNekgjqKRpqPQn4W72eKul9dDCul/8ykouhqnVTyjFHYvBhlBWE0PK3nmG7i83QvhgGSiMw==", + "dev": true, + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + } + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nomiclabs/hardhat-ethers": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz", + "integrity": "sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg==", + "dev": true + }, + "@nomiclabs/hardhat-ganache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ganache/-/hardhat-ganache-2.0.0.tgz", + "integrity": "sha512-JJI4+5bHZUoeuIZL42usxp+0i/krYnoApzzA2Xii1P7DwrZHwFBa2OCtR1sUq5z3VTSTvQKrJ1d2/Y6CoQGTKQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "ganache-core": "^2.7.0", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@nomiclabs/hardhat-truffle5": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.0.tgz", + "integrity": "sha512-JLjyfeXTiSqa0oLHcN3i8kD4coJa4Gx6uAXybGv3aBiliEbHddLSzmBWx0EU69a1/Ad5YDdGSqVnjB8mkUCr/g==", + "dev": true, + "requires": { + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^6.1.0", + "fs-extra": "^7.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "@nomiclabs/hardhat-web3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", + "dev": true, + "requires": { + "@types/bignumber.js": "^5.0.0" + } + }, + "@nomiclabs/truffle-contract": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.2.23.tgz", + "integrity": "sha512-Khj/Ts9r0LqEpGYhISbc+8WTOd6qJ4aFnDR+Ew+neqcjGnhwrIvuihNwPFWU6hDepW3Xod6Y+rTo90N8sLRDjw==", + "dev": true, + "requires": { + "@truffle/blockchain-utils": "^0.0.25", + "@truffle/contract-schema": "^3.2.5", + "@truffle/debug-utils": "^4.2.9", + "@truffle/error": "^0.0.11", + "@truffle/interface-adapter": "^0.4.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "dependencies": { + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "dev": true + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.5.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true + } + } + }, + "@openzeppelin/contract-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.2.tgz", + "integrity": "sha512-/P8v8ZFVwK+Z7rHQH2N3hqzEmTzLFjhMtvNK4FeIak6DEeONZ92vdFaFb10CCCQtp390Rp/Y57Rtfrm50bUdMQ==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "@openzeppelin/test-helpers": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.11.tgz", + "integrity": "sha512-HkFpCjtTD8dk+wdYhsT07YbMGCE+Z4Wp5sBKXvPDF3Lynoc0H2KqZgCWV+qr2YZ0WW1oX/sXkKFrrKJ0caBTjw==", + "dev": true, + "requires": { + "@openzeppelin/contract-loader": "^0.6.2", + "@truffle/contract": "^4.0.35", + "ansi-colors": "^3.2.3", + "chai": "^4.2.0", + "chai-bn": "^0.2.1", + "ethjs-abi": "^0.2.1", + "lodash.flatten": "^4.4.0", + "semver": "^5.6.0", + "web3": "^1.2.5", + "web3-utils": "^1.2.5" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "dev": true, + "optional": true + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true, + "optional": true + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true, + "optional": true + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "dev": true, + "optional": true + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dev": true, + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true, + "optional": true + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "dev": true, + "optional": true + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true, + "optional": true + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true, + "optional": true + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "dev": true, + "optional": true + }, + "@redux-saga/core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.1.3.tgz", + "integrity": "sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.6.3", + "@redux-saga/deferred": "^1.1.2", + "@redux-saga/delay-p": "^1.1.2", + "@redux-saga/is": "^1.1.2", + "@redux-saga/symbols": "^1.1.2", + "@redux-saga/types": "^1.1.0", + "redux": "^4.0.4", + "typescript-tuple": "^2.2.1" + }, + "dependencies": { + "redux": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.0.tgz", + "integrity": "sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2" + } + } + } + }, + "@redux-saga/deferred": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.1.2.tgz", + "integrity": "sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ==", + "dev": true + }, + "@redux-saga/delay-p": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.1.2.tgz", + "integrity": "sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g==", + "dev": true, + "requires": { + "@redux-saga/symbols": "^1.1.2" + } + }, + "@redux-saga/is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.2.tgz", + "integrity": "sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w==", + "dev": true, + "requires": { + "@redux-saga/symbols": "^1.1.2", + "@redux-saga/types": "^1.1.0" + } + }, + "@redux-saga/symbols": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.2.tgz", + "integrity": "sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ==", + "dev": true + }, + "@redux-saga/types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.1.0.tgz", + "integrity": "sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==", + "dev": true + }, + "@repeaterjs/repeater": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", + "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==", + "dev": true, + "optional": true + }, + "@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "requires": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dev": true, + "requires": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true + }, + "@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "requires": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@solidity-parser/parser": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.10.2.tgz", + "integrity": "sha512-SFO5xlpR5rnqIds++4JDcXMG9b6KfslcxKoX+y19rizB0sNkv9mRs/TA5PhD4MrRbyaS60FkQ4updZtjPa4LjQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@textile/buckets": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@textile/buckets/-/buckets-6.0.5.tgz", + "integrity": "sha512-MJum/qLGPE13Ew0uhoNI4Wp2SdDCdmfp35JFEBHU4Uisna0PZ4lfOFXZVA/cVVgw5g94NOm1KS0FXQKu0x8prw==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@repeaterjs/repeater": "^3.0.4", + "@textile/buckets-grpc": "2.6.5", + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-authentication": "^3.3.4", + "@textile/grpc-connection": "^2.4.1", + "@textile/grpc-transport": "^0.4.0", + "@textile/hub-grpc": "2.6.5", + "@textile/hub-threads-client": "^5.3.4", + "@textile/security": "^0.8.1", + "@textile/threads-id": "^0.5.1", + "abort-controller": "^3.0.0", + "cids": "^1.1.4", + "it-drain": "^1.0.3", + "loglevel": "^1.6.8", + "paramap-it": "^0.1.1" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "@textile/buckets-grpc": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@textile/buckets-grpc/-/buckets-grpc-2.6.5.tgz", + "integrity": "sha512-jySQPKJvqeyeVJZIx4BUlgi3MHxKvVpyV1NtoZXserItLbNNPURaFuCeLi7ujAXjGWIcMMJMbcFfSsetDVvrOQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/google-protobuf": "^3.7.4", + "google-protobuf": "^3.13.0" + } + }, + "@textile/context": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@textile/context/-/context-0.11.1.tgz", + "integrity": "sha512-XP1cBT5OaJVt8LrTCzE/OffnmE4ImwDXiGG7kzU5gCRSx5ftafEwgOOjbQA3HRPl7nWW1YdBsiZf35xSM1KmoQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@textile/security": "^0.8.1" + } + }, + "@textile/crypto": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@textile/crypto/-/crypto-4.1.1.tgz", + "integrity": "sha512-n/SxZyNvAD4FEyfX1HXtyNDcK+stUYur0vgwIoi5NzT6jP6gwhFVzf8NI3TBNIP2rInCAuF3Qks8hWS+LWL/YA==", + "dev": true, + "optional": true, + "requires": { + "@types/ed2curve": "^0.2.2", + "ed2curve": "^0.3.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", + "multibase": "^3.1.0", + "tweetnacl": "^1.0.3" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "optional": true + } + } + }, + "@textile/grpc-authentication": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@textile/grpc-authentication/-/grpc-authentication-3.3.4.tgz", + "integrity": "sha512-E7pw+MDNu7oWFWiTqDuLZncei+GIwnlSXlRlrRUXITZrf9vBiY+QHKkDrhLyhBpaLGazqB0PERzOFx8a0BYlbw==", + "dev": true, + "optional": true, + "requires": { + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-connection": "^2.4.1", + "@textile/hub-threads-client": "^5.3.4", + "@textile/security": "^0.8.1" + } + }, + "@textile/grpc-connection": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@textile/grpc-connection/-/grpc-connection-2.4.1.tgz", + "integrity": "sha512-8+y9PFcl9VBCludEpXvzputIis3lKYAzExdm8+zvtrr9uv0dCovIS0bu2GJoqU6DJkQSVBP9PA4V6T9THuQpjQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.12.0", + "@textile/context": "^0.11.1", + "@textile/grpc-transport": "^0.4.0" + }, + "dependencies": { + "@improbable-eng/grpc-web": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.12.0.tgz", + "integrity": "sha512-uJjgMPngreRTYPBuo6gswMj1gK39Wbqre/RgE0XnSDXJRg6ST7ZhuS53dFE6Vc2CX4jxgl+cO+0B3op8LA4Q0Q==", + "dev": true, + "optional": true, + "requires": { + "browser-headers": "^0.4.0" + } + } + } + }, + "@textile/grpc-powergate-client": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@textile/grpc-powergate-client/-/grpc-powergate-client-2.6.0.tgz", + "integrity": "sha512-5QkU3aClcuqsxPd9Ej2TTYjFUJhXzZzcZ/tSDlZ5jerFnRp09SaL4U+yjnBSe+Dc1k/jv6MUnfjte2vq3YX3Nw==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.14.0", + "@types/google-protobuf": "^3.15.2", + "google-protobuf": "^3.17.2" + }, + "dependencies": { + "@improbable-eng/grpc-web": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.14.0.tgz", + "integrity": "sha512-ag1PTMWpBZKGi6GrEcZ4lkU5Qag23Xjo10BmnK9qyx4TMmSVcWmQ3rECirfQzm2uogrM9n1M6xfOpFsJP62ivA==", + "dev": true, + "optional": true, + "requires": { + "browser-headers": "^0.4.1" + } + } + } + }, + "@textile/grpc-transport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@textile/grpc-transport/-/grpc-transport-0.4.0.tgz", + "integrity": "sha512-OyHyv963Y0y1qlMkuIp7urWCKbCL0Tjn06ffFo+u82yy6G1YprjTQDE980dUGQMZfK1EF2/OTjqZb04PxHa5zQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/ws": "^7.2.6", + "isomorphic-ws": "^4.0.1", + "loglevel": "^1.6.6", + "ws": "^7.2.1" + }, + "dependencies": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "optional": true + } + } + }, + "@textile/hub": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@textile/hub/-/hub-6.1.2.tgz", + "integrity": "sha512-BnmF1539+/939BmmHt+X7TzSrDgD3vkP5tBHZKksjppJn6q+6BJOPYdmWapt6S9YOTQAoCcYkkcr+xUdN8z3mA==", + "dev": true, + "optional": true, + "requires": { + "@textile/buckets": "^6.0.5", + "@textile/crypto": "^4.1.1", + "@textile/grpc-authentication": "^3.3.4", + "@textile/hub-filecoin": "^2.0.5", + "@textile/hub-grpc": "2.6.5", + "@textile/hub-threads-client": "^5.3.4", + "@textile/security": "^0.8.1", + "@textile/threads-id": "^0.5.1", + "@textile/users": "^6.0.4", + "loglevel": "^1.6.8", + "multihashes": "3.1.2" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "multihashes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-3.1.2.tgz", + "integrity": "sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^3.1.0", + "uint8arrays": "^2.0.5", + "varint": "^6.0.0" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + } + } + }, + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "@textile/hub-filecoin": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@textile/hub-filecoin/-/hub-filecoin-2.0.5.tgz", + "integrity": "sha512-5qwm3aMeR5q6KBbY1tVagUynMDw/Irh6jijgtlv66kQ+CbV4TgQjLsIH14UQkgcAW5hj1CMfqPIabLaBXFtDlA==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.12.0", + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-authentication": "^3.3.4", + "@textile/grpc-connection": "^2.4.1", + "@textile/grpc-powergate-client": "^2.3.0", + "@textile/hub-grpc": "2.6.5", + "@textile/security": "^0.8.1", + "event-iterator": "^2.0.0", + "loglevel": "^1.6.8" + }, + "dependencies": { + "@improbable-eng/grpc-web": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.12.0.tgz", + "integrity": "sha512-uJjgMPngreRTYPBuo6gswMj1gK39Wbqre/RgE0XnSDXJRg6ST7ZhuS53dFE6Vc2CX4jxgl+cO+0B3op8LA4Q0Q==", + "dev": true, + "optional": true, + "requires": { + "browser-headers": "^0.4.0" + } + }, + "event-iterator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", + "integrity": "sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==", + "dev": true, + "optional": true + } + } + }, + "@textile/hub-grpc": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@textile/hub-grpc/-/hub-grpc-2.6.5.tgz", + "integrity": "sha512-BFjhkBOQD1CebGjP4Hys/6Z5OlzepZTbC11kUSuLG6mt4rb2JiDNw25/UUzylsJCkpyAusob2sttJ9GUh/lv+g==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/google-protobuf": "^3.7.4", + "google-protobuf": "^3.13.0" + } + }, + "@textile/hub-threads-client": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@textile/hub-threads-client/-/hub-threads-client-5.3.4.tgz", + "integrity": "sha512-bKbpavWOg2bH9Zuf/aSmg7YOfKzx9yL7xmvPYo1FBaVcos8XeZvsN2gA80oFzTfm88e6xvotNNcRy7GktGDWIQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@textile/context": "^0.11.1", + "@textile/hub-grpc": "2.6.5", + "@textile/security": "^0.8.1", + "@textile/threads-client": "^2.1.2", + "@textile/threads-id": "^0.5.1", + "@textile/users-grpc": "2.6.5", + "loglevel": "^1.7.0" + } + }, + "@textile/multiaddr": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@textile/multiaddr/-/multiaddr-0.5.1.tgz", + "integrity": "sha512-i/lBZ9j+MgxqcjLl+4lbOCbw5dU3Vbn39aGKma8yBILLPbmCAWWUDGzk5+Rbcnk3giuPBM/nNhJLLSeKzK+rhA==", + "dev": true, + "optional": true, + "requires": { + "@textile/threads-id": "^0.5.1", + "multiaddr": "^8.1.2", + "varint": "^6.0.0" + }, + "dependencies": { + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "@textile/security": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@textile/security/-/security-0.8.1.tgz", + "integrity": "sha512-FVoBRP7DAL+lh1+CyUQPE3ceG8HO3LMClTPYuNjW+2BAOR+KiKf5vFbeSpe29l6p+A9LF5/r2KWz7bN5cqCs8w==", + "dev": true, + "optional": true, + "requires": { + "@consento/sync-randombytes": "^1.0.5", + "fast-sha256": "^1.3.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", + "multibase": "^3.1.0" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + } + } + }, + "@textile/threads-client": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@textile/threads-client/-/threads-client-2.1.2.tgz", + "integrity": "sha512-N4ItF3hxKmdC3oA1dAENw9uA7Q89q86/foYiNaXLPq5KJ1B3IYP3GdXjxe56wkT6dRRniCIREkRnqDdwVpRtQA==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-transport": "^0.4.0", + "@textile/multiaddr": "^0.5.1", + "@textile/security": "^0.8.1", + "@textile/threads-client-grpc": "^1.0.2", + "@textile/threads-id": "^0.5.1", + "@types/to-json-schema": "^0.2.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", + "to-json-schema": "^0.2.5" + } + }, + "@textile/threads-client-grpc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@textile/threads-client-grpc/-/threads-client-grpc-1.0.2.tgz", + "integrity": "sha512-yrgdUb3VLGW18HKmbzAU8L7NElhnPYKWG9cHZG6EnV3ITS9zOiDydfVSNSkojEDfoFSel5x3eAUiOQbXUrkKng==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/google-protobuf": "^3.7.3", + "google-protobuf": "^3.13.0" + } + }, + "@textile/threads-id": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@textile/threads-id/-/threads-id-0.5.1.tgz", + "integrity": "sha512-Nyvp24RsHarLBT3JxEI5akshcKKXA4Yx851bAooReE5G/40cijMuxTeVK4hDM0HdTex4PZRYozpPRXIDFDA96Q==", + "dev": true, + "optional": true, + "requires": { + "@consento/sync-randombytes": "^1.0.4", + "multibase": "^3.1.0", + "varint": "^6.0.0" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "@textile/users": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@textile/users/-/users-6.0.4.tgz", + "integrity": "sha512-/aDwdcsvpW0QrUuXmRAAg41oGjGebwMUGK5czY0gcI/+Av6W8PicHJk4O9ft5ByfwXWzUMyz3ODWH45OYi0TVQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@textile/buckets-grpc": "2.6.5", + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-authentication": "^3.3.4", + "@textile/grpc-connection": "^2.4.1", + "@textile/grpc-transport": "^0.4.0", + "@textile/hub-grpc": "2.6.5", + "@textile/hub-threads-client": "^5.3.4", + "@textile/security": "^0.8.1", + "@textile/threads-id": "^0.5.1", + "@textile/users-grpc": "2.6.5", + "event-iterator": "^2.0.0", + "loglevel": "^1.7.0" + }, + "dependencies": { + "event-iterator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", + "integrity": "sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==", + "dev": true, + "optional": true + } + } + }, + "@textile/users-grpc": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@textile/users-grpc/-/users-grpc-2.6.5.tgz", + "integrity": "sha512-JMxkze3eyxyuxhbuMrqdbVTqp5wQmv1YoXAq1gJdAYYpcOX5S4ov6arI5NPy3weF3+KP3U+BX/HdR8dIvkFAcw==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/google-protobuf": "^3.7.4", + "google-protobuf": "^3.13.0" + } + }, + "@truffle/abi-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.2.1.tgz", + "integrity": "sha512-Ba05gGBzTqjzgpQ8Fpfny47HD3aMn7+LWZ44A0HXdMgn1d5bxjR8SPYlXV5jo5fpOOvsghfQTvSUk0G9fg2fIg==", + "dev": true, + "requires": { + "change-case": "3.0.2", + "faker": "^5.3.1", + "fast-check": "^2.12.1" + } + }, + "@truffle/blockchain-utils": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.0.25.tgz", + "integrity": "sha512-XA5m0BfAWtysy5ChHyiAf1fXbJxJXphKk+eZ9Rb9Twi6fn3Jg4gnHNwYXJacYFEydqT5vr2s4Ou812JHlautpw==", + "dev": true, + "requires": { + "source-map-support": "^0.5.19" + } + }, + "@truffle/code-utils": { + "version": "1.2.27", + "resolved": "https://registry.npmjs.org/@truffle/code-utils/-/code-utils-1.2.27.tgz", + "integrity": "sha512-1vnJYup1KDlXWsDbEinMFhWN1VyqRWxWzDN4UhdfqCUXrEWDBpGmKeEPLwwKYuUBY43TDPpnwq1/cGGN0PjOeA==", + "dev": true, + "requires": { + "cbor": "^5.1.0" + } + }, + "@truffle/codec": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.7.1.tgz", + "integrity": "sha512-mNd6KnW6J0UB1zafGBXDlTEbCMvWpmPAJmzv7aF/nAIaN/F8UePSCiQ1OTQP39Rprj6GFiCCaWVnBAwum6UGSg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "bn.js": "^4.11.8", + "borc": "^2.1.2", + "debug": "^4.1.0", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.partition": "^4.6.0", + "lodash.sum": "^4.0.2", + "semver": "^6.3.0", + "source-map-support": "^0.5.19", + "utf8": "^3.0.0", + "web3-utils": "1.2.9" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@truffle/config": { + "version": "1.2.42", + "resolved": "https://registry.npmjs.org/@truffle/config/-/config-1.2.42.tgz", + "integrity": "sha512-Nfn0tR3Wuj3PoC46AskNa8MOPU1M51NNXZConY11eWJtkalXielZPOtTLRKX3W45M2M7b7maT7L/aWl7lrsIow==", + "dev": true, + "optional": true, + "requires": { + "@truffle/error": "^0.0.14", + "@truffle/events": "^0.0.12", + "@truffle/provider": "^0.2.32", + "configstore": "^4.0.0", + "find-up": "^2.1.0", + "lodash.assignin": "^4.2.0", + "lodash.merge": "^4.6.2", + "module": "^1.2.5", + "original-require": "^1.0.1" + }, + "dependencies": { + "@truffle/error": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.14.tgz", + "integrity": "sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA==", + "dev": true, + "optional": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "optional": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "optional": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "optional": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "optional": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "optional": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "optional": true + } + } + }, + "@truffle/contract": { + "version": "4.3.19", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.3.19.tgz", + "integrity": "sha512-asBwoxUePLwNAuYfHO/SvyZyqFQ9QMeUieJ6PXD9DBrUdNpjgJvk+WHYnXH4bWHgHakbTpL1MEBa1qmcAL+LMw==", + "dev": true, + "requires": { + "@truffle/blockchain-utils": "^0.0.30", + "@truffle/contract-schema": "^3.4.1", + "@truffle/debug-utils": "^5.0.19", + "@truffle/error": "^0.0.14", + "@truffle/interface-adapter": "^0.5.0", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.32", + "web3": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-eth-abi": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "@truffle/blockchain-utils": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.0.30.tgz", + "integrity": "sha512-3hkHSHxVavoALcxpBqD4YwHuCmkBrvjq6PAGw93i6WCB+pnejBD5sFjVCiZZKCogh4kGObxxcwu53+3dyT/6IQ==", + "dev": true + }, + "@truffle/codec": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.10.9.tgz", + "integrity": "sha512-+xBcn1mTAqBhVaFULkMC+pJnUp3prL9QZtE5I4XhlCar3QLkSGR9Oy+Bm5qZwH72rctBRD/lGp2ezUo/oFc2MQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "bn.js": "^5.1.3", + "cbor": "^5.1.0", + "debug": "^4.3.1", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.partition": "^4.6.0", + "lodash.sum": "^4.0.2", + "semver": "^7.3.4", + "utf8": "^3.0.0", + "web3-utils": "1.3.6" + } + }, + "@truffle/debug-utils": { + "version": "5.0.19", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-5.0.19.tgz", + "integrity": "sha512-wCF5fwyJTHGBwQD+m8npRCrUIgSPw9jRiZlvyuE+TDcVNBpV4A1NcdsTJR/E5lAViLDTp9lpelsgA/Mw65kU+w==", + "dev": true, + "requires": { + "@truffle/codec": "^0.10.9", + "@trufflesuite/chromafi": "^2.2.2", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlight.js": "^10.4.0", + "highlightjs-solidity": "^1.1.0" + } + }, + "@truffle/error": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.14.tgz", + "integrity": "sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA==", + "dev": true + }, + "@truffle/interface-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.0.tgz", + "integrity": "sha512-0MRt9orgQqo0knyKDy0fGRqnI+alkuK0BUAvHB1/VUJgCKyWBNAUUZO5gPjuj75qCjV4Rw+W6SKDQpn2xOWsXw==", + "dev": true, + "requires": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.3.6" + } + }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.5.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + } + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + } + } + }, + "@truffle/contract-schema": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.1.tgz", + "integrity": "sha512-2gvu6gxJtbbI67H2Bwh2rBuej+1uCV3z4zKFzQZP00hjNoL+QfybrmBcOVB88PflBeEB+oUXuwQfDoKX3TXlnQ==", + "dev": true, + "requires": { + "ajv": "^6.10.0", + "crypto-js": "^3.1.9-1", + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@truffle/db": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/@truffle/db/-/db-0.5.14.tgz", + "integrity": "sha512-rTRhRqPsG03Lv6y43n5CAZF9q40NK1D2VwqTI9xD7lU/klYYHtKklgWAIgqn4TmVS5tP2MGVNzgdr0tMzJQE0Q==", + "dev": true, + "optional": true, + "requires": { + "@truffle/abi-utils": "^0.2.1", + "@truffle/code-utils": "^1.2.27", + "@truffle/config": "^1.2.42", + "apollo-server": "^2.18.2", + "debug": "^4.3.1", + "fs-extra": "^9.1.0", + "graphql": "^15.3.0", + "graphql-tag": "^2.11.0", + "graphql-tools": "^6.2.4", + "json-stable-stringify": "^1.0.1", + "jsondown": "^1.0.0", + "pascal-case": "^2.0.1", + "pluralize": "^8.0.0", + "pouchdb": "7.1.1", + "pouchdb-adapter-memory": "^7.1.1", + "pouchdb-adapter-node-websql": "^7.0.0", + "pouchdb-debug": "^7.1.1", + "pouchdb-find": "^7.0.0", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "optional": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "optional": true + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true, + "optional": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "optional": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "@truffle/debug-utils": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-4.2.14.tgz", + "integrity": "sha512-g5UTX2DPTzrjRjBJkviGI2IrQRTTSvqjmNWCNZNXP+vgQKNxL9maLZhQ6oA3BuuByVW/kusgYeXt8+W1zynC8g==", + "dev": true, + "requires": { + "@truffle/codec": "^0.7.1", + "@trufflesuite/chromafi": "^2.2.1", + "chalk": "^2.4.2", + "debug": "^4.1.0", + "highlight.js": "^9.15.8", + "highlightjs-solidity": "^1.0.18" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@truffle/debugger": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@truffle/debugger/-/debugger-9.0.1.tgz", + "integrity": "sha512-1Om8f6LhHOYaYi3oV7+OoP4ZPZ9mkO+sHIsBvSU57Jptc3FnL3gYHV/fAhIih/dMWFDpywOTWKVMiK6vYq3bWw==", + "dev": true, + "requires": { + "@truffle/abi-utils": "^0.2.1", + "@truffle/codec": "^0.10.9", + "@truffle/source-map-utils": "^1.3.43", + "bn.js": "^5.1.3", + "debug": "^4.3.1", + "json-pointer": "^0.6.0", + "json-stable-stringify": "^1.0.1", + "lodash.flatten": "^4.4.0", + "lodash.merge": "^4.6.2", + "lodash.sum": "^4.0.2", + "lodash.zipwith": "^4.2.0", + "redux": "^3.7.2", + "redux-cli-logger": "^2.0.1", + "redux-saga": "1.0.0", + "remote-redux-devtools": "^0.5.12", + "reselect-tree": "^1.3.4", + "semver": "^7.3.4", + "web3": "1.3.6", + "web3-eth-abi": "1.3.6" + }, + "dependencies": { + "@truffle/codec": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.10.9.tgz", + "integrity": "sha512-+xBcn1mTAqBhVaFULkMC+pJnUp3prL9QZtE5I4XhlCar3QLkSGR9Oy+Bm5qZwH72rctBRD/lGp2ezUo/oFc2MQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "bn.js": "^5.1.3", + "cbor": "^5.1.0", + "debug": "^4.3.1", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.partition": "^4.6.0", + "lodash.sum": "^4.0.2", + "semver": "^7.3.4", + "utf8": "^3.0.0", + "web3-utils": "1.3.6" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + } + } + }, + "@truffle/error": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.11.tgz", + "integrity": "sha512-ju6TucjlJkfYMmdraYY/IBJaFb+Sa+huhYtOoyOJ+G29KcgytUVnDzKGwC7Kgk6IsxQMm62Mc1E0GZzFbGGipw==", + "dev": true + }, + "@truffle/events": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@truffle/events/-/events-0.0.12.tgz", + "integrity": "sha512-Atblkx0M/Ct+uzx41HpKLLdHxB6p7aQ9jXw/r5KCRnbMBbOdoYWF+PCebGFkLvVg7N0Ll2dHpDvB+PDGP//cew==", + "dev": true, + "optional": true, + "requires": { + "emittery": "^0.4.1", + "ora": "^3.4.0" + } + }, + "@truffle/interface-adapter": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.4.24.tgz", + "integrity": "sha512-2Zho4dJbm/XGwNleY7FdxcjXiAR3SzdGklgrAW4N/YVmltaJv6bT56ACIbPNN6AdzkTSTO65OlsB/63sfSa/VA==", + "dev": true, + "requires": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.3.6" + }, + "dependencies": { + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.5.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true + } + } + }, + "@truffle/preserve": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve/-/preserve-0.2.2.tgz", + "integrity": "sha512-yg2AII9X2o9kwLvMXGJ9jcmrIhKtMynXFP19LacA27MAOV/v+xjauXL9irfcd/9zpSv2b1DACYbeTyufpsatvw==", + "dev": true, + "optional": true, + "requires": { + "spinnies": "^0.5.1" + } + }, + "@truffle/preserve-fs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve-fs/-/preserve-fs-0.2.2.tgz", + "integrity": "sha512-t5YPqVfdEdpC85QRGxWPmgq8/iC4dDE2PSmmt0KKwtSx2kVw+DCXLUdl82T6Bp5En5Hbg8Pwehi1h37OAJ7dWQ==", + "dev": true, + "optional": true, + "requires": { + "@truffle/preserve": "^0.2.2" + } + }, + "@truffle/preserve-to-buckets": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve-to-buckets/-/preserve-to-buckets-0.2.2.tgz", + "integrity": "sha512-VxfnLQ4NDt2t/MrM3FAt1TfOHzkusgPgyltO/cTFYDj+ljXWlECPY9XZgQ60kpWLbNzq6SXjJuWYnCYEmTxghA==", + "dev": true, + "optional": true, + "requires": { + "@textile/hub": "^6.0.2", + "@truffle/preserve": "^0.2.2", + "cids": "^1.1.5", + "ipfs-http-client": "^48.2.2", + "isomorphic-ws": "^4.0.1", + "iter-tools": "^7.0.2", + "ws": "^7.4.3" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "optional": true + } + } + }, + "@truffle/preserve-to-filecoin": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve-to-filecoin/-/preserve-to-filecoin-0.2.2.tgz", + "integrity": "sha512-cg5uFp1HTlVpVH0dTpv+0nR6v0SZP6673m2NaFOjYpTtbN4AA+ijvXd0XPdDNitw/6So+vDcPpzuE79RkY5zSg==", + "dev": true, + "optional": true, + "requires": { + "@truffle/preserve": "^0.2.2", + "cids": "^1.1.5", + "delay": "^5.0.0", + "filecoin.js": "^0.0.5-alpha", + "node-fetch": "^2.6.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "@truffle/preserve-to-ipfs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve-to-ipfs/-/preserve-to-ipfs-0.2.2.tgz", + "integrity": "sha512-6y/237oLtkJbDRJb1Lj6xblz1iaQXfbjJdvtTAxwX3Z9bcMQmv33pDaUTEgkYXc+dYaOf8hQi511xEoqJXQx6A==", + "dev": true, + "optional": true, + "requires": { + "@truffle/preserve": "^0.2.2", + "cids": "^1.1.5", + "ipfs-http-client": "^48.2.2", + "iter-tools": "^7.0.2" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "@truffle/provider": { + "version": "0.2.32", + "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.32.tgz", + "integrity": "sha512-dzO7bnCO5iSLfoHH/SIIYQ5dUi9oVxtRE1qJ89dwKuUgtvaWOTPtZK1MLq7Ai+wrgNrYFKBVpxQjkCPXGdMWWw==", + "dev": true, + "requires": { + "@truffle/error": "^0.0.14", + "@truffle/interface-adapter": "^0.5.0", + "web3": "1.3.6" + }, + "dependencies": { + "@truffle/error": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.14.tgz", + "integrity": "sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA==", + "dev": true + }, + "@truffle/interface-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.0.tgz", + "integrity": "sha512-0MRt9orgQqo0knyKDy0fGRqnI+alkuK0BUAvHB1/VUJgCKyWBNAUUZO5gPjuj75qCjV4Rw+W6SKDQpn2xOWsXw==", + "dev": true, + "requires": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.3.6" + } + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.5.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true + } + } + }, + "@truffle/source-map-utils": { + "version": "1.3.43", + "resolved": "https://registry.npmjs.org/@truffle/source-map-utils/-/source-map-utils-1.3.43.tgz", + "integrity": "sha512-QDXNnvJO2R/5eTpTgiZFggkqKcDEA0LoxdVGJKCoMY5hCwSoG+ybpmWtsMBW+1hCYewxjvb5yGgYkhnTv/fs0A==", + "dev": true, + "requires": { + "@truffle/code-utils": "^1.2.27", + "@truffle/codec": "^0.10.9", + "debug": "^4.3.1", + "json-pointer": "^0.6.0", + "node-interval-tree": "^1.3.3", + "web3-utils": "1.3.6" + }, + "dependencies": { + "@truffle/codec": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.10.9.tgz", + "integrity": "sha512-+xBcn1mTAqBhVaFULkMC+pJnUp3prL9QZtE5I4XhlCar3QLkSGR9Oy+Bm5qZwH72rctBRD/lGp2ezUo/oFc2MQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "bn.js": "^5.1.3", + "cbor": "^5.1.0", + "debug": "^4.3.1", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.partition": "^4.6.0", + "lodash.sum": "^4.0.2", + "semver": "^7.3.4", + "utf8": "^3.0.0", + "web3-utils": "1.3.6" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + } + } + }, + "@trufflesuite/chromafi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-2.2.2.tgz", + "integrity": "sha512-mItQwVBsb8qP/vaYHQ1kDt2vJLhjoEXJptT6y6fJGvFophMFhOI/NsTVUa0nJL1nyMeFiS6hSYuNVdpQZzB1gA==", + "dev": true, + "requires": { + "ansi-mark": "^1.0.0", + "ansi-regex": "^3.0.0", + "array-uniq": "^1.0.3", + "camelcase": "^4.1.0", + "chalk": "^2.3.2", + "cheerio": "^1.0.0-rc.2", + "detect-indent": "^5.0.0", + "he": "^1.1.1", + "highlight.js": "^10.4.1", + "lodash.merge": "^4.6.2", + "min-indent": "^1.0.0", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0", + "super-split": "^1.1.0" + }, + "dependencies": { + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true + } + } + }, + "@types/abstract-leveldown": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz", + "integrity": "sha512-wYxU3kp5zItbxKmeRYCEplS2MW7DzyBnxPGj+GJVHZEUZiK/nn5Ei1sUFgURDh+X051+zsGe28iud3oHjrYWQQ==", + "dev": true + }, + "@types/accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "dev": true, + "requires": { + "bignumber.js": "*" + } + }, + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/chai": { + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.18.tgz", + "integrity": "sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ==", + "dev": true + }, + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==", + "dev": true + }, + "@types/cookies": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.6.tgz", + "integrity": "sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, + "@types/cors": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", + "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "dev": true, + "optional": true + }, + "@types/ed2curve": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@types/ed2curve/-/ed2curve-0.2.2.tgz", + "integrity": "sha512-G1sTX5xo91ydevQPINbL2nfgVAj/s1ZiqZxC8OCWduwu+edoNGUm5JXtTkg9F3LsBZbRI46/0HES4CPUE2wc9g==", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^1.0.0" + }, + "dependencies": { + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "optional": true + } + } + }, + "@types/express": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", + "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz", + "integrity": "sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/fs-capacitor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", + "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/google-protobuf": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.2.tgz", + "integrity": "sha512-ubeqvw7sl6CdgeiIilsXB2jIFoD/D0F+/LIEp7xEBEXRNtDJcf05FRINybsJtL7GlkWOUVn6gJs2W9OF+xI6lg==", + "dev": true, + "optional": true + }, + "@types/http-assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", + "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==", + "dev": true + }, + "@types/http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true, + "optional": true + }, + "@types/keygrip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", + "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==", + "dev": true + }, + "@types/koa": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.3.tgz", + "integrity": "sha512-TaujBV+Dhe/FvmSMZJtCFBms+bqQacgUebk/M2C2tq8iGmHE/DDf4DcW2Hc7NqusVZmy5xzrWOjtdPKNP+fTfw==", + "dev": true, + "requires": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "@types/koa-compose": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", + "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", + "dev": true, + "requires": { + "@types/koa": "*" + } + }, + "@types/levelup": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.1.tgz", + "integrity": "sha512-n//PeTpbHLjMLTIgW5B/g06W/6iuTBHuvUka2nFL9APMSVMNe2r4enADfu3CIE9IyV9E+uquf9OEQQqrDeg24A==", + "dev": true, + "requires": { + "@types/abstract-leveldown": "*", + "@types/node": "*" + } + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "dev": true, + "optional": true + }, + "@types/lru-cache": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.0.tgz", + "integrity": "sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "@types/node": { + "version": "12.20.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.14.tgz", + "integrity": "sha512-iFJOS5Q470FF+r4Ol2pSley7/wCNVqf+jgjhtxLLaJcDs+To2iCxlXIkJXrGLD9w9G/oJ9ibySu7z92DCwr7Pg==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.2.tgz", + "integrity": "sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/to-json-schema": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@types/to-json-schema/-/to-json-schema-0.2.0.tgz", + "integrity": "sha512-9fqRjNFSSxJ8dQrE4v8gThS5ftxdFj8Q0y8hAjaF+uN+saJRxLiJdtFaDd9sv3bhzwcB2oDJpT/1ZelHnexbLw==", + "dev": true, + "optional": true, + "requires": { + "@types/json-schema": "*" + } + }, + "@types/websocket": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.2.tgz", + "integrity": "sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-d/7W23JAXPodQNbOZNXvl2K+bqAQrCMwlh/nuQsPSQk6Fq0opHoPrUw43aHsvSbIiQPr8Of2hkFbnz1XBFVyZQ==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@types/zen-observable": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz", + "integrity": "sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==", + "dev": true, + "optional": true + }, + "@vue/component-compiler-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", + "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@wry/context": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.6.0.tgz", + "integrity": "sha512-sAgendOXR8dM7stJw3FusRxFHF/ZinU0lffsA2YTyyIOfic86JX02qlPqPVqJNZJPAxFt+2EE8bvq6ZlS0Kf+Q==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@wry/equality": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", + "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "@wry/trie": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.0.tgz", + "integrity": "sha512-Yw1akIogPhAT6XPYsRHlZZIS0tIGmAl9EYXHi2scf7LPKKqdqmow/Hu4kEqP2cJR3EjaU/9L0ZlAjFf3hFxmug==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@zondax/filecoin-signing-tools": { + "version": "github:Digital-MOB-Filecoin/filecoin-signing-tools-js#8f8e92157cac2556d35cab866779e9a8ea8a4e25", + "from": "github:Digital-MOB-Filecoin/filecoin-signing-tools-js", + "dev": true, + "optional": true, + "requires": { + "axios": "^0.20.0", + "base32-decode": "^1.0.0", + "base32-encode": "^1.1.1", + "bip32": "^2.0.5", + "bip39": "^3.0.2", + "blakejs": "^1.1.0", + "bn.js": "^5.1.2", + "ipld-dag-cbor": "^0.17.0", + "leb128": "0.0.5", + "secp256k1": "^4.0.1" + }, + "dependencies": { + "axios": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", + "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", + "dev": true, + "optional": true, + "requires": { + "follow-redirects": "^1.10.0" + } + } + } + }, + "@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "dev": true, + "optional": true + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true, + "optional": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "abstract-leveldown": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", + "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "dev": true, + "optional": true, + "requires": { + "acorn": "^2.1.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "dev": true, + "optional": true + } + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true + }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-mark": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ansi-mark/-/ansi-mark-1.0.4.tgz", + "integrity": "sha1-HNS6jVfxXxCdaq9uycqXhsik7mw=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "array-uniq": "^1.0.3", + "chalk": "^2.3.2", + "strip-ansi": "^4.0.0", + "super-split": "^1.1.0" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "antlr4": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", + "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==", + "dev": true + }, + "antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true + }, + "any-signal": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-2.1.2.tgz", + "integrity": "sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ==", + "dev": true, + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "native-abort-controller": "^1.0.3" + }, + "dependencies": { + "native-abort-controller": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/native-abort-controller/-/native-abort-controller-1.0.3.tgz", + "integrity": "sha512-fd5LY5q06mHKZPD5FmMrn7Lkd2H018oBGKNOAdLpctBDEPFKsfJ1nX9ke+XRa8PEJJpjqrpQkGjq2IZ27QNmYA==", + "dev": true, + "optional": true + } + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "apollo-cache-control": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz", + "integrity": "sha512-qN4BCq90egQrgNnTRMUHikLZZAprf3gbm8rC5Vwmc6ZdLolQ7bFsa769Hqi6Tq/lS31KLsXBLTOsRbfPHph12w==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-env": "^3.1.0", + "apollo-server-plugin-base": "^0.13.0" + } + }, + "apollo-datasource": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.9.0.tgz", + "integrity": "sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-caching": "^0.7.0", + "apollo-server-env": "^3.1.0" + } + }, + "apollo-graphql": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.9.3.tgz", + "integrity": "sha512-rcAl2E841Iko4kSzj4Pt3PRBitmyq1MvoEmpl04TQSpGnoVgl1E/ZXuLBYxMTSnEAm7umn2IsoY+c6Ll9U/10A==", + "dev": true, + "optional": true, + "requires": { + "core-js-pure": "^3.10.2", + "lodash.sortby": "^4.7.0", + "sha.js": "^2.4.11" + } + }, + "apollo-link": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", + "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", + "dev": true, + "optional": true, + "requires": { + "apollo-utilities": "^1.3.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3", + "zen-observable-ts": "^0.8.21" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "apollo-reporting-protobuf": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz", + "integrity": "sha512-B3XmnkH6Y458iV6OsA7AhfwvTgeZnFq9nPVjbxmLKnvfkEl8hYADtz724uPa0WeBiD7DSFcnLtqg9yGmCkBohg==", + "dev": true, + "optional": true, + "requires": { + "@apollo/protobufjs": "1.2.2" + } + }, + "apollo-server": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-2.25.0.tgz", + "integrity": "sha512-cIXrEWzYWH2y4P4HrfTS0ql6UfJuPO1czb5u9Ch8bLPcWcL1lC84ZbsHzQHNNMLkNApSCAgoS3GZja7dF111Hw==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-core": "^2.25.0", + "apollo-server-express": "^2.25.0", + "express": "^4.0.0", + "graphql-subscriptions": "^1.0.0", + "graphql-tools": "^4.0.8", + "stoppable": "^1.1.0" + }, + "dependencies": { + "graphql-tools": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", + "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", + "dev": true, + "optional": true, + "requires": { + "apollo-link": "^1.2.14", + "apollo-utilities": "^1.0.1", + "deprecated-decorator": "^0.1.6", + "iterall": "^1.1.3", + "uuid": "^3.1.0" + } + } + } + }, + "apollo-server-caching": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz", + "integrity": "sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "apollo-server-core": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.25.0.tgz", + "integrity": "sha512-LqDmY+R5dcb6zj/RgM7P8NnURV2XdQFIF4rY7g80hD9mc2WSCKHF6eH+lHG0sFPW7f8iBr+lJ4LyETuWEVF0hg==", + "dev": true, + "optional": true, + "requires": { + "@apollographql/apollo-tools": "^0.5.0", + "@apollographql/graphql-playground-html": "1.6.27", + "@apollographql/graphql-upload-8-fork": "^8.1.3", + "@josephg/resolvable": "^1.0.0", + "@types/ws": "^7.0.0", + "apollo-cache-control": "^0.14.0", + "apollo-datasource": "^0.9.0", + "apollo-graphql": "^0.9.0", + "apollo-reporting-protobuf": "^0.8.0", + "apollo-server-caching": "^0.7.0", + "apollo-server-env": "^3.1.0", + "apollo-server-errors": "^2.5.0", + "apollo-server-plugin-base": "^0.13.0", + "apollo-server-types": "^0.9.0", + "apollo-tracing": "^0.15.0", + "async-retry": "^1.2.1", + "fast-json-stable-stringify": "^2.0.0", + "graphql-extensions": "^0.15.0", + "graphql-tag": "^2.11.0", + "graphql-tools": "^4.0.8", + "loglevel": "^1.6.7", + "lru-cache": "^6.0.0", + "sha.js": "^2.4.11", + "subscriptions-transport-ws": "^0.9.11", + "uuid": "^8.0.0", + "ws": "^6.0.0" + }, + "dependencies": { + "graphql-tools": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", + "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", + "dev": true, + "optional": true, + "requires": { + "apollo-link": "^1.2.14", + "apollo-utilities": "^1.0.1", + "deprecated-decorator": "^0.1.6", + "iterall": "^1.1.3", + "uuid": "^3.1.0" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "optional": true + } + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "optional": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "apollo-server-env": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-3.1.0.tgz", + "integrity": "sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ==", + "dev": true, + "optional": true, + "requires": { + "node-fetch": "^2.6.1", + "util.promisify": "^1.0.0" + } + }, + "apollo-server-errors": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz", + "integrity": "sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA==", + "dev": true, + "optional": true + }, + "apollo-server-express": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.25.0.tgz", + "integrity": "sha512-FCTisD+VB1LCcTjjhKvQZ/dkly83KVlioFMgcPjW1X/kzCznRT3aQoVn9bQHlzQr7NnpwFseb4Rhd2KKD4wKEA==", + "dev": true, + "optional": true, + "requires": { + "@apollographql/graphql-playground-html": "1.6.27", + "@types/accepts": "^1.3.5", + "@types/body-parser": "1.19.0", + "@types/cors": "2.8.10", + "@types/express": "4.17.11", + "@types/express-serve-static-core": "4.17.19", + "accepts": "^1.3.5", + "apollo-server-core": "^2.25.0", + "apollo-server-types": "^0.9.0", + "body-parser": "^1.18.3", + "cors": "^2.8.5", + "express": "^4.17.1", + "graphql-subscriptions": "^1.0.0", + "graphql-tools": "^4.0.8", + "parseurl": "^1.3.2", + "subscriptions-transport-ws": "^0.9.16", + "type-is": "^1.6.16" + }, + "dependencies": { + "@types/express": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", + "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", + "dev": true, + "optional": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", + "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "graphql-tools": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", + "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", + "dev": true, + "optional": true, + "requires": { + "apollo-link": "^1.2.14", + "apollo-utilities": "^1.0.1", + "deprecated-decorator": "^0.1.6", + "iterall": "^1.1.3", + "uuid": "^3.1.0" + } + } + } + }, + "apollo-server-plugin-base": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz", + "integrity": "sha512-L3TMmq2YE6BU6I4Tmgygmd0W55L+6XfD9137k+cWEBFu50vRY4Re+d+fL5WuPkk5xSPKd/PIaqzidu5V/zz8Kg==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-types": "^0.9.0" + } + }, + "apollo-server-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz", + "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==", + "dev": true, + "optional": true, + "requires": { + "apollo-reporting-protobuf": "^0.8.0", + "apollo-server-caching": "^0.7.0", + "apollo-server-env": "^3.1.0" + } + }, + "apollo-tracing": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.15.0.tgz", + "integrity": "sha512-UP0fztFvaZPHDhIB/J+qGuy6hWO4If069MGC98qVs0I8FICIGu4/8ykpX3X3K6RtaQ56EDAWKykCxFv4ScxMeA==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-env": "^3.1.0", + "apollo-server-plugin-base": "^0.13.0" + } + }, + "apollo-upload-client": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-14.1.2.tgz", + "integrity": "sha512-ozaW+4tnVz1rpfwiQwG3RCdCcZ93RV/37ZQbRnObcQ9mjb+zur58sGDPVg9Ef3fiujLmiE/Fe9kdgvIMA3VOjA==", + "dev": true, + "optional": true, + "requires": { + "@apollo/client": "^3.1.5", + "@babel/runtime": "^7.11.2", + "extract-files": "^9.0.0" + } + }, + "apollo-utilities": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", + "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", + "dev": true, + "optional": true, + "requires": { + "@wry/equality": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argsarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz", + "integrity": "sha1-bnIHtOzbObCviDA/pa4ivajfYcs=", + "dev": true, + "optional": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.map": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.3.tgz", + "integrity": "sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.5" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-args": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-args/-/assert-args-1.2.1.tgz", + "integrity": "sha1-QEEDoUUqMv53iYgR5U5ZCoqTc70=", + "dev": true, + "optional": true, + "requires": { + "101": "^1.2.0", + "compound-subject": "0.0.1", + "debug": "^2.2.0", + "get-prototype-of": "0.0.0", + "is-capitalized": "^1.0.0", + "is-class": "0.0.4" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-parents": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", + "integrity": "sha1-UI/Q8F0MSHddnszaLhdEIyYejdM=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true, + "optional": true + }, + "async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "dev": true, + "requires": { + "async": "^2.4.0" + } + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "async-retry": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", + "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", + "dev": true, + "optional": true, + "requires": { + "retry": "0.12.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "available-typed-arrays": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "optional": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", + "dev": true, + "optional": true + }, + "babel-preset-fbjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", + "dev": true, + "optional": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base32-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base32-decode/-/base32-decode-1.0.0.tgz", + "integrity": "sha512-KNWUX/R7wKenwE/G/qFMzGScOgVntOmbE27vvc6GrniDGYb6a5+qWcuoXl8WIOQL7q0TpK7nZDm1Y04Yi3Yn5g==", + "dev": true, + "optional": true + }, + "base32-encode": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", + "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", + "dev": true, + "optional": true, + "requires": { + "to-data-view": "^1.1.0" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "dependencies": { + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "dev": true, + "optional": true + } + } + }, + "bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + }, + "dependencies": { + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", + "dev": true, + "optional": true + } + } + }, + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bitcore-lib": { + "version": "8.25.10", + "resolved": "https://registry.npmjs.org/bitcore-lib/-/bitcore-lib-8.25.10.tgz", + "integrity": "sha512-MyHpSg7aFRHe359RA/gdkaQAal3NswYZTLEuu0tGX1RGWXAYN9i/24fsjPqVKj+z0ua+gzAT7aQs0KiKXWCgKA==", + "dev": true, + "optional": true, + "requires": { + "bech32": "=1.1.3", + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20" + }, + "dependencies": { + "bech32": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.3.tgz", + "integrity": "sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==", + "dev": true, + "optional": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true, + "optional": true + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true, + "optional": true + } + } + }, + "bitcore-mnemonic": { + "version": "8.25.10", + "resolved": "https://registry.npmjs.org/bitcore-mnemonic/-/bitcore-mnemonic-8.25.10.tgz", + "integrity": "sha512-FeXxO37BLV5JRvxPmVFB91zRHalavV8H4TdQGt1/hz0AkoPymIV68OkuB+TptpjeYgatcgKPoPvPhglJkTzFQQ==", + "dev": true, + "optional": true, + "requires": { + "bitcore-lib": "^8.25.10", + "unorm": "^1.4.1" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "blakejs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", + "dev": true + }, + "blob-to-it": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-1.0.2.tgz", + "integrity": "sha512-yD8tikfTlUGEOSHExz4vDCIQFLaBPXIL0KcxGQt9RbwMVXBEh+jokdJyStvTXPgWrdKfwgk7RX8GPsgrYzsyng==", + "dev": true, + "optional": true, + "requires": { + "browser-readablestream-to-it": "^1.0.2" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "dev": true, + "requires": { + "bignumber.js": "^9.0.0", + "buffer": "^5.5.0", + "commander": "^2.15.0", + "ieee754": "^1.1.13", + "iso-url": "~0.4.7", + "json-text-sequence": "~0.1.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/browser-headers/-/browser-headers-0.4.1.tgz", + "integrity": "sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==", + "dev": true, + "optional": true + }, + "browser-readablestream-to-it": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.2.tgz", + "integrity": "sha512-lv4M2Z6RKJpyJijJzBQL5MNssS7i8yedl+QkhnLCyPtgNGNSXv1KthzUnye9NlRAtBAI80X6S9i+vK09Rzjcvg==", + "dev": true, + "optional": true + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "optional": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dev": true, + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "optional": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true, + "optional": true + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-compare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", + "integrity": "sha1-W+e+hTr4kZjR9N3AkNHWakiu9ZY=", + "dev": true, + "optional": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-pipe": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/buffer-pipe/-/buffer-pipe-0.0.3.tgz", + "integrity": "sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2" + } + }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "dev": true, + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "busboy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "dev": true, + "optional": true, + "requires": { + "dicer": "0.3.0" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001235", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001235.tgz", + "integrity": "sha512-zWEwIVqnzPkSAXOUlQnPW2oKoYb2aLQ4Q5ejdjBcnH63rfypaW34CxaeBn1VMya2XaEU3P/R2qHpWyj+l0BT1A==", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "dev": true, + "requires": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + } + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chai-bn": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/chai-bn/-/chai-bn-0.2.1.tgz", + "integrity": "sha512-01jt2gSXAw7UYFPT5K8d7HYjdXj2vyeIuE+0T/34FWzlNcVbs1JkPxRu7rYMfQnJhrHT8Nr6qjSf5ZwwLU2EYg==", + "dev": true + }, + "chai-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.5.0.tgz", + "integrity": "sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.9.tgz", + "integrity": "sha512-QF6XVdrLONO6DXRF5iaolY+odmhj2CLj+xzNod7INPWMi/x9X4SOylH0S/vaPpX+AUU6t04s34SQNh7DbkuCng==", + "dev": true, + "requires": { + "cheerio-select": "^1.4.0", + "dom-serializer": "^1.3.1", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + } + }, + "cheerio-select": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.4.0.tgz", + "integrity": "sha512-sobR3Yqz27L553Qa7cK6rtJlMDbiKPdNywtR95Sj/YgfpLfy0u6CGJuaBKe5YE/vTc23SCRKxWSdlon/w6I/Ew==", + "dev": true, + "requires": { + "css-select": "^4.1.2", + "css-what": "^5.0.0", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0" + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "dependencies": { + "multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "dev": true, + "requires": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + } + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "dev": true, + "optional": true + }, + "class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "dev": true, + "optional": true + }, + "cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "optional": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-logger": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.6.tgz", + "integrity": "sha1-5WJF7ymCJlcRDHy3WpzXhstp7Rs=", + "dev": true + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true, + "optional": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true + }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compound-subject": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/compound-subject/-/compound-subject-0.0.1.tgz", + "integrity": "sha1-JxVUaYoVrmCLHfyv0wt7oeqJLEs=", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "dev": true, + "optional": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "dev": true, + "requires": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dev": true, + "requires": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "core-js-pure": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.14.0.tgz", + "integrity": "sha512-YVh+LN2FgNU0odThzm61BsdkwrbrchumFq3oztnE9vTKC4KS2fvnPmcx8t6jnqAyOTCTF4ZSiuK8Qhh7SNcL4g==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "coveralls": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", + "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" + } + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dev": true, + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-fetch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "dev": true, + "optional": true, + "requires": { + "node-fetch": "2.6.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", + "dev": true + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true, + "optional": true + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dev": true, + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=", + "dev": true, + "optional": true + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "optional": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "optional": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dataloader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", + "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==", + "dev": true, + "optional": true + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debug-fabulous": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz", + "integrity": "sha1-+gccXYdIRoVCSAdCHKSxawsaB2M=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.X", + "lazy-debug-legacy": "0.0.X", + "object-assign": "4.1.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true, + "optional": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "optional": true, + "requires": { + "clone": "^1.0.2" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "deferred-leveldown": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "dev": true, + "requires": { + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "delimit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", + "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "deprecated-decorator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", + "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=", + "dev": true, + "optional": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true, + "optional": true + }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "dev": true, + "optional": true, + "requires": { + "streamsearch": "0.1.2" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dirty-chai": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dirty-chai/-/dirty-chai-2.0.1.tgz", + "integrity": "sha512-ys79pWKvDMowIDEPC6Fig8d5THiC0DJ2gmTeGzVAoEH18J8OzLud0Jh7I9IWg3NSk8x2UocznUuFmfHCXYZx9w==", + "dev": true + }, + "dns-over-http-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", + "integrity": "sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==", + "dev": true, + "optional": true, + "requires": { + "debug": "^4.3.1", + "native-fetch": "^3.0.0", + "receptacle": "^1.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "optional": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "optional": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", + "dev": true, + "optional": true + }, + "drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ed2curve": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", + "integrity": "sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "1.x.x" + }, + "dependencies": { + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "optional": true + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.7.3.tgz", + "integrity": "sha512-1AVMaxrHXTTMqd7EK0MGWusdqNr07Rpj8Th6bG4at0oNgIi/1LBwa9CjT/0Zy+M0k/tSJPS04nFxHj0SXDVgVw==", + "dev": true, + "optional": true, + "requires": { + "encoding": "^0.1.13" + } + }, + "electron-to-chromium": { + "version": "1.3.749", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.749.tgz", + "integrity": "sha512-F+v2zxZgw/fMwPz/VUGIggG4ZndDsYy0vlpthi3tjmDZlcfbhN5mYW0evXUsBr2sUtuDANFtle410A9u/sd/4A==", + "dev": true, + "optional": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emittery": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.4.1.tgz", + "integrity": "sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==", + "dev": true, + "optional": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "encoding-down": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "dev": true, + "requires": { + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "end-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/end-stream/-/end-stream-0.1.0.tgz", + "integrity": "sha1-MgA/P0OKKwFDFoE3+PpumGbIHtU=", + "dev": true, + "optional": true, + "requires": { + "write-stream": "~0.4.3" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "optional": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-denodeify": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-denodeify/-/es6-denodeify-0.1.5.tgz", + "integrity": "sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8=", + "dev": true, + "optional": true + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "optional": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "esdoc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esdoc/-/esdoc-1.1.0.tgz", + "integrity": "sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA==", + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-traverse": "6.26.0", + "babylon": "6.18.0", + "cheerio": "1.0.0-rc.2", + "color-logger": "0.0.6", + "escape-html": "1.0.3", + "fs-extra": "5.0.0", + "ice-cap": "0.0.4", + "marked": "0.3.19", + "minimist": "1.2.0", + "taffydb": "2.7.3" + }, + "dependencies": { + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-plugin-truffle": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-truffle/-/eslint-plugin-truffle-0.3.1.tgz", + "integrity": "sha512-mjDM1gD96UknBUSEufgdx5m1x3jkWL3Xn/npSZhOVoTbKk/nkBL7dCcH7xsO6GyAjmjvzdev5o5IA4lKWf9b4g==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", + "dev": true, + "requires": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + } + } + }, + "eth-gas-reporter": { + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.22.tgz", + "integrity": "sha512-L1FlC792aTf3j/j+gGzSNlGrXKSxNPXQNk6TnV5NNZ2w3jnQCRyJjDl0zUo25Cq2t90IS5vGdbkwqFQK7Ce+kw==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.0-beta.146", + "@solidity-parser/parser": "^0.12.0", + "cli-table3": "^0.5.0", + "colors": "^1.1.2", + "ethereumjs-util": "6.2.0", + "ethers": "^4.0.40", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^7.1.1", + "req-cwd": "^2.0.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.12.2.tgz", + "integrity": "sha512-d7VS7PxgMosm5NyaiyDJRNID5pK4AWj1l64Dbz0147hJgy5k2C0/ZiKK/9u5c5K+HRUVHmp+RMvGEjGh84oA5Q==", + "dev": true + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "ethereumjs-util": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", + "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^2.0.0", + "rlp": "^2.2.3", + "secp256k1": "^3.0.1" + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.5.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + } + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + }, + "keccak": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", + "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", + "dev": true, + "requires": { + "bindings": "^1.5.0", + "inherits": "^2.0.4", + "nan": "^2.14.0", + "safe-buffer": "^5.2.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "secp256k1": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", + "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", + "dev": true, + "requires": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.5.2", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true + } + } + }, + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "eth-sig-util": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.5.4.tgz", + "integrity": "sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A==", + "dev": true, + "requires": { + "ethereumjs-abi": "0.6.8", + "ethereumjs-util": "^5.1.1", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + } + } + }, + "ethereum-bloom-filters": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.9.tgz", + "integrity": "sha512-GiK/RQkAkcVaEdxKVkPcG07PQ5vD7v2MFSHgZmBJSfMzNRHimntdBithsHAT89tAXnIpzVDWt8iaCD1DvkaxGg==", + "dev": true, + "requires": { + "js-sha3": "^0.8.0" + } + }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + }, + "dependencies": { + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + } + } + }, + "ethereum-ens": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", + "dev": true, + "requires": { + "bluebird": "^3.4.7", + "eth-ens-namehash": "^2.0.0", + "js-sha3": "^0.5.7", + "pako": "^1.0.4", + "underscore": "^1.8.3", + "web3": "^1.0.0-beta.34" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + } + } + }, + "ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "dev": true, + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "ethereumjs-common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", + "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", + "dev": true + }, + "ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "ethers": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.3.0.tgz", + "integrity": "sha512-myN+338S4sFQZvQ9trii7xit8Hu/LnUtjA0ROFOHpUreQc3fgLZEMNVqF3vM1u2D78DIIeG1TbuozVCVlXQWvQ==", + "dev": true, + "requires": { + "@ethersproject/abi": "5.3.0", + "@ethersproject/abstract-provider": "5.3.0", + "@ethersproject/abstract-signer": "5.3.0", + "@ethersproject/address": "5.3.0", + "@ethersproject/base64": "5.3.0", + "@ethersproject/basex": "5.3.0", + "@ethersproject/bignumber": "5.3.0", + "@ethersproject/bytes": "5.3.0", + "@ethersproject/constants": "5.3.0", + "@ethersproject/contracts": "5.3.0", + "@ethersproject/hash": "5.3.0", + "@ethersproject/hdnode": "5.3.0", + "@ethersproject/json-wallets": "5.3.0", + "@ethersproject/keccak256": "5.3.0", + "@ethersproject/logger": "5.3.0", + "@ethersproject/networks": "5.3.0", + "@ethersproject/pbkdf2": "5.3.0", + "@ethersproject/properties": "5.3.0", + "@ethersproject/providers": "5.3.0", + "@ethersproject/random": "5.3.0", + "@ethersproject/rlp": "5.3.0", + "@ethersproject/sha2": "5.3.0", + "@ethersproject/signing-key": "5.3.0", + "@ethersproject/solidity": "5.3.0", + "@ethersproject/strings": "5.3.0", + "@ethersproject/transactions": "5.3.0", + "@ethersproject/units": "5.3.0", + "@ethersproject/wallet": "5.3.0", + "@ethersproject/web": "5.3.0", + "@ethersproject/wordlists": "5.3.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.3.0.tgz", + "integrity": "sha512-NaT4UacjOwca8qCG/gv8k+DgTcWu49xlrvdhr/p8PTFnoS8e3aMWqjI3znFME5Txa/QWXDrg2/heufIUue9rtw==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + } + } + }, + "ethjs-abi": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", + "integrity": "sha1-4KepOn6BFjqUR3utVu3lJKtt5TM=", + "dev": true, + "requires": { + "bn.js": "4.11.6", + "js-sha3": "0.5.5", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", + "dev": true + }, + "js-sha3": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", + "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=", + "dev": true + } + } + }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "dev": true, + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", + "dev": true + } + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "event-iterator": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-1.2.0.tgz", + "integrity": "sha512-Daq7YUl0Mv1i4QEgzGQlz0jrx7hUFNyLGbiF+Ap7NCMCjDLCCnolyj6s0TAc6HmrBziO5rNVHsPwGMp7KdRPvw==", + "dev": true, + "optional": true + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-files": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz", + "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", + "dev": true, + "optional": true + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", + "dev": true + }, + "fast-check": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.16.0.tgz", + "integrity": "sha512-r1uoJQoLzKUgfAeGzSZ/7dGyvSLG3OGjmWIKZRJpKtY/791di7n/x389F0Bei3Ry8126Z6MKp78Cbt4+9LUp1g==", + "dev": true, + "requires": { + "pure-rand": "^4.1.1" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-fifo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.0.0.tgz", + "integrity": "sha512-4VEXmjxLj7sbs8J//cn2qhRap50dGzF5n8fjay8mau+Jn4hxSeR3xPFwxMaQq/pDaq7+KQk0PAbC2+nWDkJrmQ==", + "dev": true, + "optional": true + }, + "fast-future": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fast-future/-/fast-future-1.0.2.tgz", + "integrity": "sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo=", + "dev": true, + "optional": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-sha256": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz", + "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==", + "dev": true, + "optional": true + }, + "fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", + "dev": true, + "optional": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "optional": true, + "requires": { + "bser": "2.1.1" + } + }, + "fbjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", + "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "dev": true, + "optional": true, + "requires": { + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true, + "optional": true + } + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "dev": true, + "optional": true + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "fetch-cookie": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.7.0.tgz", + "integrity": "sha512-Mm5pGlT3agW6t71xVM7vMZPIvI7T4FaTuFW4jari6dVzYHFDb3WZZsGpN22r/o3XMdkM0E7sPd1EGeyVbH2Tgg==", + "dev": true, + "optional": true, + "requires": { + "es6-denodeify": "^0.1.1", + "tough-cookie": "^2.3.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "filecoin.js": { + "version": "0.0.5-alpha", + "resolved": "https://registry.npmjs.org/filecoin.js/-/filecoin.js-0.0.5-alpha.tgz", + "integrity": "sha512-xPrB86vDnTPfmvtN/rJSrhl4M77694ruOgNXd0+5gP67mgmCDhStLCqcr+zHIDRgDpraf7rY+ELbwjXZcQNdpQ==", + "dev": true, + "optional": true, + "requires": { + "@ledgerhq/hw-transport-webusb": "^5.22.0", + "@nodefactory/filsnap-adapter": "^0.2.1", + "@nodefactory/filsnap-types": "^0.2.1", + "@zondax/filecoin-signing-tools": "github:Digital-MOB-Filecoin/filecoin-signing-tools-js", + "bignumber.js": "^9.0.0", + "bitcore-lib": "^8.22.2", + "bitcore-mnemonic": "^8.22.2", + "btoa-lite": "^1.0.0", + "events": "^3.2.0", + "isomorphic-ws": "^4.0.1", + "node-fetch": "^2.6.0", + "rpc-websockets": "^5.3.1", + "scrypt-async": "^2.0.1", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1", + "websocket": "^1.0.31", + "ws": "^7.3.1" + }, + "dependencies": { + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "optional": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "optional": true + } + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "requires": { + "semver-regex": "^3.1.2" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true, + "optional": true + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + } + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw=", + "dev": true, + "requires": { + "imul": "^1.0.0" + } + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "optional": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-capacitor": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", + "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==", + "dev": true, + "optional": true + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "ganache-cli": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.12.2.tgz", + "integrity": "sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw==", + "dev": true, + "requires": { + "ethereumjs-util": "6.2.1", + "source-map-support": "0.5.12", + "yargs": "13.2.4" + }, + "dependencies": { + "@types/bn.js": { + "version": "4.11.6", + "bundled": true, + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "14.11.2", + "bundled": true, + "dev": true + }, + "@types/pbkdf2": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/secp256k1": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "base-x": { + "version": "3.0.8", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "blakejs": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "bn.js": { + "version": "4.11.9", + "bundled": true, + "dev": true + }, + "brorand": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "bs58": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "buffer-from": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "bundled": true, + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cliui": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "bundled": true, + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "create-hash": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "bundled": true, + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "bundled": true, + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "bundled": true, + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "ethereum-cryptography": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-util": { + "version": "6.2.1", + "bundled": true, + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "ethjs-util": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "hash-base": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-hex-prefixed": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "keccak": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "node-addon-api": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "node-gyp-build": { + "version": "4.2.3", + "bundled": true, + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-locale": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "pbkdf2": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "randombytes": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "ripemd160": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.6", + "bundled": true, + "dev": true, + "requires": { + "bn.js": "^4.11.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "bundled": true, + "dev": true + }, + "scrypt-js": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "secp256k1": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "source-map-support": { + "version": "0.5.12", + "bundled": true, + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-hex-prefix": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "13.2.4", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "ganache-core": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz", + "integrity": "sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==", + "dev": true, + "requires": { + "abstract-leveldown": "3.0.0", + "async": "2.6.2", + "bip39": "2.5.0", + "cachedown": "1.0.0", + "clone": "2.1.2", + "debug": "3.2.6", + "encoding-down": "5.0.4", + "eth-sig-util": "3.0.0", + "ethereumjs-abi": "0.6.8", + "ethereumjs-account": "3.0.0", + "ethereumjs-block": "2.2.2", + "ethereumjs-common": "1.5.0", + "ethereumjs-tx": "2.1.2", + "ethereumjs-util": "6.2.1", + "ethereumjs-vm": "4.2.0", + "ethereumjs-wallet": "0.6.5", + "heap": "0.2.6", + "keccak": "3.0.1", + "level-sublevel": "6.6.4", + "levelup": "3.1.1", + "lodash": "4.17.20", + "lru-cache": "5.1.1", + "merkle-patricia-tree": "3.0.0", + "patch-package": "6.2.2", + "seedrandom": "3.0.1", + "source-map-support": "0.5.12", + "tmp": "0.1.0", + "web3": "1.2.11", + "web3-provider-engine": "14.2.1", + "websocket": "1.0.32" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.0.0-beta.153", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", + "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/address": ">=5.0.0-beta.128", + "@ethersproject/bignumber": ">=5.0.0-beta.130", + "@ethersproject/bytes": ">=5.0.0-beta.129", + "@ethersproject/constants": ">=5.0.0-beta.128", + "@ethersproject/hash": ">=5.0.0-beta.128", + "@ethersproject/keccak256": ">=5.0.0-beta.127", + "@ethersproject/logger": ">=5.0.0-beta.129", + "@ethersproject/properties": ">=5.0.0-beta.131", + "@ethersproject/strings": ">=5.0.0-beta.130" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.8.tgz", + "integrity": "sha512-fqJXkewcGdi8LogKMgRyzc/Ls2js07yor7+g9KfPs09uPOcQLg7cc34JN+lk34HH9gg2HU0DIA5797ZR8znkfw==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/networks": "^5.0.7", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/transactions": "^5.0.9", + "@ethersproject/web": "^5.0.12" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.10.tgz", + "integrity": "sha512-irx7kH7FDAeW7QChDPW19WsxqeB1d3XLyOLSXm0bfPqL1SS07LXWltBJUBUxqC03ORpAOcM3JQj57DU8JnVY2g==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/abstract-provider": "^5.0.8", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7" + } + }, + "@ethersproject/address": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.9.tgz", + "integrity": "sha512-gKkmbZDMyGbVjr8nA5P0md1GgESqSGH7ILIrDidPdNXBl4adqbuA3OAuZx/O2oGpL6PtJ9BDa0kHheZ1ToHU3w==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/rlp": "^5.0.7" + } + }, + "@ethersproject/base64": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.7.tgz", + "integrity": "sha512-S5oh5DVfCo06xwJXT8fQC68mvJfgScTl2AXvbYMsHNfIBTDb084Wx4iA9MNlEReOv6HulkS+gyrUM/j3514rSw==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bytes": "^5.0.9" + } + }, + "@ethersproject/bignumber": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.13.tgz", + "integrity": "sha512-b89bX5li6aK492yuPP5mPgRVgIxxBP7ksaBtKX5QQBsrZTpNOjf/MR4CjcUrAw8g+RQuD6kap9lPjFgY4U1/5A==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "bn.js": "^4.4.0" + } + }, + "@ethersproject/bytes": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.9.tgz", + "integrity": "sha512-k+17ZViDtAugC0s7HM6rdsTWEdIYII4RPCDkPEuxKc6i40Bs+m6tjRAtCECX06wKZnrEoR9pjOJRXHJ/VLoOcA==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/constants": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.8.tgz", + "integrity": "sha512-sCc73pFBsl59eDfoQR5OCEZCRv5b0iywadunti6MQIr5lt3XpwxK1Iuzd8XSFO02N9jUifvuZRrt0cY0+NBgTg==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bignumber": "^5.0.13" + } + }, + "@ethersproject/hash": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.10.tgz", + "integrity": "sha512-Tf0bvs6YFhw28LuHnhlDWyr0xfcDxSXdwM4TcskeBbmXVSKLv3bJQEEEBFUcRX0fJuslR3gCVySEaSh7vuMx5w==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/abstract-signer": "^5.0.10", + "@ethersproject/address": "^5.0.9", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/strings": "^5.0.8" + } + }, + "@ethersproject/keccak256": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.7.tgz", + "integrity": "sha512-zpUBmofWvx9PGfc7IICobgFQSgNmTOGTGLUxSYqZzY/T+b4y/2o5eqf/GGmD7qnTGzKQ42YlLNo+LeDP2qe55g==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bytes": "^5.0.9", + "js-sha3": "0.5.7" + } + }, + "@ethersproject/logger": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.8.tgz", + "integrity": "sha512-SkJCTaVTnaZ3/ieLF5pVftxGEFX56pTH+f2Slrpv7cU0TNpUZNib84QQdukd++sWUp/S7j5t5NW+WegbXd4U/A==", + "dev": true, + "optional": true + }, + "@ethersproject/networks": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.7.tgz", + "integrity": "sha512-dI14QATndIcUgcCBL1c5vUr/YsI5cCHLN81rF7PU+yS7Xgp2/Rzbr9+YqpC6NBXHFUASjh6GpKqsVMpufAL0BQ==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/properties": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.7.tgz", + "integrity": "sha512-812H1Rus2vjw0zbasfDI1GLNPDsoyX1pYqiCgaR1BuyKxUTbwcH1B+214l6VGe1v+F6iEVb7WjIwMjKhb4EUsg==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/rlp": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.7.tgz", + "integrity": "sha512-ulUTVEuV7PT4jJTPpfhRHK57tkLEDEY9XSYJtrSNHOqdwMvH0z7BM2AKIMq4LVDlnu4YZASdKrkFGEIO712V9w==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/signing-key": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.8.tgz", + "integrity": "sha512-YKxQM45eDa6WAD+s3QZPdm1uW1MutzVuyoepdRRVmMJ8qkk7iOiIhUkZwqKLNxKzEJijt/82ycuOREc9WBNAKg==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "elliptic": "6.5.3" + } + }, + "@ethersproject/strings": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.8.tgz", + "integrity": "sha512-5IsdXf8tMY8QuHl8vTLnk9ehXDDm6x9FB9S9Og5IA1GYhLe5ZewydXSjlJlsqU2t9HRbfv97OJZV/pX8DVA/Hw==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/constants": "^5.0.8", + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/transactions": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.9.tgz", + "integrity": "sha512-0Fu1yhdFBkrbMjenEr+39tmDxuHmaw0pe9Jb18XuKoItj7Z3p7+UzdHLr2S/okvHDHYPbZE5gtANDdQ3ZL1nBA==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/address": "^5.0.9", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/constants": "^5.0.8", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/rlp": "^5.0.7", + "@ethersproject/signing-key": "^5.0.8" + } + }, + "@ethersproject/web": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.12.tgz", + "integrity": "sha512-gVxS5iW0bgidZ76kr7LsTxj4uzN5XpCLzvZrLp8TP+4YgxHfCeetFyQkRPgBEAJdNrexdSBayvyJvzGvOq0O8g==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/base64": "^5.0.7", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/strings": "^5.0.8" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "optional": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "optional": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "14.14.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", + "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==", + "dev": true + }, + "@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/secp256k1": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", + "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "abstract-leveldown": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz", + "integrity": "sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "optional": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", + "dev": true, + "optional": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true, + "optional": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "dev": true, + "requires": { + "async": "^2.4.0" + } + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babelify": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", + "dev": true, + "requires": { + "babel-core": "^6.0.14", + "object-assign": "^4.0.0" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "dev": true, + "requires": { + "precond": "0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + } + } + }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "dev": true, + "optional": true + }, + "bip39": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz", + "integrity": "sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==", + "dev": true, + "requires": { + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1", + "safe-buffer": "^5.0.1", + "unorm": "^1.3.3" + } + }, + "blakejs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "optional": true + }, + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "optional": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "optional": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "optional": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "optional": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true, + "optional": true + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dev": true, + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=", + "dev": true, + "optional": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "dev": true, + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "optional": true + }, + "bytewise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", + "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=", + "dev": true, + "requires": { + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" + } + }, + "bytewise-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", + "integrity": "sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=", + "dev": true, + "requires": { + "typewise-core": "^1.2" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "optional": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "optional": true + } + } + }, + "cachedown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz", + "integrity": "sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=", + "dev": true, + "requires": { + "abstract-leveldown": "^2.4.1", + "lru-cache": "^3.2.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "lru-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", + "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", + "dev": true, + "requires": { + "pseudomap": "^1.0.1" + } + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caniuse-lite": { + "version": "1.0.30001174", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz", + "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "checkpoint-store": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", + "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", + "dev": true, + "requires": { + "functional-red-black-tree": "^1.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "dependencies": { + "multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + } + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", + "dev": true, + "optional": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "optional": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + } + } + }, + "content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dev": true, + "optional": true, + "requires": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "optional": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "optional": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true, + "optional": true + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true, + "optional": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "core-js-pure": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.8.2.tgz", + "integrity": "sha512-v6zfIQqL/pzTVAbZvYUozsxNfxcFb6Ks3ZfEbuneJl3FW9Jb8F6vLWB6f+qTmAu72msUdyb84V8d/yBFf7FNnw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "optional": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-fetch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.3.tgz", + "integrity": "sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==", + "dev": true, + "requires": { + "node-fetch": "2.1.2", + "whatwg-fetch": "2.0.4" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "optional": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "optional": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true, + "optional": true + }, + "deferred-leveldown": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz", + "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", + "dev": true, + "requires": { + "abstract-leveldown": "~5.0.0", + "inherits": "^2.0.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", + "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "optional": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true, + "optional": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true, + "optional": true + }, + "electron-to-chromium": { + "version": "1.3.636", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.636.tgz", + "integrity": "sha512-Adcvng33sd3gTjNIDNXGD1G4H6qCImIy2euUJAQHtLNplEKU5WEz5KRJxupRNIIT8sD5oFZLTKBWAf12Bsz24A==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "optional": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "encoding-down": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz", + "integrity": "sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==", + "dev": true, + "requires": { + "abstract-leveldown": "^5.0.0", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "abstract-leveldown": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", + "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true, + "optional": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "optional": true + }, + "eth-block-tracker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz", + "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==", + "dev": true, + "requires": { + "eth-query": "^2.1.0", + "ethereumjs-tx": "^1.3.3", + "ethereumjs-util": "^5.1.3", + "ethjs-util": "^0.1.3", + "json-rpc-engine": "^3.6.0", + "pify": "^2.3.0", + "tape": "^4.6.3" + }, + "dependencies": { + "ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "dev": true, + "requires": { + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" + } + }, + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", + "dev": true, + "optional": true, + "requires": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "eth-json-rpc-infura": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz", + "integrity": "sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==", + "dev": true, + "requires": { + "cross-fetch": "^2.1.1", + "eth-json-rpc-middleware": "^1.5.0", + "json-rpc-engine": "^3.4.0", + "json-rpc-error": "^2.0.0" + } + }, + "eth-json-rpc-middleware": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", + "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", + "dev": true, + "requires": { + "async": "^2.5.0", + "eth-query": "^2.1.2", + "eth-tx-summary": "^3.1.2", + "ethereumjs-block": "^1.6.0", + "ethereumjs-tx": "^1.3.3", + "ethereumjs-util": "^5.1.2", + "ethereumjs-vm": "^2.1.0", + "fetch-ponyfill": "^4.0.0", + "json-rpc-engine": "^3.6.0", + "json-rpc-error": "^2.0.0", + "json-stable-stringify": "^1.0.1", + "promise-to-callback": "^1.0.0", + "tape": "^4.6.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "dev": true, + "requires": { + "abstract-leveldown": "~2.6.0" + } + }, + "ethereumjs-account": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", + "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", + "dev": true, + "requires": { + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-block": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", + "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", + "dev": true, + "requires": { + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereum-common": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", + "dev": true + } + } + }, + "ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "dev": true, + "requires": { + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" + } + }, + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-vm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", + "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", + "dev": true, + "requires": { + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "ethereumjs-block": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", + "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", + "dev": true, + "requires": { + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + } + } + }, + "ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==", + "dev": true + }, + "level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "dev": true, + "requires": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "requires": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + } + } + }, + "merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "dev": true, + "requires": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "eth-query": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", + "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", + "dev": true, + "requires": { + "json-rpc-random-id": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "eth-sig-util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.0.tgz", + "integrity": "sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "elliptic": "^6.4.0", + "ethereumjs-abi": "0.6.5", + "ethereumjs-util": "^5.1.1", + "tweetnacl": "^1.0.0", + "tweetnacl-util": "^0.15.0" + }, + "dependencies": { + "ethereumjs-abi": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz", + "integrity": "sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=", + "dev": true, + "requires": { + "bn.js": "^4.10.0", + "ethereumjs-util": "^4.3.0" + }, + "dependencies": { + "ethereumjs-util": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz", + "integrity": "sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==", + "dev": true, + "requires": { + "bn.js": "^4.8.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.0.0" + } + } + } + }, + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + } + } + }, + "eth-tx-summary": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz", + "integrity": "sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==", + "dev": true, + "requires": { + "async": "^2.1.2", + "clone": "^2.0.0", + "concat-stream": "^1.5.1", + "end-of-stream": "^1.1.0", + "eth-query": "^2.0.2", + "ethereumjs-block": "^1.4.1", + "ethereumjs-tx": "^1.1.1", + "ethereumjs-util": "^5.0.1", + "ethereumjs-vm": "^2.6.0", + "through2": "^2.0.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "dev": true, + "requires": { + "abstract-leveldown": "~2.6.0" + } + }, + "ethereumjs-account": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", + "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", + "dev": true, + "requires": { + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-block": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", + "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", + "dev": true, + "requires": { + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereum-common": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", + "dev": true + } + } + }, + "ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "dev": true, + "requires": { + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" + } + }, + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-vm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", + "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", + "dev": true, + "requires": { + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "ethereumjs-block": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", + "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", + "dev": true, + "requires": { + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + } + } + }, + "ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==", + "dev": true + }, + "level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "dev": true, + "requires": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "requires": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + } + } + }, + "merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "dev": true, + "requires": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "ethashjs": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ethashjs/-/ethashjs-0.0.8.tgz", + "integrity": "sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==", + "dev": true, + "requires": { + "async": "^2.1.2", + "buffer-xor": "^2.0.1", + "ethereumjs-util": "^7.0.2", + "miller-rabin": "^4.0.0" + }, + "dependencies": { + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "buffer-xor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", + "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-util": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.7.tgz", + "integrity": "sha512-vU5rtZBlZsgkTw3o6PDKyB8li2EgLavnAbsKcfsH2YhHH1Le+PP8vEiMnAnvgc1B6uMoaM5GDCrVztBw0Q5K9g==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + } + } + }, + "ethereum-bloom-filters": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz", + "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==", + "dev": true, + "optional": true, + "requires": { + "js-sha3": "^0.8.0" + }, + "dependencies": { + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true, + "optional": true + } + } + }, + "ethereum-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=", + "dev": true + }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "dev": true, + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "ethereumjs-account": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz", + "integrity": "sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==", + "dev": true, + "requires": { + "ethereumjs-util": "^6.0.0", + "rlp": "^2.2.1", + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-block": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", + "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", + "dev": true, + "requires": { + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "dev": true, + "requires": { + "abstract-leveldown": "~2.6.0" + } + }, + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==", + "dev": true + }, + "level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "dev": true, + "requires": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "requires": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + } + } + }, + "merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "dev": true, + "requires": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "ethereumjs-blockchain": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz", + "integrity": "sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==", + "dev": true, + "requires": { + "async": "^2.6.1", + "ethashjs": "~0.0.7", + "ethereumjs-block": "~2.2.2", + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.1.0", + "flow-stoplight": "^1.0.0", + "level-mem": "^3.0.1", + "lru-cache": "^5.1.1", + "rlp": "^2.2.2", + "semaphore": "^1.1.0" + } + }, + "ethereumjs-common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", + "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==", + "dev": true + }, + "ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "ethereumjs-vm": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz", + "integrity": "sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==", + "dev": true, + "requires": { + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "core-js-pure": "^3.0.1", + "ethereumjs-account": "^3.0.0", + "ethereumjs-block": "^2.2.2", + "ethereumjs-blockchain": "^4.0.3", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.2", + "ethereumjs-util": "^6.2.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1", + "util.promisify": "^1.0.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "dev": true, + "requires": { + "abstract-leveldown": "~2.6.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==", + "dev": true + }, + "level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "dev": true, + "requires": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "requires": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + } + } + }, + "merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "dev": true, + "requires": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "ethereumjs-wallet": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz", + "integrity": "sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==", + "dev": true, + "optional": true, + "requires": { + "aes-js": "^3.1.1", + "bs58check": "^2.1.2", + "ethereum-cryptography": "^0.1.3", + "ethereumjs-util": "^6.0.0", + "randombytes": "^2.0.6", + "safe-buffer": "^5.1.2", + "scryptsy": "^1.2.1", + "utf8": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "dev": true, + "optional": true, + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", + "dev": true, + "optional": true + } + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true, + "optional": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "optional": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "optional": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fake-merkle-patricia-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", + "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=", + "dev": true, + "requires": { + "checkpoint-store": "^1.1.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fetch-ponyfill": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", + "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", + "dev": true, + "requires": { + "node-fetch": "~1.7.1" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + } + } + }, + "find-yarn-workspace-root": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz", + "integrity": "sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==", + "dev": true, + "requires": { + "fs-extra": "^4.0.3", + "micromatch": "^3.1.4" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "flow-stoplight": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flow-stoplight/-/flow-stoplight-1.0.0.tgz", + "integrity": "sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true, + "optional": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "optional": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "optional": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "optional": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "optional": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true, + "optional": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "optional": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "heap": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz", + "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true, + "optional": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "optional": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", + "dev": true, + "optional": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dev": true, + "optional": true, + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true, + "optional": true + } + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "optional": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", + "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=", + "dev": true + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true + }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "optional": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "optional": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "optional": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "optional": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true, + "optional": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true, + "optional": true + }, + "json-rpc-engine": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", + "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", + "dev": true, + "requires": { + "async": "^2.0.1", + "babel-preset-env": "^1.7.0", + "babelify": "^7.3.0", + "json-rpc-error": "^2.0.0", + "promise-to-callback": "^1.0.0", + "safe-event-emitter": "^1.0.1" + } + }, + "json-rpc-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz", + "integrity": "sha1-p6+cICg4tekFxyUOVH8a/3cligI=", + "dev": true, + "requires": { + "inherits": "^2.0.1" + } + }, + "json-rpc-random-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", + "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "optional": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11" + } + }, + "level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "dev": true, + "requires": { + "buffer": "^5.6.0" + } + }, + "level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz", + "integrity": "sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5", + "xtend": "^4.0.0" + } + }, + "level-mem": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-3.0.1.tgz", + "integrity": "sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==", + "dev": true, + "requires": { + "level-packager": "~4.0.0", + "memdown": "~3.0.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", + "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-3.0.0.tgz", + "integrity": "sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==", + "dev": true, + "requires": { + "abstract-leveldown": "~5.0.0", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "level-packager": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-4.0.1.tgz", + "integrity": "sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==", + "dev": true, + "requires": { + "encoding-down": "~5.0.0", + "levelup": "^3.0.0" + } + }, + "level-post": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz", + "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==", + "dev": true, + "requires": { + "ltgt": "^2.1.2" + } + }, + "level-sublevel": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.6.4.tgz", + "integrity": "sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==", + "dev": true, + "requires": { + "bytewise": "~1.1.0", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0", + "level-iterator-stream": "^2.0.3", + "ltgt": "~2.1.1", + "pull-defer": "^0.2.2", + "pull-level": "^2.0.3", + "pull-stream": "^3.6.8", + "typewiselite": "~1.0.0", + "xtend": "~4.0.0" + } + }, + "level-ws": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-1.0.0.tgz", + "integrity": "sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.8", + "xtend": "^4.0.1" + } + }, + "levelup": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz", + "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==", + "dev": true, + "requires": { + "deferred-leveldown": "~4.0.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~3.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "level-iterator-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz", + "integrity": "sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "xtend": "^4.0.0" + } + } + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "looper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz", + "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "optional": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "ltgt": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz", + "integrity": "sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true, + "optional": true + }, + "merkle-patricia-tree": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz", + "integrity": "sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==", + "dev": true, + "requires": { + "async": "^2.6.1", + "ethereumjs-util": "^5.2.0", + "level-mem": "^3.0.1", + "level-ws": "^1.0.0", + "readable-stream": "^3.0.6", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "optional": true + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "dev": true + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dev": true, + "requires": { + "mime-db": "1.45.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "optional": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "*" + } + }, + "mock-fs": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.13.0.tgz", + "integrity": "sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA==", + "dev": true, + "optional": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "dev": true, + "optional": true, + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "dev": true, + "optional": true, + "requires": { + "varint": "^5.0.0" + } + }, + "multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + }, + "dependencies": { + "multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "dev": true, + "optional": true, + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + } + } + }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "optional": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "node-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", + "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", + "dev": true + }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true, + "optional": true + }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "dev": true, + "optional": true, + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", + "dev": true, + "optional": true + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-is": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", + "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "oboe": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", + "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", + "dev": true, + "optional": true, + "requires": { + "http-https": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "optional": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "optional": true + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "optional": true, + "requires": { + "p-finally": "^1.0.0" + }, + "dependencies": { + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "optional": true + } + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "optional": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "optional": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "patch-package": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz", + "integrity": "sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^1.2.1", + "fs-extra": "^7.0.1", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.0", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true, + "optional": true + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "optional": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-to-callback": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", + "integrity": "sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=", + "dev": true, + "requires": { + "is-fn": "^1.0.0", + "set-immediate-shim": "^1.0.1" + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "optional": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pull-cat": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz", + "integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=", + "dev": true + }, + "pull-defer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz", + "integrity": "sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==", + "dev": true + }, + "pull-level": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz", + "integrity": "sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==", + "dev": true, + "requires": { + "level-post": "^1.0.7", + "pull-cat": "^1.1.9", + "pull-live": "^1.0.1", + "pull-pushable": "^2.0.0", + "pull-stream": "^3.4.0", + "pull-window": "^2.1.4", + "stream-to-pull-stream": "^1.7.1" + } + }, + "pull-live": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz", + "integrity": "sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=", + "dev": true, + "requires": { + "pull-cat": "^1.1.9", + "pull-stream": "^3.4.0" + } + }, + "pull-pushable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz", + "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=", + "dev": true + }, + "pull-stream": { + "version": "3.6.14", + "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.14.tgz", + "integrity": "sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==", + "dev": true + }, + "pull-window": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz", + "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=", + "dev": true, + "requires": { + "looper": "^2.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "optional": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "optional": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "optional": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "optional": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "optional": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "dev": true, + "requires": { + "through": "~2.3.4" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "dev": true, + "requires": { + "bn.js": "^4.11.1" + } + }, + "rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-event-emitter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", + "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", + "dev": true, + "requires": { + "events": "^3.0.0" + } + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "dev": true, + "optional": true, + "requires": { + "pbkdf2": "^3.0.3" + } + }, + "secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", + "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", + "dev": true, + "requires": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "seedrandom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.1.tgz", + "integrity": "sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==", + "dev": true + }, + "semaphore": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "optional": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "optional": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "dev": true, + "optional": true, + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true, + "optional": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "optional": true + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "dev": true, + "optional": true, + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "optional": true + }, + "stream-to-pull-stream": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz", + "integrity": "sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==", + "dev": true, + "requires": { + "looper": "^3.0.0", + "pull-stream": "^3.2.3" + }, + "dependencies": { + "looper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", + "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=", + "dev": true + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "optional": true + }, + "string.prototype.trim": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.3.tgz", + "integrity": "sha512-16IL9pIBA5asNOSukPfxX2W68BaBvxyiRK16H3RA/lWW9BDosh+w7f+LhomPHpXJ82QEe7w7/rY/S1CV97raLg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "swarm-js": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", + "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "dev": true, + "optional": true, + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "optional": true + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "optional": true, + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "optional": true + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true, + "optional": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true, + "optional": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "optional": true, + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "tape": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz", + "integrity": "sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==", + "dev": true, + "requires": { + "deep-equal": "~1.1.1", + "defined": "~1.0.0", + "dotignore": "~0.1.2", + "for-each": "~0.3.3", + "function-bind": "~1.1.1", + "glob": "~7.1.6", + "has": "~1.0.3", + "inherits": "~2.0.4", + "is-regex": "~1.0.5", + "minimist": "~1.2.5", + "object-inspect": "~1.7.0", + "resolve": "~1.17.0", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.2.1", + "through": "~2.3.8" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true, + "optional": true + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "requires": { + "rimraf": "^2.6.3" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "optional": true + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "optional": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + }, + "tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "optional": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typewise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", + "integrity": "sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=", + "dev": true, + "requires": { + "typewise-core": "^1.2.0" + } + }, + "typewise-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", + "integrity": "sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=", + "dev": true + }, + "typewiselite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz", + "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true, + "optional": true + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "dev": true, + "optional": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "optional": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "optional": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=", + "dev": true, + "optional": true + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true, + "optional": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "utf-8-validate": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz", + "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==", + "dev": true, + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", + "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "for-each": "^0.3.3", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.1" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "optional": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", + "dev": true, + "optional": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "optional": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "web3": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.11.tgz", + "integrity": "sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==", + "dev": true, + "optional": true, + "requires": { + "web3-bzz": "1.2.11", + "web3-core": "1.2.11", + "web3-eth": "1.2.11", + "web3-eth-personal": "1.2.11", + "web3-net": "1.2.11", + "web3-shh": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-bzz": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz", + "integrity": "sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "^12.12.6", + "got": "9.6.0", + "swarm-js": "^0.1.40", + "underscore": "1.9.1" + }, + "dependencies": { + "@types/node": { + "version": "12.19.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", + "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", + "dev": true, + "optional": true + } + } + }, + "web3-core": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.11.tgz", + "integrity": "sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==", + "dev": true, + "optional": true, + "requires": { + "@types/bn.js": "^4.11.5", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-requestmanager": "1.2.11", + "web3-utils": "1.2.11" + }, + "dependencies": { + "@types/node": { + "version": "12.19.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", + "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", + "dev": true, + "optional": true + } + } + }, + "web3-core-helpers": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz", + "integrity": "sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==", + "dev": true, + "optional": true, + "requires": { + "underscore": "1.9.1", + "web3-eth-iban": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-core-method": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz", + "integrity": "sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/transactions": "^5.0.0-beta.135", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11", + "web3-core-promievent": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-core-promievent": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz", + "integrity": "sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==", + "dev": true, + "optional": true, + "requires": { + "eventemitter3": "4.0.4" + } + }, + "web3-core-requestmanager": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz", + "integrity": "sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==", + "dev": true, + "optional": true, + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11", + "web3-providers-http": "1.2.11", + "web3-providers-ipc": "1.2.11", + "web3-providers-ws": "1.2.11" + } + }, + "web3-core-subscriptions": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz", + "integrity": "sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==", + "dev": true, + "optional": true, + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11" + } + }, + "web3-eth": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz", + "integrity": "sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==", + "dev": true, + "optional": true, + "requires": { + "underscore": "1.9.1", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-eth-abi": "1.2.11", + "web3-eth-accounts": "1.2.11", + "web3-eth-contract": "1.2.11", + "web3-eth-ens": "1.2.11", + "web3-eth-iban": "1.2.11", + "web3-eth-personal": "1.2.11", + "web3-net": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-eth-abi": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz", + "integrity": "sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/abi": "5.0.0-beta.153", + "underscore": "1.9.1", + "web3-utils": "1.2.11" + } + }, + "web3-eth-accounts": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz", + "integrity": "sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==", + "dev": true, + "optional": true, + "requires": { + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "scrypt-js": "^3.0.1", + "underscore": "1.9.1", + "uuid": "3.3.2", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-utils": "1.2.11" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true, + "optional": true + } + } + }, + "web3-eth-contract": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz", + "integrity": "sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==", + "dev": true, + "optional": true, + "requires": { + "@types/bn.js": "^4.11.5", + "underscore": "1.9.1", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-promievent": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-eth-abi": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-eth-ens": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz", + "integrity": "sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==", + "dev": true, + "optional": true, + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "underscore": "1.9.1", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-promievent": "1.2.11", + "web3-eth-abi": "1.2.11", + "web3-eth-contract": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-eth-iban": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz", + "integrity": "sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.11.9", + "web3-utils": "1.2.11" + } + }, + "web3-eth-personal": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz", + "integrity": "sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "^12.12.6", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-net": "1.2.11", + "web3-utils": "1.2.11" + }, + "dependencies": { + "@types/node": { + "version": "12.19.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", + "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", + "dev": true, + "optional": true + } + } + }, + "web3-net": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz", + "integrity": "sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==", + "dev": true, + "optional": true, + "requires": { + "web3-core": "1.2.11", + "web3-core-method": "1.2.11", + "web3-utils": "1.2.11" + } + }, + "web3-provider-engine": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz", + "integrity": "sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==", + "dev": true, + "requires": { + "async": "^2.5.0", + "backoff": "^2.5.0", + "clone": "^2.0.0", + "cross-fetch": "^2.1.0", + "eth-block-tracker": "^3.0.0", + "eth-json-rpc-infura": "^3.1.0", + "eth-sig-util": "^1.4.2", + "ethereumjs-block": "^1.2.2", + "ethereumjs-tx": "^1.2.0", + "ethereumjs-util": "^5.1.5", + "ethereumjs-vm": "^2.3.4", + "json-rpc-error": "^2.0.0", + "json-stable-stringify": "^1.0.1", + "promise-to-callback": "^1.0.0", + "readable-stream": "^2.2.9", + "request": "^2.85.0", + "semaphore": "^1.0.3", + "ws": "^5.1.1", + "xhr": "^2.2.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "dev": true, + "requires": { + "abstract-leveldown": "~2.6.0" + } + }, + "eth-sig-util": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", + "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", + "dev": true, + "requires": { + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "ethereumjs-util": "^5.1.1" + } + }, + "ethereumjs-abi": { + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", + "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "dev": true, + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + }, + "dependencies": { + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + } + } + }, + "ethereumjs-account": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", + "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", + "dev": true, + "requires": { + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-block": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", + "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", + "dev": true, + "requires": { + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereum-common": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", + "dev": true + } + } + }, + "ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "dev": true, + "requires": { + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" + } + }, + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-vm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", + "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", + "dev": true, + "requires": { + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "ethereumjs-block": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", + "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", + "dev": true, + "requires": { + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + } + } + }, + "ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==", + "dev": true + }, + "level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "dev": true, + "requires": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "requires": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + } + } + }, + "merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "dev": true, + "requires": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "web3-providers-http": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.11.tgz", + "integrity": "sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==", + "dev": true, + "optional": true, + "requires": { + "web3-core-helpers": "1.2.11", + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz", + "integrity": "sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==", + "dev": true, + "optional": true, + "requires": { + "oboe": "2.1.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11" + } + }, + "web3-providers-ws": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz", + "integrity": "sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==", + "dev": true, + "optional": true, + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11", + "websocket": "^1.0.31" + } + }, + "web3-shh": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz", + "integrity": "sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==", + "dev": true, + "optional": true, + "requires": { + "web3-core": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-net": "1.2.11" + } + }, + "web3-utils": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", + "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + } + } + }, + "websocket": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz", + "integrity": "sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==", + "dev": true, + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "optional": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + } + } + }, + "xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dev": true, + "requires": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dev": true, + "optional": true, + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dev": true, + "optional": true, + "requires": { + "xhr-request": "^1.1.0" + } + }, + "xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", + "dev": true, + "optional": true, + "requires": { + "cookiejar": "^2.1.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", + "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==", + "dev": true, + "optional": true + }, + "get-params": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/get-params/-/get-params-0.1.2.tgz", + "integrity": "sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=", + "dev": true + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "dev": true + }, + "get-prototype-of": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/get-prototype-of/-/get-prototype-of-0.0.0.tgz", + "integrity": "sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ=", + "dev": true, + "optional": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "optional": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "optional": true, + "requires": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "optional": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "optional": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "optional": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "dev": true, + "optional": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "google-protobuf": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.17.2.tgz", + "integrity": "sha512-LlFVMhSkNy6C1MakEjiwbLxq5w+V+Go+mvt2EUoysrp8gXl903ic2W/3BwzM4/WnDMJP+u7UO2efUSl/0CJMzA==", + "dev": true, + "optional": true + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "graphql": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.0.tgz", + "integrity": "sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA==", + "dev": true, + "optional": true + }, + "graphql-extensions": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.15.0.tgz", + "integrity": "sha512-bVddVO8YFJPwuACn+3pgmrEg6I8iBuYLuwvxiE+lcQQ7POotVZxm2rgGw0PvVYmWWf3DT7nTVDZ5ROh/ALp8mA==", + "dev": true, + "optional": true, + "requires": { + "@apollographql/apollo-tools": "^0.5.0", + "apollo-server-env": "^3.1.0", + "apollo-server-types": "^0.9.0" + } + }, + "graphql-subscriptions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", + "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==", + "dev": true, + "optional": true, + "requires": { + "iterall": "^1.3.0" + } + }, + "graphql-tag": { + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.4.tgz", + "integrity": "sha512-VV1U4O+9x99EkNpNmCUV5RZwq6MnK4+pGbRYWG+lA/m3uo7TSqJF81OkcOP148gFP6fzdl7JWYBrwWVTS9jXww==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "graphql-tools": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-6.2.6.tgz", + "integrity": "sha512-OyhSvK5ALVVD6bFiWjAqv2+lRyvjIRfb6Br5Tkjrv++rxnXDodPH/zhMbDGRw+W3SD5ioGEEz84yO48iPiN7jA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/batch-delegate": "^6.2.6", + "@graphql-tools/code-file-loader": "^6.2.4", + "@graphql-tools/delegate": "^6.2.4", + "@graphql-tools/git-loader": "^6.2.4", + "@graphql-tools/github-loader": "^6.2.4", + "@graphql-tools/graphql-file-loader": "^6.2.4", + "@graphql-tools/graphql-tag-pluck": "^6.2.4", + "@graphql-tools/import": "^6.2.4", + "@graphql-tools/json-file-loader": "^6.2.4", + "@graphql-tools/links": "^6.2.4", + "@graphql-tools/load": "^6.2.4", + "@graphql-tools/load-files": "^6.2.4", + "@graphql-tools/merge": "^6.2.4", + "@graphql-tools/mock": "^6.2.4", + "@graphql-tools/module-loader": "^6.2.4", + "@graphql-tools/relay-operation-optimizer": "^6.2.4", + "@graphql-tools/resolvers-composition": "^6.2.4", + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/stitch": "^6.2.4", + "@graphql-tools/url-loader": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "@graphql-tools/wrap": "^6.2.4", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "graphql-ws": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-4.9.0.tgz", + "integrity": "sha512-sHkK9+lUm20/BGawNEWNtVAeJzhZeBg21VmvmLoT5NdGVeZWv5PdIhkcayQIAgjSyyQ17WMKmbDijIPG2On+Ag==", + "dev": true, + "optional": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "gulp-sourcemaps": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", + "integrity": "sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=", + "dev": true, + "optional": true, + "requires": { + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "4.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "0.0.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom": "2.X", + "through2": "2.X", + "vinyl": "1.X" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hardhat": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.3.0.tgz", + "integrity": "sha512-nc4ro2bM4wPaA6/0Y22o5F5QrifQk2KCyPUUKLPUeFFZoGNGYB8vmeW/k9gV9DdMukdWTzfYlKc2Jn4bfb6tDQ==", + "dev": true, + "requires": { + "@ethereumjs/block": "^3.2.1", + "@ethereumjs/blockchain": "^5.2.1", + "@ethereumjs/common": "^2.2.0", + "@ethereumjs/tx": "^3.1.3", + "@ethereumjs/vm": "^5.3.2", + "@sentry/node": "^5.18.1", + "@solidity-parser/parser": "^0.11.0", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "eth-sig-util": "^2.5.2", + "ethereum-cryptography": "^0.1.2", + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^7.0.10", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "^7.1.3", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "lodash": "^4.17.11", + "merkle-patricia-tree": "^4.1.0", + "mnemonist": "^0.38.0", + "mocha": "^7.1.2", + "node-fetch": "^2.6.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "slash": "^3.0.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "true-case-path": "^2.2.1", + "tsort": "0.0.1", + "uuid": "^3.3.2", + "ws": "^7.2.1" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.11.1.tgz", + "integrity": "sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ==", + "dev": true + }, + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ethereumjs-util": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", + "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true + } + } + }, + "hardhat-contract-sizer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.0.3.tgz", + "integrity": "sha512-iaixOzWxwOSIIE76cl2uk4m9VXI1hKU3bFt+gl7jDhyb2/JB2xOp5wECkfWqAoc4V5lD4JtjldZlpSTbzX+nPQ==", + "dev": true, + "requires": { + "cli-table3": "^0.6.0", + "colors": "^1.4.0" + } + }, + "hardhat-deploy": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.7.10.tgz", + "integrity": "sha512-+0oiEWy/FgKOEzRNhSWPqSjofVCwtkK3E5x916kbZ5SgFGOjWTFCrWbWUYjzc2GyZgNXuSuRn8mBowHSLF4sVg==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/abstract-signer": "^5.0.0", + "@ethersproject/address": "^5.0.0", + "@ethersproject/bignumber": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/contracts": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "@ethersproject/solidity": "^5.0.0", + "@ethersproject/transactions": "^5.0.0", + "@ethersproject/wallet": "^5.0.0", + "@types/qs": "^6.9.4", + "axios": "^0.21.1", + "chalk": "^4.1.0", + "chokidar": "^3.4.0", + "debug": "^4.1.1", + "form-data": "^3.0.0", + "fs-extra": "^9.0.0", + "match-all": "^1.2.6", + "murmur-128": "^0.2.1", + "qs": "^6.9.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "hardhat-docgen": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hardhat-docgen/-/hardhat-docgen-1.1.1.tgz", + "integrity": "sha512-vMZqT2go9JmIAtTfK4QZLsL2hzGVccqkfDvSIvqC6wvH2FX9vmp4H5mTHoYqimanqZcU74QZ8Vi81G13m0WZ2w==", + "dev": true, + "requires": { + "css-loader": "^2.1.0", + "html-webpack-plugin": "^3.2.0", + "vue": "^2.6.12", + "vue-loader": "^15.6.4", + "vue-router": "^3.4.9", + "vue-template-compiler": "^2.6.7", + "webpack": "^4.29.5" + } + }, + "hardhat-gas-reporter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.4.tgz", + "integrity": "sha512-G376zKh81G3K9WtDA+SoTLWsoygikH++tD1E7llx+X7J+GbIqfwhDKKgvJjcnEesMrtR9UqQHK02lJuXY1RTxw==", + "dev": true, + "requires": { + "eth-gas-reporter": "^0.2.20", + "sha1": "^1.1.1" + } + }, + "hardhat-log-remover": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hardhat-log-remover/-/hardhat-log-remover-2.0.2.tgz", + "integrity": "sha512-TvEWOisQmZUZ7Mlb7s4XYS/MxgZzjFJSjDI8v3uTcrD6aaXy1QtomW6D6WNsISEWtwwRlSntOGpHQwFjrz2MCw==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "requires": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, + "highlight.js": { + "version": "9.18.5", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz", + "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", + "dev": true + }, + "highlightjs-solidity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-1.1.0.tgz", + "integrity": "sha512-LtH7uuoe+FOmtQd41ozAZKLJC2chqdqs461FJcWAx00R3VcBhSQTRFfzRGtTQqu2wsVIEdHiyynrPrEDDWyIMw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "optional": true, + "requires": { + "react-is": "^16.7.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "optional": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", + "dev": true + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "husky": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^4.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ice-cap": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ice-cap/-/ice-cap-0.0.4.tgz", + "integrity": "sha1-im0xq0ysjUtW3k+pRt8zUlYbbhg=", + "dev": true, + "requires": { + "cheerio": "0.20.0", + "color-logger": "0.0.3" + }, + "dependencies": { + "cheerio": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz", + "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "jsdom": "^7.0.2", + "lodash": "^4.1.0" + } + }, + "color-logger": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.3.tgz", + "integrity": "sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dev": true, + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "imagemin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz", + "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==", + "requires": { + "file-type": "^10.7.0", + "globby": "^8.0.1", + "make-dir": "^1.0.0", + "p-pipe": "^1.1.0", + "pify": "^4.0.1", + "replace-ext": "^1.0.0" + } + }, + "immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, + "immutable": { + "version": "4.0.0-rc.12", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", + "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "optional": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "optional": true + } + } + }, + "imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + } + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "requires": { + "fp-ts": "^1.0.0" + } + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true, + "optional": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "ipfs-core-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ipfs-core-types/-/ipfs-core-types-0.2.1.tgz", + "integrity": "sha512-q93+93qSybku6woZaajE9mCrHeVoMzNtZ7S5m/zx0+xHRhnoLlg8QNnGGsb5/+uFQt/RiBArsIw/Q61K9Jwkzw==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.1.5", + "multiaddr": "^8.0.0", + "peer-id": "^0.14.1" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "ipfs-core-utils": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.6.1.tgz", + "integrity": "sha512-UFIklwE3CFcsNIhYFDuz0qB7E2QtdFauRfc76kskgiqhGWcjqqiDeND5zBCrAy0u8UMaDqAbFl02f/mIq1yKXw==", + "dev": true, + "optional": true, + "requires": { + "any-signal": "^2.0.0", + "blob-to-it": "^1.0.1", + "browser-readablestream-to-it": "^1.0.1", + "cids": "^1.1.5", + "err-code": "^2.0.3", + "ipfs-core-types": "^0.2.1", + "ipfs-utils": "^5.0.0", + "it-all": "^1.0.4", + "it-map": "^1.0.4", + "it-peekable": "^1.0.1", + "multiaddr": "^8.0.0", + "multiaddr-to-uri": "^6.0.0", + "parse-duration": "^0.4.4", + "timeout-abort-controller": "^1.1.1", + "uint8arrays": "^1.1.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + } + } + }, + "ipfs-http-client": { + "version": "48.2.2", + "resolved": "https://registry.npmjs.org/ipfs-http-client/-/ipfs-http-client-48.2.2.tgz", + "integrity": "sha512-f3ppfWe913SJLvunm0UgqdA1dxVZSGQJPaEVJtqgjxPa5x0fPDiBDdo60g2MgkW1W6bhF9RGlxvHHIE9sv/tdg==", + "dev": true, + "optional": true, + "requires": { + "any-signal": "^2.0.0", + "bignumber.js": "^9.0.0", + "cids": "^1.1.5", + "debug": "^4.1.1", + "form-data": "^3.0.0", + "ipfs-core-types": "^0.2.1", + "ipfs-core-utils": "^0.6.1", + "ipfs-utils": "^5.0.0", + "ipld-block": "^0.11.0", + "ipld-dag-cbor": "^0.17.0", + "ipld-dag-pb": "^0.20.0", + "ipld-raw": "^6.0.0", + "it-last": "^1.0.4", + "it-map": "^1.0.4", + "it-tar": "^1.2.2", + "it-to-stream": "^0.1.2", + "merge-options": "^2.0.0", + "multiaddr": "^8.0.0", + "multibase": "^3.0.0", + "multicodec": "^2.0.1", + "multihashes": "^3.0.1", + "nanoid": "^3.1.12", + "native-abort-controller": "~0.0.3", + "parse-duration": "^0.4.4", + "stream-to-it": "^0.2.2", + "uint8arrays": "^1.1.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "optional": true + }, + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "multicodec": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-2.1.3.tgz", + "integrity": "sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "1.1.0", + "varint": "^6.0.0" + }, + "dependencies": { + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "multihashes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-3.1.2.tgz", + "integrity": "sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^3.1.0", + "uint8arrays": "^2.0.5", + "varint": "^6.0.0" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + } + } + }, + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true, + "optional": true + } + } + }, + "ipfs-utils": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-5.0.1.tgz", + "integrity": "sha512-28KZPgO4Uf5duT2ORLAYfboUp98iUshDD7yRAfbNxNAR8Dtidfn6o20rZfoXnkri2zKBVIPlJkuCPmPJB+6erg==", + "dev": true, + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "any-signal": "^2.1.0", + "buffer": "^6.0.1", + "electron-fetch": "^1.7.2", + "err-code": "^2.0.0", + "fs-extra": "^9.0.1", + "is-electron": "^2.2.0", + "iso-url": "^1.0.0", + "it-glob": "0.0.10", + "it-to-stream": "^0.1.2", + "merge-options": "^2.0.0", + "nanoid": "^3.1.3", + "native-abort-controller": "0.0.3", + "native-fetch": "^2.0.0", + "node-fetch": "^2.6.0", + "stream-to-it": "^0.2.0" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "optional": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "iso-url": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.1.5.tgz", + "integrity": "sha512-+3JqoKdBTGmyv9vOkS6b9iHhvK34UajfTibrH/1HOK8TI7K2VsM0qOCd+aJdWKtSOA8g3PqZfcwDmnR0p3klqQ==", + "dev": true, + "optional": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true, + "optional": true + }, + "native-fetch": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-2.0.1.tgz", + "integrity": "sha512-gv4Bea+ga9QdXINurpkEqun3ap3vnB+WYoe4c8ddqUYEH7B2h6iD39RF8uVN7OwmSfMY3RDxkvBnoI4e2/vLXQ==", + "dev": true, + "optional": true, + "requires": { + "globalthis": "^1.0.1" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "optional": true + } + } + }, + "ipld-block": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/ipld-block/-/ipld-block-0.11.1.tgz", + "integrity": "sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.0.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "ipld-dag-cbor": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz", + "integrity": "sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw==", + "dev": true, + "optional": true, + "requires": { + "borc": "^2.1.2", + "cids": "^1.0.0", + "is-circular": "^1.0.2", + "multicodec": "^3.0.1", + "multihashing-async": "^2.0.0", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "ipld-dag-pb": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz", + "integrity": "sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.0.0", + "class-is": "^1.1.0", + "multicodec": "^2.0.0", + "multihashing-async": "^2.0.0", + "protons": "^2.0.0", + "reset": "^0.1.0", + "run": "^1.4.0", + "stable": "^0.1.8", + "uint8arrays": "^1.0.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-2.1.3.tgz", + "integrity": "sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "1.1.0", + "varint": "^6.0.0" + }, + "dependencies": { + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + } + } + }, + "ipld-raw": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ipld-raw/-/ipld-raw-6.0.0.tgz", + "integrity": "sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.0.0", + "multicodec": "^2.0.0", + "multihashing-async": "^2.0.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + } + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-2.1.3.tgz", + "integrity": "sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "1.1.0", + "varint": "^6.0.0" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "uint8arrays": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-1.1.0.tgz", + "integrity": "sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^3.0.0", + "web-encoding": "^1.0.2" + } + }, + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-capitalized": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-capitalized/-/is-capitalized-1.0.0.tgz", + "integrity": "sha1-TIRktNkdPk7rRIid0s2PGwrEwTY=", + "dev": true, + "optional": true + }, + "is-circular": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-circular/-/is-circular-1.0.2.tgz", + "integrity": "sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==", + "dev": true, + "optional": true + }, + "is-class": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.4.tgz", + "integrity": "sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY=", + "dev": true, + "optional": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true, + "optional": true + }, + "is-electron": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.0.tgz", + "integrity": "sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q==", + "dev": true, + "optional": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "optional": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", + "dev": true + }, + "is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "dev": true, + "optional": true, + "requires": { + "ip-regex": "^4.0.0" + } + }, + "is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", + "dev": true, + "requires": { + "lower-case": "^1.1.0" + } + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "optional": true + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true, + "optional": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true, + "optional": true + }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "optional": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", + "dev": true, + "requires": { + "upper-case": "^1.1.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true, + "optional": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true, + "optional": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "iso-constants": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/iso-constants/-/iso-constants-0.1.2.tgz", + "integrity": "sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ==", + "dev": true, + "optional": true + }, + "iso-random-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/iso-random-stream/-/iso-random-stream-2.0.0.tgz", + "integrity": "sha512-lGuIu104KfBV9ubYTSaE3GeAr6I69iggXxBHbTBc5u/XKlwlWl0LCytnkIZissaKqvxablwRD9B3ktVnmIUnEg==", + "dev": true, + "optional": true, + "requires": { + "events": "^3.3.0", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "iso-url": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", + "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "dev": true, + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "it-all": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.5.tgz", + "integrity": "sha512-ygD4kA4vp8fi+Y+NBgEKt6W06xSbv6Ub/0V8d1r3uCyJ9Izwa1UspkIOlqY9fOee0Z1w3WRo1+VWyAU4DgtufA==", + "dev": true, + "optional": true + }, + "it-concat": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/it-concat/-/it-concat-1.0.3.tgz", + "integrity": "sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA==", + "dev": true, + "optional": true, + "requires": { + "bl": "^4.0.0" + } + }, + "it-drain": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-1.0.4.tgz", + "integrity": "sha512-coB7mcyZ4lWBQKoQGJuqM+P94pvpn2T3KY27vcVWPqeB1WmoysRC76VZnzAqrBWzpWcoEJMjZ+fsMBslxNaWfQ==", + "dev": true, + "optional": true + }, + "it-glob": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-0.0.10.tgz", + "integrity": "sha512-p1PR15djgPV7pxdLOW9j4WcJdla8+91rJdUU2hU2Jm68vkxpIEXK55VHBeH8Lvqh2vqLtM83t8q4BuJxue6niA==", + "dev": true, + "optional": true, + "requires": { + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "optional": true + } + } + }, + "it-last": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/it-last/-/it-last-1.0.5.tgz", + "integrity": "sha512-PV/2S4zg5g6dkVuKfgrQfN2rUN4wdTI1FzyAvU+i8RV96syut40pa2s9Dut5X7SkjwA3P0tOhLABLdnOJ0Y/4Q==", + "dev": true, + "optional": true + }, + "it-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/it-map/-/it-map-1.0.5.tgz", + "integrity": "sha512-EElupuWhHVStUgUY+OfTJIS2MZed96lDrAXzJUuqiiqLnIKoBRqtX1ZG2oR0bGDsSppmz83MtzCeKLZ9TVAUxQ==", + "dev": true, + "optional": true + }, + "it-peekable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-1.0.2.tgz", + "integrity": "sha512-LRPLu94RLm+lxLZbChuc9iCXrKCOu1obWqxfaKhF00yIp30VGkl741b5P60U+rdBxuZD/Gt1bnmakernv7bVFg==", + "dev": true, + "optional": true + }, + "it-reader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-2.1.0.tgz", + "integrity": "sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw==", + "dev": true, + "optional": true, + "requires": { + "bl": "^4.0.0" + } + }, + "it-tar": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/it-tar/-/it-tar-1.2.2.tgz", + "integrity": "sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA==", + "dev": true, + "optional": true, + "requires": { + "bl": "^4.0.0", + "buffer": "^5.4.3", + "iso-constants": "^0.1.2", + "it-concat": "^1.0.0", + "it-reader": "^2.0.0", + "p-defer": "^3.0.0" + } + }, + "it-to-stream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-0.1.2.tgz", + "integrity": "sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.6.0", + "fast-fifo": "^1.0.0", + "get-iterator": "^1.0.2", + "p-defer": "^3.0.0", + "p-fifo": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "iter-tools": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/iter-tools/-/iter-tools-7.1.3.tgz", + "integrity": "sha512-Pnd3FVHgKnDHrTVjggXLMq5O/P60fho5iL0a0kkdLcofxX8STHw6cgYZ4ZHQS3Zb4Hg/VeqeNUxDs4vlVwUL4A==", + "dev": true, + "optional": true, + "requires": { + "@babel/runtime": "^7.12.1" + } + }, + "iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==", + "dev": true, + "optional": true + }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "js-graph-algorithms": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", + "integrity": "sha1-+W7Ie/GU9cCjE2X6Dh0Ht7li2JE=" + }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsan": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.13.tgz", + "integrity": "sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", + "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", + "dev": true, + "optional": true, + "requires": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.29 < 0.3.0", + "escodegen": "^1.6.1", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^2.0.0", + "whatwg-url-compat": "~0.6.5", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "dev": true, + "optional": true + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true, + "optional": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "optional": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-pointer": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.1.tgz", + "integrity": "sha512-3OvjqKdCBvH41DLpV4iSt6v2XhZXV1bPB4OROuknvUXI7ZQNofieCPkmE26stEJ9zdQuvIxDHCuYhfgxFAAs+Q==", + "dev": true, + "requires": { + "foreach": "^2.0.4" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json-text-sequence": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", + "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", + "dev": true, + "requires": { + "delimit-stream": "0.1.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsondown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jsondown/-/jsondown-1.0.0.tgz", + "integrity": "sha512-p6XxPaq59aXwcdDQV3ISMA5xk+1z6fJuctcwwSdR9iQgbYOcIrnknNrhcMGG+0FaUfKHGkdDpQNaZrovfBoyOw==", + "dev": true, + "optional": true, + "requires": { + "memdown": "1.4.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dev": true, + "optional": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "optional": true, + "requires": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + } + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonschema": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz", + "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keccak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "dev": true, + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=" + }, + "keypair": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/keypair/-/keypair-1.0.3.tgz", + "integrity": "sha512-0wjZ2z/SfZZq01+3/8jYLd8aEShSa+aat1zyPGQY3IuKoEAp6DJGvu2zt6snELrQU9jbCkIlCyNOD7RdQbHhkQ==", + "dev": true, + "optional": true + }, + "keypather": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/keypather/-/keypather-1.10.2.tgz", + "integrity": "sha1-4ESWMtSz5RbyHMAUznxWRP3c5hQ=", + "dev": true, + "requires": { + "101": "^1.0.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lazy-debug-legacy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", + "integrity": "sha1-U3cWwHduTPeePtG2IfdljCkRsbE=", + "dev": true, + "optional": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", + "dev": true + }, + "leb128": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/leb128/-/leb128-0.0.5.tgz", + "integrity": "sha512-elbNtfmu3GndZbesVF6+iQAfVjOXW9bM/aax9WwMlABZW+oK9sbAZEXoewaPHmL34sxa8kVwWsru8cNE/yn2gg==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^5.0.0", + "buffer-pipe": "0.0.3" + } + }, + "level": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/level/-/level-5.0.1.tgz", + "integrity": "sha512-wcak5OQeA4rURGacqS62R/xNHjCYnJSQDBOlm4KNUGJVE9bWv2B04TclqReYejN+oD65PzD4FsqeWoI5wNC5Lg==", + "dev": true, + "optional": true, + "requires": { + "level-js": "^4.0.0", + "level-packager": "^5.0.0", + "leveldown": "^5.0.0", + "opencollective-postinstall": "^2.0.0" + } + }, + "level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "dev": true, + "requires": { + "buffer": "^5.6.0" + } + }, + "level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "dev": true + }, + "level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "level-js": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-4.0.2.tgz", + "integrity": "sha512-PeGjZsyMG4O89KHiez1zoMJxStnkM+oBIqgACjoo5PJqFiSUUm3GNod/KcbqN5ktyZa8jkG7I1T0P2u6HN9lIg==", + "dev": true, + "optional": true, + "requires": { + "abstract-leveldown": "~6.0.1", + "immediate": "~3.2.3", + "inherits": "^2.0.3", + "ltgt": "^2.1.2", + "typedarray-to-buffer": "~3.1.5" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz", + "integrity": "sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q==", + "dev": true, + "optional": true, + "requires": { + "level-concat-iterator": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", + "dev": true, + "optional": true + } + } + }, + "level-mem": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", + "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", + "dev": true, + "requires": { + "level-packager": "^5.0.3", + "memdown": "^5.0.0" + } + }, + "level-packager": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", + "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "dev": true, + "requires": { + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" + } + }, + "level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dev": true, + "requires": { + "xtend": "^4.0.2" + } + }, + "level-write-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/level-write-stream/-/level-write-stream-1.0.0.tgz", + "integrity": "sha1-P3+7Z5pVE3wP6zA97nZuEu4Twdw=", + "dev": true, + "optional": true, + "requires": { + "end-stream": "~0.1.0" + } + }, + "level-ws": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", + "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "leveldown": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.0.2.tgz", + "integrity": "sha512-Ib6ygFYBleS8x2gh3C1AkVsdrUShqXpe6jSTnZ6sRycEXKhqVf+xOSkhgSnjidpPzyv0d95LJVFrYQ4NuXAqHA==", + "dev": true, + "optional": true, + "requires": { + "abstract-leveldown": "~6.0.0", + "fast-future": "~1.0.2", + "napi-macros": "~1.8.1", + "node-gyp-build": "~3.8.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz", + "integrity": "sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q==", + "dev": true, + "optional": true, + "requires": { + "level-concat-iterator": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node-gyp-build": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.8.0.tgz", + "integrity": "sha512-bYbpIHyRqZ7sVWXxGpz8QIRug5JZc/hzZH4GbdT9HTZi6WmKCZ8GLvP8OZ9TTiIBvwPFKgtGrlWQSXDAvYdsPw==", + "dev": true, + "optional": true + } + } + }, + "levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "dev": true, + "requires": { + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "libp2p-crypto": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.19.4.tgz", + "integrity": "sha512-8iUwiNlU/sFEtXQpxaehmXUQ5Fw6r52H7NH0d8ZSb8nKBbO6r8y8ft6f1to8A81SrFOVd4/zsjEzokpedDvRgw==", + "dev": true, + "optional": true, + "requires": { + "err-code": "^3.0.1", + "is-typedarray": "^1.0.0", + "iso-random-stream": "^2.0.0", + "keypair": "^1.0.1", + "multibase": "^4.0.3", + "multicodec": "^3.0.1", + "multihashes": "^4.0.2", + "multihashing-async": "^2.1.2", + "node-forge": "^0.10.0", + "pem-jwk": "^2.0.0", + "protobufjs": "^6.10.2", + "secp256k1": "^4.0.0", + "uint8arrays": "^2.1.4", + "ursa-optional": "^0.10.1" + }, + "dependencies": { + "err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "dev": true, + "optional": true + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "linked-list": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/linked-list/-/linked-list-0.1.0.tgz", + "integrity": "sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "optional": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true, + "optional": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true, + "optional": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true, + "optional": true + }, + "lodash.assigninwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assigninwith/-/lodash.assigninwith-4.2.0.tgz", + "integrity": "sha1-rwLJhDKshtk9ppW0voAUAZcXNq8=", + "dev": true, + "optional": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true, + "optional": true + }, + "lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU=", + "dev": true, + "optional": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", + "dev": true, + "optional": true + }, + "lodash.partition": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.partition/-/lodash.partition-4.6.0.tgz", + "integrity": "sha1-o45GtzRp4EILDaEhLmbUFL42S6Q=", + "dev": true + }, + "lodash.rest": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.5.tgz", + "integrity": "sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo=", + "dev": true, + "optional": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true, + "optional": true + }, + "lodash.sum": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lodash.sum/-/lodash.sum-4.0.2.tgz", + "integrity": "sha1-rZDjl5ZdgD1PH/eqWy0Bl/O0Y3s=", + "dev": true + }, + "lodash.template": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.2.4.tgz", + "integrity": "sha1-0FPBno50442WW/T7SV2A8Qnn96Q=", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "~3.0.0", + "lodash.assigninwith": "^4.0.0", + "lodash.keys": "^4.0.0", + "lodash.rest": "^4.0.0", + "lodash.templatesettings": "^4.0.0", + "lodash.tostring": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.tostring": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.4.tgz", + "integrity": "sha1-Vgwn0fjq3eA8LM4Zj+9cAx2CmPs=", + "dev": true, + "optional": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "lodash.without": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz", + "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=", + "dev": true, + "optional": true + }, + "lodash.xor": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.xor/-/lodash.xor-4.5.0.tgz", + "integrity": "sha1-TUjtfpgJWwYyWCunFNP/iuj7HbY=", + "dev": true, + "optional": true + }, + "lodash.zipwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zipwith/-/lodash.zipwith-4.2.0.tgz", + "integrity": "sha1-r6zwP9LzhK8p4mPDxr2juA4/Uf0=", + "dev": true + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true, + "optional": true + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true, + "optional": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "dev": true, + "requires": { + "lower-case": "^1.1.2" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=", + "dev": true + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.6.tgz", + "integrity": "sha1-0u9OuBGihkTHqJiZhcacL91JaCc=", + "dev": true, + "optional": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true + }, + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true + }, + "match-all": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", + "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", + "dev": true + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true, + "optional": true + }, + "mcl-wasm": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.7.tgz", + "integrity": "sha512-jDGiCQA++5hX37gdH6RDZ3ZsA0raet7xyY/R5itj5cbcdf4Gvw+YyxWX/ZZ0Z2UPxJiw1ktRsCJZzpnqlQILdw==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memdown": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", + "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "dev": true, + "requires": { + "abstract-leveldown": "~6.2.1", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-2.0.0.tgz", + "integrity": "sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ==", + "dev": true, + "optional": true, + "requires": { + "is-plain-obj": "^2.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "optional": true + } + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "merkle-patricia-tree": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz", + "integrity": "sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ==", + "dev": true, + "requires": { + "@types/levelup": "^4.3.0", + "ethereumjs-util": "^7.0.10", + "level-mem": "^5.0.1", + "level-ws": "^2.0.0", + "readable-stream": "^3.6.0", + "rlp": "^2.2.4", + "semaphore-async-await": "^1.5.1" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ethereumjs-util": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", + "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "meros": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.1.4.tgz", + "integrity": "sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ==", + "dev": true, + "optional": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "dev": true, + "requires": { + "mkdirp": "*" + } + }, + "mnemonist": { + "version": "0.38.3", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", + "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", + "dev": true, + "requires": { + "obliterator": "^1.6.1" + } + }, + "mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", + "dev": true + }, + "module": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/module/-/module-1.2.5.tgz", + "integrity": "sha1-tQPrBs3BNHP1aBhCaXTN5+xZvxU=", + "dev": true, + "optional": true, + "requires": { + "chalk": "1.1.3", + "concat-stream": "1.5.1", + "lodash.template": "4.2.4", + "map-stream": "0.0.6", + "tildify": "1.2.0", + "vinyl-fs": "2.4.3", + "yargs": "4.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "concat-stream": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz", + "integrity": "sha1-87gKz54fSOOHXAaItBtsMWAu6hw=", + "dev": true, + "optional": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "optional": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true, + "optional": true + }, + "yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha1-y0BQwBWb+2u2ScD0r1UFJqhGGdw=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "optional": true + } + } + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multiaddr": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-8.1.2.tgz", + "integrity": "sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.0.0", + "class-is": "^1.1.0", + "dns-over-http-resolver": "^1.0.0", + "err-code": "^2.0.3", + "is-ip": "^3.1.0", + "multibase": "^3.0.0", + "uint8arrays": "^1.1.0", + "varint": "^5.0.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + } + } + }, + "multiaddr-to-uri": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz", + "integrity": "sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A==", + "dev": true, + "optional": true, + "requires": { + "multiaddr": "^8.0.0" + } + }, + "multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "dev": true, + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "dev": true, + "requires": { + "varint": "^5.0.0" + } + }, + "multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + }, + "dependencies": { + "multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "dev": true, + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + } + } + }, + "multihashing-async": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-2.1.2.tgz", + "integrity": "sha512-FTPNnWWxwIK5dXXmTFhySSF8Fkdqf7vzqpV09+RWsmfUhrsL/b3Arg3+bRrBnXTtjxm3JRGI3wSAtQHL0QCxhQ==", + "dev": true, + "optional": true, + "requires": { + "blakejs": "^1.1.0", + "err-code": "^3.0.0", + "js-sha3": "^0.8.0", + "multihashes": "^4.0.1", + "murmurhash3js-revisited": "^3.0.0", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "dev": true, + "optional": true + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "murmur-128": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", + "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", + "dev": true, + "requires": { + "encode-utf8": "^1.0.2", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "murmurhash3js-revisited": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", + "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "dev": true, + "optional": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true + }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=", + "dev": true + }, + "nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "napi-macros": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-1.8.2.tgz", + "integrity": "sha512-Tr0DNY4RzTaBG2W2m3l7ZtFuJChTH6VZhXVhkGGjF/4cZTt+i8GcM9ozD+30Lmr4mDoZ5Xx34t2o4GJqYWDGcg==", + "dev": true, + "optional": true + }, + "native-abort-controller": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/native-abort-controller/-/native-abort-controller-0.0.3.tgz", + "integrity": "sha512-YIxU5nWqSHG1Xbu3eOu3pdFRD882ivQpIcu6AiPVe2oSVoRbfYW63DVkZm3g1gHiMtZSvZzF6THSzTGEBYl8YA==", + "dev": true, + "optional": true, + "requires": { + "globalthis": "^1.0.1" + } + }, + "native-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", + "integrity": "sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "needle": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", + "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": true + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "optional": true + }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true, + "optional": true + }, + "node-interval-tree": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-1.3.3.tgz", + "integrity": "sha512-K9vk96HdTK5fEipJwxSvIIqwTqr4e3HRJeJrNxBSeVMNSC/JWARRaX7etOLOuTmrRMeOI/K5TCJu3aWIwZiNTw==", + "dev": true, + "requires": { + "shallowequal": "^1.0.2" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + } + } + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true, + "optional": true + }, + "nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "dev": true + }, + "noop-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/noop-fn/-/noop-fn-1.0.0.tgz", + "integrity": "sha1-XzPUfxPSFQ35PgywNmmemC94/78=", + "dev": true, + "optional": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "optional": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true, + "optional": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "dev": true, + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", + "dev": true + } + } + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true, + "optional": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-path": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz", + "integrity": "sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg==", + "dev": true, + "optional": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "optional": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "obliterator": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", + "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", + "dev": true + }, + "oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", + "dev": true, + "requires": { + "http-https": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "optimism": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz", + "integrity": "sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg==", + "dev": true, + "optional": true, + "requires": { + "@wry/context": "^0.6.0", + "@wry/trie": "^0.3.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "optional": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "optional": true, + "requires": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + } + }, + "original-require": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", + "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", + "dev": true + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "dev": true, + "optional": true + }, + "p-fifo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz", + "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==", + "dev": true, + "optional": true, + "requires": { + "fast-fifo": "^1.0.0", + "p-defer": "^3.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-pipe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=" + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "paramap-it": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/paramap-it/-/paramap-it-0.1.1.tgz", + "integrity": "sha512-3uZmCAN3xCw7Am/4ikGzjjR59aNMJVXGSU7CjG2Z6DfOAdhnLdCOd0S0m1sTkN4ov9QhlE3/jkzyu953hq0uwQ==", + "dev": true, + "optional": true, + "requires": { + "event-iterator": "^1.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", + "dev": true + }, + "parse-duration": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", + "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==", + "dev": true, + "optional": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "optional": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "peer-id": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/peer-id/-/peer-id-0.14.8.tgz", + "integrity": "sha512-GpuLpob/9FrEFvyZrKKsISEkaBYsON2u0WtiawLHj1ii6ewkoeRiSDFLyIefYhw0jGvQoeoZS05jaT52X7Bvig==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.1.5", + "class-is": "^1.1.0", + "libp2p-crypto": "^0.19.0", + "minimist": "^1.2.5", + "multihashes": "^4.0.2", + "protobufjs": "^6.10.2", + "uint8arrays": "^2.0.5" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "pegjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=", + "dev": true + }, + "pem-jwk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pem-jwk/-/pem-jwk-2.0.0.tgz", + "integrity": "sha512-rFxu7rVoHgQ5H9YsP50dDWf0rHjreVA2z0yPiWr5WdH/UHb29hKtF7h6l8vNd1cbYR1t0QL+JKhW55a2ZV4KtA==", + "dev": true, + "optional": true, + "requires": { + "asn1.js": "^5.0.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "requires": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + } + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-1.1.3.tgz", + "integrity": "sha1-N45W1v0T6Iv7b0ol33qD+qvduls=", + "dev": true, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "load-json-file": "^1.1.0", + "object-assign": "^4.0.1", + "symbol": "^0.2.1" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "optional": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "pouchdb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/pouchdb/-/pouchdb-7.1.1.tgz", + "integrity": "sha512-8bXWclixNJZqokvxGHRsG19zehSJiaZaz4dVYlhXhhUctz7gMcNTElHjPBzBdZlKKvt9aFDndmXN1VVE53Co8g==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "0.0.1", + "buffer-from": "1.1.0", + "clone-buffer": "1.0.0", + "double-ended-queue": "2.1.0-0", + "fetch-cookie": "0.7.0", + "immediate": "3.0.6", + "inherits": "2.0.3", + "level": "5.0.1", + "level-codec": "9.0.1", + "level-write-stream": "1.0.0", + "leveldown": "5.0.2", + "levelup": "4.0.2", + "ltgt": "2.2.1", + "node-fetch": "2.4.1", + "readable-stream": "1.0.33", + "spark-md5": "3.0.0", + "through2": "3.0.1", + "uuid": "3.2.1", + "vuvuzela": "1.0.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz", + "integrity": "sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q==", + "dev": true, + "optional": true, + "requires": { + "level-concat-iterator": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true, + "optional": true + }, + "deferred-leveldown": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.0.1.tgz", + "integrity": "sha512-BXohsvTedWOLkj2n/TY+yqVlrCWa2Zs8LSxh3uCAgFOru7/pjxKyZAexGa1j83BaKloER4PqUyQ9rGPJLt9bqA==", + "dev": true, + "optional": true, + "requires": { + "abstract-leveldown": "~6.0.0", + "inherits": "^2.0.3" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true, + "optional": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "level-codec": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.1.tgz", + "integrity": "sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q==", + "dev": true, + "optional": true + }, + "levelup": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.0.2.tgz", + "integrity": "sha512-cx9PmLENwbGA3svWBEbeO2HazpOSOYSXH4VA+ahVpYyurvD+SDSfURl29VBY2qgyk+Vfy2dJd71SBRckj/EZVA==", + "dev": true, + "optional": true, + "requires": { + "deferred-leveldown": "~5.0.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "xtend": "~4.0.0" + } + }, + "node-fetch": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.4.1.tgz", + "integrity": "sha512-P9UbpFK87NyqBZzUuDBDz4f6Yiys8xm8j7ACDbi6usvFm6KItklQUKjeoqTrYS/S1k6I8oaOC2YLLDr/gg26Mw==", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "integrity": "sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "2 || 3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true, + "optional": true + } + } + }, + "pouchdb-abstract-mapreduce": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.2.2.tgz", + "integrity": "sha512-7HWN/2yV2JkwMnGnlp84lGvFtnm0Q55NiBUdbBcaT810+clCGKvhssBCrXnmwShD1SXTwT83aszsgiSfW+SnBA==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-binary-utils": "7.2.2", + "pouchdb-collate": "7.2.2", + "pouchdb-collections": "7.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-fetch": "7.2.2", + "pouchdb-mapreduce-utils": "7.2.2", + "pouchdb-md5": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "pouchdb-adapter-leveldb-core": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-adapter-leveldb-core/-/pouchdb-adapter-leveldb-core-7.2.2.tgz", + "integrity": "sha512-K9UGf1Ivwe87mjrMqN+1D07tO/DfU7ariVDrGffuOjvl+3BcvUF25IWrxsBObd4iPOYCH7NVQWRpojhBgxULtQ==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "0.0.1", + "buffer-from": "1.1.1", + "double-ended-queue": "2.1.0-0", + "levelup": "4.4.0", + "pouchdb-adapter-utils": "7.2.2", + "pouchdb-binary-utils": "7.2.2", + "pouchdb-collections": "7.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-json": "7.2.2", + "pouchdb-md5": "7.2.2", + "pouchdb-merge": "7.2.2", + "pouchdb-utils": "7.2.2", + "sublevel-pouchdb": "7.2.2", + "through2": "3.0.2" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "pouchdb-adapter-memory": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-adapter-memory/-/pouchdb-adapter-memory-7.2.2.tgz", + "integrity": "sha512-9o+zdItPEq7rIrxdkUxgsLNaZkDJAGEqqoYgeYdrHidOCZnlhxhX3g7/R/HcpDKC513iEPqJWDJQSfeT6nVKkw==", + "dev": true, + "optional": true, + "requires": { + "memdown": "1.4.1", + "pouchdb-adapter-leveldb-core": "7.2.2", + "pouchdb-utils": "7.2.2" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dev": true, + "optional": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "optional": true, + "requires": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + } + } + } + }, + "pouchdb-adapter-node-websql": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-adapter-node-websql/-/pouchdb-adapter-node-websql-7.0.0.tgz", + "integrity": "sha512-fNaOMO8bvMrRTSfmH4RSLSpgnKahRcCA7Z0jg732PwRbGvvMdGbreZwvKPPD1fg2tm2ZwwiXWK2G3+oXyoqZYw==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-adapter-websql-core": "7.0.0", + "pouchdb-utils": "7.0.0", + "websql": "1.0.0" + }, + "dependencies": { + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true, + "optional": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + }, + "pouchdb-binary-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.0.0.tgz", + "integrity": "sha512-yUktdOPIPvOVouCjJN3uop+bCcpdPwePrLm9eUAZNgEYnUFu0njdx7Q0WRsZ7UJ6l75HinL5ZHk4bnvEt86FLw==", + "dev": true, + "optional": true, + "requires": { + "buffer-from": "1.1.0" + } + }, + "pouchdb-collections": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.0.0.tgz", + "integrity": "sha512-DaoUr/vU24Q3gM6ghj0va9j/oBanPwkbhkvnqSyC3Dm5dgf5pculNxueLF9PKMo3ycApoWzHMh6N2N8KJbDU2Q==", + "dev": true, + "optional": true + }, + "pouchdb-errors": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.0.0.tgz", + "integrity": "sha512-dTusY8nnTw4HIztCrNl7AoGgwvS1bVf/3/97hDaGc4ytn72V9/4dK8kTqlimi3UpaurohYRnqac0SGXYP8vgXA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "2.0.3" + } + }, + "pouchdb-md5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.0.0.tgz", + "integrity": "sha512-yaSJKhLA3QlgloKUQeb2hLdT3KmUmPfoYdryfwHZuPTpXIRKTnMQTR9qCIRUszc0ruBpDe53DRslCgNUhAyTNQ==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-binary-utils": "7.0.0", + "spark-md5": "3.0.0" + } + }, + "pouchdb-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.0.0.tgz", + "integrity": "sha512-1bnoX1KdZYHv9wicDIFdO0PLiVIMzNDUBUZ/yOJZ+6LW6niQCB8aCv09ZztmKfSQcU5nnN3fe656tScBgP6dOQ==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "0.0.1", + "clone-buffer": "1.0.0", + "immediate": "3.0.6", + "inherits": "2.0.3", + "pouchdb-collections": "7.0.0", + "pouchdb-errors": "7.0.0", + "pouchdb-md5": "7.0.0", + "uuid": "3.2.1" + } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true, + "optional": true + } + } + }, + "pouchdb-adapter-utils": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.2.2.tgz", + "integrity": "sha512-2CzZkTyTyHZkr3ePiWFMTiD5+56lnembMjaTl8ohwegM0+hYhRyJux0biAZafVxgIL4gnCUC4w2xf6WVztzKdg==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-binary-utils": "7.2.2", + "pouchdb-collections": "7.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-md5": "7.2.2", + "pouchdb-merge": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "pouchdb-adapter-websql-core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-adapter-websql-core/-/pouchdb-adapter-websql-core-7.0.0.tgz", + "integrity": "sha512-NyMaH0bl20SdJdOCzd+fwXo8JZ15a48/MAwMcIbXzsRHE4DjFNlRcWAcjUP6uN4Ezc+Gx+r2tkBBMf71mIz1Aw==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-adapter-utils": "7.0.0", + "pouchdb-binary-utils": "7.0.0", + "pouchdb-collections": "7.0.0", + "pouchdb-errors": "7.0.0", + "pouchdb-json": "7.0.0", + "pouchdb-merge": "7.0.0", + "pouchdb-utils": "7.0.0" + }, + "dependencies": { + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true, + "optional": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + }, + "pouchdb-adapter-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.0.0.tgz", + "integrity": "sha512-UWKPC6jkz6mHUzZefrU7P5X8ZGvBC8LSNZ7BIp0hWvJE6c20cnpDwedTVDpZORcCbVJpDmFOHBYnOqEIblPtbA==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-binary-utils": "7.0.0", + "pouchdb-collections": "7.0.0", + "pouchdb-errors": "7.0.0", + "pouchdb-md5": "7.0.0", + "pouchdb-merge": "7.0.0", + "pouchdb-utils": "7.0.0" + } + }, + "pouchdb-binary-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.0.0.tgz", + "integrity": "sha512-yUktdOPIPvOVouCjJN3uop+bCcpdPwePrLm9eUAZNgEYnUFu0njdx7Q0WRsZ7UJ6l75HinL5ZHk4bnvEt86FLw==", + "dev": true, + "optional": true, + "requires": { + "buffer-from": "1.1.0" + } + }, + "pouchdb-collections": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.0.0.tgz", + "integrity": "sha512-DaoUr/vU24Q3gM6ghj0va9j/oBanPwkbhkvnqSyC3Dm5dgf5pculNxueLF9PKMo3ycApoWzHMh6N2N8KJbDU2Q==", + "dev": true, + "optional": true + }, + "pouchdb-errors": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.0.0.tgz", + "integrity": "sha512-dTusY8nnTw4HIztCrNl7AoGgwvS1bVf/3/97hDaGc4ytn72V9/4dK8kTqlimi3UpaurohYRnqac0SGXYP8vgXA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "2.0.3" + } + }, + "pouchdb-json": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-json/-/pouchdb-json-7.0.0.tgz", + "integrity": "sha512-w0bNRu/7VmmCrFWMYAm62n30wvJJUT2SokyzeTyj3hRohj4GFwTRg1mSZ+iAmxgRKOFE8nzZstLG/WAB4Ymjew==", + "dev": true, + "optional": true, + "requires": { + "vuvuzela": "1.0.3" + } + }, + "pouchdb-md5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.0.0.tgz", + "integrity": "sha512-yaSJKhLA3QlgloKUQeb2hLdT3KmUmPfoYdryfwHZuPTpXIRKTnMQTR9qCIRUszc0ruBpDe53DRslCgNUhAyTNQ==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-binary-utils": "7.0.0", + "spark-md5": "3.0.0" + } + }, + "pouchdb-merge": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-merge/-/pouchdb-merge-7.0.0.tgz", + "integrity": "sha512-tci5u6NpznQhGcPv4ho1h0miky9rs+ds/T9zQ9meQeDZbUojXNaX1Jxsb0uYEQQ+HMqdcQs3Akdl0/u0mgwPGg==", + "dev": true, + "optional": true + }, + "pouchdb-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.0.0.tgz", + "integrity": "sha512-1bnoX1KdZYHv9wicDIFdO0PLiVIMzNDUBUZ/yOJZ+6LW6niQCB8aCv09ZztmKfSQcU5nnN3fe656tScBgP6dOQ==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "0.0.1", + "clone-buffer": "1.0.0", + "immediate": "3.0.6", + "inherits": "2.0.3", + "pouchdb-collections": "7.0.0", + "pouchdb-errors": "7.0.0", + "pouchdb-md5": "7.0.0", + "uuid": "3.2.1" + } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true, + "optional": true + } + } + }, + "pouchdb-binary-utils": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.2.2.tgz", + "integrity": "sha512-shacxlmyHbUrNfE6FGYpfyAJx7Q0m91lDdEAaPoKZM3SzAmbtB1i+OaDNtYFztXjJl16yeudkDb3xOeokVL3Qw==", + "dev": true, + "optional": true, + "requires": { + "buffer-from": "1.1.1" + } + }, + "pouchdb-collate": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-collate/-/pouchdb-collate-7.2.2.tgz", + "integrity": "sha512-/SMY9GGasslknivWlCVwXMRMnQ8myKHs4WryQ5535nq1Wj/ehpqWloMwxEQGvZE1Sda3LOm7/5HwLTcB8Our+w==", + "dev": true, + "optional": true + }, + "pouchdb-collections": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.2.2.tgz", + "integrity": "sha512-6O9zyAYlp3UdtfneiMYuOCWdUCQNo2bgdjvNsMSacQX+3g8WvIoFQCYJjZZCpTttQGb+MHeRMr8m2U95lhJTew==", + "dev": true, + "optional": true + }, + "pouchdb-debug": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/pouchdb-debug/-/pouchdb-debug-7.2.1.tgz", + "integrity": "sha512-eP3ht/AKavLF2RjTzBM6S9gaI2/apcW6xvaKRQhEdOfiANqerFuksFqHCal3aikVQuDO+cB/cw+a4RyJn/glBw==", + "dev": true, + "optional": true, + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "pouchdb-errors": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.2.2.tgz", + "integrity": "sha512-6GQsiWc+7uPfgEHeavG+7wuzH3JZW29Dnrvz8eVbDFE50kVFxNDVm3EkYHskvo5isG7/IkOx7PV7RPTA3keG3g==", + "dev": true, + "optional": true, + "requires": { + "inherits": "2.0.4" + } + }, + "pouchdb-fetch": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-fetch/-/pouchdb-fetch-7.2.2.tgz", + "integrity": "sha512-lUHmaG6U3zjdMkh8Vob9GvEiRGwJfXKE02aZfjiVQgew+9SLkuOxNw3y2q4d1B6mBd273y1k2Lm0IAziRNxQnA==", + "dev": true, + "optional": true, + "requires": { + "abort-controller": "3.0.0", + "fetch-cookie": "0.10.1", + "node-fetch": "2.6.0" + }, + "dependencies": { + "fetch-cookie": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.10.1.tgz", + "integrity": "sha512-beB+VEd4cNeVG1PY+ee74+PkuCQnik78pgLi5Ah/7qdUfov8IctU0vLUbBT8/10Ma5GMBeI4wtxhGrEfKNYs2g==", + "dev": true, + "optional": true, + "requires": { + "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true, + "optional": true + } + } + }, + "pouchdb-find": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-find/-/pouchdb-find-7.2.2.tgz", + "integrity": "sha512-BmFeFVQ0kHmDehvJxNZl9OmIztCjPlZlVSdpijuFbk/Fi1EFPU1BAv3kLC+6DhZuOqU/BCoaUBY9sn66pPY2ag==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-abstract-mapreduce": "7.2.2", + "pouchdb-collate": "7.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-fetch": "7.2.2", + "pouchdb-md5": "7.2.2", + "pouchdb-selector-core": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "pouchdb-json": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-json/-/pouchdb-json-7.2.2.tgz", + "integrity": "sha512-3b2S2ynN+aoB7aCNyDZc/4c0IAdx/ir3nsHB+/RrKE9cM3QkQYbnnE3r/RvOD1Xvr6ji/KOCBie+Pz/6sxoaug==", + "dev": true, + "optional": true, + "requires": { + "vuvuzela": "1.0.3" + } + }, + "pouchdb-mapreduce-utils": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-mapreduce-utils/-/pouchdb-mapreduce-utils-7.2.2.tgz", + "integrity": "sha512-rAllb73hIkU8rU2LJNbzlcj91KuulpwQu804/F6xF3fhZKC/4JQMClahk+N/+VATkpmLxp1zWmvmgdlwVU4HtQ==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "0.0.1", + "inherits": "2.0.4", + "pouchdb-collections": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "pouchdb-md5": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.2.2.tgz", + "integrity": "sha512-c/RvLp2oSh8PLAWU5vFBnp6ejJABIdKqboZwRRUrWcfGDf+oyX8RgmJFlYlzMMOh4XQLUT1IoaDV8cwlsuryZw==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-binary-utils": "7.2.2", + "spark-md5": "3.0.1" + }, + "dependencies": { + "spark-md5": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.1.tgz", + "integrity": "sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig==", + "dev": true, + "optional": true + } + } + }, + "pouchdb-merge": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-merge/-/pouchdb-merge-7.2.2.tgz", + "integrity": "sha512-6yzKJfjIchBaS7Tusuk8280WJdESzFfQ0sb4jeMUNnrqs4Cx3b0DIEOYTRRD9EJDM+je7D3AZZ4AT0tFw8gb4A==", + "dev": true, + "optional": true + }, + "pouchdb-selector-core": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-selector-core/-/pouchdb-selector-core-7.2.2.tgz", + "integrity": "sha512-XYKCNv9oiNmSXV5+CgR9pkEkTFqxQGWplnVhO3W9P154H08lU0ZoNH02+uf+NjZ2kjse7Q1fxV4r401LEcGMMg==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-collate": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "pouchdb-utils": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.2.2.tgz", + "integrity": "sha512-XmeM5ioB4KCfyB2MGZXu1Bb2xkElNwF1qG+zVFbQsKQij0zvepdOUfGuWvLRHxTOmt4muIuSOmWZObZa3NOgzQ==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "0.0.1", + "clone-buffer": "1.0.0", + "immediate": "3.3.0", + "inherits": "2.0.4", + "pouchdb-collections": "7.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-md5": "7.2.2", + "uuid": "8.1.0" + }, + "dependencies": { + "uuid": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", + "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==", + "dev": true, + "optional": true + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true, + "optional": true + }, + "prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "prettier-plugin-solidity": { + "version": "1.0.0-beta.13", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.13.tgz", + "integrity": "sha512-AWMDRSabpNQMX7EqdDKgx/UVtQY6e3/Iu4gSPYDGvgiWl+OY8kYhAMll2NZHK/X+F0YYpPHYpebkDh7MGxbB1g==", + "dev": true, + "requires": { + "@solidity-parser/parser": "^0.13.2", + "emoji-regex": "^9.2.2", + "escape-string-regexp": "^4.0.0", + "semver": "^7.3.5", + "solidity-comments-extractor": "^0.0.7", + "string-width": "^4.2.2" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.13.2.tgz", + "integrity": "sha512-RwHnpRnfrnD2MSPveYoPh8nhofEvX7fgjHk1Oq+NNvCcLx4r1js91CO9o+F/F3fBzOCyvm8kKRTriFICX/odWw==", + "dev": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "optional": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "dev": true, + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "15.12.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.1.tgz", + "integrity": "sha512-zyxJM8I1c9q5sRMtVF+zdd13Jt6RU4r4qfhTd7lQubyThvLfx6yYekWSQjGCGV2Tkecgxnlpl/DNlb6Hg+dmEw==", + "dev": true, + "optional": true + } + } + }, + "protocol-buffers-schema": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz", + "integrity": "sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw==", + "dev": true, + "optional": true + }, + "protons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protons/-/protons-2.0.1.tgz", + "integrity": "sha512-FlmPorLEeCEDPu+uIn0Qardgiy5XqVA4IyNTz9wb9c0e2U7BEXdRcIbx64r09o4Abtf+4B7mkTtMbsIXMxZzKw==", + "dev": true, + "optional": true, + "requires": { + "protocol-buffers-schema": "^3.3.1", + "signed-varint": "^2.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.0" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pure-rand": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-4.2.0.tgz", + "integrity": "sha512-d2IwZpSFSLGWmjThAdMECofl07uOMqmuIHqH8mRY7h7Hl2jY5ZJZ9fx9dEBIKkKyk4jmEvS0vnpdFUtzPi3Ctg==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "optional": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + } + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "optional": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "receptacle": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz", + "integrity": "sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "dev": true, + "requires": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + }, + "redux-cli-logger": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/redux-cli-logger/-/redux-cli-logger-2.1.0.tgz", + "integrity": "sha512-75mVsggAJRSykWy2qxdGI7osocDWvc3RCMeN93hlvS/FxgdRww12NaXslez+W6gBOrSJKO7W16V0IzuISSfCxg==", + "dev": true, + "requires": { + "colors": "^1.1.2" + } + }, + "redux-devtools-core": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz", + "integrity": "sha512-RAGOxtUFdr/1USAvxrWd+Gq/Euzgw7quCZlO5TgFpDfG7rB5tMhZUrNyBjpzgzL2yMk0eHnPYIGm7NkIfRzHxQ==", + "dev": true, + "requires": { + "get-params": "^0.1.2", + "jsan": "^3.1.13", + "lodash": "^4.17.11", + "nanoid": "^2.0.0", + "remotedev-serialize": "^0.1.8" + } + }, + "redux-devtools-instrument": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.10.0.tgz", + "integrity": "sha512-X8JRBCzX2ADSMp+iiV7YQ8uoTNyEm0VPFPd4T854coz6lvRiBrFSqAr9YAS2n8Kzxx8CJQotR0QF9wsMM+3DvA==", + "dev": true, + "requires": { + "lodash": "^4.17.19", + "symbol-observable": "^1.2.0" + } + }, + "redux-saga": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.0.0.tgz", + "integrity": "sha512-GvJWs/SzMvEQgeaw6sRMXnS2FghlvEGsHiEtTLpJqc/FHF3I5EE/B+Hq5lyHZ8LSoT2r/X/46uWvkdCnK9WgHA==", + "dev": true, + "requires": { + "@redux-saga/core": "^1.0.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "optional": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "relay-compiler": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-10.1.0.tgz", + "integrity": "sha512-HPqc3N3tNgEgUH5+lTr5lnLbgnsZMt+MRiyS0uAVNhuPY2It0X1ZJG+9qdA3L9IqKFUNwVn6zTO7RArjMZbARQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/runtime": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "chalk": "^4.0.0", + "fb-watchman": "^2.0.0", + "fbjs": "^3.0.0", + "glob": "^7.1.1", + "immutable": "~3.7.6", + "nullthrows": "^1.1.1", + "relay-runtime": "10.1.0", + "signedsource": "^1.0.0", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "optional": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "relay-runtime": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-10.1.0.tgz", + "integrity": "sha512-bxznLnQ1ST6APN/cFi7l0FpjbZVchWQjjhj9mAuJBuUqNNCh9uV+UTRhpQF7Q8ycsPp19LHTpVyGhYb0ustuRQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/runtime": "^7.0.0", + "fbjs": "^3.0.0" + } + }, + "remote-redux-devtools": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/remote-redux-devtools/-/remote-redux-devtools-0.5.16.tgz", + "integrity": "sha512-xZ2D1VRIWzat5nsvcraT6fKEX9Cfi+HbQBCwzNnUAM8Uicm/anOc60XGalcaDPrVmLug7nhDl2nimEa3bL3K9w==", + "dev": true, + "requires": { + "jsan": "^3.1.13", + "querystring": "^0.2.0", + "redux-devtools-core": "^0.2.1", + "redux-devtools-instrument": "^1.9.4", + "rn-host-detect": "^1.1.5", + "socketcluster-client": "^14.2.1" + } + }, + "remotedev-serialize": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.9.tgz", + "integrity": "sha512-5tFdZg9mSaAWTv6xmQ7HtHjKMLSFQFExEZOtJe10PLsv1wb7cy7kYHtBvTYRro27/3fRGEcQBRNKSaixOpb69w==", + "dev": true, + "requires": { + "jsan": "^3.1.13" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true, + "optional": true + }, + "renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "dev": true, + "requires": { + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" + }, + "req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha1-1AgrTURZgDZkD7c93qAe1T20nrw=", + "dev": true, + "requires": { + "req-from": "^2.0.0" + } + }, + "req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "requires": { + "throttleit": "^1.0.0" + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==", + "dev": true + }, + "reselect-tree": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/reselect-tree/-/reselect-tree-1.3.4.tgz", + "integrity": "sha512-1OgNq1IStyJFqIqOoD3k3Ge4SsYCMP9W88VQOfvgyLniVKLfvbYO1Vrl92SyEK5021MkoBX6tWb381VxTDyPBQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "esdoc": "^1.0.4", + "json-pointer": "^0.6.0", + "reselect": "^4.0.0", + "source-map-support": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "reset": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/reset/-/reset-0.1.0.tgz", + "integrity": "sha1-n8cxQXGZWubLC35YsGznUir0uvs=", + "dev": true, + "optional": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retimer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/retimer/-/retimer-2.0.0.tgz", + "integrity": "sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==", + "dev": true, + "optional": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "optional": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "dev": true, + "requires": { + "bn.js": "^4.11.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "rn-host-detect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.2.0.tgz", + "integrity": "sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==", + "dev": true + }, + "rpc-websockets": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-5.3.1.tgz", + "integrity": "sha512-rIxEl1BbXRlIA9ON7EmY/2GUM7RLMy8zrUPTiLPFiYnYOz0I3PXfCmDDrge5vt4pW4oIcAXBDvgZuJ1jlY5+VA==", + "dev": true, + "optional": true, + "requires": { + "@babel/runtime": "^7.8.7", + "assert-args": "^1.2.1", + "babel-runtime": "^6.26.0", + "circular-json": "^0.5.9", + "eventemitter3": "^3.1.2", + "uuid": "^3.4.0", + "ws": "^5.2.2" + }, + "dependencies": { + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true, + "optional": true + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "optional": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "run": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/run/-/run-1.4.0.tgz", + "integrity": "sha1-4X2ekEOrL+F3dsspnhI3848LT/o=", + "dev": true, + "optional": true, + "requires": { + "minimatch": "*" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", + "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "sc-channel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sc-channel/-/sc-channel-1.2.0.tgz", + "integrity": "sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + } + } + }, + "sc-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sc-errors/-/sc-errors-2.0.1.tgz", + "integrity": "sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==", + "dev": true + }, + "sc-formatter": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sc-formatter/-/sc-formatter-3.0.2.tgz", + "integrity": "sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==", + "dev": true + }, + "sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "scrypt-async": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/scrypt-async/-/scrypt-async-2.0.1.tgz", + "integrity": "sha512-wHR032jldwZNy7Tzrfu7RccOgGf8r5hyDMSP2uV6DpLiBUsR8JsDcx/in73o2UGVVrH5ivRFdNsFPcjtl3LErQ==", + "dev": true, + "optional": true + }, + "scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true + }, + "secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", + "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", + "dev": true, + "requires": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true, + "optional": true + }, + "semaphore-async-await": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", + "integrity": "sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz", + "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "dev": true, + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=", + "dev": true, + "requires": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "signed-varint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", + "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", + "dev": true, + "optional": true, + "requires": { + "varint": "~5.0.0" + } + }, + "signedsource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", + "integrity": "sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=", + "dev": true, + "optional": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "dev": true, + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socketcluster-client": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.1.tgz", + "integrity": "sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "clone": "2.1.1", + "component-emitter": "1.2.1", + "linked-list": "0.1.0", + "querystring": "0.2.0", + "sc-channel": "^1.2.0", + "sc-errors": "^2.0.1", + "sc-formatter": "^3.0.1", + "uuid": "3.2.1", + "ws": "7.1.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "ws": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", + "integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", + "dev": true, + "requires": { + "async-limiter": "^1.0.0" + } + } + } + }, + "sol2uml": { + "version": "1.1.25", + "resolved": "https://registry.npmjs.org/sol2uml/-/sol2uml-1.1.25.tgz", + "integrity": "sha512-p1UcPGQ49Kh7KAGgtonjunTL086iaA9hr8QfgmTQXJbqe3ztGsshGaemzASkWANI1FXvIDGlAYEvFxc6gQa+ng==", + "requires": { + "@solidity-parser/parser": "^0.10.2", + "axios": "^0.21.1", + "commander": "^3.0.2", + "debug": "^4.3.1", + "js-graph-algorithms": "^1.0.18", + "klaw": "^3.0.0", + "svg-to-png": "^4.0.0", + "verror": "^1.10.0", + "viz.js": "^1.8.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "dev": true, + "requires": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "solhint": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.6.tgz", + "integrity": "sha512-HWUxTAv2h7hx3s3hAab3ifnlwb02ZWhwFU/wSudUHqteMS3ll9c+m1FlGn9V8ztE2rf3Z82fQZA005Wv7KpcFA==", + "dev": true, + "requires": { + "@solidity-parser/parser": "^0.13.2", + "ajv": "^6.6.1", + "antlr4": "4.7.1", + "ast-parents": "0.0.1", + "chalk": "^2.4.2", + "commander": "2.18.0", + "cosmiconfig": "^5.0.7", + "eslint": "^5.6.0", + "fast-diff": "^1.1.2", + "glob": "^7.1.3", + "ignore": "^4.0.6", + "js-yaml": "^3.12.0", + "lodash": "^4.17.11", + "prettier": "^1.14.3", + "semver": "^6.3.0" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.13.2.tgz", + "integrity": "sha512-RwHnpRnfrnD2MSPveYoPh8nhofEvX7fgjHk1Oq+NNvCcLx4r1js91CO9o+F/F3fBzOCyvm8kKRTriFICX/odWw==", + "dev": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "commander": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", + "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "solhint-plugin-prettier": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.4.tgz", + "integrity": "sha512-JVxh8ZkD4ydb0EndbNcstpFU+vWzUvX3jr9z6u72+Srg/zjD8JQ1tIMjMn0H1PnsNLItZqPZ6RYIPJB6HOsVMg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "solidity-comments-extractor": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", + "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", + "dev": true + }, + "solidity-coverage": { + "version": "0.7.16", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.16.tgz", + "integrity": "sha512-ttBOStywE6ZOTJmmABSg4b8pwwZfYKG8zxu40Nz+sRF5bQX7JULXWj/XbX0KXps3Fsp8CJXg8P29rH3W54ipxw==", + "dev": true, + "requires": { + "@solidity-parser/parser": "^0.12.0", + "@truffle/provider": "^0.2.24", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "fs-extra": "^8.1.0", + "ganache-cli": "^6.11.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@solidity-parser/parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.12.2.tgz", + "integrity": "sha512-d7VS7PxgMosm5NyaiyDJRNID5pK4AWj1l64Dbz0147hJgy5k2C0/ZiKK/9u5c5K+HRUVHmp+RMvGEjGh84oA5Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "solparse": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.8.tgz", + "integrity": "sha512-Tm6hdfG72DOxD40SD+T5ddbekWglNWjzDRSNq7ZDIOHVsyaJSeeunUuWNj4DE7uDrJK3tGQuX0ZTDZWNYsGPMA==", + "dev": true, + "requires": { + "mocha": "^4.0.1", + "pegjs": "^0.10.0", + "yargs": "^10.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "spark-md5": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.0.tgz", + "integrity": "sha1-NyIifFTi+vJLHcbZM8wUTm9xv+8=", + "dev": true, + "optional": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "optional": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "optional": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "optional": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true, + "optional": true + }, + "spinnies": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/spinnies/-/spinnies-0.5.1.tgz", + "integrity": "sha512-WpjSXv9NQz0nU3yCT9TFEOfpFrXADY9C5fG6eAJqixLhvTX1jP3w92Y8IE5oafIe42nlF9otjhllnXN/QCaB3A==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^3.0.0", + "strip-ansi": "^5.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "optional": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "optional": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "optional": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "optional": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "optional": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sqlite3": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz", + "integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.11.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true, + "optional": true + }, + "stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dev": true, + "requires": { + "type-fest": "^0.7.1" + }, + "dependencies": { + "type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "optional": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "stream-to-it": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.3.tgz", + "integrity": "sha512-xaK9EjPtLox5rrC7YLSBXSanTtUJN/lzJlMFvy9VaROmnyvy0U/X6m2uMhXPJRn3g3M9uOSIzTszW7BPiWSg9w==", + "dev": true, + "optional": true, + "requires": { + "get-iterator": "^1.0.2" + } + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "dev": true, + "optional": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "optional": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "optional": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "sublevel-pouchdb": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/sublevel-pouchdb/-/sublevel-pouchdb-7.2.2.tgz", + "integrity": "sha512-y5uYgwKDgXVyPZceTDGWsSFAhpSddY29l9PJbXqMJLfREdPmQTY8InpatohlEfCXX7s1LGcrfYAhxPFZaJOLnQ==", + "dev": true, + "optional": true, + "requires": { + "inherits": "2.0.4", + "level-codec": "9.0.2", + "ltgt": "2.2.1", + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "subscriptions-transport-ws": { + "version": "0.9.18", + "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz", + "integrity": "sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA==", + "dev": true, + "optional": true, + "requires": { + "backo2": "^1.0.2", + "eventemitter3": "^3.1.0", + "iterall": "^1.2.1", + "symbol-observable": "^1.0.4", + "ws": "^5.2.0" + }, + "dependencies": { + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true, + "optional": true + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "optional": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "super-split": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/super-split/-/super-split-1.1.0.tgz", + "integrity": "sha512-I4bA5mgcb6Fw5UJ+EkpzqXfiuvVGS/7MuND+oBxNFmxu3ugLNrdIatzBLfhFRMVMLxgSsRy+TjIktgkF9RFSNQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-to-png": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svg-to-png/-/svg-to-png-4.0.0.tgz", + "integrity": "sha512-rRZtKkufSiOh9peAA8Sn/+VnrHR0copUi+btLwygoKHJ21lDmMT6AXHrBjqL3rYDXT/81k5pTMJ34UsnjXliiw==", + "requires": { + "imagemin": "^6.0.0", + "phantomjs-prebuilt": "^2.1.7" + } + }, + "swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "dev": true, + "requires": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "swarm-js": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", + "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "symbol": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.2.3.tgz", + "integrity": "sha1-O5hzuKkB5Hxu/iFSajrDcu8ou8c=", + "dev": true, + "optional": true + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "optional": true + }, + "sync-fetch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.3.0.tgz", + "integrity": "sha512-dJp4qg+x4JwSEW1HibAuMi0IIrBI3wuQr2GimmqB7OXR50wmwzfdusG+p39R9w3R6aFtZ2mzvxvWKQ3Bd/vx3g==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.7.0", + "node-fetch": "^2.6.1" + } + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "requires": { + "get-port": "^3.1.0" + } + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "taffydb": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", + "integrity": "sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ=", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dev": true, + "requires": { + "asap": "~2.0.6" + } + } + } + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "optional": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timeout-abort-controller": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz", + "integrity": "sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ==", + "dev": true, + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "retimer": "^2.0.0" + } + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-queue": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.1.tgz", + "integrity": "sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY=", + "dev": true, + "optional": true + }, + "tiny-secp256k1": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", + "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "optional": true + } + } + }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true, + "optional": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "optional": true + }, + "to-json-schema": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/to-json-schema/-/to-json-schema-0.2.5.tgz", + "integrity": "sha512-jP1ievOee8pec3tV9ncxLSS48Bnw7DIybgy112rhMCEhf3K4uyVNZZHr03iQQBzbV5v5Hos+dlZRRyk6YSMNDw==", + "dev": true, + "optional": true, + "requires": { + "lodash.isequal": "^4.5.0", + "lodash.keys": "^4.2.0", + "lodash.merge": "^4.6.2", + "lodash.omit": "^4.5.0", + "lodash.without": "^4.4.0", + "lodash.xor": "^4.5.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true, + "optional": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", + "dev": true + }, + "truffle": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-5.3.9.tgz", + "integrity": "sha512-heKtYqUmYCtMxIn1ho/MgeLMYeoqeUrf0f4J7nQnSrMaPz0L5YXdtYI5UP4fFkc6XKLZWHfvyx/3ccz05OS63Q==", + "dev": true, + "requires": { + "@truffle/db": "^0.5.14", + "@truffle/debugger": "^9.0.1", + "@truffle/preserve-fs": "^0.2.2", + "@truffle/preserve-to-buckets": "^0.2.2", + "@truffle/preserve-to-filecoin": "^0.2.2", + "@truffle/preserve-to-ipfs": "^0.2.2", + "app-module-path": "^2.2.0", + "mocha": "8.1.2", + "original-require": "^1.0.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "mocha": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.2.tgz", + "integrity": "sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.2", + "debug": "4.1.1", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "4.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yargs-unparser": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", + "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "decamelize": "^1.2.0", + "flat": "^4.1.0", + "is-plain-obj": "^1.1.0", + "yargs": "^14.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + } + } + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true + }, + "tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", + "dev": true, + "optional": true + }, + "typescript-compare": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", + "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", + "dev": true, + "requires": { + "typescript-logic": "^0.0.0" + } + }, + "typescript-logic": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", + "dev": true + }, + "typescript-tuple": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", + "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", + "dev": true, + "requires": { + "typescript-compare": "^0.0.2" + } + }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "dev": true, + "optional": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uint8arrays": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-1.1.0.tgz", + "integrity": "sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^3.0.0", + "web-encoding": "^1.0.2" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "optional": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + }, + "dependencies": { + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "optional": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + } + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "optional": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA=", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "optional": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "dev": true, + "requires": { + "upper-case": "^1.1.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=", + "dev": true + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "ursa-optional": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/ursa-optional/-/ursa-optional-0.10.2.tgz", + "integrity": "sha512-TKdwuLboBn7M34RcvVTuQyhvrA8gYKapuVdm0nBP0mnBc7oECOfUQZrY91cefL3/nm64ZyrejSRrhTVdX7NG/A==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.14.2" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "utf-8-validate": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", + "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", + "dev": true, + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", + "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "for-each": "^0.3.3", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.1" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true, + "optional": true + }, + "valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=", + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "optional": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-promise": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.6.tgz", + "integrity": "sha512-9r0wQsWD8z/BxPOvnwbPf05ZvFngXyouE9EKB+5GbYix+BYnAwrIChCUyFIinfbf2FL/U71z+CPpbnmTdxrwBg==", + "dev": true, + "optional": true + }, + "varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "optional": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "dependencies": { + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true, + "optional": true + } + } + }, + "vinyl-fs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.3.tgz", + "integrity": "sha1-PZflYuv91LZpId6nBia4S96dLQc=", + "dev": true, + "optional": true, + "requires": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "^1.5.2", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + } + }, + "viz.js": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.2.tgz", + "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==" + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vue": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.13.tgz", + "integrity": "sha512-O+pAdJkce1ooYS1XyoQtpBQr9An+Oys3w39rkqxukVO3ZD1ilYJkWBGoRuadiQEm2LLJnCL2utV4TMSf52ubjw==", + "dev": true + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-loader": { + "version": "15.9.7", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.7.tgz", + "integrity": "sha512-qzlsbLV1HKEMf19IqCJqdNvFJRCI58WNbS6XbPqK13MrLz65es75w392MSQ5TsARAfIjUw+ATm3vlCXUJSOH9Q==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-router": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", + "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==", + "dev": true + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.13.tgz", + "integrity": "sha512-latKAqpUjCkovB8XppW5gnZbSdYQzkf8pavsMBZYZrQcG6lAnj0EH4Ty7jMwAwFw5Cf4mybKBHlp1UTjnLPOWw==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vuvuzela": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vuvuzela/-/vuvuzela-1.0.3.tgz", + "integrity": "sha1-O+FF5YJxxzylUnndhR8SpoIRSws=", + "dev": true, + "optional": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "optional": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "web-encoding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", + "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", + "dev": true, + "optional": true, + "requires": { + "@zxing/text-encoding": "0.9.0", + "util": "^0.12.3" + } + }, + "web3": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.6.tgz", + "integrity": "sha512-jEpPhnL6GDteifdVh7ulzlPrtVQeA30V9vnki9liYlUvLV82ZM7BNOQJiuzlDePuE+jZETZSP/0G/JlUVt6pOA==", + "dev": true, + "requires": { + "web3-bzz": "1.3.6", + "web3-core": "1.3.6", + "web3-eth": "1.3.6", + "web3-eth-personal": "1.3.6", + "web3-net": "1.3.6", + "web3-shh": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-bzz": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.6.tgz", + "integrity": "sha512-ibHdx1wkseujFejrtY7ZyC0QxQ4ATXjzcNUpaLrvM6AEae8prUiyT/OloG9FWDgFD2CPLwzKwfSQezYQlANNlw==", + "dev": true, + "requires": { + "@types/node": "^12.12.6", + "got": "9.6.0", + "swarm-js": "^0.1.40", + "underscore": "1.12.1" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "web3-core": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.6.tgz", + "integrity": "sha512-gkLDM4T1Sc0T+HZIwxrNrwPg0IfWI0oABSglP2X5ZbBAYVUeEATA0o92LWV8BeF+okvKXLK1Fek/p6axwM/h3Q==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.5", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-requestmanager": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-core-helpers": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.6.tgz", + "integrity": "sha512-nhtjA2ZbkppjlxTSwG0Ttu6FcPkVu1rCN5IFAOVpF/L0SEt+jy+O5l90+cjDq0jAYvlBwUwnbh2mR9hwDEJCNA==", + "dev": true, + "requires": { + "underscore": "1.12.1", + "web3-eth-iban": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-core-method": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.6.tgz", + "integrity": "sha512-RyegqVGxn0cyYW5yzAwkPlsSEynkdPiegd7RxgB4ak1eKk2Cv1q2x4C7D2sZjeeCEF+q6fOkVmo2OZNqS2iQxg==", + "dev": true, + "requires": { + "@ethersproject/transactions": "^5.0.0-beta.135", + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-core-promievent": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.6.tgz", + "integrity": "sha512-Z+QzfyYDTXD5wJmZO5wwnRO8bAAHEItT1XNSPVb4J1CToV/I/SbF7CuF8Uzh2jns0Cm1109o666H7StFFvzVKw==", + "dev": true, + "requires": { + "eventemitter3": "4.0.4" + } + }, + "web3-core-requestmanager": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.6.tgz", + "integrity": "sha512-2rIaeuqeo7QN1Eex7aXP0ZqeteJEPWXYFS/M3r3LXMiV8R4STQBKE+//dnHJXoo2ctzEB5cgd+7NaJM8S3gPyA==", + "dev": true, + "requires": { + "underscore": "1.12.1", + "util": "^0.12.0", + "web3-core-helpers": "1.3.6", + "web3-providers-http": "1.3.6", + "web3-providers-ipc": "1.3.6", + "web3-providers-ws": "1.3.6" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "web3-core-subscriptions": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.6.tgz", + "integrity": "sha512-wi9Z9X5X75OKvxAg42GGIf81ttbNR2TxzkAsp1g+nnp5K8mBwgZvXrIsDuj7Z7gx72Y45mWJADCWjk/2vqNu8g==", + "dev": true, + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "web3-eth": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.6.tgz", + "integrity": "sha512-9+rnywRRpyX3C4hfsAQXPQh6vHh9XzQkgLxo3gyeXfbhbShUoq2gFVuy42vsRs//6JlsKdyZS7Z3hHPHz2wreA==", + "dev": true, + "requires": { + "underscore": "1.12.1", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-eth-abi": "1.3.6", + "web3-eth-accounts": "1.3.6", + "web3-eth-contract": "1.3.6", + "web3-eth-ens": "1.3.6", + "web3-eth-iban": "1.3.6", + "web3-eth-personal": "1.3.6", + "web3-net": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-eth-abi": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.6.tgz", + "integrity": "sha512-Or5cRnZu6WzgScpmbkvC6bfNxR26hqiKK4i8sMPFeTUABQcb/FU3pBj7huBLYbp9dH+P5W79D2MqwbWwjj9DoQ==", + "dev": true, + "requires": { + "@ethersproject/abi": "5.0.7", + "underscore": "1.12.1", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-eth-accounts": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.6.tgz", + "integrity": "sha512-Ilr0hG6ONbCdSlVKffasCmNwftD5HsNpwyQASevocIQwHdTlvlwO0tb3oGYuajbKOaDzNTwXfz25bttAEoFCGA==", + "dev": true, + "requires": { + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "scrypt-js": "^3.0.1", + "underscore": "1.12.1", + "uuid": "3.3.2", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-eth-contract": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.6.tgz", + "integrity": "sha512-8gDaRrLF2HCg+YEZN1ov0zN35vmtPnGf3h1DxmJQK5Wm2lRMLomz9rsWsuvig3UJMHqZAQKD7tOl3ocJocQsmA==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.5", + "underscore": "1.12.1", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-eth-abi": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-eth-ens": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.6.tgz", + "integrity": "sha512-n27HNj7lpSkRxTgSx+Zo7cmKAgyg2ElFilaFlUu/X2CNH23lXfcPm2bWssivH9z0ndhg0OyR4AYFZqPaqDHkJA==", + "dev": true, + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "underscore": "1.12.1", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-eth-abi": "1.3.6", + "web3-eth-contract": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-eth-iban": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.6.tgz", + "integrity": "sha512-nfMQaaLA/zsg5W4Oy/EJQbs8rSs1vBAX6b/35xzjYoutXlpHMQadujDx2RerTKhSHqFXSJeQAfE+2f6mdhYkRQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-eth-personal": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.6.tgz", + "integrity": "sha512-pOHU0+/h1RFRYoh1ehYBehRbcKWP4OSzd4F7mDljhHngv6W8ewMHrAN8O1ol9uysN2MuCdRE19qkRg5eNgvzFQ==", + "dev": true, + "requires": { + "@types/node": "^12.12.6", + "web3-core": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-method": "1.3.6", + "web3-net": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-net": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.6.tgz", + "integrity": "sha512-KhzU3wMQY/YYjyMiQzbaLPt2kut88Ncx2iqjy3nw28vRux3gVX0WOCk9EL/KVJBiAA/fK7VklTXvgy9dZnnipw==", + "dev": true, + "requires": { + "web3-core": "1.3.6", + "web3-core-method": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "web3-utils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + } + } + } + }, + "web3-providers-http": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.6.tgz", + "integrity": "sha512-OQkT32O1A06dISIdazpGLveZcOXhEo5cEX6QyiSQkiPk/cjzDrXMw4SKZOGQbbS1+0Vjizm1Hrp7O8Vp2D1M5Q==", + "dev": true, + "requires": { + "web3-core-helpers": "1.3.6", + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.6.tgz", + "integrity": "sha512-+TVsSd2sSVvVgHG4s6FXwwYPPT91boKKcRuEFXqEfAbUC5t52XOgmyc2LNiD9LzPhed65FbV4LqICpeYGUvSwA==", + "dev": true, + "requires": { + "oboe": "2.1.5", + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "web3-providers-ws": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.6.tgz", + "integrity": "sha512-bk7MnJf5or0Re2zKyhR3L3CjGululLCHXx4vlbc/drnaTARUVvi559OI5uLytc/1k5HKUUyENAxLvetz2G1dnQ==", + "dev": true, + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.12.1", + "web3-core-helpers": "1.3.6", + "websocket": "^1.0.32" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "web3-shh": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.6.tgz", + "integrity": "sha512-9zRo415O0iBslxBnmu9OzYjNErzLnzOsy+IOvSpIreLYbbAw0XkDWxv3SfcpKnTIWIACBR4AYMIxmmyi5iB3jw==", + "dev": true, + "requires": { + "web3-core": "1.3.6", + "web3-core-method": "1.3.6", + "web3-core-subscriptions": "1.3.6", + "web3-net": "1.3.6" + } + }, + "web3-utils": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.9.tgz", + "integrity": "sha512-9hcpuis3n/LxFzEVjwnVgvJzTirS2S9/MiNAa7l4WOEoywY+BSNwnRX4MuHnjkh9NY25B6QOjuNG6FNnSjTw1w==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } + } + }, + "webidl-conversions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz", + "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=", + "dev": true, + "optional": true + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dev": true, + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + } + }, + "websql": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/websql/-/websql-1.0.0.tgz", + "integrity": "sha512-7iZ+u28Ljw5hCnMiq0BCOeSYf0vCFQe/ORY0HgscTiKjQed8WqugpBUggJ2NTnB9fahn1kEnPRX2jf8Px5PhJw==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "^0.0.1", + "immediate": "^3.2.2", + "noop-fn": "^1.0.0", + "sqlite3": "^4.0.0", + "tiny-queue": "^0.2.1" + } + }, + "whatwg-url-compat": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", + "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=", + "dev": true, + "optional": true, + "requires": { + "tr46": "~0.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + } + } + }, + "wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", + "dev": true, + "optional": true, + "requires": { + "bs58check": "<3.0.0" + } + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true, + "optional": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "write-stream": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/write-stream/-/write-stream-0.4.3.tgz", + "integrity": "sha1-g8yMA0fQr2BXqThitOOuAd5cgcE=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~0.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-0.0.4.tgz", + "integrity": "sha1-8y124/uGM0SlSNeZIwBxc2ZbO40=", + "dev": true, + "optional": true + } + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true, + "optional": true + }, + "xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dev": true, + "requires": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dev": true, + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dev": true, + "requires": { + "xhr-request": "^1.1.0" + } + }, + "xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", + "dev": true, + "requires": { + "cookiejar": "^2.1.1" + } + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true, + "optional": true + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true + }, + "xss": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.9.tgz", + "integrity": "sha512-2t7FahYnGJys6DpHLhajusId7R0Pm2yTmuL0GV9+mV0ZlaLSnb2toBmppATfg5sWIhZQGlsTLoecSzya+l4EAQ==", + "dev": true, + "optional": true, + "requires": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + } + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + }, + "yarn": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.10.tgz", + "integrity": "sha512-IanQGI9RRPAN87VGTF7zs2uxkSyQSrSPsju0COgbsKQOOXr5LtcVPeyXWgwVa0ywG3d8dg6kSYKGBuYK021qeA==" + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", + "dev": true, + "optional": true + }, + "zen-observable-ts": { + "version": "0.8.21", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", + "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^1.9.3", + "zen-observable": "^0.8.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..bd1ac34 --- /dev/null +++ b/package.json @@ -0,0 +1,82 @@ +{ + "name": "origins", + "version": "0.1.0", + "description": "The smart contracts for the Origins Platform", + "keywords": [ + "Origins", + "Launchpad", + "Token Sale" + ], + "author": "Franklin Richards", + "homepage": "https://live.sovryn.app/origins", + "repository": { + "type": "git", + "url": "https://github.com/DistributedCollective/origins" + }, + "bugs": { + "url": "https://github.com/DistributedCollective/origins/issues" + }, + "devDependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.1", + "@nomiclabs/hardhat-ganache": "^2.0.0", + "@nomiclabs/hardhat-truffle5": "^2.0.0", + "@nomiclabs/hardhat-web3": "^2.0.0", + "@openzeppelin/test-helpers": "^0.5.10", + "bignumber.js": "^9.0.0", + "bn.js": "^5.1.2", + "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", + "chai-bn": "^0.2.1", + "chai-string": "^1.5.0", + "coveralls": "^3.1.0", + "decimal.js": "10.2.0", + "dirty-chai": "^2.0.1", + "eslint": "^7.21.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-truffle": "^0.3.1", + "ethereumjs-abi": "^0.6.8", + "ethers": "^5.0.19", + "ganache-core": "^2.10.2", + "hardhat": "^2.0.11", + "hardhat-contract-sizer": "^2.0.2", + "hardhat-deploy": "^0.7.0-beta.46", + "hardhat-docgen": "^1.1.1", + "hardhat-gas-reporter": "^1.0.4", + "hardhat-log-remover": "^2.0.0", + "husky": "^4.3.6", + "prettier": "^2.2.1", + "prettier-plugin-solidity": "^1.0.0-beta.2", + "solhint": "^3.0.0", + "solhint-plugin-prettier": "^0.0.4", + "solidity-coverage": "^0.7.13", + "solparse": "^2.2.8", + "truffle": "^5.1.60" + }, + "scripts": { + "analyze-contracts": "slither .", + "prettier": "npm run prettier-sol && npm run prettier-js", + "prettier-sol": "prettier --write contracts/{**/*,**/**/*,**/**/**/*}.sol", + "prettier-js": "prettier --write tests-js/{*,**/*,**/**/*}.{js,test.js}", + "prettier-check": "npm run prettier-check-sol && npm run prettier-check-js", + "prettier-check-sol": "prettier --check contracts/{**/*,**/**/*,**/**/**/*}.sol", + "prettier-check-js": "prettier --check tests-js/{*,**/*,**/**/*}.{js,test.js}", + "lint": "npm run lint-contracts && npm run lint-js", + "lint-contracts": "solhint contracts/{**/*,**/**/*,**/**/**/*}.sol", + "lint-js": "", + "test": "npx hardhat test", + "coverage": "npx hardhat coverage", + "doc": "yarn run hardhat docgen", + "mocha-test-single": "mocha --timeout 10000 --exit --recursive" + }, + "husky": { + "hooks": { + "pre-commit": "yarn doc && yarn prettier && yarn lint", + "pre-push": "yarn test" + } + }, + "dependencies": { + "phantomjs-prebuilt": "^2.1.16", + "sol2uml": "^1.1.17", + "yarn": "^1.22.10" + } +} From d6b6f262d3142b2ae53b9337ef8a7261009329c8 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:08:52 +0530 Subject: [PATCH 010/112] v0.1 Documentation added --- docs/index.html | 13 +++++++++++++ docs/main.js | 12 ++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 docs/index.html create mode 100644 docs/main.js diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..d36edc0 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,13 @@ + + + + + Hardhat Docgen + + + + + +
+ + diff --git a/docs/main.js b/docs/main.js new file mode 100644 index 0000000..93ecfe7 --- /dev/null +++ b/docs/main.js @@ -0,0 +1,12 @@ +!function(e){var t={};function n(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(t){return e[t]}.bind(null,r));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=10)}([function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";(function(e,n){ +/*! + * Vue.js v2.6.13 + * (c) 2014-2021 Evan You + * Released under the MIT License. + */ +var a=Object.freeze({});function r(e){return null==e}function i(e){return null!=e}function s(e){return!0===e}function o(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function d(e){return null!==e&&"object"==typeof e}var u=Object.prototype.toString;function l(e){return"[object Object]"===u.call(e)}function p(e){return"[object RegExp]"===u.call(e)}function c(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function f(e){return i(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function y(e){return null==e?"":Array.isArray(e)||l(e)&&e.toString===u?JSON.stringify(e,null,2):String(e)}function m(e){var t=parseFloat(e);return isNaN(t)?e:t}function h(e,t){for(var n=Object.create(null),a=e.split(","),r=0;r-1)return e.splice(n,1)}}var T=Object.prototype.hasOwnProperty;function _(e,t){return T.call(e,t)}function w(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var k=/-(\w)/g,x=w((function(e){return e.replace(k,(function(e,t){return t?t.toUpperCase():""}))})),O=w((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),A=/\B([A-Z])/g,C=w((function(e){return e.replace(A,"-$1").toLowerCase()}));var S=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var a=arguments.length;return a?a>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function $(e,t){t=t||0;for(var n=e.length-t,a=new Array(n);n--;)a[n]=e[n+t];return a}function M(e,t){for(var n in t)e[n]=t[n];return e}function R(e){for(var t={},n=0;n0,Q=X&&X.indexOf("edge/")>0,ee=(X&&X.indexOf("android"),X&&/iphone|ipad|ipod|ios/.test(X)||"ios"===G),te=(X&&/chrome\/\d+/.test(X),X&&/phantomjs/.test(X),X&&X.match(/firefox\/(\d+)/)),ne={}.watch,ae=!1;if(K)try{var re={};Object.defineProperty(re,"passive",{get:function(){ae=!0}}),window.addEventListener("test-passive",null,re)}catch(e){}var ie=function(){return void 0===W&&(W=!K&&!J&&void 0!==e&&(e.process&&"server"===e.process.env.VUE_ENV)),W},se=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function oe(e){return"function"==typeof e&&/native code/.test(e.toString())}var de,ue="undefined"!=typeof Symbol&&oe(Symbol)&&"undefined"!=typeof Reflect&&oe(Reflect.ownKeys);de="undefined"!=typeof Set&&oe(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var le=I,pe=0,ce=function(){this.id=pe++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){b(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(i&&!_(r,"default"))s=!1;else if(""===s||s===C(e)){var d=He(String,r.type);(d<0||o0&&(ft((d=e(d,(n||"")+"_"+a))[0])&&ft(l)&&(p[u]=be(l.text+d[0].text),d.shift()),p.push.apply(p,d)):o(d)?ft(l)?p[u]=be(l.text+d):""!==d&&p.push(be(d)):ft(d)&&ft(l)?p[u]=be(l.text+d.text):(s(t._isVList)&&i(d.tag)&&r(d.key)&&i(n)&&(d.key="__vlist"+n+"_"+a+"__"),p.push(d)));return p}(e):void 0}function ft(e){return i(e)&&i(e.text)&&!1===e.isComment}function yt(e,t){if(e){for(var n=Object.create(null),a=ue?Reflect.ownKeys(e):Object.keys(e),r=0;r0,s=e?!!e.$stable:!i,o=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&n&&n!==a&&o===n.$key&&!i&&!n.$hasNormal)return n;for(var d in r={},e)e[d]&&"$"!==d[0]&&(r[d]=bt(t,d,e[d]))}else r={};for(var u in t)u in r||(r[u]=Tt(t,u));return e&&Object.isExtensible(e)&&(e._normalized=r),z(r,"$stable",s),z(r,"$key",o),z(r,"$hasNormal",i),r}function bt(e,t,n){var a=function(){var e=arguments.length?n.apply(null,arguments):n({}),t=(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:ct(e))&&e[0];return e&&(!t||t.isComment&&!vt(t))?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:a,enumerable:!0,configurable:!0}),a}function Tt(e,t){return function(){return e[t]}}function _t(e,t){var n,a,r,s,o;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),a=0,r=e.length;adocument.createEvent("Event").timeStamp&&(pn=function(){return cn.now()})}function fn(){var e,t;for(ln=pn(),dn=!0,an.sort((function(e,t){return e.id-t.id})),un=0;unun&&an[n].id>e.id;)n--;an.splice(n+1,0,e)}else an.push(e);on||(on=!0,rt(fn))}}(this)},mn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||d(e)||this.deep){var t=this.value;if(this.value=e,this.user){var n='callback for watcher "'+this.expression+'"';qe(this.cb,this.vm,[e,t],this.vm,n)}else this.cb.call(this.vm,e,t)}}},mn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},mn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},mn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||b(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:I,set:I};function vn(e,t,n){hn.get=function(){return this[t][n]},hn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,hn)}function gn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},a=e._props={},r=e.$options._propKeys=[];e.$parent&&Oe(!1);var i=function(i){r.push(i);var s=Ne(i,t,n,e);Se(a,i,s),i in e||vn(e,"_props",i)};for(var s in t)i(s);Oe(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?I:S(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;l(t=e._data="function"==typeof t?function(e,t){ye();try{return e.call(t,t)}catch(e){return We(e,t,"data()"),{}}finally{me()}}(t,e):t||{})||(t={});var n=Object.keys(t),a=e.$options.props,r=(e.$options.methods,n.length);for(;r--;){var i=n[r];0,a&&_(a,i)||U(i)||vn(e,"_data",i)}Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),a=ie();for(var r in t){var i=t[r],s="function"==typeof i?i:i.get;0,a||(n[r]=new mn(e,s||I,I,bn)),r in e||Tn(e,r,i)}}(e,t.computed),t.watch&&t.watch!==ne&&function(e,t){for(var n in t){var a=t[n];if(Array.isArray(a))for(var r=0;r-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!p(e)&&e.test(t)}function Mn(e,t){var n=e.cache,a=e.keys,r=e._vnode;for(var i in n){var s=n[i];if(s){var o=s.name;o&&!t(o)&&Rn(n,i,a,r)}}}function Rn(e,t,n,a){var r=e[t];!r||a&&r.tag===a.tag||r.componentInstance.$destroy(),e[t]=null,b(n,t)}!function(e){e.prototype._init=function(e){var t=this;t._uid=xn++,t._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),a=t._parentVnode;n.parent=t.parent,n._parentVnode=a;var r=a.componentOptions;n.propsData=r.propsData,n._parentListeners=r.listeners,n._renderChildren=r.children,n._componentTag=r.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=Fe(On(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Zt(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,r=n&&n.context;e.$slots=mt(t._renderChildren,r),e.$scopedSlots=a,e._c=function(t,n,a,r){return zt(e,t,n,a,r,!1)},e.$createElement=function(t,n,a,r){return zt(e,t,n,a,r,!0)};var i=n&&n.data;Se(e,"$attrs",i&&i.attrs||a,null,!0),Se(e,"$listeners",t._parentListeners||a,null,!0)}(t),nn(t,"beforeCreate"),function(e){var t=yt(e.$options.inject,e);t&&(Oe(!1),Object.keys(t).forEach((function(n){Se(e,n,t[n])})),Oe(!0))}(t),gn(t),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(t),nn(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(An),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=$e,e.prototype.$delete=Me,e.prototype.$watch=function(e,t,n){if(l(t))return kn(this,e,t,n);(n=n||{}).user=!0;var a=new mn(this,e,t,n);if(n.immediate){var r='callback for immediate watcher "'+a.expression+'"';ye(),qe(t,this,[a.value],this,r),me()}return function(){a.teardown()}}}(An),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var a=this;if(Array.isArray(e))for(var r=0,i=e.length;r1?$(n):n;for(var a=$(arguments,1),r='event handler for "'+e+'"',i=0,s=n.length;iparseInt(this.max)&&Rn(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Rn(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){Mn(e,(function(e){return $n(t,e)}))})),this.$watch("exclude",(function(t){Mn(e,(function(e){return!$n(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=Kt(e),n=t&&t.componentOptions;if(n){var a=Sn(n),r=this.include,i=this.exclude;if(r&&(!a||!$n(r,a))||i&&a&&$n(i,a))return t;var s=this.cache,o=this.keys,d=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;s[d]?(t.componentInstance=s[d].componentInstance,b(o,d),o.push(d)):(this.vnodeToCache=t,this.keyToCache=d),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return N}};Object.defineProperty(e,"config",t),e.util={warn:le,extend:M,mergeOptions:Fe,defineReactive:Se},e.set=$e,e.delete=Me,e.nextTick=rt,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),F.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,M(e.options.components,En),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=$(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=Fe(this.options,e),this}}(e),Cn(e),function(e){F.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&l(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(An),Object.defineProperty(An.prototype,"$isServer",{get:ie}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Vt}),An.version="2.6.13";var Dn=h("style,class"),jn=h("input,textarea,option,select,progress"),Vn=function(e,t,n){return"value"===n&&jn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Ln=h("contenteditable,draggable,spellcheck"),Fn=h("events,caret,typing,plaintext-only"),Pn=h("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Nn="http://www.w3.org/1999/xlink",Bn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Un=function(e){return Bn(e)?e.slice(6,e.length):""},zn=function(e){return null==e||!1===e};function Hn(e){for(var t=e.data,n=e,a=e;i(a.componentInstance);)(a=a.componentInstance._vnode)&&a.data&&(t=Wn(a.data,t));for(;i(n=n.parent);)n&&n.data&&(t=Wn(t,n.data));return function(e,t){if(i(e)||i(t))return qn(e,Kn(t));return""}(t.staticClass,t.class)}function Wn(e,t){return{staticClass:qn(e.staticClass,t.staticClass),class:i(e.class)?[e.class,t.class]:t.class}}function qn(e,t){return e?t?e+" "+t:e:t||""}function Kn(e){return Array.isArray(e)?function(e){for(var t,n="",a=0,r=e.length;a-1?ga(e,t,n):Pn(t)?zn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Ln(t)?e.setAttribute(t,function(e,t){return zn(t)||"false"===t?"false":"contenteditable"===e&&Fn(t)?t:"true"}(t,n)):Bn(t)?zn(n)?e.removeAttributeNS(Nn,Un(t)):e.setAttributeNS(Nn,t,n):ga(e,t,n)}function ga(e,t,n){if(zn(n))e.removeAttribute(t);else{if(Z&&!Y&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var a=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",a)};e.addEventListener("input",a),e.__ieph=!0}e.setAttribute(t,n)}}var ba={create:ha,update:ha};function Ta(e,t){var n=t.elm,a=t.data,s=e.data;if(!(r(a.staticClass)&&r(a.class)&&(r(s)||r(s.staticClass)&&r(s.class)))){var o=Hn(t),d=n._transitionClasses;i(d)&&(o=qn(o,Kn(d))),o!==n._prevClass&&(n.setAttribute("class",o),n._prevClass=o)}}var _a,wa,ka,xa,Oa,Aa,Ca={create:Ta,update:Ta},Sa=/[\w).+\-_$\]]/;function $a(e){var t,n,a,r,i,s=!1,o=!1,d=!1,u=!1,l=0,p=0,c=0,f=0;for(a=0;a=0&&" "===(m=e.charAt(y));y--);m&&Sa.test(m)||(u=!0)}}else void 0===r?(f=a+1,r=e.slice(0,a).trim()):h();function h(){(i||(i=[])).push(e.slice(f,a).trim()),f=a+1}if(void 0===r?r=e.slice(0,a).trim():0!==f&&h(),i)for(a=0;a-1?{exp:e.slice(0,xa),key:'"'+e.slice(xa+1)+'"'}:{exp:e,key:null};wa=e,xa=Oa=Aa=0;for(;!qa();)Ka(ka=Wa())?Ga(ka):91===ka&&Ja(ka);return{exp:e.slice(0,Oa),key:e.slice(Oa+1,Aa)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Wa(){return wa.charCodeAt(++xa)}function qa(){return xa>=_a}function Ka(e){return 34===e||39===e}function Ja(e){var t=1;for(Oa=xa;!qa();)if(Ka(e=Wa()))Ga(e);else if(91===e&&t++,93===e&&t--,0===t){Aa=xa;break}}function Ga(e){for(var t=e;!qa()&&(e=Wa())!==t;);}var Xa;function Za(e,t,n){var a=Xa;return function r(){var i=t.apply(null,arguments);null!==i&&er(e,r,n,a)}}var Ya=Xe&&!(te&&Number(te[1])<=53);function Qa(e,t,n,a){if(Ya){var r=ln,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=r||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}Xa.addEventListener(e,t,ae?{capture:n,passive:a}:n)}function er(e,t,n,a){(a||Xa).removeEventListener(e,t._wrapper||t,n)}function tr(e,t){if(!r(e.data.on)||!r(t.data.on)){var n=t.data.on||{},a=e.data.on||{};Xa=t.elm,function(e){if(i(e.__r)){var t=Z?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}i(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),ut(n,a,Qa,er,Za,t.context),Xa=void 0}}var nr,ar={create:tr,update:tr};function rr(e,t){if(!r(e.data.domProps)||!r(t.data.domProps)){var n,a,s=t.elm,o=e.data.domProps||{},d=t.data.domProps||{};for(n in i(d.__ob__)&&(d=t.data.domProps=M({},d)),o)n in d||(s[n]="");for(n in d){if(a=d[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),a===o[n])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if("value"===n&&"PROGRESS"!==s.tagName){s._value=a;var u=r(a)?"":String(a);ir(s,u)&&(s.value=u)}else if("innerHTML"===n&&Xn(s.tagName)&&r(s.innerHTML)){(nr=nr||document.createElement("div")).innerHTML=""+a+"";for(var l=nr.firstChild;s.firstChild;)s.removeChild(s.firstChild);for(;l.firstChild;)s.appendChild(l.firstChild)}else if(a!==o[n])try{s[n]=a}catch(e){}}}}function ir(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,a=e._vModifiers;if(i(a)){if(a.number)return m(n)!==m(t);if(a.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var sr={create:rr,update:rr},or=w((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var a=e.split(n);a.length>1&&(t[a[0].trim()]=a[1].trim())}})),t}));function dr(e){var t=ur(e.style);return e.staticStyle?M(e.staticStyle,t):t}function ur(e){return Array.isArray(e)?R(e):"string"==typeof e?or(e):e}var lr,pr=/^--/,cr=/\s*!important$/,fr=function(e,t,n){if(pr.test(t))e.style.setProperty(t,n);else if(cr.test(n))e.style.setProperty(C(t),n.replace(cr,""),"important");else{var a=mr(t);if(Array.isArray(n))for(var r=0,i=n.length;r-1?t.split(gr).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function Tr(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(gr).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",a=" "+t+" ";n.indexOf(a)>=0;)n=n.replace(a," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function _r(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&M(t,wr(e.name||"v")),M(t,e),t}return"string"==typeof e?wr(e):void 0}}var wr=w((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),kr=K&&!Y,xr="transition",Or="transitionend",Ar="animation",Cr="animationend";kr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(xr="WebkitTransition",Or="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Ar="WebkitAnimation",Cr="webkitAnimationEnd"));var Sr=K?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function $r(e){Sr((function(){Sr(e)}))}function Mr(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),br(e,t))}function Rr(e,t){e._transitionClasses&&b(e._transitionClasses,t),Tr(e,t)}function Ir(e,t,n){var a=Dr(e,t),r=a.type,i=a.timeout,s=a.propCount;if(!r)return n();var o="transition"===r?Or:Cr,d=0,u=function(){e.removeEventListener(o,l),n()},l=function(t){t.target===e&&++d>=s&&u()};setTimeout((function(){d0&&(n="transition",l=s,p=i.length):"animation"===t?u>0&&(n="animation",l=u,p=d.length):p=(n=(l=Math.max(s,u))>0?s>u?"transition":"animation":null)?"transition"===n?i.length:d.length:0,{type:n,timeout:l,propCount:p,hasTransform:"transition"===n&&Er.test(a[xr+"Property"])}}function jr(e,t){for(;e.length1}function Br(e,t){!0!==t.data.show&&Lr(t)}var Ur=function(e){var t,n,a={},d=e.modules,u=e.nodeOps;for(t=0;ty?b(e,r(n[v+1])?null:n[v+1].elm,n,f,v,a):f>v&&_(t,c,y)}(c,h,v,n,l):i(v)?(i(e.text)&&u.setTextContent(c,""),b(c,null,v,0,v.length-1,n)):i(h)?_(h,0,h.length-1):i(e.text)&&u.setTextContent(c,""):e.text!==t.text&&u.setTextContent(c,t.text),i(y)&&i(f=y.hook)&&i(f=f.postpatch)&&f(e,t)}}}function O(e,t,n){if(s(n)&&i(e.parent))e.parent.data.pendingInsert=t;else for(var a=0;a-1,s.selected!==i&&(s.selected=i);else if(j(Kr(s),a))return void(e.selectedIndex!==o&&(e.selectedIndex=o));r||(e.selectedIndex=-1)}}function qr(e,t){return t.every((function(t){return!j(t,e)}))}function Kr(e){return"_value"in e?e._value:e.value}function Jr(e){e.target.composing=!0}function Gr(e){e.target.composing&&(e.target.composing=!1,Xr(e.target,"input"))}function Xr(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Zr(e){return!e.componentInstance||e.data&&e.data.transition?e:Zr(e.componentInstance._vnode)}var Yr={model:zr,show:{bind:function(e,t,n){var a=t.value,r=(n=Zr(n)).data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;a&&r?(n.data.show=!0,Lr(n,(function(){e.style.display=i}))):e.style.display=a?i:"none"},update:function(e,t,n){var a=t.value;!a!=!t.oldValue&&((n=Zr(n)).data&&n.data.transition?(n.data.show=!0,a?Lr(n,(function(){e.style.display=e.__vOriginalDisplay})):Fr(n,(function(){e.style.display="none"}))):e.style.display=a?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,a,r){r||(e.style.display=e.__vOriginalDisplay)}}},Qr={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ei(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?ei(Kt(t.children)):e}function ti(e){var t={},n=e.$options;for(var a in n.propsData)t[a]=e[a];var r=n._parentListeners;for(var i in r)t[x(i)]=r[i];return t}function ni(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var ai=function(e){return e.tag||vt(e)},ri=function(e){return"show"===e.name},ii={name:"transition",props:Qr,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(ai)).length){0;var a=this.mode;0;var r=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return r;var i=ei(r);if(!i)return r;if(this._leaving)return ni(e,r);var s="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?s+"comment":s+i.tag:o(i.key)?0===String(i.key).indexOf(s)?i.key:s+i.key:i.key;var d=(i.data||(i.data={})).transition=ti(this),u=this._vnode,l=ei(u);if(i.data.directives&&i.data.directives.some(ri)&&(i.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(i,l)&&!vt(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var p=l.data.transition=M({},d);if("out-in"===a)return this._leaving=!0,lt(p,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),ni(e,r);if("in-out"===a){if(vt(i))return u;var c,f=function(){c()};lt(d,"afterEnter",f),lt(d,"enterCancelled",f),lt(p,"delayLeave",(function(e){c=e}))}}return r}}},si=M({tag:String,moveClass:String},Qr);function oi(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function di(e){e.data.newPos=e.elm.getBoundingClientRect()}function ui(e){var t=e.data.pos,n=e.data.newPos,a=t.left-n.left,r=t.top-n.top;if(a||r){e.data.moved=!0;var i=e.elm.style;i.transform=i.WebkitTransform="translate("+a+"px,"+r+"px)",i.transitionDuration="0s"}}delete si.mode;var li={Transition:ii,TransitionGroup:{props:si,beforeMount:function(){var e=this,t=this._update;this._update=function(n,a){var r=Qt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,r(),t.call(e,n,a)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),a=this.prevChildren=this.children,r=this.$slots.default||[],i=this.children=[],s=ti(this),o=0;o-1?Qn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Qn[e]=/HTMLUnknownElement/.test(t.toString())},M(An.options.directives,Yr),M(An.options.components,li),An.prototype.__patch__=K?Ur:I,An.prototype.$mount=function(e,t){return function(e,t,n){var a;return e.$el=t,e.$options.render||(e.$options.render=ge),nn(e,"beforeMount"),a=function(){e._update(e._render(),n)},new mn(e,a,I,{before:function(){e._isMounted&&!e._isDestroyed&&nn(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,nn(e,"mounted")),e}(this,e=e&&K?ta(e):void 0,t)},K&&setTimeout((function(){N.devtools&&se&&se.emit("init",An)}),0);var pi=/\{\{((?:.|\r?\n)+?)\}\}/g,ci=/[-.*+?^${}()|[\]\/\\]/g,fi=w((function(e){var t=e[0].replace(ci,"\\$&"),n=e[1].replace(ci,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}));var yi={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Na(e,"class");n&&(e.staticClass=JSON.stringify(n));var a=Pa(e,"class",!1);a&&(e.classBinding=a)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var mi,hi={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Na(e,"style");n&&(e.staticStyle=JSON.stringify(or(n)));var a=Pa(e,"style",!1);a&&(e.styleBinding=a)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},vi=function(e){return(mi=mi||document.createElement("div")).innerHTML=e,mi.textContent},gi=h("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),bi=h("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),Ti=h("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),_i=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,wi=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ki="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+B.source+"]*",xi="((?:"+ki+"\\:)?"+ki+")",Oi=new RegExp("^<"+xi),Ai=/^\s*(\/?)>/,Ci=new RegExp("^<\\/"+xi+"[^>]*>"),Si=/^]+>/i,$i=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Di=/&(?:lt|gt|quot|amp|#39);/g,ji=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Vi=h("pre,textarea",!0),Li=function(e,t){return e&&Vi(e)&&"\n"===t[0]};function Fi(e,t){var n=t?ji:Di;return e.replace(n,(function(e){return Ei[e]}))}var Pi,Ni,Bi,Ui,zi,Hi,Wi,qi,Ki=/^@|^v-on:/,Ji=/^v-|^@|^:|^#/,Gi=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Xi=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Zi=/^\(|\)$/g,Yi=/^\[.*\]$/,Qi=/:(.*)$/,es=/^:|^\.|^v-bind:/,ts=/\.[^.\]]+(?=[^\]]*$)/g,ns=/^v-slot(:|$)|^#/,as=/[\r\n]/,rs=/[ \f\t\r\n]+/g,is=w(vi);function ss(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:fs(t),rawAttrsMap:{},parent:n,children:[]}}function os(e,t){Pi=t.warn||Ra,Hi=t.isPreTag||E,Wi=t.mustUseProp||E,qi=t.getTagNamespace||E;var n=t.isReservedTag||E;(function(e){return!(!(e.component||e.attrsMap[":is"]||e.attrsMap["v-bind:is"])&&(e.attrsMap.is?n(e.attrsMap.is):n(e.tag)))}),Bi=Ia(t.modules,"transformNode"),Ui=Ia(t.modules,"preTransformNode"),zi=Ia(t.modules,"postTransformNode"),Ni=t.delimiters;var a,r,i=[],s=!1!==t.preserveWhitespace,o=t.whitespace,d=!1,u=!1;function l(e){if(p(e),d||e.processed||(e=ds(e,t)),i.length||e===a||a.if&&(e.elseif||e.else)&&ls(a,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)s=e,(o=function(e){for(var t=e.length;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&o.if&&ls(o,{exp:s.elseif,block:s});else{if(e.slotScope){var n=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[n]=e}r.children.push(e),e.parent=r}var s,o;e.children=e.children.filter((function(e){return!e.slotScope})),p(e),e.pre&&(d=!1),Hi(e.tag)&&(u=!1);for(var l=0;l]*>)","i")),c=e.replace(p,(function(e,n,a){return u=a.length,Ri(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),Li(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));d+=e.length-c.length,e=c,A(l,d-u,d)}else{var f=e.indexOf("<");if(0===f){if($i.test(e)){var y=e.indexOf("--\x3e");if(y>=0){t.shouldKeepComment&&t.comment(e.substring(4,y),d,d+y+3),k(y+3);continue}}if(Mi.test(e)){var m=e.indexOf("]>");if(m>=0){k(m+2);continue}}var h=e.match(Si);if(h){k(h[0].length);continue}var v=e.match(Ci);if(v){var g=d;k(v[0].length),A(v[1],g,d);continue}var b=x();if(b){O(b),Li(b.tagName,e)&&k(1);continue}}var T=void 0,_=void 0,w=void 0;if(f>=0){for(_=e.slice(f);!(Ci.test(_)||Oi.test(_)||$i.test(_)||Mi.test(_)||(w=_.indexOf("<",1))<0);)f+=w,_=e.slice(f);T=e.substring(0,f)}f<0&&(T=e),T&&k(T.length),t.chars&&T&&t.chars(T,d-T.length,d)}if(e===n){t.chars&&t.chars(e);break}}function k(t){d+=t,e=e.substring(t)}function x(){var t=e.match(Oi);if(t){var n,a,r={tagName:t[1],attrs:[],start:d};for(k(t[0].length);!(n=e.match(Ai))&&(a=e.match(wi)||e.match(_i));)a.start=d,k(a[0].length),a.end=d,r.attrs.push(a);if(n)return r.unarySlash=n[1],k(n[0].length),r.end=d,r}}function O(e){var n=e.tagName,d=e.unarySlash;i&&("p"===a&&Ti(n)&&A(a),o(n)&&a===n&&A(n));for(var u=s(n)||!!d,l=e.attrs.length,p=new Array(l),c=0;c=0&&r[s].lowerCasedTag!==o;s--);else s=0;if(s>=0){for(var u=r.length-1;u>=s;u--)t.end&&t.end(r[u].tag,n,i);r.length=s,a=s&&r[s-1].tag}else"br"===o?t.start&&t.start(e,[],!0,n,i):"p"===o&&(t.start&&t.start(e,[],!1,n,i),t.end&&t.end(e,n,i))}A()}(e,{warn:Pi,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,n,s,o,p){var c=r&&r.ns||qi(e);Z&&"svg"===c&&(n=function(e){for(var t=[],n=0;nd&&(o.push(i=e.slice(d,r)),s.push(JSON.stringify(i)));var u=$a(a[1].trim());s.push("_s("+u+")"),o.push({"@binding":u}),d=r+a[0].length}return d-1"+("true"===i?":("+t+")":":_q("+t+","+i+")")),Fa(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+i+"):("+s+");if(Array.isArray($$a)){var $$v="+(a?"_n("+r+")":r)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Ha(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Ha(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Ha(t,"$$c")+"}",null,!0)}(e,a,r);else if("input"===i&&"radio"===s)!function(e,t,n){var a=n&&n.number,r=Pa(e,"value")||"null";Ea(e,"checked","_q("+t+","+(r=a?"_n("+r+")":r)+")"),Fa(e,"change",Ha(t,r),null,!0)}(e,a,r);else if("input"===i||"textarea"===i)!function(e,t,n){var a=e.attrsMap.type;0;var r=n||{},i=r.lazy,s=r.number,o=r.trim,d=!i&&"range"!==a,u=i?"change":"range"===a?"__r":"input",l="$event.target.value";o&&(l="$event.target.value.trim()");s&&(l="_n("+l+")");var p=Ha(t,l);d&&(p="if($event.target.composing)return;"+p);Ea(e,"value","("+t+")"),Fa(e,u,p,null,!0),(o||s)&&Fa(e,"blur","$forceUpdate()")}(e,a,r);else{if(!N.isReservedTag(i))return za(e,a,r),!1}return!0},text:function(e,t){t.value&&Ea(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Ea(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:gi,mustUseProp:Vn,canBeLeftOpenTag:bi,isReservedTag:Zn,getTagNamespace:Yn,staticKeys:function(e){return e.reduce((function(e,t){return e.concat(t.staticKeys||[])}),[]).join(",")}(vs)},_s=w((function(e){return h("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))}));function ws(e,t){e&&(gs=_s(t.staticKeys||""),bs=t.isReservedTag||E,function e(t){if(t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||v(e.tag)||!bs(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(gs)))}(t),1===t.type){if(!bs(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,a=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,xs=/\([^)]*?\);*$/,Os=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,As={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Cs={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Ss=function(e){return"if("+e+")return null;"},$s={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Ss("$event.target !== $event.currentTarget"),ctrl:Ss("!$event.ctrlKey"),shift:Ss("!$event.shiftKey"),alt:Ss("!$event.altKey"),meta:Ss("!$event.metaKey"),left:Ss("'button' in $event && $event.button !== 0"),middle:Ss("'button' in $event && $event.button !== 1"),right:Ss("'button' in $event && $event.button !== 2")};function Ms(e,t){var n=t?"nativeOn:":"on:",a="",r="";for(var i in e){var s=Rs(e[i]);e[i]&&e[i].dynamic?r+=i+","+s+",":a+='"'+i+'":'+s+","}return a="{"+a.slice(0,-1)+"}",r?n+"_d("+a+",["+r.slice(0,-1)+"])":n+a}function Rs(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return Rs(e)})).join(",")+"]";var t=Os.test(e.value),n=ks.test(e.value),a=Os.test(e.value.replace(xs,""));if(e.modifiers){var r="",i="",s=[];for(var o in e.modifiers)if($s[o])i+=$s[o],As[o]&&s.push(o);else if("exact"===o){var d=e.modifiers;i+=Ss(["ctrl","shift","alt","meta"].filter((function(e){return!d[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else s.push(o);return s.length&&(r+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Is).join("&&")+")return null;"}(s)),i&&(r+=i),"function($event){"+r+(t?"return "+e.value+".apply(null, arguments)":n?"return ("+e.value+").apply(null, arguments)":a?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(a?"return "+e.value:e.value)+"}"}function Is(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=As[e],a=Cs[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(a)+")"}var Es={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:I},Ds=function(e){this.options=e,this.warn=e.warn||Ra,this.transforms=Ia(e.modules,"transformCode"),this.dataGenFns=Ia(e.modules,"genData"),this.directives=M(M({},Es),e.directives);var t=e.isReservedTag||E;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function js(e,t){var n=new Ds(t);return{render:"with(this){return "+(e?"script"===e.tag?"null":Vs(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Vs(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ls(e,t);if(e.once&&!e.onceProcessed)return Fs(e,t);if(e.for&&!e.forProcessed)return Ns(e,t);if(e.if&&!e.ifProcessed)return Ps(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',a=Hs(e,t),r="_t("+n+(a?",function(){return "+a+"}":""),i=e.attrs||e.dynamicAttrs?Ks((e.attrs||[]).concat(e.dynamicAttrs||[]).map((function(e){return{name:x(e.name),value:e.value,dynamic:e.dynamic}}))):null,s=e.attrsMap["v-bind"];!i&&!s||a||(r+=",null");i&&(r+=","+i);s&&(r+=(i?"":",null")+","+s);return r+")"}(e,t);var n;if(e.component)n=function(e,t,n){var a=t.inlineTemplate?null:Hs(t,n,!0);return"_c("+e+","+Bs(t,n)+(a?","+a:"")+")"}(e.component,e,t);else{var a;(!e.plain||e.pre&&t.maybeComponent(e))&&(a=Bs(e,t));var r=e.inlineTemplate?null:Hs(e,t,!0);n="_c('"+e.tag+"'"+(a?","+a:"")+(r?","+r:"")+")"}for(var i=0;i>>0}(s):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var i=function(e,t){var n=e.children[0];0;if(n&&1===n.type){var a=js(n,t.options);return"inlineTemplate:{render:function(){"+a.render+"},staticRenderFns:["+a.staticRenderFns.map((function(e){return"function(){"+e+"}"})).join(",")+"]}"}}(e,t);i&&(n+=i+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Ks(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Us(e){return 1===e.type&&("slot"===e.tag||e.children.some(Us))}function zs(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ps(e,t,zs,"null");if(e.for&&!e.forProcessed)return Ns(e,t,zs);var a="_empty_"===e.slotScope?"":String(e.slotScope),r="function("+a+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Hs(e,t)||"undefined")+":undefined":Hs(e,t)||"undefined":Vs(e,t))+"}",i=a?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+r+i+"}"}function Hs(e,t,n,a,r){var i=e.children;if(i.length){var s=i[0];if(1===i.length&&s.for&&"template"!==s.tag&&"slot"!==s.tag){var o=n?t.maybeComponent(s)?",1":",0":"";return""+(a||Vs)(s,t)+o}var d=n?function(e,t){for(var n=0,a=0;a':'
',Ys.innerHTML.indexOf(" ")>0}var no=!!K&&to(!1),ao=!!K&&to(!0),ro=w((function(e){var t=ta(e);return t&&t.innerHTML})),io=An.prototype.$mount;An.prototype.$mount=function(e,t){if((e=e&&ta(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var a=n.template;if(a)if("string"==typeof a)"#"===a.charAt(0)&&(a=ro(a));else{if(!a.nodeType)return this;a=a.innerHTML}else e&&(a=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(a){0;var r=eo(a,{outputSourceRange:!1,shouldDecodeNewlines:no,shouldDecodeNewlinesForHref:ao,delimiters:n.delimiters,comments:n.comments},this),i=r.render,s=r.staticRenderFns;n.render=i,n.staticRenderFns=s}}return io.call(this,e,t)},An.compile=eo,t.a=An}).call(this,n(0),n(7).setImmediate)},function(e){e.exports=JSON.parse('{"a":"hardhat-docgen","b":{"type":"git","url":"git+https://github.com/ItsNickBarry/hardhat-docgen.git"}}')},function(e,t,n){var a=n(5);a.__esModule&&(a=a.default),"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals);(0,n(11).default)("0b345cf4",a,!1,{})},function(e,t,n){"use strict";n(3)},function(e,t,n){(t=e.exports=n(6)(!1)).push([e.i,"@import url(https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600;700&display=swap);",""]),t.push([e.i,"\nhtml,\nbody {\n font-family: 'Source Code Pro', monospace;\n}\n",""])},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",a=e[3];if(!a)return n;if(t&&"function"==typeof btoa){var r=(s=a,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(s))))+" */"),i=a.sources.map((function(e){return"/*# sourceURL="+a.sourceRoot+e+" */"}));return[n].concat(i).concat([r]).join("\n")}var s;return[n].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var a={},r=0;r=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(8),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(0))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var a,r,i,s,o,d=1,u={},l=!1,p=e.document,c=Object.getPrototypeOf&&Object.getPrototypeOf(e);c=c&&c.setTimeout?c:e,"[object process]"==={}.toString.call(e.process)?a=function(){var e=f(arguments);return t.nextTick(y(m,e)),e}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){m(e.data)},a=function(){var e=f(arguments);return i.port2.postMessage(e),e}):p&&"onreadystatechange"in p.createElement("script")?(r=p.documentElement,a=function(){var e=f(arguments),t=p.createElement("script");return t.onreadystatechange=function(){m(e),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t),e}):a=function(){var e=f(arguments);return setTimeout(y(m,e),0),e}:(s="setImmediate$"+Math.random()+"$",o=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&m(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",o,!1):e.attachEvent("onmessage",o),a=function(){var t=f(arguments);return e.postMessage(s+t,"*"),t}),c.setImmediate=a,c.clearImmediate=h}function f(e){return u[d]=y.apply(void 0,e),d++}function y(e){var t=[].slice.call(arguments,1);return function(){"function"==typeof e?e.apply(void 0,t):new Function(""+e)()}}function m(e){if(l)setTimeout(y(m,e),0);else{var t=u[e];if(t){l=!0;try{t()}finally{h(e),l=!1}}}}function h(e){delete u[e]}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,n(0),n(9))},function(e,t){var n,a,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function o(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{a="function"==typeof clearTimeout?clearTimeout:s}catch(e){a=s}}();var d,u=[],l=!1,p=-1;function c(){l&&d&&(l=!1,d.length?u=d.concat(u):p=-1,u.length&&f())}function f(){if(!l){var e=o(c);l=!0;for(var t=u.length;t;){for(d=u,u=[];++p1)for(var n=1;n=0&&(t=e.slice(a),e=e.slice(0,a));var r=e.indexOf("?");return r>=0&&(n=e.slice(r+1),e=e.slice(0,r)),{path:e,query:n,hash:t}}(i.path||""),c=t&&t.path||"/",f=u.path?x(u.path,c,n||i.append):c,y=function(e,t,n){void 0===t&&(t={});var a,r=n||p;try{a=r(e||"")}catch(e){a={}}for(var i in t){var s=t[i];a[i]=Array.isArray(s)?s.map(l):l(s)}return a}(u.query,i.query,a&&a.options.parseQuery),m=i.hash||u.hash;return m&&"#"!==m.charAt(0)&&(m="#"+m),{_normalized:!0,path:f,query:y,hash:m}}var W,q=function(){},K={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,a=this.$route,i=n.resolve(this.to,a,this.append),s=i.location,o=i.route,d=i.href,u={},l=n.options.linkActiveClass,p=n.options.linkExactActiveClass,c=null==l?"router-link-active":l,m=null==p?"router-link-exact-active":p,h=null==this.activeClass?c:this.activeClass,v=null==this.exactActiveClass?m:this.exactActiveClass,g=o.redirectedFrom?y(null,H(o.redirectedFrom),null,n):o;u[v]=b(a,g,this.exactPath),u[h]=this.exact||this.exactPath?u[v]:function(e,t){return 0===e.path.replace(f,"/").indexOf(t.path.replace(f,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(a,g);var T=u[v]?this.ariaCurrentValue:null,_=function(e){J(e)&&(t.replace?n.replace(s,q):n.push(s,q))},w={click:J};Array.isArray(this.event)?this.event.forEach((function(e){w[e]=_})):w[this.event]=_;var k={class:u},x=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:d,route:o,navigate:_,isActive:u[h],isExactActive:u[v]});if(x){if(1===x.length)return x[0];if(x.length>1||!x.length)return 0===x.length?e():e("span",{},x)}if("a"===this.tag)k.on=w,k.attrs={href:d,"aria-current":T};else{var O=function e(t){var n;if(t)for(var a=0;a-1&&(o.params[c]=n.params[c]);return o.path=z(l.path,o.params),d(l,o,s)}if(o.path){o.params={};for(var f=0;f=e.length?n():e[r]?t(e[r],(function(){a(r+1)})):a(r+1)};a(0)}var Te={redirected:2,aborted:4,cancelled:8,duplicated:16};function _e(e,t){return ke(e,t,Te.redirected,'Redirected when going from "'+e.fullPath+'" to "'+function(e){if("string"==typeof e)return e;if("path"in e)return e.path;var t={};return xe.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}(t)+'" via a navigation guard.')}function we(e,t){return ke(e,t,Te.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function ke(e,t,n,a){var r=new Error(a);return r._isRouter=!0,r.from=e,r.to=t,r.type=n,r}var xe=["params","query","hash"];function Oe(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function Ae(e,t){return Oe(e)&&e._isRouter&&(null==t||e.type===t)}function Ce(e){return function(t,n,a){var r=!1,i=0,s=null;Se(e,(function(e,t,n,o){if("function"==typeof e&&void 0===e.cid){r=!0,i++;var d,u=Re((function(t){var r;((r=t).__esModule||Me&&"Module"===r[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:W.extend(t),n.components[o]=t,--i<=0&&a()})),l=Re((function(e){var t="Failed to resolve async component "+o+": "+e;s||(s=Oe(e)?e:new Error(t),a(s))}));try{d=e(u,l)}catch(e){l(e)}if(d)if("function"==typeof d.then)d.then(u,l);else{var p=d.component;p&&"function"==typeof p.then&&p.then(u,l)}}})),r||a()}}function Se(e,t){return $e(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function $e(e){return Array.prototype.concat.apply([],e)}var Me="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Re(e){var t=!1;return function(){for(var n=[],a=arguments.length;a--;)n[a]=arguments[a];if(!t)return t=!0,e.apply(this,n)}}var Ie=function(e,t){this.router=e,this.base=function(e){if(!e)if(G){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=h,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Ee(e,t,n,a){var r=Se(e,(function(e,a,r,i){var s=function(e,t){"function"!=typeof e&&(e=W.extend(e));return e.options[t]}(e,t);if(s)return Array.isArray(s)?s.map((function(e){return n(e,a,r,i)})):n(s,a,r,i)}));return $e(a?r.reverse():r)}function De(e,t){if(t)return function(){return e.apply(t,arguments)}}Ie.prototype.listen=function(e){this.cb=e},Ie.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Ie.prototype.onError=function(e){this.errorCbs.push(e)},Ie.prototype.transitionTo=function(e,t,n){var a,r=this;try{a=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var i=this.current;this.confirmTransition(a,(function(){r.updateRoute(a),t&&t(a),r.ensureURL(),r.router.afterHooks.forEach((function(e){e&&e(a,i)})),r.ready||(r.ready=!0,r.readyCbs.forEach((function(e){e(a)})))}),(function(e){n&&n(e),e&&!r.ready&&(Ae(e,Te.redirected)&&i===h||(r.ready=!0,r.readyErrorCbs.forEach((function(t){t(e)}))))}))},Ie.prototype.confirmTransition=function(e,t,n){var a=this,r=this.current;this.pending=e;var i,s,o=function(e){!Ae(e)&&Oe(e)&&(a.errorCbs.length?a.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},d=e.matched.length-1,u=r.matched.length-1;if(b(e,r)&&d===u&&e.matched[d]===r.matched[u])return this.ensureURL(),o(((s=ke(i=r,e,Te.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",s));var l=function(e,t){var n,a=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,a=he&&n;a&&this.listeners.push(se());var r=function(){var n=e.current,r=Ve(e.base);e.current===h&&r===e._startLocation||e.transitionTo(r,(function(e){a&&oe(t,e,n,!0)}))};window.addEventListener("popstate",r),this.listeners.push((function(){window.removeEventListener("popstate",r)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){ve(O(a.base+e.fullPath)),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){ge(O(a.base+e.fullPath)),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Ve(this.base)!==this.current.fullPath){var t=O(this.base+this.current.fullPath);e?ve(t):ge(t)}},t.prototype.getCurrentLocation=function(){return Ve(this.base)},t}(Ie);function Ve(e){var t=window.location.pathname;return e&&0===t.toLowerCase().indexOf(e.toLowerCase())&&(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Le=function(e){function t(t,n,a){e.call(this,t,n),a&&function(e){var t=Ve(e);if(!/^\/#/.test(t))return window.location.replace(O(e+"/#"+t)),!0}(this.base)||Fe()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=he&&t;n&&this.listeners.push(se());var a=function(){var t=e.current;Fe()&&e.transitionTo(Pe(),(function(a){n&&oe(e.router,a,t,!0),he||Ue(a.fullPath)}))},r=he?"popstate":"hashchange";window.addEventListener(r,a),this.listeners.push((function(){window.removeEventListener(r,a)}))}},t.prototype.push=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){Be(e.fullPath),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){Ue(e.fullPath),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Pe()!==t&&(e?Be(t):Ue(t))},t.prototype.getCurrentLocation=function(){return Pe()},t}(Ie);function Fe(){var e=Pe();return"/"===e.charAt(0)||(Ue("/"+e),!1)}function Pe(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Ne(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Be(e){he?ve(Ne(e)):window.location.hash=e}function Ue(e){he?ge(Ne(e)):window.location.replace(Ne(e))}var ze=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index+1).concat(e),a.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var a=this.stack[n];this.confirmTransition(a,(function(){var e=t.current;t.index=n,t.updateRoute(a),t.router.afterHooks.forEach((function(t){t&&t(a,e)}))}),(function(e){Ae(e,Te.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Ie),He=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Y(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!he&&!1!==e.fallback,this.fallback&&(t="hash"),G||(t="abstract"),this.mode=t,t){case"history":this.history=new je(this,e.base);break;case"hash":this.history=new Le(this,e.base,this.fallback);break;case"abstract":this.history=new ze(this,e.base);break;default:0}},We={currentRoute:{configurable:!0}};function qe(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}He.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},We.currentRoute.get=function(){return this.history&&this.history.current},He.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof je||n instanceof Le){var a=function(e){n.setupListeners(),function(e){var a=n.current,r=t.options.scrollBehavior;he&&r&&"fullPath"in e&&oe(t,e,a,!1)}(e)};n.transitionTo(n.getCurrentLocation(),a,a)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},He.prototype.beforeEach=function(e){return qe(this.beforeHooks,e)},He.prototype.beforeResolve=function(e){return qe(this.resolveHooks,e)},He.prototype.afterEach=function(e){return qe(this.afterHooks,e)},He.prototype.onReady=function(e,t){this.history.onReady(e,t)},He.prototype.onError=function(e){this.history.onError(e)},He.prototype.push=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.push(e,t,n)}));this.history.push(e,t,n)},He.prototype.replace=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.replace(e,t,n)}));this.history.replace(e,t,n)},He.prototype.go=function(e){this.history.go(e)},He.prototype.back=function(){this.go(-1)},He.prototype.forward=function(){this.go(1)},He.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},He.prototype.resolve=function(e,t,n){var a=H(e,t=t||this.history.current,n,this),r=this.match(a,t),i=r.redirectedFrom||r.fullPath;return{location:a,route:r,href:function(e,t,n){var a="hash"===n?"#"+t:t;return e?O(e+"/"+a):a}(this.history.base,i,this.mode),normalizedTo:a,resolved:r}},He.prototype.getRoutes=function(){return this.matcher.getRoutes()},He.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},He.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(He.prototype,We),He.install=function e(t){if(!e.installed||W!==t){e.installed=!0,W=t;var n=function(e){return void 0!==e},a=function(e,t){var a=e.$options._parentVnode;n(a)&&n(a=a.data)&&n(a=a.registerRouteInstance)&&a(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,a(this,this)},destroyed:function(){a(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",w),t.component("RouterLink",K);var r=t.config.optionMergeStrategies;r.beforeRouteEnter=r.beforeRouteLeave=r.beforeRouteUpdate=r.created}},He.version="3.5.1",He.isNavigationFailure=Ae,He.NavigationFailureType=Te,He.START_LOCATION=h,G&&window.Vue&&window.Vue.use(He);var Ke=He,Je=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"min-h-screen bg-gray-100 px-4 pt-6"},[t("router-view")],1)};Je._withStripped=!0;n(4);function Ge(e,t,n,a,r,i,s,o){var d,u="function"==typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),a&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),s?(d=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),r&&r.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(s)},u._ssrRegister=d):r&&(d=o?function(){r.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:r),d)if(u.functional){u._injectStyles=d;var l=u.render;u.render=function(e,t){return d.call(t),l(e,t)}}else{var p=u.beforeCreate;u.beforeCreate=p?[].concat(p,d):[d]}return{exports:e,options:u}}var Xe=Ge({},Je,[],!1,null,null,null);Xe.options.__file="node_modules/hardhat-docgen/src/App.vue";var Ze=Xe.exports,Ye=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("HeaderBar"),e._v(" "),n("div",{staticClass:"pb-32"},[n("div",{staticClass:"space-y-4"},[n("span",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.source)+"\n ")]),e._v(" "),n("h1",{staticClass:"text-xl"},[e._v("\n "+e._s(e.json.name)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.title)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.author)+"\n ")]),e._v(" "),n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))])]),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.hasOwnProperty("constructor")?n("Member",{attrs:{json:e.json.constructor}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.receive?n("Member",{attrs:{json:e.json.receive}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.fallback?n("Member",{attrs:{json:e.json.fallback}}):e._e()],1),e._v(" "),e.json.events?n("MemberSet",{attrs:{title:"Events",json:e.json.events}}):e._e(),e._v(" "),e.json.stateVariables?n("MemberSet",{attrs:{title:"State Variables",json:e.json.stateVariables}}):e._e(),e._v(" "),e.json.methods?n("MemberSet",{attrs:{title:"Methods",json:e.json.methods}}):e._e()],1),e._v(" "),n("FooterBar")],1)};Ye._withStripped=!0;var Qe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"bg-gray-100 fixed bottom-0 right-0 w-full border-t border-dashed border-gray-300"},[n("div",{staticClass:"w-full text-center py-2 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("button",{staticClass:"py-1 px-2 text-gray-500",on:{click:function(t){return e.openLink(e.repository)}}},[e._v("\n built with "+e._s(e.name)+"\n ")])])])};Qe._withStripped=!0;var et=n(2),tt=Ge({data:function(){return{repository:et.b,name:et.a}},methods:{openLink(e){window.open(e,"_blank")}}},Qe,[],!1,null,null,null);tt.options.__file="node_modules/hardhat-docgen/src/components/FooterBar.vue";var nt=tt.exports,at=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full border-b border-dashed py-2 border-gray-300"},[t("router-link",{staticClass:"py-2 text-gray-500",attrs:{to:"/"}},[this._v("\n <- Go back\n ")])],1)};at._withStripped=!0;var rt=Ge({},at,[],!1,null,null,null);rt.options.__file="node_modules/hardhat-docgen/src/components/HeaderBar.vue";var it=rt.exports,st=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"border-2 border-gray-400 border-dashed w-full p-2"},[n("h3",{staticClass:"text-lg pb-2 mb-2 border-b-2 border-gray-400 border-dashed"},[e._v("\n "+e._s(e.name)+" "+e._s(e.keywords)+" "+e._s(e.inputSignature)+"\n ")]),e._v(" "),n("div",{staticClass:"space-y-3"},[n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))]),e._v(" "),n("MemberSection",{attrs:{name:"Parameters",items:e.inputs}}),e._v(" "),n("MemberSection",{attrs:{name:"Return Values",items:e.outputs}})],1)])};st._withStripped=!0;var ot=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.items.length>0?n("ul",[n("h4",{staticClass:"text-lg"},[e._v("\n "+e._s(e.name)+"\n ")]),e._v(" "),e._l(e.items,(function(t,a){return n("li",{key:a},[n("span",{staticClass:"bg-gray-300"},[e._v(e._s(t.type))]),e._v(" "),n("b",[e._v(e._s(t.name||"_"+a))]),t.desc?n("span",[e._v(": "),n("i",[e._v(e._s(t.desc))])]):e._e()])}))],2):e._e()};ot._withStripped=!0;var dt=Ge({props:{name:{type:String,default:""},items:{type:Array,default:()=>new Array}}},ot,[],!1,null,null,null);dt.options.__file="node_modules/hardhat-docgen/src/components/MemberSection.vue";var ut=Ge({components:{MemberSection:dt.exports},props:{json:{type:Object,default:()=>new Object}},computed:{name:function(){return this.json.name||this.json.type},keywords:function(){let e=[];return this.json.stateMutability&&e.push(this.json.stateMutability),"true"===this.json.anonymous&&e.push("anonymous"),e.join(" ")},params:function(){return this.json.params||{}},returns:function(){return this.json.returns||{}},inputs:function(){return(this.json.inputs||[]).map(e=>({...e,desc:this.params[e.name]}))},inputSignature:function(){return`(${this.inputs.map(e=>e.type).join(",")})`},outputs:function(){return(this.json.outputs||[]).map((e,t)=>({...e,desc:this.returns[e.name||"_"+t]}))},outputSignature:function(){return`(${this.outputs.map(e=>e.type).join(",")})`}}},st,[],!1,null,null,null);ut.options.__file="node_modules/hardhat-docgen/src/components/Member.vue";var lt=ut.exports,pt=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full mt-8"},[n("h2",{staticClass:"text-lg"},[e._v(e._s(e.title))]),e._v(" "),e._l(Object.keys(e.json),(function(t){return n("Member",{key:t,staticClass:"mt-3",attrs:{json:e.json[t]}})}))],2)};pt._withStripped=!0;var ct=Ge({components:{Member:lt},props:{title:{type:String,default:""},json:{type:Object,default:()=>new Object}}},pt,[],!1,null,null,null);ct.options.__file="node_modules/hardhat-docgen/src/components/MemberSet.vue";var ft=Ge({components:{Member:lt,MemberSet:ct.exports,HeaderBar:it,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}}},Ye,[],!1,null,null,null);ft.options.__file="node_modules/hardhat-docgen/src/components/Contract.vue";var yt=ft.exports,mt=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto pb-32"},[t("Branch",{attrs:{json:this.trees,name:"Sources:"}}),this._v(" "),t("FooterBar",{staticClass:"mt-20"})],1)};mt._withStripped=!0;var ht=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._v("\n "+e._s(e.name)+"\n "),Array.isArray(e.json)?n("div",{staticClass:"pl-5"},e._l(e.json,(function(t,a){return n("div",{key:a},[n("router-link",{attrs:{to:t.source+":"+t.name}},[e._v("\n "+e._s(t.name)+"\n ")])],1)})),0):n("div",{staticClass:"pl-5"},e._l(Object.keys(e.json),(function(t){return n("div",{key:t},[n("Branch",{attrs:{json:e.json[t],name:t}})],1)})),0)])};ht._withStripped=!0;var vt=Ge({name:"Branch",props:{name:{type:String,default:null},json:{type:[Object,Array],default:()=>new Object}}},ht,[],!1,null,null,null);vt.options.__file="node_modules/hardhat-docgen/src/components/Branch.vue";var gt=Ge({components:{Branch:vt.exports,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}},computed:{trees:function(){let e={};for(let t in this.json)t.split(/(?<=\/)/).reduce(function(e,n){if(!n.includes(":"))return e[n]=e[n]||{},e[n];{let[a]=n.split(":");e[a]=e[a]||[],e[a].push(this.json[t])}}.bind(this),e);return e}}},mt,[],!1,null,null,null);gt.options.__file="node_modules/hardhat-docgen/src/components/Index.vue";var bt=gt.exports;a.a.use(Ke);const Tt={"contracts/Interfaces/IERC20.sol:IERC20":{source:"contracts/Interfaces/IERC20.sol",name:"IERC20",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"_owner",type:"address"},{internalType:"address",name:"_spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_spender",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"_who",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_from",type:"address"},{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Interfaces/ILockedFund.sol:ILockedFund":{source:"contracts/Interfaces/ILockedFund.sol",name:"ILockedFund",title:"An interface of Locked Fund Contract.",author:"Franklin Richards - powerhousefrank@protonmail.com",methods:{"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositVested(address,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point)which determines how much will be unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawAndStakeTokensFrom(address)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"}],name:"withdrawAndStakeTokensFrom",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_userAddress:"The address of user tokens will be withdrawn."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Interfaces/IOrigins.sol:IOrigins":{source:"contracts/Interfaces/IOrigins.sol",name:"IOrigins",title:"Interface of the Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com"},"contracts/Interfaces/IVestingLogic.sol:IVestingLogic":{source:"contracts/Interfaces/IVestingLogic.sol",name:"IVestingLogic",notice:"TODO",methods:{"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"stakeTokens(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"The amount of tokens to stake."},notice:"Stakes tokens according to the vesting schedule."},"withdrawTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"}],name:"withdrawTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{receiver:"The receiving address."},notice:"Withdraws unlocked tokens from the staking contract and forwards them to an address specified by the token owner."}}},"contracts/Interfaces/IVestingLogic.sol:VestingStorage":{source:"contracts/Interfaces/IVestingLogic.sol",name:"VestingStorage",title:"Vesting Storage Contract (Incomplete).",notice:"This contract is just the required storage fromm vesting for LockedFund.",methods:{"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Interfaces/IVestingRegistry.sol:IVestingRegistry":{source:"contracts/Interfaces/IVestingRegistry.sol",name:"IVestingRegistry",notice:"TODO",methods:{"createVesting(address,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"}],name:"createVesting",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount to be staked",_cliff:"the cliff in seconds",_duration:"the total duration in seconds",_tokenOwner:"the owner of the tokens"},notice:"creates Vesting contract"},"getVesting(address)":{constant:!0,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"}],name:"getVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",params:{_tokenOwner:"the owner of the tokens"},notice:"returns vesting contract address for the given token owner"},"stakeTokens(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_vesting",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount of tokens to stake",_vesting:"the address of Vesting contract"},notice:"stakes tokens according to the vesting schedule"}}},"contracts/LockedFund.sol:LockedFund":{source:"contracts/LockedFund.sol",name:"LockedFund",title:"A holding contract for Locked Fund.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"This is not the final form of this contract.",notice:"You can use this contract for timed token release from Locked Fund.",constructor:{inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"},{internalType:"address",name:"_token",type:"address"},{internalType:"address",name:"_vestingRegistry",type:"address"},{internalType:"address[]",name:"_admins",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AdminAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_newAdmin",type:"address"}],name:"AdminAdded",type:"event"},"AdminRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_removedAdmin",type:"address"}],name:"AdminRemoved",type:"event"},"TokenStaked(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"TokenStaked",type:"event"},"VestedDeposited(address,address,uint256,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_cliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_duration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"VestedDeposited",type:"event"},"VestingCreated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"}],name:"VestingCreated",type:"event"},"VestingRegistryUpdated(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vestingRegistry",type:"address"}],name:"VestingRegistryUpdated",type:"event"},"WaitedTSUpdated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"WaitedTSUpdated",type:"event"},"Withdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"Withdrawn",type:"event"}},methods:{"INTERVAL()":{constant:!0,inputs:[],name:"INTERVAL",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"_removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"_removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"Internal function to remove an admin."},"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"adminStatus(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"adminStatus",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the admin status."},return:"_status True if admin, False otherwise.",notice:"The function to check is an address is admin or not."},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"cliff(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositVested(address,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point)which determines how much will be unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"duration(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"getCliffAndDuration(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getCliffAndDuration",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address whose cliff and duration has to be found."},return:"The cliff of the user vesting/lock.The duration of the user vesting/lock.",notice:"Function to read the cliff and duration of a user."},"getLockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getLockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the locked balance."},return:"_balance The locked balance of the address `_addr`.",notice:"The function to get the locked balance of a user."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the unlocked balance."},return:"_balance The unlocked balance of the address `_addr`.",notice:"The function to get the unlocked balance of a user."},"getVestingDetails()":{constant:!0,inputs:[],name:"getVestingDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Vesting Registry.",notice:"Function to read the vesting registry."},"getWaitedTS()":{constant:!0,inputs:[],name:"getWaitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The waited timestamp.",notice:"Function to read the waited timestamp."},"getWaitedUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getWaitedUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the waited unlocked balance."},return:"_balance The waited unlocked balance of the address `_addr`.",notice:"The function to get the waited unlocked balance of a user."},"isAdmin(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"isAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"lockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"lockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"token()":{constant:!0,inputs:[],name:"token",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"unlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"unlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"vestedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the vested balance."},return:"_balance The vested balance of the address `_addr`.",notice:"The function to get the vested balance of a user."},"vestedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestingRegistry()":{constant:!0,inputs:[],name:"vestingRegistry",outputs:[{internalType:"contract IVestingRegistry",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"waitedTS()":{constant:!0,inputs:[],name:"waitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"waitedUnlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"waitedUnlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawAndStakeTokensFrom(address)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"}],name:"withdrawAndStakeTokensFrom",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_userAddress:"The address of user tokens will be withdrawn."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Openzeppelin/Address.sol:Address":{source:"contracts/Openzeppelin/Address.sol",name:"Address",details:"Collection of functions related to the address type"},"contracts/Openzeppelin/Context.sol:Context":{source:"contracts/Openzeppelin/Context.sol",name:"Context",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"}},"contracts/Openzeppelin/ERC20.sol:ERC20":{source:"contracts/Openzeppelin/ERC20.sol",name:"ERC20",details:"Implementation of the {IERC20} interface. * This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20Mintable}. * TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. * We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. * Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-allowance}."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-approve}.\t * Requirements:\t * - `spender` cannot be the zero address."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-balanceOf}."},"decreaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically decreases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically increases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-totalSupply}."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transfer}.\t * Requirements:\t * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transferFrom}.\t * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20};\t * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for `sender`'s tokens of at least `amount`."}}},"contracts/Openzeppelin/ERC20Detailed.sol:ERC20Detailed":{source:"contracts/Openzeppelin/ERC20Detailed.sol",name:"ERC20Detailed",details:"Optional functions from the ERC20 standard.",constructor:{inputs:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint8",name:"decimals",type:"uint8"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default.\t * This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Sets `amount` as the allowance of `spender` over the caller's tokens.\t * Returns a boolean value indicating whether the operation succeeded.\t * IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\t * Emits an {Approval} event."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens owned by `account`."},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\t * Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\t * NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the name of the token."},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens in existence."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from the caller's account to `recipient`.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."}}},"contracts/Openzeppelin/IERC20_.sol:IERC20_":{source:"contracts/Openzeppelin/IERC20_.sol",name:"IERC20_",details:"Interface of the ERC20 standard as defined in the EIP. Does not include the optional functions; to access them see {ERC20Detailed}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default.\t * This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Sets `amount` as the allowance of `spender` over the caller's tokens.\t * Returns a boolean value indicating whether the operation succeeded.\t * IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\t * Emits an {Approval} event."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens owned by `account`."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens in existence."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from the caller's account to `recipient`.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."}}},"contracts/Openzeppelin/Ownable.sol:Ownable":{source:"contracts/Openzeppelin/Ownable.sol",name:"Ownable",details:"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. * This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"contracts/Openzeppelin/ReentrancyGuard.sol:ReentrancyGuard":{source:"contracts/Openzeppelin/ReentrancyGuard.sol",name:"ReentrancyGuard",title:"Helps contracts guard against reentrancy attacks.",author:"Remco Bloemen , Eenae ",details:"If you mark a function `nonReentrant`, you should also mark it `external`."},"contracts/Openzeppelin/SafeMath.sol:SafeMath":{source:"contracts/Openzeppelin/SafeMath.sol",name:"SafeMath",details:"Wrappers over Solidity's arithmetic operations with added overflow checks. * Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. * Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always."},"contracts/OriginsAdmin.sol:OriginsAdmin":{source:"contracts/OriginsAdmin.sol",name:"OriginsAdmin",title:"An owner contract with granular access for multiple parties.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"To add a new role, add the corresponding array and mapping, along with add, remove and get functions.",notice:"You can use this contract for creating multiple owners with different access.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsBase.sol:OriginsBase":{source:"contracts/OriginsBase.sol",name:"OriginsBase",title:"A contract for Origins platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"You can use this contract for creating a sale in the Origins Platform.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"},{internalType:"address payable",name:"_depositAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!1,internalType:"address",name:"_depositToken",type:"address"},{indexed:!0,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"addressVerification(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"addressVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tier for which the address has to be verified."},notice:"Function to verify a single address with a single tier."},"buy(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"buy",outputs:[],payable:!0,stateMutability:"payable",type:"function",details:"If deposit type if RBTC, then _amount can be passed as zero.",params:{_amount:"The amount of token (deposit asset) which will be sent for purchasing.",_tierID:"The Tier ID from which the token has to be bought."},notice:"Function to buy tokens from sale based on tier."},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkSaleEnded(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"checkSaleEnded",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"A return of false does not necessary mean the sale is active. It can also be in inactive state.",params:{_tierID:"The Tier whose info is to be read."},return:"True is sale ended, False otherwise.",notice:"Function to check if a tier sale ended or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"createTier(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint8,uint8,uint8,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"createTier",outputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this should be decoupled.",params:{_depositRate:"Contains the rate of the token w.r.t. the depositing asset.",_depositToken:"Contains the deposit token address if the deposit type is Token.",_remainingTokens:"Contains the remaining tokens for sale.",_saleEnd:"Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens.",_saleEndDurationOrTS:"Contains whether end of sale is by Duration or Timestamp.",_saleStartTS:"Contains the timestamp for the sale to start. Before which no user will be able to buy tokens.",_transferType:"Contains the type of token transfer after a user buys to get the tokens.",_unlockedBP:"Contains the unlock amount in Basis Point for Vesting/Lock.",_unlockedTokenWithdrawTS:"Contains the timestamp for the waited unlocked tokens to be withdrawn.",_verificationType:"Contains the method by which verification happens.",_vestOrLockCliff:"Contains the cliff of the vesting/lock for distribution.",_vestOrLockDuration:"Contains the duration of the vesting/lock for distribution."},return:"_tierID The newly created tier ID.",notice:"Function to create a new tier."},"getDepositAddress()":{constant:!0,inputs:[],name:"getDepositAddress",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"If zero is returned, any of the owners can withdraw the raised funds.",return:"The address of the deposit address.",notice:"Function to read the deposit address."},"getLockDetails()":{constant:!0,inputs:[],name:"getLockDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Locked Fund Contract.",notice:"Function to read the locked fund contract address."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getParticipatingWalletCountPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getParticipatingWalletCountPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Total participation of wallets cannot be determined by this. A user can participate on one round and not on other. In the future maybe a count on that can be created.",params:{_tierID:"The tier ID for which the count has to be checked."},return:"The number of wallets who participated in that Tier.",notice:"Function to read participating wallet count per tier."},"getTierCount()":{constant:!0,inputs:[],name:"getTierCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The number of tiers present in the contract.",notice:"Function to read the tier count."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getTokensBoughtByAddressOnTier(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensBoughtByAddressOnTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"The amount of tokens bought by the address.",notice:"Function to read tokens bought by an address on a particular tier."},"getTokensSoldPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensSoldPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The tier ID for which the sold metrics has to be checked."},return:"The amount of tokens sold on that tier.",notice:"Function to read tokens sold per tier."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"isAddressApproved(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"isAddressApproved",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"True is allowed, False otherwise.",notice:"Function to read address which are approved for sale in a tier."},"multipleAddressAndTierVerification(address[],uint256[])":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"multipleAddressAndTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tiers for which the addresses has to be verified."},notice:"Function to verify multiple address with multiple tiers."},"multipleAddressSingleTierVerification(address[],uint256)":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"multipleAddressSingleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tier for which the addresses has to be verified."},notice:"Function to verify multiple address with a single tier."},"readTierPartA(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartA",outputs:[{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_minAmount The minimum amount which can be deposited._maxAmount The maximum amount which can be deposited._remainingTokens Contains the remaining tokens for sale._saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens._saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens._unlockedTokenWithdrawTS Contains the timestamp for the waited unlocked tokens to be withdrawn._unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock._vestOrLockCliff Contains the cliff of the vesting/lock for distribution._vestOrLockDuration Contains the duration of the vesting/lock for distribution._depositRate Contains the rate of the token w.r.t. the depositing asset.",notice:"Function to read a Tier parameter."},"readTierPartB(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartB",outputs:[{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_depositToken Contains the deposit token address if the deposit type is Token._depositType The type of deposit for the particular sale._verificationType Contains the method by which verification happens._saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp._transferType Contains the type of token transfer after a user buys to get the tokens.",notice:"Function to read a Tier parameter."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."},"setDepositAddress(address)":{constant:!1,inputs:[{internalType:"address payable",name:"_depositAddress",type:"address"}],name:"setDepositAddress",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party.",params:{_depositAddress:"The address of deposit address where all the raised fund will go."},notice:"Function to set the deposit address."},"setLockedFund(address)":{constant:!1,inputs:[{internalType:"address",name:"_lockedFund",type:"address"}],name:"setLockedFund",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_lockedFund:"The address of new the Vesting registry."},notice:"Function to set the Locked Fund Contract Address."},"setTierDeposit(uint256,uint256,address,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"setTierDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_depositRate:"The rate is the, asset * rate = token.",_depositToken:"The token for that particular Tier Sale.",_depositType:"The type of deposit for the particular sale.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Deposit Parameters."},"setTierTime(uint256,uint256,uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"setTierTime",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_saleEnd:"The Tier Sale End Duration or Timestamp.",_saleEndDurationOrTS:"The Tier Sale End Type for the Tier.",_saleStartTS:"The Tier Sale Start Timestamp.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Time Parameters."},"setTierTokenAmount(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"setTierTokenAmount",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_remainingTokens:"The maximum number of tokens allowed to be sold in the tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Amount Parameters."},"setTierTokenLimit(uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"setTierTokenLimit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_maxAmount:"The maximum asset amount allowed to participate in that tier.",_minAmount:"The minimum asset amount required to participate in that tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Limit Parameters."},"setTierVerification(uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"setTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_verificationType:"The type of verification for the particular sale."},notice:"Function to set the Tier Verification Method."},"setTierVestOrLock(uint256,uint256,uint256,uint256,uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"setTierVestOrLock",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_transferType:"The Tier Transfer Type for the Tier.",_unlockedBP:"The unlocked token amount in BP.",_unlockedTokenWithdrawTS:"The unlocked token withdraw timestamp.",_vestOrLockCliff:"The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff.",_vestOrLockDuration:"The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration."},notice:"Function to set the Tier Vest/Lock Parameters."},"singleAddressMultipleTierVerification(address,uint256[])":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"singleAddressMultipleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tiers for which the address has to be verified."},notice:"Function to verify a single address with multiple tiers."},"withdrawSaleDeposit()":{constant:!1,inputs:[],name:"withdrawSaleDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this could be made to be accessible only to seller, rather than owner.",notice:"The function used by the admin or deposit address to withdraw the sale proceedings."}}},"contracts/OriginsEvents.sol:OriginsEvents":{source:"contracts/OriginsEvents.sol",name:"OriginsEvents",title:"A contract containing all the events of Origins Base.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"You can use this contract for adding events into Origins Base.",events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!1,internalType:"address",name:"_depositToken",type:"address"},{indexed:!0,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsStorage.sol:OriginsStorage":{source:"contracts/OriginsStorage.sol",name:"OriginsStorage",title:"A storage contract for Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"This plays as the harddisk for the Origins Platform.",events:{"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}}},_t=new Ke({routes:[{path:"/",component:bt,props:()=>({json:Tt})},{path:"*",component:yt,props:e=>({json:Tt[e.path.slice(1)]})}]});new a.a({el:"#app",router:_t,mounted(){document.dispatchEvent(new Event("render-event"))},render:e=>e(Ze)})},function(e,t,n){"use strict";function a(e,t){for(var n=[],a={},r=0;rn.parts.length&&(a.parts.length=n.parts.length)}else{var s=[];for(r=0;r Date: Tue, 15 Jun 2021 11:09:15 +0530 Subject: [PATCH 011/112] Added dummy scripts --- scripts/values/deploy.json | 3 +++ scripts/values/mainnet.json | 4 ++++ scripts/values/testnet.json | 4 ++++ 3 files changed, 11 insertions(+) create mode 100644 scripts/values/deploy.json create mode 100644 scripts/values/mainnet.json create mode 100644 scripts/values/testnet.json diff --git a/scripts/values/deploy.json b/scripts/values/deploy.json new file mode 100644 index 0000000..f73b04a --- /dev/null +++ b/scripts/values/deploy.json @@ -0,0 +1,3 @@ +{ + "DEPLOYMENT_PARAMETERS_HERE": "" +} \ No newline at end of file diff --git a/scripts/values/mainnet.json b/scripts/values/mainnet.json new file mode 100644 index 0000000..c42693a --- /dev/null +++ b/scripts/values/mainnet.json @@ -0,0 +1,4 @@ +{ + "FISH" : "", + "NEW_SALE_NAME": "" +} \ No newline at end of file diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json new file mode 100644 index 0000000..c42693a --- /dev/null +++ b/scripts/values/testnet.json @@ -0,0 +1,4 @@ +{ + "FISH" : "", + "NEW_SALE_NAME": "" +} \ No newline at end of file From 9f45835366b45d895700f649f6ca3f67d7489852 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:09:32 +0530 Subject: [PATCH 012/112] Added dummy test files --- tests/integration/locked.test.js | 0 tests/integration/vesting.test.js | 0 tests/unit-lockedfund/event.test.js | 0 tests/unit-lockedfund/owner.test.js | 0 tests/unit-lockedfund/state.test.js | 0 tests/unit-lockedfund/user.test.js | 0 tests/unit-origins/event.test.js | 0 tests/unit-origins/owner.test.js | 0 tests/unit-origins/state.test.js | 0 tests/unit-origins/user.test.js | 0 tests/unit-origins/whitelister.test.js | 0 11 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/integration/locked.test.js create mode 100644 tests/integration/vesting.test.js create mode 100644 tests/unit-lockedfund/event.test.js create mode 100644 tests/unit-lockedfund/owner.test.js create mode 100644 tests/unit-lockedfund/state.test.js create mode 100644 tests/unit-lockedfund/user.test.js create mode 100644 tests/unit-origins/event.test.js create mode 100644 tests/unit-origins/owner.test.js create mode 100644 tests/unit-origins/state.test.js create mode 100644 tests/unit-origins/user.test.js create mode 100644 tests/unit-origins/whitelister.test.js diff --git a/tests/integration/locked.test.js b/tests/integration/locked.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/vesting.test.js b/tests/integration/vesting.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit-lockedfund/event.test.js b/tests/unit-lockedfund/event.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit-lockedfund/owner.test.js b/tests/unit-lockedfund/owner.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit-lockedfund/state.test.js b/tests/unit-lockedfund/state.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit-lockedfund/user.test.js b/tests/unit-lockedfund/user.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit-origins/event.test.js b/tests/unit-origins/event.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit-origins/owner.test.js b/tests/unit-origins/owner.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit-origins/state.test.js b/tests/unit-origins/state.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit-origins/user.test.js b/tests/unit-origins/user.test.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit-origins/whitelister.test.js b/tests/unit-origins/whitelister.test.js new file mode 100644 index 0000000..e69de29 From 7d1ee7f70f1a8b65f28080c5010c6333d194ef69 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:09:54 +0530 Subject: [PATCH 013/112] Added git attributes --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..52031de --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sol linguist-language=Solidity From 5a1f8d7629cbc693e994f60ecc7b510140cdb975 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:10:31 +0530 Subject: [PATCH 014/112] Added brownie config for scripts --- brownie-config.yaml | 66 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 brownie-config.yaml diff --git a/brownie-config.yaml b/brownie-config.yaml new file mode 100644 index 0000000..b2b79df --- /dev/null +++ b/brownie-config.yaml @@ -0,0 +1,66 @@ +# Brownie configuration file +# https://eth-brownie.readthedocs.io/en/stable/config.html + +project_structure: + build: build + contracts: contracts + interfaces: interfaces + reports: reports + scripts: scripts + tests: tests + +networks: + default: development + development: + gas_limit: 6800000 + gas_price: 65000000 + reverting_tx_gas_limit: 8000000 + default_contract_owner: true + cmd_settings: + port: 8545 + gas_limit: 6800000 + accounts: 10 + evm_version: istanbul + mnemonic: brownie + block_time: 0 + default_balance: 1000000 + #time: 2020-05-08T14:54:08+0000 + live: + cmd_settings: + port: 443 + gas_limit: 6800000 + gas_price: 65000010 # 8000000000 + reverting_tx_gas_limit: false + default_contract_owner: false + +compiler: + evm_version: null + solc: + version: null + optimizer: + enabled: true + runs: 200 + remappings: null + +console: + show_colors: true + color_style: monokai + auto_suggest: true + completions: true + +reports: + exclude_paths: + - contracts/helpers/*.* + exclude_contracts: + - Ownable + - SafeMath + +hypothesis: + deadline: null + max_examples: 50 + report_multiple_bugs: False + stateful_step_count: 10 + +autofetch_sources: false +dependencies: null +dev_deployment_artifacts: false From 9321d62a7ffc674cd6ca2f77b4a3caaa9a82df9f Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:10:56 +0530 Subject: [PATCH 015/112] Added Truffle Config --- truffle-config.js | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 truffle-config.js diff --git a/truffle-config.js b/truffle-config.js new file mode 100644 index 0000000..c78ac8b --- /dev/null +++ b/truffle-config.js @@ -0,0 +1,52 @@ +/* eslint-disable import/no-extraneous-dependencies */ +require("chai") + .use(require("chai-as-promised")) + .use(require("chai-bn")(require("bn.js"))) + .use(require("chai-string")) + .use(require("dirty-chai")) + .expect(); + +const Decimal = require("decimal.js"); +Decimal.set({ precision: 100, rounding: Decimal.ROUND_DOWN, toExpPos: 40 }); + +const ganache = require("ganache-core"); +/* eslint-enable import/no-extraneous-dependencies */ + +module.exports = { + contracts_directory: "./contracts", + contracts_build_directory: "./build/contracts", + test_directory: "./tests", + networks: { + development: { + host: "localhost", + port: 7545, + network_id: "*", + gasPrice: 20000000000, + gas: 6800000, + provider: ganache.provider({ + gasLimit: 6800000, + gasPrice: 20000000000, + default_balance_ether: 10000000000000000000, + }), + }, + }, + plugins: ["solidity-coverage"], + compilers: { + solc: { + version: "0.5.17", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + }, + mocha: { + enableTimeouts: false, + before_timeout: 3600000, + timeout: 1800000, + useColors: true, + reporter: "list", + }, +}; From 3aaf12e24224f9722475b8d6ec442f715c2ac124 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:11:18 +0530 Subject: [PATCH 016/112] Added hardhat for Testing --- hardhat.config.js | 99 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 hardhat.config.js diff --git a/hardhat.config.js b/hardhat.config.js new file mode 100644 index 0000000..74fff45 --- /dev/null +++ b/hardhat.config.js @@ -0,0 +1,99 @@ +const { task } = require("hardhat/config"); + +require("@nomiclabs/hardhat-ganache"); +require("@nomiclabs/hardhat-truffle5"); +require("@nomiclabs/hardhat-ethers"); +require("@nomiclabs/hardhat-web3"); +require("hardhat-contract-sizer"); //yarn run hardhat size-contracts +require("solidity-coverage"); // $ npx hardhat coverage +require("hardhat-log-remover"); +require("hardhat-gas-reporter"); +require('hardhat-docgen'); + +// This is a sample Hardhat task. To learn how to create your own go to +// https://hardhat.org/guides/create-task.html +/// this is for use with ethers.js +task("accounts", "Prints the list of accounts", async () => { + const accounts = await ethers.getSigners(); + + for (const account of accounts.address) { + const wallet = ethers.Wallet.fromMnemonic("test test test test test test test test test test test junk", "m/44'/60'/0'/0"); + + console.log(account); + } +}); + +/*task("accounts", "Prints accounts", async (_, { web3 }) => { + console.log(); + console.log(await web3.eth.getAccounts()); +});*/ + +// You need to export an object to set up your config +// Go to https://hardhat.org/config/ to learn more + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +/**/ + +module.exports = { + solidity: { + version: "0.5.17", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + contractSizer: { + alphaSort: false, + runOnCompile: false, + disambiguatePaths: false, + }, + networks: { + hardhat: {}, + rskPublicTestnet: { + url: "https://public-node.testnet.rsk.co/", + accounts: { mnemonic: "brownie", count: 10 }, + network_id: 31, + confirmations: 4, + gasMultiplier: 1.25, + //timeout: 20000, // increase if needed; 20000 is the default value + //allowUnlimitedContractSize, //EIP170 contrtact size restriction temporal testnet workaround + }, + rskPublicMainnet: { + url: "https://public-node.rsk.co/", + network_id: 30, + //timeout: 20000, // increase if needed; 20000 is the default value + }, + rskSovrynTestnet: { + url: "https://testnet.sovryn.app/rpc", + accounts: { mnemonic: "brownie", count: 10 }, + network_id: 31, + confirmations: 4, + gasMultiplier: 1.25, + //timeout: 20000, // increase if needed; 20000 is the default value + //allowUnlimitedContractSize, //EIP170 contrtact size restriction temporal testnet workaround + }, + rskSovrynMainnet: { + url: "https://mainnet.sovryn.app/rpc", + network_id: 30, + //timeout: 20000, // increase if needed; 20000 is the default value + }, + }, + paths: { + sources: "./contracts", + tests: "./tests", + }, + mocha: { + timeout: 800000, + }, + docgen: { + path: './docs', + clear: true + }, + gasReporter: { + enabled: true + } +}; From db2a67c280c275e33bf8e463e7d7caafe90a7311 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:11:55 +0530 Subject: [PATCH 017/112] Added formatting files --- .eslintrc.js | 15 +++++++++++++++ .prettierignore | 12 ++++++++++++ .prettierrc | 15 +++++++++++++++ .solcover.js | 3 +++ .solhint.json | 8 ++++++++ 5 files changed, 53 insertions(+) create mode 100644 .eslintrc.js create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .solcover.js create mode 100644 .solhint.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..f270456 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + env: { + browser: true, + commonjs: true, + es2021: true, + mocha: true, // for test files + "truffle/globals": true, // same as "truffle/truffle": true + }, + extends: "prettier", + parserOptions: { + ecmaVersion: 2020, + }, + rules: {}, + plugins: ["truffle"], +}; diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..e0bde87 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,12 @@ +__pycache__ +.DS_Store +.history +.hypothesis/ +artifacts/ +build/ +reports/ +node_modules/ +!.solhint.json +package-lock.json +coverage +coverage.json \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..3f375bb --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "overrides": [ + { + "files": ["*.sol", "*.js"], + "options": { + "printWidth": 140, + "tabWidth": 4, + "useTabs": true, + "singleQuote": false, + "bracketSpacing": true, + "explicitTypes": "always" + } + } + ] +} diff --git a/.solcover.js b/.solcover.js new file mode 100644 index 0000000..f64b422 --- /dev/null +++ b/.solcover.js @@ -0,0 +1,3 @@ +module.exports = { + skipFiles: ['helpers', 'openzeppelin'] +}; \ No newline at end of file diff --git a/.solhint.json b/.solhint.json new file mode 100644 index 0000000..ebdadbd --- /dev/null +++ b/.solhint.json @@ -0,0 +1,8 @@ +{ + "extends": "solhint:default", + "plugins": ["prettier"], + "rules": { + "prettier/prettier": "error", + "max-line-length": ["warn",140] + } +} From d540c432c0960a0d7bda3a01f758653797894572 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:12:16 +0530 Subject: [PATCH 018/112] Added Github Workflows --- .github/workflows/node.js.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/node.js.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 0000000..ea9c384 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,28 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x, 14.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - npm: npm run lint + - run: npm run coverage + - run: cat coverage/lcov.info | coveralls From 154b6fade263c145e4673b26b41fd1fcaa25c95b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:12:31 +0530 Subject: [PATCH 019/112] Updated .gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 6704566..037d4da 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,10 @@ dist # TernJS port file .tern-port + +# Custom +cache +build +*.dbg.json +artifacts/build-info +.vscode \ No newline at end of file From 0d2e860c48c6a86939d43c9f49c76132bd612d90 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:12:43 +0530 Subject: [PATCH 020/112] Updated README --- README.md | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 92fb621..85224a5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,87 @@ -# origins +# Origins + The Origins Platform Smart Contracts + +## Main Contracts + +- IOrgins +- OriginsAdmin +- OriginsStorage +- OriginsEvents +- OriginsBase +- ILockedFund +- LockedFund + +### OriginsAdmin + +A basic contract with currently two main roles: +- Owner +- Verifier + +An owner has the right on major decision making functions. The owner has too many rights, including the withdrawal of proceedings, thus it is recommended to use a multisig for the same. + +A Verifier currently has the right to add any address as verified. + +### OriginsStorage + +A contract with all the storage of `OriginsBase`. Basically acts as the harddisk of the system. + +### OriginsEvents + +A contract with all the events of `OriginsBase` listed in it. + +### OriginsBase + +This is the main contract which does all the major works. Each sale is a Tier. And a single contract will be enough to do multiple sales of a unique Token. + +The proceedings of the raised amount could be taken by the owner or a pre-set deposit address. + +Tier creation could be done with a single function call, or can be done by multiple calls. Individual Tier parameters can be edited as well based on Tier ID. + +Verification of participants at the moment can be done by address. And any verifier can add address and tiers for which the address is approved. Verification Type also gives freedom to pass anyone, thus allowing a public sale. + +Sale time is also dependent on two different methods mainly, one is duration (calculated from the start time) or the end timestamp itself. Another method is until supply last as well. + +Deposit asset can be either RBTC or any other ERC20 Compliant Token as well, and it can be unique for each tier also. + +Transfer Type can be None, Unlocked Immediately, Waited Unlock, which means the unlock will happen after a certain period, Locked, which means the tokens will be a linear vesting, and finally Vested, which is tokens vested linearly, but the difference being the voting power in Governance. The current version only support None, Unlocked and Vested for now. + +The contract also keeps track of participating wallets per tier, the number of tokens sold per tier, etc. + +### LockedFund + +Currently it's functionality is limited to vest tokens and withdraw tokens after a certain time period. In the future, it will allow for further features like locked tokens and unlocked tokens, etc. + +For Vesting, it uses the contracts of `Sovryn-smart-contract` repo. The registry used in this case with be `VestingRegistry3`. + +## Explanation + +TODO + +## Deployment + +- TODO +- TODO: Setting `waitedTS` in LockedFund. +- TODO: Setting `OriginsBase` as an admin of LockedFund for calling deposit function. + +### Deployment Parameters + +TODO + +## Assumptions + +- Admin has a lot of power, and is assumed to be the right, fair and just person/party. It is highly advised to have a multisig as admin, rather than just a EOA. + +## Limitations + +- If the deposit asset price is lower than the token which is sold, currently that is not possible with this system. A simple solution is to have a divisor constant or a numerator & denominator system instead of the rate system. +- LockedFund can only have a single cliff and duration per person. Tier based system would be much better when the vesting registry is updated (waiting for a PR to be merged in Sovryn). + +## Improvements + +- NFT Based Sale. +- Decoupling Tier for lesser gas usage and minimize the stack too deep error. +- Fee for use of Origins platform (Contracts, UI and Setup). +- Divide the contract based on Verification Type, Vesting/Locked Type, Deposit by Token or RBTC, etc to make the contract size and interaction gas cost to the minimum without losing the Origins Granularity. This will be a new contract which will be inheriting from OriginsBase, with OriginsBase itself inheriting a unique OriginsStorage based on the granularity. +- Maybe a single contract can act as the platform if instead of different tiers based on ID, the tiers are based on token address (which is to be sold), thus having multiple tiers based on that. So, a single contract can handle multiple sales at once with multiple tiers. This can only be done after struct decoupling and gas profiling of each function and possible gas saving methods added. +- Total unique wallets participated in all tiers. Currently only unique wallets participated in a each tier is counted, which is not the same as unique wallets participated in all tiers combined. New storage structure will be required. From 26e1a5d029a904f4d528be6a41a2d2de219c1193 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:18:18 +0530 Subject: [PATCH 021/112] package.json updated --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index bd1ac34..0d67acf 100644 --- a/package.json +++ b/package.json @@ -56,10 +56,10 @@ "analyze-contracts": "slither .", "prettier": "npm run prettier-sol && npm run prettier-js", "prettier-sol": "prettier --write contracts/{**/*,**/**/*,**/**/**/*}.sol", - "prettier-js": "prettier --write tests-js/{*,**/*,**/**/*}.{js,test.js}", + "prettier-js": "prettier --write tests/{**/*,**/**/*}.{js,test.js}", "prettier-check": "npm run prettier-check-sol && npm run prettier-check-js", "prettier-check-sol": "prettier --check contracts/{**/*,**/**/*,**/**/**/*}.sol", - "prettier-check-js": "prettier --check tests-js/{*,**/*,**/**/*}.{js,test.js}", + "prettier-check-js": "prettier --check tests/{**/*,**/**/*}.{js,test.js}", "lint": "npm run lint-contracts && npm run lint-js", "lint-contracts": "solhint contracts/{**/*,**/**/*,**/**/**/*}.sol", "lint-js": "", From bfa41472f1e25c4658d69ece2bc26865c33ede81 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:18:33 +0530 Subject: [PATCH 022/112] gitignore updated --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 037d4da..f3dbdcd 100644 --- a/.gitignore +++ b/.gitignore @@ -108,4 +108,6 @@ cache build *.dbg.json artifacts/build-info -.vscode \ No newline at end of file +.vscode +coverage +coverage.json \ No newline at end of file From 0574d4d68556ae27ae3fe4928d40e040272c1308 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:18:58 +0530 Subject: [PATCH 023/112] cContracts Formatted --- contracts/Interfaces/ILockedFund.sol | 4 +- contracts/Interfaces/IOrigins.sol | 2 - contracts/Interfaces/IVestingLogic.sol | 10 +- contracts/Interfaces/IVestingRegistry.sol | 13 +- contracts/LockedFund.sol | 19 +- contracts/OriginsAdmin.sol | 22 +- contracts/OriginsBase.sol | 250 +++++++++++++++------- contracts/OriginsEvents.sol | 42 +++- contracts/OriginsStorage.sol | 37 +++- 9 files changed, 273 insertions(+), 126 deletions(-) diff --git a/contracts/Interfaces/ILockedFund.sol b/contracts/Interfaces/ILockedFund.sol index dcade20..f77cb18 100644 --- a/contracts/Interfaces/ILockedFund.sol +++ b/contracts/Interfaces/ILockedFund.sol @@ -5,7 +5,6 @@ pragma solidity ^0.5.17; * @author Franklin Richards - powerhousefrank@protonmail.com */ contract ILockedFund { - /* Functions */ /** @@ -62,7 +61,7 @@ contract ILockedFund { * @dev Only use this function if the `duration` is small. */ function createVestingAndStake() external; - + /** * @notice Creates vesting contract (if it hasn't been created yet) for the calling user. * @return _vestingAddress The New Vesting Contract Created. @@ -86,5 +85,4 @@ contract ILockedFund { * @param _userAddress The address of user tokens will be withdrawn. */ function withdrawAndStakeTokensFrom(address _userAddress) external; - } diff --git a/contracts/Interfaces/IOrigins.sol b/contracts/Interfaces/IOrigins.sol index c44efa8..fd53117 100644 --- a/contracts/Interfaces/IOrigins.sol +++ b/contracts/Interfaces/IOrigins.sol @@ -5,7 +5,5 @@ pragma solidity ^0.5.17; * @author Franklin Richards - powerhousefrank@protonmail.com */ contract IOrigins { - /// TODO - } diff --git a/contracts/Interfaces/IVestingLogic.sol b/contracts/Interfaces/IVestingLogic.sol index 1743a16..7040a63 100644 --- a/contracts/Interfaces/IVestingLogic.sol +++ b/contracts/Interfaces/IVestingLogic.sol @@ -15,21 +15,19 @@ contract VestingStorage { /** * TODO */ -contract IVestingLogic is VestingStorage{ - +contract IVestingLogic is VestingStorage { /* Functions */ /** * @notice Stakes tokens according to the vesting schedule. * @param _amount The amount of tokens to stake. * */ - function stakeTokens(uint256 _amount) public ; + function stakeTokens(uint256 _amount) public; /** * @notice Withdraws unlocked tokens from the staking contract and * forwards them to an address specified by the token owner. * @param receiver The receiving address. * */ - function withdrawTokens(address receiver) public ; - -} \ No newline at end of file + function withdrawTokens(address receiver) public; +} diff --git a/contracts/Interfaces/IVestingRegistry.sol b/contracts/Interfaces/IVestingRegistry.sol index cb4e659..af531a5 100644 --- a/contracts/Interfaces/IVestingRegistry.sol +++ b/contracts/Interfaces/IVestingRegistry.sol @@ -4,7 +4,6 @@ pragma solidity ^0.5.17; * TODO */ contract IVestingRegistry { - /** * @notice creates Vesting contract * @param _tokenOwner the owner of the tokens @@ -12,19 +11,23 @@ contract IVestingRegistry { * @param _cliff the cliff in seconds * @param _duration the total duration in seconds */ - function createVesting(address _tokenOwner, uint256 _amount, uint256 _cliff, uint256 _duration) public ; + function createVesting( + address _tokenOwner, + uint256 _amount, + uint256 _cliff, + uint256 _duration + ) public; /** * @notice stakes tokens according to the vesting schedule * @param _vesting the address of Vesting contract * @param _amount the amount of tokens to stake */ - function stakeTokens(address _vesting, uint256 _amount) public ; + function stakeTokens(address _vesting, uint256 _amount) public; /** * @notice returns vesting contract address for the given token owner * @param _tokenOwner the owner of the tokens */ function getVesting(address _tokenOwner) public view returns (address); - -} \ No newline at end of file +} diff --git a/contracts/LockedFund.sol b/contracts/LockedFund.sol index d9e19e8..2fad1d9 100644 --- a/contracts/LockedFund.sol +++ b/contracts/LockedFund.sol @@ -87,7 +87,14 @@ contract LockedFund is ILockedFund { * @param _duration The duration for vesting. * @param _basisPoint The % (in Basis Point) which determines how much will be unlocked immediately. */ - event VestedDeposited(address indexed _initiator, address indexed _userAddress, uint256 _amount, uint256 _cliff, uint256 _duration, uint256 _basisPoint); + event VestedDeposited( + address indexed _initiator, + address indexed _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint + ); /** * @notice Emitted when a user withdraws the fund. @@ -223,7 +230,7 @@ contract LockedFund is ILockedFund { function createVestingAndStake() external { _createVestingAndStake(msg.sender); } - + /** * @notice Creates vesting contract (if it hasn't been created yet) for the calling user. * @return _vestingAddress The New Vesting Contract Created. @@ -238,7 +245,7 @@ contract LockedFund is ILockedFund { */ function stakeTokens() external { IVestingLogic vesting = IVestingLogic(_getVesting(msg.sender)); - + require(cliff[msg.sender] == vesting.cliff() && duration[msg.sender] == vesting.duration(), "LockedFund: Wrong Vesting Schedule."); _stakeTokens(msg.sender, address(vesting)); @@ -434,7 +441,7 @@ contract LockedFund is ILockedFund { * @notice Function to read the token on sale. * @return The Token contract address which is being sold in the contract. */ - function getToken() public view returns(address) { + function getToken() public view returns (address) { return address(token); } @@ -442,7 +449,7 @@ contract LockedFund is ILockedFund { * @notice Function to read the vesting registry. * @return Address of Vesting Registry. */ - function getVestingDetails() public view returns(address) { + function getVestingDetails() public view returns (address) { return address(vestingRegistry); } @@ -497,7 +504,7 @@ contract LockedFund is ILockedFund { * @return The cliff of the user vesting/lock. * @return The duration of the user vesting/lock. */ - function getCliffAndDuration(address _addr) external view returns(uint256, uint256) { + function getCliffAndDuration(address _addr) external view returns (uint256, uint256) { return (cliff[_addr], duration[_addr]); } } diff --git a/contracts/OriginsAdmin.sol b/contracts/OriginsAdmin.sol index 09f7887..6a6d7b8 100644 --- a/contracts/OriginsAdmin.sol +++ b/contracts/OriginsAdmin.sol @@ -7,14 +7,13 @@ pragma solidity ^0.5.17; * @dev To add a new role, add the corresponding array and mapping, along with add, remove and get functions. */ contract OriginsAdmin { - /* Storage */ - address[] private owners; - address[] private verifiers; + address[] private owners; + address[] private verifiers; - mapping(address => bool) private isOwner; - mapping(address => bool) private isVerifier; + mapping(address => bool) private isOwner; + mapping(address => bool) private isVerifier; /** * @notice In the future new list can be added based on the required limit. * When adding a new list, a new array & mapping has to be created. @@ -145,8 +144,8 @@ contract OriginsAdmin { require(isOwner[_ownerToRemove], "OriginsAdmin: Address is not an owner."); isOwner[_ownerToRemove] = false; uint256 len = owners.length; - for(uint256 index = 0; index < len; index++) { - if(_ownerToRemove == owners[index]) { + for (uint256 index = 0; index < len; index++) { + if (_ownerToRemove == owners[index]) { owners[index] = owners[len - 1]; break; } @@ -177,8 +176,8 @@ contract OriginsAdmin { require(isVerifier[_verifierToRemove], "OriginsAdmin: Address is not a verifier."); isVerifier[_verifierToRemove] = false; uint256 len = verifiers.length; - for(uint256 index = 0; index < len; index++) { - if(_verifierToRemove == verifiers[index]) { + for (uint256 index = 0; index < len; index++) { + if (_verifierToRemove == verifiers[index]) { verifiers[index] = verifiers[len - 1]; break; } @@ -210,7 +209,7 @@ contract OriginsAdmin { /** * @dev Returns the address array of the owners. - * @return The list of owners. + * @return The list of owners. */ function getOwners() public view returns (address[] memory) { return owners; @@ -218,10 +217,9 @@ contract OriginsAdmin { /** * @dev Returns the address array of the verifier. - * @return The list of verifiers. + * @return The list of verifiers. */ function getVerifiers() public view returns (address[] memory) { return verifiers; } - } diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index ff62a9d..ce34c60 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -9,7 +9,6 @@ import "./Interfaces/IOrigins.sol"; * @notice You can use this contract for creating a sale in the Origins Platform. */ contract OriginsBase is IOrigins, OriginsEvents { - /* Functions */ /** @@ -18,7 +17,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _depositAddress The address of deposit address where all the raised fund will go. (Optional) */ constructor(address[] memory _owners, address payable _depositAddress) public OriginsAdmin(_owners) { - if(_depositAddress != address(0)){ + if (_depositAddress != address(0)) { depositAddress = _depositAddress; emit DepositAddressUpdated(msg.sender, address(0), _depositAddress); } @@ -60,7 +59,21 @@ contract OriginsBase is IOrigins, OriginsEvents { * @return _tierID The newly created tier ID. * @dev In the future this should be decoupled. */ - function createTier(uint256 _remainingTokens, uint256 _saleStartTS, uint256 _saleEnd, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _depositRate, address _depositToken, DepositType _depositType, VerificationType _verificationType, SaleEndDurationOrTS _saleEndDurationOrTS, TransferType _transferType) external onlyOwner returns(uint256 _tierID){ + function createTier( + uint256 _remainingTokens, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _unlockedTokenWithdrawTS, + uint256 _unlockedBP, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _depositRate, + address _depositToken, + DepositType _depositType, + VerificationType _verificationType, + SaleEndDurationOrTS _saleEndDurationOrTS, + TransferType _transferType + ) external onlyOwner returns (uint256 _tierID) { /// @notice `tierCount` should always start at 1, because else default value zero will result in verification process. tierCount++; @@ -79,7 +92,7 @@ contract OriginsBase is IOrigins, OriginsEvents { /// @dev This is not set here due to stack too deep error. //_setTierTokenLimit(_tierID, _minAmount, _maxAmount); // @dev Corresponding _minAmount and _maxAmount parameters has been removed. - + /// @notice Tier Token Amount Parameters. _setTierTokenAmount(_tierID, _remainingTokens); @@ -106,7 +119,12 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _depositToken The token for that particular Tier Sale. * @param _depositType The type of deposit for the particular sale. */ - function setTierDeposit(uint256 _tierID, uint256 _depositRate, address _depositToken, DepositType _depositType) external onlyOwner { + function setTierDeposit( + uint256 _tierID, + uint256 _depositRate, + address _depositToken, + DepositType _depositType + ) external onlyOwner { _setTierDeposit(_tierID, _depositRate, _depositToken, _depositType); } @@ -116,7 +134,11 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _minAmount The minimum asset amount required to participate in that tier. * @param _maxAmount The maximum asset amount allowed to participate in that tier. */ - function setTierTokenLimit(uint256 _tierID, uint256 _minAmount, uint256 _maxAmount) external onlyOwner { + function setTierTokenLimit( + uint256 _tierID, + uint256 _minAmount, + uint256 _maxAmount + ) external onlyOwner { _setTierTokenLimit(_tierID, _minAmount, _maxAmount); } @@ -138,7 +160,14 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _unlockedBP The unlocked token amount in BP. * @param _transferType The Tier Transfer Type for the Tier. */ - function setTierVestOrLock(uint256 _tierID, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, TransferType _transferType) external onlyOwner { + function setTierVestOrLock( + uint256 _tierID, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _unlockedTokenWithdrawTS, + uint256 _unlockedBP, + TransferType _transferType + ) external onlyOwner { _setTierVestOrLock(_tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedTokenWithdrawTS, _unlockedBP, _transferType); } @@ -149,7 +178,12 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _saleEnd The Tier Sale End Duration or Timestamp. * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. */ - function setTierTime(uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, SaleEndDurationOrTS _saleEndDurationOrTS) external onlyOwner { + function setTierTime( + uint256 _tierID, + uint256 _saleStartTS, + uint256 _saleEnd, + SaleEndDurationOrTS _saleEndDurationOrTS + ) external onlyOwner { _setTierTime(_tierID, _saleStartTS, _saleEnd, _saleEndDurationOrTS); } @@ -159,7 +193,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _tierID The tier for which the address has to be verified. */ function addressVerification(address _addressToBeVerified, uint256 _tierID) external onlyVerifier { - _addressVerification(_addressToBeVerified, _tierID); + _addressVerification(_addressToBeVerified, _tierID); } /** @@ -258,9 +292,14 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _depositToken The token for that particular Tier Sale. * @param _depositType The type of deposit for the particular sale. */ - function _setTierDeposit(uint256 _tierID, uint256 _depositRate, address _depositToken, DepositType _depositType) internal { + function _setTierDeposit( + uint256 _tierID, + uint256 _depositRate, + address _depositToken, + DepositType _depositType + ) internal { require(_depositRate > 0, "OriginsBase: Deposit Rate cannot be zero."); - if(_depositType == DepositType.Token){ + if (_depositType == DepositType.Token) { require(_depositToken != address(0), "OriginsBase: Deposit Token Address cannot be zero."); } @@ -277,9 +316,13 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _minAmount The minimum asset amount required to participate in that tier. * @param _maxAmount The maximum asset amount allowed to participate in that tier. */ - function _setTierTokenLimit(uint256 _tierID, uint256 _minAmount, uint256 _maxAmount) internal { + function _setTierTokenLimit( + uint256 _tierID, + uint256 _minAmount, + uint256 _maxAmount + ) internal { require(_minAmount <= _maxAmount, "OriginsBase: Min Amount cannot be higher than Max Amount."); - + tiers[_tierID].minAmount = _minAmount; tiers[_tierID].maxAmount = _maxAmount; @@ -290,7 +333,7 @@ contract OriginsBase is IOrigins, OriginsEvents { @notice Internal Function to returns the total remaining tokens in all tier. @return _totalBal The total balance of tokens in all tier. */ - function _getTotalRemainingTokens() internal view returns(uint256 _totalBal) { + function _getTotalRemainingTokens() internal view returns (uint256 _totalBal) { /// @notice Starting with 1 as Tier Count always starts from 1. for (uint256 index = 1; index <= tierCount; index++) { _totalBal = _totalBal.add(tiers[index].remainingTokens); @@ -305,17 +348,19 @@ contract OriginsBase is IOrigins, OriginsEvents { */ function _setTierTokenAmount(uint256 _tierID, uint256 _remainingTokens) internal { require(_remainingTokens > 0, "OriginsBase: Total token to sell should be higher than zero."); - require(tiers[_tierID].maxAmount.mul(tiers[_tierID].depositRate) <= _remainingTokens, "OriginsBase: Max Amount to buy should not be higher than token availability."); - + require( + tiers[_tierID].maxAmount.mul(tiers[_tierID].depositRate) <= _remainingTokens, + "OriginsBase: Max Amount to buy should not be higher than token availability." + ); + uint256 currentBal = token.balanceOf(address(this)); uint256 requiredBal = _getTotalRemainingTokens().add(_remainingTokens).sub(tiers[_tierID].remainingTokens); /// @notice Checking if we have enough token for all tiers. If we have more, then we refund the extra. - if(requiredBal > currentBal){ + if (requiredBal > currentBal) { bool txStatus = token.transferFrom(msg.sender, address(this), requiredBal.sub(currentBal)); require(txStatus, "OriginsBase: Not enough token supplied for Token Distribution."); - } - else{ + } else { bool txStatus = token.transfer(msg.sender, currentBal.sub(requiredBal)); require(txStatus, "OriginsBase: Admin didn't received the tokens correctly."); } @@ -334,7 +379,14 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _unlockedBP The unlocked token amount in BP. * @param _transferType The Tier Transfer Type for the Tier. */ - function _setTierVestOrLock(uint256 _tierID, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, TransferType _transferType) internal { + function _setTierVestOrLock( + uint256 _tierID, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _unlockedTokenWithdrawTS, + uint256 _unlockedBP, + TransferType _transferType + ) internal { /// @notice The below is mainly for TransferType of Vested and Locked, but should not hinder for other types as well. require(_vestOrLockCliff <= _vestOrLockDuration, "OriginsBase: Cliff has to be <= duration."); require(_unlockedBP <= MAX_BASIS_POINT, "OriginsBase: The basis point cannot be higher than 10K."); @@ -346,7 +398,15 @@ contract OriginsBase is IOrigins, OriginsEvents { tiers[_tierID].unlockedBP = _unlockedBP; tiers[_tierID].transferType = _transferType; - emit TierVestOrLockUpdated(msg.sender, _tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedTokenWithdrawTS, _unlockedBP, _transferType); + emit TierVestOrLockUpdated( + msg.sender, + _tierID, + _vestOrLockCliff, + _vestOrLockDuration, + _unlockedTokenWithdrawTS, + _unlockedBP, + _transferType + ); } /** @@ -356,11 +416,15 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _saleEnd The Tier Sale End Duration or Timestamp. * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. */ - function _setTierTime(uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, SaleEndDurationOrTS _saleEndDurationOrTS) internal { - if(_saleStartTS !=0 && _saleEnd != 0 && _saleEndDurationOrTS == SaleEndDurationOrTS.Duration) { + function _setTierTime( + uint256 _tierID, + uint256 _saleStartTS, + uint256 _saleEnd, + SaleEndDurationOrTS _saleEndDurationOrTS + ) internal { + if (_saleStartTS != 0 && _saleEnd != 0 && _saleEndDurationOrTS == SaleEndDurationOrTS.Duration) { require(_saleStartTS.add(_saleEnd) > block.timestamp, "OriginsBase: The sale end duration cannot be past already."); - } - else if((_saleStartTS !=0 || _saleEnd != 0) && _saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp) { + } else if ((_saleStartTS != 0 || _saleEnd != 0) && _saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp) { require(_saleStartTS < _saleEnd, "OriginsBase: The sale start TS cannot be after sale end TS."); require(_saleEnd > block.timestamp, "OriginsBase: The sale end time cannot be past already."); } @@ -392,21 +456,21 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _id The Tier ID whose sale status has to be checked. * @return True if the sale is allowed on that tier, False otherwise. */ - function _saleAllowed(uint256 _id) internal returns(bool) { + function _saleAllowed(uint256 _id) internal returns (bool) { require(tiers[_id].saleStartTS != 0, "OriginsBase: Sale has not started yet."); require(!tierSaleEnded[_id], "OriginsBase: Sale ended."); - if(tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.None){ + if (tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.None) { return false; - } - else if(tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.UntilSupply && tiers[_id].remainingTokens == 0) { + } else if (tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.UntilSupply && tiers[_id].remainingTokens == 0) { tierSaleEnded[_id] = true; return false; - } - else if(tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp && tiers[_id].saleEnd < block.timestamp) { + } else if (tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp && tiers[_id].saleEnd < block.timestamp) { tierSaleEnded[_id] = true; return false; - } - else if(tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.Duration && tiers[_id].saleStartTS.add(tiers[_id].saleEnd) < block.timestamp) { + } else if ( + tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.Duration && + tiers[_id].saleStartTS.add(tiers[_id].saleEnd) < block.timestamp + ) { tierSaleEnded[_id] = true; return false; } @@ -423,9 +487,9 @@ contract OriginsBase is IOrigins, OriginsEvents { function _updateTierTokenDetailsAfterBuy(uint256 _tierID) internal { Tier memory tierDetails = tiers[_tierID]; - if(tierDetails.remainingTokens < tierDetails.maxAmount) { - if(tierDetails.remainingTokens < tierDetails.minAmount) { - if(tierDetails.remainingTokens == 0) { + if (tierDetails.remainingTokens < tierDetails.maxAmount) { + if (tierDetails.remainingTokens < tierDetails.minAmount) { + if (tierDetails.remainingTokens == 0) { tierSaleEnded[_tierID] = true; emit TierSaleEnded(msg.sender, _tierID); } @@ -447,19 +511,22 @@ contract OriginsBase is IOrigins, OriginsEvents { require(tierDetails.transferType != TransferType.None, "OriginsBase: Transfer Type not set by owner"); - if(tierDetails.transferType == TransferType.Unlocked){ + if (tierDetails.transferType == TransferType.Unlocked) { tierDetails.depositToken.transfer(msg.sender, _tokensBought); - } - else if(tierDetails.transferType == TransferType.WaitedUnlock) { + } else if (tierDetails.transferType == TransferType.WaitedUnlock) { /// TODO Call LockedFund Contract to release the token after a certain period. /// TODO approve LockedFund revert("Not implemented yet."); - } - else if(tierDetails.transferType == TransferType.Vested) { + } else if (tierDetails.transferType == TransferType.Vested) { token.approve(address(lockedFund), _tokensBought); - lockedFund.depositVested(msg.sender, _tokensBought, tierDetails.vestOrLockCliff, tierDetails.vestOrLockDuration, tierDetails.unlockedBP); - } - else if(tierDetails.transferType == TransferType.Locked) { + lockedFund.depositVested( + msg.sender, + _tokensBought, + tierDetails.vestOrLockCliff, + tierDetails.vestOrLockDuration, + tierDetails.unlockedBP + ); + } else if (tierDetails.transferType == TransferType.Locked) { /// TODO Call the LockedFund Contract with simple lock on the received token. /// Don't forget the immediate unlocked amount after the unlockTimestamp. /// TODO approve LockedFund @@ -474,9 +541,14 @@ contract OriginsBase is IOrigins, OriginsEvents { * @notice _tokensBoughtByAddress The amount of tokens bought by the user previously. * @notice _tokensBought The amount of tokens bought during the current buy. */ - function _updateWalletCount(uint256 _tierID, uint256 _deposit, uint256 _tokensBoughtByAddress, uint256 _tokensBought) internal { - if(_deposit > 0) { - if(_tokensBoughtByAddress == 0){ + function _updateWalletCount( + uint256 _tierID, + uint256 _deposit, + uint256 _tokensBoughtByAddress, + uint256 _tokensBought + ) internal { + if (_deposit > 0) { + if (_tokensBoughtByAddress == 0) { participatingWalletCountPerTier[_tierID]++; } tokensSoldPerTier[_tierID] = tokensSoldPerTier[_tierID].add(_tokensBought); @@ -496,10 +568,9 @@ contract OriginsBase is IOrigins, OriginsEvents { Tier memory tierDetails = tiers[_tierID]; /// @notice Checking if verification is set and if user has permission. - if(tierDetails.verificationType == VerificationType.None) { + if (tierDetails.verificationType == VerificationType.None) { revert("OriginsBase: No one is allowed for sale."); - } - else if(tierDetails.verificationType == VerificationType.ByAddress) { + } else if (tierDetails.verificationType == VerificationType.ByAddress) { /// @notice Checking if user is verified based on address. require(addressApproved[msg.sender][_tierID], "OriginsBase: User not approved for sale."); } @@ -512,10 +583,9 @@ contract OriginsBase is IOrigins, OriginsEvents { /// @notice Checking which deposit type is selected. uint256 deposit; - if(tierDetails.depositType == DepositType.RBTC) { + if (tierDetails.depositType == DepositType.RBTC) { deposit = msg.value; - } - else { + } else { require(_amount != 0, "OriginsBase: Amount cannot be zero."); require(address(tierDetails.depositToken) != address(0), "OriginsBase: Deposit Token not set by owner."); bool txStatus = tierDetails.depositToken.transferFrom(msg.sender, address(this), _amount); @@ -526,7 +596,7 @@ contract OriginsBase is IOrigins, OriginsEvents { /// @notice Checking what should be the allowed deposit amount. uint256 refund; require(deposit >= tierDetails.minAmount, "OriginsBase: Deposit is less than minimum allowed."); - if(tierDetails.maxAmount.sub(tokensBoughtByAddress) <= deposit) { + if (tierDetails.maxAmount.sub(tokensBoughtByAddress) <= deposit) { refund = deposit.add(tokensBoughtByAddress).sub(tierDetails.maxAmount); deposit = tierDetails.maxAmount.sub(tokensBoughtByAddress); } @@ -546,13 +616,12 @@ contract OriginsBase is IOrigins, OriginsEvents { _updateWalletCount(_tierID, deposit, tokensBoughtByAddress, tokensBought); /// @notice Refunding the excess funds. - if(refund > 0) { + if (refund > 0) { bool txStatus = tierDetails.depositToken.transfer(msg.sender, refund); - require(txStatus, "OriginsBase: Token refund not received by user correctly."); + require(txStatus, "OriginsBase: Token refund not received by user correctly."); } emit TokenBuy(msg.sender, _tierID, tokensBought); - } /** @@ -564,15 +633,15 @@ contract OriginsBase is IOrigins, OriginsEvents { /// @notice Checks if deposit address is set or not. address payable receiver = msg.sender; if (depositAddress != address(0)) { - receiver = depositAddress; + receiver = depositAddress; } /// @notice Only withdraw is allowed where sale is ended. Premature withdraw is not allowed. for (uint256 index = 1; index <= tierCount; index++) { - if(tierSaleEnded[index]){ + if (tierSaleEnded[index]) { uint256 amount = tokensSoldPerTier[index].div(tiers[index].depositRate); if (tiers[index].depositType == DepositType.RBTC) { - receiver.transfer(amount); + receiver.transfer(amount); emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.RBTC, amount); } else { tiers[index].depositToken.transfer(receiver, amount); @@ -588,7 +657,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @notice Function to read the tier count. * @return The number of tiers present in the contract. */ - function getTierCount() public view returns(uint256) { + function getTierCount() public view returns (uint256) { return tierCount; } @@ -597,7 +666,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @return The address of the deposit address. * @dev If zero is returned, any of the owners can withdraw the raised funds. */ - function getDepositAddress() public view returns(address) { + function getDepositAddress() public view returns (address) { return depositAddress; } @@ -605,7 +674,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @notice Function to read the token on sale. * @return The Token contract address which is being sold in the contract. */ - function getToken() public view returns(address) { + function getToken() public view returns (address) { return address(token); } @@ -613,7 +682,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @notice Function to read the locked fund contract address. * @return Address of Locked Fund Contract. */ - function getLockDetails() public view returns(address) { + function getLockDetails() public view returns (address) { return address(lockedFund); } @@ -631,9 +700,35 @@ contract OriginsBase is IOrigins, OriginsEvents { * @return _vestOrLockDuration Contains the duration of the vesting/lock for distribution. * @return _depositRate Contains the rate of the token w.r.t. the depositing asset. */ - function readTierPartA(uint256 _tierID) public view returns(uint256 _minAmount, uint256 _maxAmount, uint256 _remainingTokens, uint256 _saleStartTS, uint256 _saleEnd, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _depositRate) { + function readTierPartA(uint256 _tierID) + public + view + returns ( + uint256 _minAmount, + uint256 _maxAmount, + uint256 _remainingTokens, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _unlockedTokenWithdrawTS, + uint256 _unlockedBP, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _depositRate + ) + { Tier memory tier = tiers[_tierID]; - return (tier.minAmount, tier.maxAmount, tier.remainingTokens, tier.saleStartTS, tier.saleEnd, tier.unlockedTokenWithdrawTS, tier.unlockedBP, tier.vestOrLockCliff, tier.vestOrLockDuration, tier.depositRate); + return ( + tier.minAmount, + tier.maxAmount, + tier.remainingTokens, + tier.saleStartTS, + tier.saleEnd, + tier.unlockedTokenWithdrawTS, + tier.unlockedBP, + tier.vestOrLockCliff, + tier.vestOrLockDuration, + tier.depositRate + ); } /** @@ -645,7 +740,17 @@ contract OriginsBase is IOrigins, OriginsEvents { * @return _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. * @return _transferType Contains the type of token transfer after a user buys to get the tokens. */ - function readTierPartB(uint256 _tierID) public view returns(address _depositToken, DepositType _depositType, VerificationType _verificationType, SaleEndDurationOrTS _saleEndDurationOrTS, TransferType _transferType) { + function readTierPartB(uint256 _tierID) + public + view + returns ( + address _depositToken, + DepositType _depositType, + VerificationType _verificationType, + SaleEndDurationOrTS _saleEndDurationOrTS, + TransferType _transferType + ) + { Tier memory tier = tiers[_tierID]; return (address(tier.depositToken), tier.depositType, tier.verificationType, tier.saleEndDurationOrTS, tier.transferType); } @@ -656,7 +761,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _tierID The tier ID for which the address has to be checked. * @return The amount of tokens bought by the address. */ - function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) public view returns(uint256) { + function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) public view returns (uint256) { return tokensBoughtByAddressOnTier[_addr][_tierID]; } @@ -668,7 +773,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * A user can participate on one round and not on other. * In the future maybe a count on that can be created. */ - function getParticipatingWalletCountPerTier(uint256 _tierID) public view returns(uint256) { + function getParticipatingWalletCountPerTier(uint256 _tierID) public view returns (uint256) { return participatingWalletCountPerTier[_tierID]; } @@ -677,7 +782,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _tierID The tier ID for which the sold metrics has to be checked. * @return The amount of tokens sold on that tier. */ - function getTokensSoldPerTier(uint256 _tierID) public view returns(uint256) { + function getTokensSoldPerTier(uint256 _tierID) public view returns (uint256) { return tokensSoldPerTier[_tierID]; } @@ -687,7 +792,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @return True is sale ended, False otherwise. * @dev A return of false does not necessary mean the sale is active. It can also be in inactive state. */ - function checkSaleEnded(uint256 _tierID) public view returns(bool _status) { + function checkSaleEnded(uint256 _tierID) public view returns (bool _status) { return tierSaleEnded[_tierID]; } @@ -697,8 +802,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _tierID The tier ID for which the address has to be checked. * @return True is allowed, False otherwise. */ - function isAddressApproved(address _addr, uint256 _tierID) public view returns(bool) { + function isAddressApproved(address _addr, uint256 _tierID) public view returns (bool) { return addressApproved[_addr][_tierID]; } - } diff --git a/contracts/OriginsEvents.sol b/contracts/OriginsEvents.sol index a06ecb0..bbb0b29 100644 --- a/contracts/OriginsEvents.sol +++ b/contracts/OriginsEvents.sol @@ -7,8 +7,7 @@ import "./OriginsStorage.sol"; * @author Franklin Richards - powerhousefrank@protonmail.com * @notice You can use this contract for adding events into Origins Base. */ -contract OriginsEvents is OriginsStorage{ - +contract OriginsEvents is OriginsStorage { /* Events */ /** @@ -22,7 +21,7 @@ contract OriginsEvents is OriginsStorage{ /** * @notice Emitted when the Deposit Address is updated. * @param _initiator The one who initiates this event. - * @param _oldDepositAddr The address of the old deposit address. + * @param _oldDepositAddr The address of the old deposit address. * @param _newDepositAddr The address of the new deposit address. */ event DepositAddressUpdated(address indexed _initiator, address indexed _oldDepositAddr, address indexed _newDepositAddr); @@ -30,7 +29,7 @@ contract OriginsEvents is OriginsStorage{ /** * @notice Emitted when the Locked Fund is updated. * @param _initiator The one who initiates this event. - * @param _oldLockedFund The address of the old locked fund address. + * @param _oldLockedFund The address of the old locked fund address. * @param _newLockedFund The address of the new locked fund address. */ event LockedFundUpdated(address indexed _initiator, address indexed _oldLockedFund, address indexed _newLockedFund); @@ -67,7 +66,13 @@ contract OriginsEvents is OriginsStorage{ * @param _saleEnd The Tier Sale End Duration or Timestamp. * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. */ - event TierTimeUpdated(address indexed _initiator, uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, SaleEndDurationOrTS indexed _saleEndDurationOrTS); + event TierTimeUpdated( + address indexed _initiator, + uint256 _tierID, + uint256 _saleStartTS, + uint256 _saleEnd, + SaleEndDurationOrTS indexed _saleEndDurationOrTS + ); /** * @notice Emitted when Tier Vesting/Lock Parameters are updated. @@ -79,7 +84,15 @@ contract OriginsEvents is OriginsStorage{ * @param _unlockedBP The unlocked token amount in BP. * @param _transferType The Tier Transfer Type for the Tier. */ - event TierVestOrLockUpdated(address indexed _initiator, uint256 _tierID, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, TransferType indexed _transferType); + event TierVestOrLockUpdated( + address indexed _initiator, + uint256 _tierID, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _unlockedTokenWithdrawTS, + uint256 _unlockedBP, + TransferType indexed _transferType + ); /** * @notice Emitted when Tier Deposit Parameters are updated. @@ -89,7 +102,13 @@ contract OriginsEvents is OriginsStorage{ * @param _depositToken The token for that particular Tier Sale. * @param _depositType The type of deposit for the particular sale. */ - event TierDepositUpdated(address indexed _initiator, uint256 _tierID, uint256 _depositRate, address _depositToken, DepositType indexed _depositType); + event TierDepositUpdated( + address indexed _initiator, + uint256 _tierID, + uint256 _depositRate, + address _depositToken, + DepositType indexed _depositType + ); /** * @notice Emitted when the Tier Verification are updated. @@ -137,6 +156,11 @@ contract OriginsEvents is OriginsStorage{ * @param _depositType The type of withdraw (RBTC or Token). * @param _amount The amount of withdraw. */ - event ProceedingWithdrawn(address indexed _initiator, address indexed _receiver, uint256 _tierID, DepositType _depositType, uint256 _amount); - + event ProceedingWithdrawn( + address indexed _initiator, + address indexed _receiver, + uint256 _tierID, + DepositType _depositType, + uint256 _amount + ); } diff --git a/contracts/OriginsStorage.sol b/contracts/OriginsStorage.sol index e5a54ca..7c79437 100644 --- a/contracts/OriginsStorage.sol +++ b/contracts/OriginsStorage.sol @@ -10,7 +10,7 @@ import "./Interfaces/ILockedFund.sol"; * @author Franklin Richards - powerhousefrank@protonmail.com * @notice This plays as the harddisk for the Origins Platform. */ -contract OriginsStorage is OriginsAdmin{ +contract OriginsStorage is OriginsAdmin { using SafeMath for uint256; /* Storage */ @@ -32,7 +32,10 @@ contract OriginsStorage is OriginsAdmin{ * RBTC - The deposit will be made in RBTC. * Token - The deposit will be made in any ERC20 Token set in depositToken in Tier Struct. */ - enum DepositType { RBTC, Token } + enum DepositType { + RBTC, + Token + } /** * @notice The method by which we determine whether the sale ended or not. * None - This type is not set, so no one is allowed for sale yet. @@ -40,14 +43,23 @@ contract OriginsStorage is OriginsAdmin{ * Duration - This type is set to allow sale until a particular duration. * Timestamp - This type is set to allow sale until a particular timestamp. */ - enum SaleEndDurationOrTS { None, UntilSupply, Duration, Timestamp } + enum SaleEndDurationOrTS { + None, + UntilSupply, + Duration, + Timestamp + } /** * @notice The method by which the verification is happening. * None - The type is not set, so no one is approved for sale. * Everyone - This type is set to allow everyone. * ByAddress - This type is set to allow only verified addresses. */ - enum VerificationType { None, Everyone, ByAddress } + enum VerificationType { + None, + Everyone, + ByAddress + } /** * @notice The method by which the distribution is happening. * None - The distribution is not set yet, so tokens remain in the contract. @@ -56,7 +68,13 @@ contract OriginsStorage is OriginsAdmin{ * Vested - The tokens are vested (based on the contracts from Sovryn) for a certain period. * Locked - The tokens are locked without any benefit based on cliff and duration. */ - enum TransferType { None, Unlocked, WaitedUnlock, Vested, Locked } + enum TransferType { + None, + Unlocked, + WaitedUnlock, + Vested, + Locked + } /// @notice The tiers based on the tier id, taken from tier count. mapping(uint256 => Tier) internal tiers; @@ -71,8 +89,8 @@ contract OriginsStorage is OriginsAdmin{ /// @notice Contains if a tier sale ended or not. mapping(uint256 => bool) internal tierSaleEnded; - /// @notice The address to uint to bool mapping to see if the particular address is eligible or not for a tier. - mapping(address => mapping(uint256 => bool)) internal addressApproved; + /// @notice The address to uint to bool mapping to see if the particular address is eligible or not for a tier. + mapping(address => mapping(uint256 => bool)) internal addressApproved; /** * @notice The Tier Structure. @@ -104,9 +122,8 @@ contract OriginsStorage is OriginsAdmin{ uint256 depositRate; IERC20 depositToken; DepositType depositType; - VerificationType verificationType; + VerificationType verificationType; SaleEndDurationOrTS saleEndDurationOrTS; TransferType transferType; - } - + } } From c40c5b0cfb3d4e6eee5107d3adb73cf45c7ad806 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:19:20 +0530 Subject: [PATCH 024/112] Artifacts Updated --- .../Interfaces/IERC20.sol/IERC20.json | 15 ++++ .../ILockedFund.sol/ILockedFund.json | 15 ++++ .../Interfaces/IOrigins.sol/IOrigins.json | 22 +++++- .../IVestingLogic.sol/IVestingLogic.json | 30 +++++++ .../IVestingLogic.sol/VestingStorage.json | 19 ++++- .../IVestingRegistry.json | 15 ++++ .../contracts/LockedFund.sol/LockedFund.json | 34 +++++++- .../Openzeppelin/Address.sol/Address.json | 22 +++++- .../Openzeppelin/Context.sol/Context.json | 15 ++++ .../Openzeppelin/ERC20.sol/ERC20.json | 34 +++++++- .../ERC20Detailed.sol/ERC20Detailed.json | 15 ++++ .../Openzeppelin/Ownable.sol/Ownable.json | 30 +++++++ .../ReentrancyGuard.sol/ReentrancyGuard.json | 22 +++++- .../Openzeppelin/SafeMath.sol/SafeMath.json | 22 +++++- .../OriginsAdmin.sol/OriginsAdmin.json | 15 ++++ .../OriginsBase.sol/OriginsBase.json | 79 ++++++++++++++++++- .../OriginsEvents.sol/OriginsEvents.json | 45 +++++++++++ .../OriginsStorage.sol/OriginsStorage.json | 30 +++++++ 18 files changed, 459 insertions(+), 20 deletions(-) diff --git a/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json b/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json index 5cd6953..90ac67e 100644 --- a/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json +++ b/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json @@ -126,6 +126,21 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x1be38b5b", + "type": "bytes32" + } + ], + "name": "c_0x1be38b5b", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [], diff --git a/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json b/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json index 001e5ce..4d3add4 100644 --- a/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json +++ b/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json @@ -18,6 +18,21 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x6defa1ca", + "type": "bytes32" + } + ], + "name": "c_0x6defa1ca", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": false, "inputs": [ diff --git a/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json b/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json index 9b698fe..dec5199 100644 --- a/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json +++ b/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json @@ -2,9 +2,25 @@ "_format": "hh-sol-artifact-1", "contractName": "IOrigins", "sourceName": "contracts/Interfaces/IOrigins.sol", - "abi": [], - "bytecode": "0x6080604052348015600f57600080fd5b50603e80601d6000396000f3fe6080604052600080fdfea265627a7a72315820563c295cb97e14be9c42083c5236cc9c95740e44c4382c01325b5405c18549eb64736f6c63430005110032", - "deployedBytecode": "0x6080604052600080fdfea265627a7a72315820563c295cb97e14be9c42083c5236cc9c95740e44c4382c01325b5405c18549eb64736f6c63430005110032", + "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x2b1a913c", + "type": "bytes32" + } + ], + "name": "c_0x2b1a913c", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b5060908061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063d8c8469514602d575b600080fd5b605660048036036020811015604157600080fd5b81019080803590602001909291905050506058565b005b5056fea265627a7a7231582011070318350c618d0e8bb8a9b7791cbb95e3d0f51124e445ebe7bb07fa742f1a64736f6c63430005110032", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063d8c8469514602d575b600080fd5b605660048036036020811015604157600080fd5b81019080803590602001909291905050506058565b005b5056fea265627a7a7231582011070318350c618d0e8bb8a9b7791cbb95e3d0f51124e445ebe7bb07fa742f1a64736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json b/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json index 44bc026..d880753 100644 --- a/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json +++ b/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json @@ -3,6 +3,36 @@ "contractName": "IVestingLogic", "sourceName": "contracts/Interfaces/IVestingLogic.sol", "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0xa1e8758b", + "type": "bytes32" + } + ], + "name": "c_0xa1e8758b", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0xd266dec3", + "type": "bytes32" + } + ], + "name": "c_0xd266dec3", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [], diff --git a/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json b/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json index 33bdc95..a534f30 100644 --- a/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json +++ b/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json @@ -3,6 +3,21 @@ "contractName": "VestingStorage", "sourceName": "contracts/Interfaces/IVestingLogic.sol", "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0xa1e8758b", + "type": "bytes32" + } + ], + "name": "c_0xa1e8758b", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [], @@ -34,8 +49,8 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630fb5a6b414603757806313d033c014604f575b600080fd5b603d6055565b60408051918252519081900360200190f35b603d605b565b60015481565b6000548156fea265627a7a72315820bf3475cae20a692d605e5ffe2e2427ac41aec3ad12ae46d0d23af985351d2a8064736f6c63430005110032", - "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060325760003560e01c80630fb5a6b414603757806313d033c014604f575b600080fd5b603d6055565b60408051918252519081900360200190f35b603d605b565b60015481565b6000548156fea265627a7a72315820bf3475cae20a692d605e5ffe2e2427ac41aec3ad12ae46d0d23af985351d2a8064736f6c63430005110032", + "bytecode": "0x608060405234801561001057600080fd5b5060e88061001f6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80630fb5a6b414604157806313d033c014605d578063cf31b46e146079575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b606360aa565b6040518082815260200191505060405180910390f35b60a260048036036020811015608d57600080fd5b810190808035906020019092919050505060b0565b005b60015481565b60005481565b5056fea265627a7a723158203012d68fe12002eb91edfeeb6dd579167417b4e35fb7fde2fcd89bb21b4f2f8d64736f6c63430005110032", + "deployedBytecode": "0x6080604052348015600f57600080fd5b5060043610603c5760003560e01c80630fb5a6b414604157806313d033c014605d578063cf31b46e146079575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b606360aa565b6040518082815260200191505060405180910390f35b60a260048036036020811015608d57600080fd5b810190808035906020019092919050505060b0565b005b60015481565b60005481565b5056fea265627a7a723158203012d68fe12002eb91edfeeb6dd579167417b4e35fb7fde2fcd89bb21b4f2f8d64736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json b/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json index 6263d94..e9f271e 100644 --- a/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json +++ b/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json @@ -3,6 +3,21 @@ "contractName": "IVestingRegistry", "sourceName": "contracts/Interfaces/IVestingRegistry.sol", "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x8a4aab55", + "type": "bytes32" + } + ], + "name": "c_0x8a4aab55", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": false, "inputs": [ diff --git a/artifacts/contracts/LockedFund.sol/LockedFund.json b/artifacts/contracts/LockedFund.sol/LockedFund.json index 40c920f..fa19264 100644 --- a/artifacts/contracts/LockedFund.sol/LockedFund.json +++ b/artifacts/contracts/LockedFund.sol/LockedFund.json @@ -290,6 +290,36 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x6defa1ca", + "type": "bytes32" + } + ], + "name": "c_0x6defa1ca", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x8dbef84a", + "type": "bytes32" + } + ], + "name": "c_0x8dbef84a", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": false, "inputs": [ @@ -796,8 +826,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b5060405162001e1a38038062001e1a833981810160405260808110156200003757600080fd5b8151602083015160408085015160608601805192519496939591949391820192846401000000008211156200006b57600080fd5b9083019060208201858111156200008157600080fd5b82518660208202830111640100000000821117156200009f57600080fd5b82525081516020918201928201910280838360005b83811015620000ce578181015183820152602001620000b4565b5050505090500160405250505083600014156200011d5760405162461bcd60e51b815260040180806020018281038252602581526020018062001da36025913960400191505060405180910390fd5b6001600160a01b038316620001645760405162461bcd60e51b815260040180806020018281038252602281526020018062001dc86022913960400191505060405180910390fd5b6001600160a01b038216620001ab5760405162461bcd60e51b815260040180806020018281038252603081526020018062001dea6030913960400191505060405180910390fd5b6000848155600180546001600160a01b038087166001600160a01b03199283161790925560028054928616929091169190911790555b8151811015620003175760006001600160a01b03168282815181106200020357fe5b60200260200101516001600160a01b0316141562000268576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600760008484815181106200027b57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550818181518110620002c757fe5b60200260200101516001600160a01b0316336001600160a01b03167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a3600101620001e1565b5050505050611a77806200032c6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806389facb201161010f578063c4086893116100a2578063ce46643b11610071578063ce46643b14610599578063e5545864146105a1578063ec3ea7d4146105c7578063fc0c546a146105ed576101f0565b8063c40868931461051f578063cb3fdb6114610545578063cc6f03331461056b578063cdce101b14610573576101f0565b80639114557e116100de5780639114557e146104a5578063aaba2c0d146104cb578063b36760a3146104f1578063c227cbd814610517576101f0565b806389facb20146104525780638c8ba66d1461045a5780638efd94f314610480578063904c5b8f1461049d576101f0565b80634558269f1161018757806361ade4261161015657806361ade426146103c057806370480275146103e657806377a69b521461040c578063849a681714610414576101f0565b80634558269f1461034b5780634c2a295c1461035357806355e715cf1461035b578063594092db14610381576101f0565b806324276777116101c3578063242767771461029f57806324d7806c146102c55780632b6df82a146102ff5780633e4a89d114610325576101f0565b80630483a7f6146101f5578063129de5bf1461022d5780631785f53c1461025357806321df0da71461027b575b600080fd5b61021b6004803603602081101561020b57600080fd5b50356001600160a01b03166105f5565b60408051918252519081900360200190f35b61021b6004803603602081101561024357600080fd5b50356001600160a01b0316610607565b6102796004803603602081101561026957600080fd5b50356001600160a01b0316610622565b005b610283610680565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102b557600080fd5b50356001600160a01b031661068f565b6102eb600480360360208110156102db57600080fd5b50356001600160a01b03166106a1565b604080519115158252519081900360200190f35b6102796004803603602081101561031557600080fd5b50356001600160a01b03166106b6565b6102eb6004803603602081101561033b57600080fd5b50356001600160a01b03166106c9565b6102796106e7565b61021b6106f2565b6102796004803603602081101561037157600080fd5b50356001600160a01b03166106f8565b6103a76004803603602081101561039757600080fd5b50356001600160a01b0316610702565b6040805192835260208301919091528051918290030190f35b610279600480360360208110156103d657600080fd5b50356001600160a01b031661072a565b610279600480360360208110156103fc57600080fd5b50356001600160a01b031661081d565b61021b610878565b610279600480360360a081101561042a57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013561087e565b61021b6108e4565b61021b6004803603602081101561047057600080fd5b50356001600160a01b03166108eb565b6102796004803603602081101561049657600080fd5b50356108fd565b610283610958565b61021b600480360360208110156104bb57600080fd5b50356001600160a01b0316610967565b61021b600480360360208110156104e157600080fd5b50356001600160a01b0316610982565b61021b6004803603602081101561050757600080fd5b50356001600160a01b031661099d565b6102836109af565b61021b6004803603602081101561053557600080fd5b50356001600160a01b03166109be565b61021b6004803603602081101561055b57600080fd5b50356001600160a01b03166109d9565b6102836109eb565b61021b6004803603602081101561058957600080fd5b50356001600160a01b03166109fb565b610279610a0d565b610279600480360360208110156105b757600080fd5b50356001600160a01b0316610b53565b610279600480360360208110156105dd57600080fd5b50356001600160a01b0316610b66565b610283610bc1565b60046020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b3360009081526007602052604090205460ff16610674576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161072a565b50565b6001546001600160a01b031690565b60056020526000908152604090205481565b60076020526000908152604090205460ff1681565b6106c08182610bd0565b61067d81610d84565b6001600160a01b031660009081526007602052604090205460ff1690565b6106f033610d84565b565b60005490565b61067d3382610bd0565b6001600160a01b03166000908152600860209081526040808320546009909252909120549091565b3360009081526007602052604090205460ff1661077c576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166107d35760405162461bcd60e51b81526004018080602001828103825260248152602001806118746024913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b3360009081526007602052604090205460ff1661086f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81610db9565b60005481565b3360009081526007602052604090205460ff166108d0576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6108dd8585858585610eb9565b5050505050565b6224ea0081565b60066020526000908152604090205481565b3360009081526007602052604090205460ff1661094f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161115d565b6002546001600160a01b031681565b6001600160a01b031660009081526003602052604090205490565b6001600160a01b031660009081526005602052604090205490565b60096020526000908152604090205481565b6002546001600160a01b031690565b6001600160a01b031660009081526004602052604090205490565b60036020526000908152604090205481565b60006109f6336111d7565b905090565b60086020526000908152604090205481565b6000610a183361132b565b9050806001600160a01b03166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b505133600090815260086020526040902054148015610b0e5750806001600160a01b0316630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6020811015610afa57600080fd5b505133600090815260096020526040902054145b610b495760405162461bcd60e51b81526004018080602001828103825260238152602001806119f06023913960400191505060405180910390fd5b61067d33826113ae565b610b5d3382610bd0565b61067d33610d84565b3360009081526007602052604090205460ff16610bb8576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81611540565b6001546001600160a01b031681565b600054610c0e5760405162461bcd60e51b815260040180806020018281038252602281526020018061197f6022913960400191505060405180910390fd5b4260005410610c4e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806118bc602a913960400191505060405180910390fd5b806001600160a01b038116610c605750815b6001600160a01b038084166000908152600560209081526040808320805490849055600154825163a9059cbb60e01b815287871660048201526024810183905292519195169263a9059cbb926044808201939182900301818787803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b5051905080610d325760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b826001600160a01b0316856001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6000610d8f8261132b565b90506001600160a01b038116610dab57610da8826111d7565b90505b610db582826113ae565b5050565b6001600160a01b038116610e14576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610e6c5760405162461bcd60e51b81526004018080602001828103825260258152602001806119a16025913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b81610ef55760405162461bcd60e51b81526004018080602001828103825260248152602001806118986024913960400191505060405180910390fd5b60258210610f345760405162461bcd60e51b81526004018080602001828103825260218152602001806119396021913960400191505060405180910390fd5b6127108110610f745760405162461bcd60e51b81526004018080602001828103825260328152602001806118e66032913960400191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050506040513d6020811015610ff757600080fd5b50519050806110375760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b600061105b61271061104f888663ffffffff6115d116565b9063ffffffff61163316565b6001600160a01b038816600090815260056020526040902054909150611087908263ffffffff61167516565b6001600160a01b0388166000908152600560209081526040808320939093556003905220546110ce9082906110c2908963ffffffff61167516565b9063ffffffff6116cf16565b6001600160a01b038816600081815260036020908152604080832094909455600881528382206224ea008a810290915560098252918490209188029091558251898152908101889052808301879052606081018690529151909133917fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a9181900360800190a350505050505050565b806111995760405162461bcd60e51b815260040180806020018281038252602581526020018061195a6025913960400191505060405180910390fd5b600081905560408051828152905133917f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94919081900360200190a250565b336000908152600860205260408120541580159061120357503360009081526009602052604090205415155b61123e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119c6602a913960400191505060405180910390fd5b6002546001600160a01b038381166000818152600860209081526040808320546009909252808320548151630665a06f60e01b815260048101959095526024850184905260448501929092526064840191909152519290931692630665a06f9260848084019382900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b505050506112da8261132b565b9050806001600160a01b0316826001600160a01b0316336001600160a01b03167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6002546040805163cc49ede760e01b81526001600160a01b0384811660048301529151600093929092169163cc49ede791602480820192602092909190829003018186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b505192915050565b6001600160a01b038083166000908152600460208181526040808420805490859055600154825163095ea7b360e01b8152888816958101959095526024850182905291519095919091169363095ea7b3936044808201949392918390030190829087803b15801561141e57600080fd5b505af1158015611432573d6000803e3d6000fd5b505050506040513d602081101561144857600080fd5b505161149b576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656446756e643a20417070726f7665206661696c65642e0000000000604482015290519081900360640190fd5b816001600160a01b0316637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506040805184815290516001600160a01b038087169450871692507f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b9181900360200190a3505050565b6001600160a01b0381166115855760405162461bcd60e51b8152600401808060200182810382526030815260200180611a136030913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e790600090a350565b6000826115e05750600061162d565b828202828482816115ed57fe5b041461162a5760405162461bcd60e51b81526004018080602001828103825260218152602001806119186021913960400191505060405180910390fd5b90505b92915050565b600061162a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611711565b60008282018381101561162a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061162a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b3565b6000818361179d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561176257818101518382015260200161174a565b50505050905090810190601f16801561178f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816117a957fe5b0495945050505050565b600081848411156118055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561176257818101518382015260200161174a565b50505090039056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4f6e6c792061646d696e2063616e2063616c6c20746869732e000000000000004c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a7231582037112f7bf95aa5fb33056f5be64387b152c40393a8f5c489a64401b1995b3af464736f6c634300051100324c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20496e76616c696420546f6b656e20416464726573732e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642e", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806389facb201161010f578063c4086893116100a2578063ce46643b11610071578063ce46643b14610599578063e5545864146105a1578063ec3ea7d4146105c7578063fc0c546a146105ed576101f0565b8063c40868931461051f578063cb3fdb6114610545578063cc6f03331461056b578063cdce101b14610573576101f0565b80639114557e116100de5780639114557e146104a5578063aaba2c0d146104cb578063b36760a3146104f1578063c227cbd814610517576101f0565b806389facb20146104525780638c8ba66d1461045a5780638efd94f314610480578063904c5b8f1461049d576101f0565b80634558269f1161018757806361ade4261161015657806361ade426146103c057806370480275146103e657806377a69b521461040c578063849a681714610414576101f0565b80634558269f1461034b5780634c2a295c1461035357806355e715cf1461035b578063594092db14610381576101f0565b806324276777116101c3578063242767771461029f57806324d7806c146102c55780632b6df82a146102ff5780633e4a89d114610325576101f0565b80630483a7f6146101f5578063129de5bf1461022d5780631785f53c1461025357806321df0da71461027b575b600080fd5b61021b6004803603602081101561020b57600080fd5b50356001600160a01b03166105f5565b60408051918252519081900360200190f35b61021b6004803603602081101561024357600080fd5b50356001600160a01b0316610607565b6102796004803603602081101561026957600080fd5b50356001600160a01b0316610622565b005b610283610680565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102b557600080fd5b50356001600160a01b031661068f565b6102eb600480360360208110156102db57600080fd5b50356001600160a01b03166106a1565b604080519115158252519081900360200190f35b6102796004803603602081101561031557600080fd5b50356001600160a01b03166106b6565b6102eb6004803603602081101561033b57600080fd5b50356001600160a01b03166106c9565b6102796106e7565b61021b6106f2565b6102796004803603602081101561037157600080fd5b50356001600160a01b03166106f8565b6103a76004803603602081101561039757600080fd5b50356001600160a01b0316610702565b6040805192835260208301919091528051918290030190f35b610279600480360360208110156103d657600080fd5b50356001600160a01b031661072a565b610279600480360360208110156103fc57600080fd5b50356001600160a01b031661081d565b61021b610878565b610279600480360360a081101561042a57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013561087e565b61021b6108e4565b61021b6004803603602081101561047057600080fd5b50356001600160a01b03166108eb565b6102796004803603602081101561049657600080fd5b50356108fd565b610283610958565b61021b600480360360208110156104bb57600080fd5b50356001600160a01b0316610967565b61021b600480360360208110156104e157600080fd5b50356001600160a01b0316610982565b61021b6004803603602081101561050757600080fd5b50356001600160a01b031661099d565b6102836109af565b61021b6004803603602081101561053557600080fd5b50356001600160a01b03166109be565b61021b6004803603602081101561055b57600080fd5b50356001600160a01b03166109d9565b6102836109eb565b61021b6004803603602081101561058957600080fd5b50356001600160a01b03166109fb565b610279610a0d565b610279600480360360208110156105b757600080fd5b50356001600160a01b0316610b53565b610279600480360360208110156105dd57600080fd5b50356001600160a01b0316610b66565b610283610bc1565b60046020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b3360009081526007602052604090205460ff16610674576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161072a565b50565b6001546001600160a01b031690565b60056020526000908152604090205481565b60076020526000908152604090205460ff1681565b6106c08182610bd0565b61067d81610d84565b6001600160a01b031660009081526007602052604090205460ff1690565b6106f033610d84565b565b60005490565b61067d3382610bd0565b6001600160a01b03166000908152600860209081526040808320546009909252909120549091565b3360009081526007602052604090205460ff1661077c576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166107d35760405162461bcd60e51b81526004018080602001828103825260248152602001806118746024913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b3360009081526007602052604090205460ff1661086f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81610db9565b60005481565b3360009081526007602052604090205460ff166108d0576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6108dd8585858585610eb9565b5050505050565b6224ea0081565b60066020526000908152604090205481565b3360009081526007602052604090205460ff1661094f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161115d565b6002546001600160a01b031681565b6001600160a01b031660009081526003602052604090205490565b6001600160a01b031660009081526005602052604090205490565b60096020526000908152604090205481565b6002546001600160a01b031690565b6001600160a01b031660009081526004602052604090205490565b60036020526000908152604090205481565b60006109f6336111d7565b905090565b60086020526000908152604090205481565b6000610a183361132b565b9050806001600160a01b03166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b505133600090815260086020526040902054148015610b0e5750806001600160a01b0316630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6020811015610afa57600080fd5b505133600090815260096020526040902054145b610b495760405162461bcd60e51b81526004018080602001828103825260238152602001806119f06023913960400191505060405180910390fd5b61067d33826113ae565b610b5d3382610bd0565b61067d33610d84565b3360009081526007602052604090205460ff16610bb8576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81611540565b6001546001600160a01b031681565b600054610c0e5760405162461bcd60e51b815260040180806020018281038252602281526020018061197f6022913960400191505060405180910390fd5b4260005410610c4e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806118bc602a913960400191505060405180910390fd5b806001600160a01b038116610c605750815b6001600160a01b038084166000908152600560209081526040808320805490849055600154825163a9059cbb60e01b815287871660048201526024810183905292519195169263a9059cbb926044808201939182900301818787803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b5051905080610d325760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b826001600160a01b0316856001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6000610d8f8261132b565b90506001600160a01b038116610dab57610da8826111d7565b90505b610db582826113ae565b5050565b6001600160a01b038116610e14576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610e6c5760405162461bcd60e51b81526004018080602001828103825260258152602001806119a16025913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b81610ef55760405162461bcd60e51b81526004018080602001828103825260248152602001806118986024913960400191505060405180910390fd5b60258210610f345760405162461bcd60e51b81526004018080602001828103825260218152602001806119396021913960400191505060405180910390fd5b6127108110610f745760405162461bcd60e51b81526004018080602001828103825260328152602001806118e66032913960400191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050506040513d6020811015610ff757600080fd5b50519050806110375760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b600061105b61271061104f888663ffffffff6115d116565b9063ffffffff61163316565b6001600160a01b038816600090815260056020526040902054909150611087908263ffffffff61167516565b6001600160a01b0388166000908152600560209081526040808320939093556003905220546110ce9082906110c2908963ffffffff61167516565b9063ffffffff6116cf16565b6001600160a01b038816600081815260036020908152604080832094909455600881528382206224ea008a810290915560098252918490209188029091558251898152908101889052808301879052606081018690529151909133917fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a9181900360800190a350505050505050565b806111995760405162461bcd60e51b815260040180806020018281038252602581526020018061195a6025913960400191505060405180910390fd5b600081905560408051828152905133917f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94919081900360200190a250565b336000908152600860205260408120541580159061120357503360009081526009602052604090205415155b61123e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119c6602a913960400191505060405180910390fd5b6002546001600160a01b038381166000818152600860209081526040808320546009909252808320548151630665a06f60e01b815260048101959095526024850184905260448501929092526064840191909152519290931692630665a06f9260848084019382900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b505050506112da8261132b565b9050806001600160a01b0316826001600160a01b0316336001600160a01b03167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6002546040805163cc49ede760e01b81526001600160a01b0384811660048301529151600093929092169163cc49ede791602480820192602092909190829003018186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b505192915050565b6001600160a01b038083166000908152600460208181526040808420805490859055600154825163095ea7b360e01b8152888816958101959095526024850182905291519095919091169363095ea7b3936044808201949392918390030190829087803b15801561141e57600080fd5b505af1158015611432573d6000803e3d6000fd5b505050506040513d602081101561144857600080fd5b505161149b576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656446756e643a20417070726f7665206661696c65642e0000000000604482015290519081900360640190fd5b816001600160a01b0316637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506040805184815290516001600160a01b038087169450871692507f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b9181900360200190a3505050565b6001600160a01b0381166115855760405162461bcd60e51b8152600401808060200182810382526030815260200180611a136030913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e790600090a350565b6000826115e05750600061162d565b828202828482816115ed57fe5b041461162a5760405162461bcd60e51b81526004018080602001828103825260218152602001806119186021913960400191505060405180910390fd5b90505b92915050565b600061162a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611711565b60008282018381101561162a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061162a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b3565b6000818361179d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561176257818101518382015260200161174a565b50505050905090810190601f16801561178f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816117a957fe5b0495945050505050565b600081848411156118055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561176257818101518382015260200161174a565b50505090039056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4f6e6c792061646d696e2063616e2063616c6c20746869732e000000000000004c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a7231582037112f7bf95aa5fb33056f5be64387b152c40393a8f5c489a64401b1995b3af464736f6c63430005110032", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162006c7c38038062006c7c833981810160405260808110156200003757600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805160405193929190846401000000008211156200007657600080fd5b838201915060208201858111156200008d57600080fd5b8251866020820283011164010000000082111715620000ab57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015620000e4578082015181840152602081019050620000c7565b50505050905001604052505050620001257fbe772ba151ce438198245007931cf4d28657c2c464fc936378d2f1a8eb70187860001b62000a8560201b60201c565b620001597ffa9ddb8c6f2fc34f38088f66ec09a076fe42374c6fd0d801638248d94a6fff1d60001b62000a8560201b60201c565b6200018d7f3db94983fa8d32e75391535d5e24d11560526cc625d75ee04be80d9a7eeaa86660001b62000a8560201b60201c565b620001c17f42a32338e7347349d416312ae30eea4548391a9a62c69730105e7b5e3176729560001b62000a8560201b60201c565b60008414156200021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018062006c056025913960400191505060405180910390fd5b620002517f570a927c5bc1ccfb758f2598def9b418c1b3d8b767df6fc015a74a957da6a87560001b62000a8560201b60201c565b620002857f1672c3a374d8e28edf40b592874b60d0a25d3f1566300e2dc01a4879be64463460001b62000a8560201b60201c565b620002b97f54b9b909f7a52f60c44ec32271e419fa638f2829a53698b8c4bd08958512d4b060001b62000a8560201b60201c565b620002ed7f0168e63122b684b1a2e6c79fde56d2f4020c3340a5f4392f611e9a8528e4b3bf60001b62000a8560201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018062006c2a6022913960400191505060405180910390fd5b620003a97f3f93e922db25b8139270353926d822620dae76baf5cadd08b1d86ea9584618e560001b62000a8560201b60201c565b620003dd7f3c8c82fccd0d33193a6bcbc63f3b3fb13cfb2cd580be6b16fe41a0f4b7fb9e6460001b62000a8560201b60201c565b620004117f8d3381f7f30b8a908a7c63242a423a90c85fe0f906292272255e554206ab236060001b62000a8560201b60201c565b620004457f6f96b8823eefeda86f3bff9e56ff5c53fc9d834cec91686e6a4f517c00b5a4e260001b62000a8560201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018062006c4c6030913960400191505060405180910390fd5b620005017f62f66c19fe6aad5f9184067361a08ade25e032b01a59c49aba41480e6fe38ca360001b62000a8560201b60201c565b620005357fff1273a6591d712e3811bf14f9ab817c7656e395f7c58dfb94c3824513df653a60001b62000a8560201b60201c565b620005697f4516ee5e54cc8ccfe63ed24861ccba57428a472ba459aea66e6277e3d5008e3260001b62000a8560201b60201c565b83600081905550620005a47f5c6871dc64c4a5de7266cd04f739cb86ebc6f62630c869574110fa44fd7a91e960001b62000a8560201b60201c565b620005d87f990762a6869ec40e82bc510ff327bbf2a3ecfd19c8661ff4bf128b999308fdd460001b62000a8560201b60201c565b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200064d7f50c29f360d14984614b13b28ba79dc08c74017e7ba8d3dba33de32448f91504160001b62000a8560201b60201c565b620006817fc122633e18d0e7bab07cd9c17556ada0accc14d165465e1047649abae54c882660001b62000a8560201b60201c565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620006f67fed1294aa68efde61362cdd32ed986237ed74378aada8204f2c9ac283f7b5614660001b62000a8560201b60201c565b6200072a7fc2c116e9e9380abb8800fd1c6dfcc9d0250b700ad4a997c183fe23663b5ac7ea60001b62000a8560201b60201c565b60008090505b815181101562000a7a576200076e7f9e443a806c9bdcb98eff4ae38cf4b3b1524e040e9c8b380e45f2493913057cad60001b62000a8560201b60201c565b620007a27f162573dc2f2d428388e216a5a734964f2a92b01fd311546fb530ea28ec84537360001b62000a8560201b60201c565b620007d67f7eb07445bf339cbc889ac348c55e6cc6a1c78debd6311282868818334b4b26f160001b62000a8560201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff16828281518110620007fb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156200088e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4c6f636b656446756e643a20496e76616c696420416464726573732e0000000081525060200191505060405180910390fd5b620008c27f3afe0bd2b62b0578a211f4ea0510ab860f2637ff6a44c215eceadd3300125e1160001b62000a8560201b60201c565b620008f67fcb27314f5d405be6db68875424bd4222442cb47939a1a4aeae757b9f17ccd38a60001b62000a8560201b60201c565b6200092a7f0d5665de2ccb079e4ef145950627bf7a84b66c4dad95603a48918839e3a088cf60001b62000a8560201b60201c565b6001600760008484815181106200093d57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620009ca7f6ea79692ea744c82b2072210200e1a97e3499c227e3bb337a93585ddd2feb13060001b62000a8560201b60201c565b620009fe7f6f62ec6f761ae525365464c83cd65fe572e3e0f92c04e5f45f6ba2682f34996360001b62000a8560201b60201c565b81818151811062000a0b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a3808060010191505062000730565b505050505062000a88565b50565b61616d8062000a986000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806389facb201161011a578063c227cbd8116100ad578063cdce101b1161007c578063cdce101b14610a10578063ce46643b14610a68578063e554586414610a72578063ec3ea7d414610ab6578063fc0c546a14610afa57610206565b8063c227cbd8146108cc578063c408689314610916578063cb3fdb611461096e578063cc6f0333146109c657610206565b80639114557e116100e95780639114557e14610796578063a2dcc234146107ee578063aaba2c0d1461081c578063b36760a31461087457610206565b806389facb20146106a85780638c8ba66d146106c65780638efd94f31461071e578063904c5b8f1461074c57610206565b80633e4a89d11161019d578063594092db1161016c578063594092db1461053757806361ade4261461059657806370480275146105da57806377a69b521461061e578063849a68171461063c57610206565b80633e4a89d11461046f5780634558269f146104cb5780634c2a295c146104d557806355e715cf146104f357610206565b806324276777116101d9578063242767771461034957806324d7806c146103a15780632b6df82a146103fd5780633a2cb6431461044157610206565b80630483a7f61461020b578063129de5bf146102635780631785f53c146102bb57806321df0da7146102ff575b600080fd5b61024d6004803603602081101561022157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b44565b6040518082815260200191505060405180910390f35b6102a56004803603602081101561027957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b5c565b6040518082815260200191505060405180910390f35b6102fd600480360360208110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c29565b005b610307610e80565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61038b6004803603602081101561035f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f2e565b6040518082815260200191505060405180910390f35b6103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f46565b604051808215151515815260200191505060405180910390f35b61043f6004803603602081101561041357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f66565b005b61046d6004803603602081101561045757600080fd5b8101908080359060200190929190505050611058565b005b6104b16004803603602081101561048557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061105b565b604051808215151515815260200191505060405180910390f35b6104d3611135565b005b6104dd6111c4565b6040518082815260200191505060405180910390f35b6105356004803603602081101561050957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611252565b005b6105796004803603602081101561054d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112e3565b604051808381526020018281526020019250505060405180910390f35b6105d8600480360360208110156105ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113f3565b005b61061c600480360360208110156105f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061189d565b005b610626611af4565b6040518082815260200191505060405180910390f35b6106a6600480360360a081101561065257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611afa565b005b6106b0611d59565b6040518082815260200191505060405180910390f35b610708600480360360208110156106dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d60565b6040518082815260200191505060405180910390f35b61074a6004803603602081101561073457600080fd5b8101908080359060200190929190505050611d78565b005b610754611fcf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107d8600480360360208110156107ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff5565b6040518082815260200191505060405180910390f35b61081a6004803603602081101561080457600080fd5b81019080803590602001909291905050506120c2565b005b61085e6004803603602081101561083257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120c5565b6040518082815260200191505060405180910390f35b6108b66004803603602081101561088a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612192565b6040518082815260200191505060405180910390f35b6108d46121aa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109586004803603602081101561092c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612258565b6040518082815260200191505060405180910390f35b6109b06004803603602081101561098457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612325565b6040518082815260200191505060405180910390f35b6109ce61233d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5260048036036020811015610a2657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d1565b6040518082815260200191505060405180910390f35b610a706123e9565b005b610ab460048036036020811015610a8857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612770565b005b610af860048036036020811015610acc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612862565b005b610b02612ab9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60046020528060005260406000206000915090505481565b6000610b8a7f8d30935436f9763ba510dd452958b894e82a2f2df9a715965b97948f5f6554bb60001b6120c2565b610bb67f540ab7eb13a723764abb54f31073978e1a056e582ae6a5a0462b01c9077e85c560001b6120c2565b610be27fe89437c01d8f61ffb579f3817688b3b2fbfaa05125a88b3c67261c31e48cd44b60001b6120c2565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c557f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b610c817f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b610cad7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b610cd97ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b610dc47feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b610df07f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b610e1c7f199ebc860835465e653d5f3529ded97a9d1d9022f6a04982dd25452629221ee460001b6120c2565b610e487f563873a770b8bec6c59dd33118c9e859a94e8aee7dab1c5aaa34a297fc5eaffe60001b6120c2565b610e747fe94c66a7af827134e7fe7641210fb3bc7410bb9ab0820d57284ad6983a9a039560001b6120c2565b610e7d816113f3565b50565b6000610eae7fb8636c7958b2fdcf394fbad77445c90a04f8af4b6ad54b77f1a699e3368d679b60001b6120c2565b610eda7f51780eda96ae13557d50a5b0cc4f15a32d8df830427810f7cb0ee5d4c5138f4360001b6120c2565b610f067fc0ee94f7785a9e0558c697f8caf882ae82cbbd38140f3c8b1e051698035f586e60001b6120c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60056020528060005260406000206000915090505481565b60076020528060005260406000206000915054906101000a900460ff1681565b610f927f382d93b023531f50d6d42dbf5fe8f53204083df223b210824a01ef5f7520096660001b6120c2565b610fbe7fadc7fd506dcb3e07a4df382c007ba0ff2b382bb2e6a9753d634c5f84c9a9e5ac60001b6120c2565b610fea7fca342ce8f32afa93a60e822a8b9a4f120c7ddcaff19eed0f11ef7730bde2c32160001b6120c2565b610ff48182612adf565b6110207fcd7c4dd121825dfe35bd543ed991e5b92769ac7c2cb8cc905b68dcfc05e9c89a60001b6120c2565b61104c7f7367f857ab7ad88aa02bf5a6cc895925a742b39c9cbc26299bbfeff7b8a125e060001b6120c2565b61105581613306565b50565b50565b60006110897ff0f9cf48eee00d8f448690e37784a00c3bf23ea568148c965338e354a680222660001b6120c2565b6110b57f4fdf2705d02263a6902b49c2650d9c5eb2f6e6c188bbdf3d669517f00df9d43960001b6120c2565b6110e17f206f4dcaee767055ddbe59219dac22cf00ffc5d83e188ea173839274bba3162360001b6120c2565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6111617fb91b9b727b80d64410258aaaeb2918528367562dcb351fbd1347d559bf6c4da060001b6120c2565b61118d7fdfffe4fc27319050bc90f35199a1ee2f81aae6c04c243a07f47b829a24c24c5a60001b6120c2565b6111b97ffc9a8226693a490df5afc1bc05198b488e62e2bd169913a44814015ae75976fe60001b6120c2565b6111c233613306565b565b60006111f27f51b86fedfcfb91e992427db7b7bb8e4a5c18bd400e42cfb707b09e3f87f01bd960001b6120c2565b61121e7f22c8e3a309c720a2be6d2c9e0a35f67f2e09f39b5eeb08b95383cb975d84a97760001b6120c2565b61124a7fdec4cfd3d5a2b977603d79e7e261c177504206d10b0a7d090b71c1d06b8d5b8160001b6120c2565b600054905090565b61127e7fb582cf390bc69e2bbac202e7146ab40217adff3e1a610636e74e550273a68fe160001b6120c2565b6112aa7fc5c6a2503d880fbafecb6eca6cffd4e7e6ff32d94cfd5f333af4a08dc61b61e960001b6120c2565b6112d67f5945bb6025bd4be7317bf83d7156dfe74eaed755e7761781c9158d875170175660001b6120c2565b6112e03382612adf565b50565b6000806113127f6d21d91f53e64636833842af0b1ff2bc91c7deff6136dd6e5d84ea94b3f5629b60001b6120c2565b61133e7f7801a63eb869b2941daf4dac41de65d2eefb48d8356043ef087d0b91707344a560001b6120c2565b61136a7f1824962066b83997c42ddde0df8506b198d63cf5534af2fa4e98f0da27315a0260001b6120c2565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491509150915091565b61141f7f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b61144b7f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6114777fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b6114a37ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b61158e7feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b6115ba7f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b6115e67fd44bd0a5a8e1b1cf5c40e8686ea93068735e46e04ea8f7451f1dbe4b5663cb1660001b6120c2565b6116127f413a061529df923ef1df668287e71961f34c644bda5d9e7c50a1b688bc70d0ad60001b6120c2565b61163e7fa0947243ffec2f263e5a42db60281289ab7d30cf30c815dab76aff61fbb4c8d960001b6120c2565b61166a7fae293520888da26834f1f7d0a5e180bd2fd7b38315e3b43eb9880ec9f72d398360001b6120c2565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615f6a6024913960400191505060405180910390fd5b6117387fc94e9860303bddde773e258e690fd77fa94f62f34eef08dbeeb3caa6a1084ccb60001b6120c2565b6117647f07236db6fdb4f04851861d5a02b6b19e07aa173215ba87f713c843661572e31260001b6120c2565b6117907ff0a3ed86d5bf70a045cc857c964a0dfe3697009ba02afde0539b93640dac70df60001b6120c2565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118147fec8cd4d3ba6bf27673f2a51d49743c00e0efad87c40afe43a105b4534b6f900b60001b6120c2565b6118407fbb06e7a5566421d5268a045ca7a8df7c8b9180d63cfdcaf8868c914322ae9a0660001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce60405160405180910390a350565b6118c97f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b6118f57f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6119217fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b61194d7ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611a387feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611a647f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611a907f185510b26e4533633eb9e81fb4b278833126a4775ec9f935437561596b8fbf8260001b6120c2565b611abc7fc4030fe5ed91aa493625bb81b13feeecb9e75e87930bafb8fac1198a6452865060001b6120c2565b611ae87f51d743be5efbbdc9d2345ad2165a5a694d136119509a608dc84a2dcecdaf9e9960001b6120c2565b611af18161354b565b50565b60005481565b611b267f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b611b527f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b611b7e7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b611baa7ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611c957feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611cc17f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611ced7f21a9d6adbb1fd2de9a3b4799706cfb5dc3ee5c9af765ce13c20fdb74c70d1c4260001b6120c2565b611d197f7eb8a4b485304918653e2946f4e38710f4a2ad63d00554abb94b7c96d4d87ce060001b6120c2565b611d457fee20a448205dafb1c9c05e9e3994ab8008ffb03d46d12f8b589d8986f15cc00a60001b6120c2565b611d528585858585613982565b5050505050565b6224ea0081565b60066020528060005260406000206000915090505481565b611da47f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b611dd07f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b611dfc7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b611e287ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ee7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611f137feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611f3f7f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611f6b7f72a0cb4c872172de61485421f90edfb4d8b580103d590c9815615d237091e8b360001b6120c2565b611f977fe884888a461226ffd96fa58e88cac64db1c2a8e894e4fe7ebb766267f7b26b8f60001b6120c2565b611fc37f64794ea099490c3fdef8853b08d1bb0af5a67d5476535117e5aa01a4198ebbc960001b6120c2565b611fcc816143d4565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120237faa62d4170cca1279af59222ff9a3dd683190db71504fa7808a11f923f3fa446960001b6120c2565b61204f7f8b718ba75c06aeb0de3a5aa438ed8cc94723969ef94d5068fcf00aaeb66d7e9160001b6120c2565b61207b7fbb444eb32e956dd5e2d37c58284e3bdb898d19da6cf88ec9116b6bfd6a4a2a8260001b6120c2565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b50565b60006120f37f6cca1833a7ce056afde293c960b4f2537dd26784f8a782136db017fd40c9096460001b6120c2565b61211f7fa2d8e93e3e54cdb3a4b2be05ad5da16750f117ef63999c06dbf9089b22ecda5460001b6120c2565b61214b7fb8c1c0de814152d59088b12c96fded18e84d6f6fb43281820f77bf6e9b25718660001b6120c2565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60096020528060005260406000206000915090505481565b60006121d87fd581639942bd57930cb26494ed1b3c78df4df5f646cd5f8b2b5c68f75b924d0d60001b6120c2565b6122047fa92746ef821f9af86a5a2aa242d7c500a7a4f5a6aa936e45e2fc76fc5a5823dd60001b6120c2565b6122307fab2768db8421a0c4a45b361d9891d7febb37d69838636c7e2c8fe90600589de660001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006122867f73e1231b72914553ce72612130cb14ceb3ea72283d3da549062ea7d875eee8a760001b6120c2565b6122b27fc431eaf4e43e60aadf886c5a1e82e5602b3d7842ed669f7643af99e0efe78a4f60001b6120c2565b6122de7ff4bf8ff9452e138ad4fe4f977582d11086773eb283e291a0184982fde2da3c1560001b6120c2565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60036020528060005260406000206000915090505481565b600061236b7f410111e00ef9ea45fc8fe867b2dd3eb522b31a8ac610bc223fd87a135907b5dc60001b6120c2565b6123977fe1f47c334c4e9ac1b77463fb4c86c993e198ef2af8158ee26e70a90732f4b3c660001b6120c2565b6123c37f3ed97b31d10d9a32d15072a2b0ad8c3464a76d6b4e835e77b51ebbd9c754f6a460001b6120c2565b6123cc33614612565b905090565b60086020528060005260406000206000915090505481565b6124157fc9b6161bb463010133b07b3749dab52b3b5bae2ffa5b0ff771e4fef924920d2160001b6120c2565b6124417f956b27ac437c4177acf2f585d679a7be824018549fd6a06e59ec7233953fea7960001b6120c2565b61246d7fb0735d6f0b9c25f5f6203d19e16f4b02a736026c69752d5916e6f71e83812c6460001b6120c2565b600061247833614aae565b90506124a67fe696d5a9526c91685a4614699f77b000bcc2cb035a6cfe7328a6aa299314643760001b6120c2565b6124d27fa346e4761b70576222cdc29bd041506125aa6ffb80e99f2513dc0396d2b7d75060001b6120c2565b6124fe7f1e0acd9d879f08925c14ccb1a2be1b6ff30b93bb33efe31099881695c33697d260001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b15801561254457600080fd5b505afa158015612558573d6000803e3d6000fd5b505050506040513d602081101561256e57600080fd5b8101908080519060200190929190505050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414801561268a57508073ffffffffffffffffffffffffffffffffffffffff16630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561260d57600080fd5b505afa158015612621573d6000803e3d6000fd5b505050506040513d602081101561263757600080fd5b8101908080519060200190929190505050600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b6126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806160e66023913960400191505060405180910390fd5b61270b7fedcc2b993deb24a268a31f29b0aeadd64f14cad64f21629bb4dbe26c763cfc3f60001b6120c2565b6127377f57b0e8fe5ec7cb3130f9a658584b9bd13dbdf7739a8cc97a4bc746c05581c4db60001b6120c2565b6127637fdba9e5889e452afdfe10e6b8afe1c40d17eaa101d67423b51150febcb8f4b7dd60001b6120c2565b61276d3382614c15565b50565b61279c7f8a345477d48d5c4876763e8543ab319c75e4a162841ec51453ff17080145877660001b6120c2565b6127c87f69de36af6f1868ff74eb03f10513d1a7d169a885219eccf3b49a68c322fd7b8760001b6120c2565b6127f47f8236a71187ed4b4f256819879b85f6f3d6fee1044971a09ad0ca9ca78d26a48f60001b6120c2565b6127fe3382612adf565b61282a7f9817baab47b1a224bd209595f3f433f7401137b769c7fbbeef71a519617afdf860001b6120c2565b6128567fa6e9521ce627d0abf4d9eafde16ab9e44241d35719ef6efedac81e8f88994dcc60001b6120c2565b61285f33613306565b50565b61288e7f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b6128ba7f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6128e67fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b6129127ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b6129fd7feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b612a297f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b612a557fa14fe3830a4c36831d7f5efe9e432a58097763811f509158662eadc5ae5917e560001b6120c2565b612a817f2885d693c641f52d08156618f9f73d171fae6b6660c227fa5c80213a9ef9904960001b6120c2565b612aad7fecca3a7f5f9ce183e3b4c016c435c9f543fcc3d10f0f4fdefb65062049cfcf9a60001b6120c2565b612ab681615105565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b0b7f32d1b74cc50d16562974e82f053f152d08e1bb420e63931fe9b5548a2bd8194160001b6120c2565b612b377f1abcf5dbb19ca541ee32650c8d112828f082170b302d16d5a773d5e7564d837060001b6120c2565b612b637f9758af99550fa21a43fd8f7ff032795ca121478eecb185975b1190737cfd7ab160001b6120c2565b612b8f7f0dc75cfdeeb4f9f45072e6495ac1995aa97020794bb9c8176a2ae13f5f85c1ef60001b6120c2565b600080541415612bea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806160756022913960400191505060405180910390fd5b612c167f8b2a4d4c360cc2484c70c9a9bc8c2509849e5aa23fddfd83279a144e2361182260001b6120c2565b612c427f044e09fc509c9773bb976a1b726e44622d5a2657d467b373dd5c5c7ea7db388d60001b6120c2565b612c6e7f28c85247847e3581a4d13260fd45b3d97ab1443e6bca3b40ceedb79f92f4d73e60001b6120c2565b612c9a7fd9484fd18ba5d363b2031df5a9295c2270e5ac91c89ebb88f4c819f3fd24701d60001b6120c2565b4260005410612cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615fb2602a913960400191505060405180910390fd5b612d207f59c7059dcc5c3f2b92467ad40a7ea55a33e7840fb0968e42b96a2996966b92fe60001b6120c2565b612d4c7f9a8ed0e72d8e07021da192b401b38d39f235fc59db778d6f7e8d2d46dc13afe060001b6120c2565b612d787fc1c47e132db7835f40e66c902a83846ca56226491c2239bb55744318497afd5f60001b6120c2565b6000819050612da97f12df37e7c609a9266da89a1bc569fa090c6ad938fcc150a2413e4a435fe371ae60001b6120c2565b612dd57f5fa5d1e4013ceb89c9335056ebeb83bb5f8cb76bb4d8e5bb5a9eb7284fc2fb4f60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e9657612e367fcb0a00123a753151361074c70cee2b2d91d0304f6588e422759ebe04d4c6490460001b6120c2565b612e627fa6d4da324a5de41fea5db60e4df1902776e66f7f509e95be5aef8de53016bf2760001b6120c2565b612e8e7f6aaef27a6b716a0c22d672c70b57623d539c47ec9aefa2a2e63c61d2ee04452160001b6120c2565b829050612ec3565b612ec27fceca843deb6474bc8a1191d4d0a5ab2aeb7630cc6199606ce51e50c3e81862ac60001b6120c2565b5b612eef7f3b9fa9174dc6a4df4dc32fa9ed7ac7a4ad41138b23992e0e32995f37c9356bd860001b6120c2565b612f1b7fe72fe8b7995975f8e43e041a03b116eb5b7e3ba3825986ca73b041e76677ebd260001b6120c2565b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612f8b7ffd340739b7a2c38ae28baa65c897a82da8873f8c782f7bb81650c8c8dbd3182c60001b6120c2565b612fb77f298b1cb32cce7c3c3a683636fa7fbcd793e9c765bc02f426fa2cde06a8d8802d60001b6120c2565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130287f9ab63a8a3fe7cc91de6d80ee7b9d58d61d586f2b285fd1c9843a1eb9eacdead260001b6120c2565b6130547fb013a37e78aa2d0477a3339ccc81cc15daab83c6e480f1fee57e12248cd7aba960001b6120c2565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130ff57600080fd5b505af1158015613113573d6000803e3d6000fd5b505050506040513d602081101561312957600080fd5b810190808051906020019092919050505090506131687fb52cf5bec8ea5f7740d5f106b51e9f48043e54aea5d1b44b2b7a031917eb8c0360001b6120c2565b6131947fbfbcf3b75bb4c7a828f089c50140ee2348a61442ba222d6c5db7192a019f90d360001b6120c2565b6131c07fd7dfa52a48ab69979694c9fa26d8ccf10a13b50c29e8799eb48a9e9531da2abf60001b6120c2565b80613216576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180615f246046913960600191505060405180910390fd5b6132427f9821cdb90d8dbb520d9787cf22665329f055aaaae5a0076c46e8f352cfe129d460001b6120c2565b61326e7fb46cdacb2840ef568a3c58e3e42155b9e9490c6e2380320bffb91c2cfc1f961760001b6120c2565b61329a7fdb12fa92c7609773d48220182794f03c4ce1140c7d56e73be39c86b30306a34e60001b6120c2565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6133327ff2f6aa91ba57661874aba566e7c9eb97c0ce0af60a04acd51e253bdc478fa7a160001b6120c2565b61335e7fa52ecb22b17614096a67aa7139209b6836e8905e5f4452bfb14bc03876ee0e2060001b6120c2565b61338a7fb1fd726d0379bd894395ba13777c96880bcc4203fbdcb7f5cf6b7c8d0c0c21e760001b6120c2565b600061339582614aae565b90506133c37fc21ba7f7c1927e8b6d2353cb128b2a0370fa4d5524d9a3f0f1e964630dcc300d60001b6120c2565b6133ef7f1c13d451ad86d5806bca5b1fc6edfd66aca99e858a7d15029fb4017235cd93f560001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156134b8576134507fea0eaed7eef9dfefa8a117d7f8f49b5fac08cfa69d0ffd93681e04a4a9f3f34a60001b6120c2565b61347c7fc73b7c611574449ac1805d22452156c2b6a8b610ecf792c5c492be085a8f4dc360001b6120c2565b6134a87f858b6b1b7b76300c4bc2637e7d0f837152627611e8997eba542112f6a3ec089360001b6120c2565b6134b182614612565b90506134e5565b6134e47f51b6041242fe87c23613c4ca83c0ce6cc782f984daa1175b5282198f4cbae01360001b6120c2565b5b6135117f179004e13c69c281c926ed9a60d5197d533b662af042352a71862de1d486126b60001b6120c2565b61353d7f14b43749593568faccdaf6c0f2da5fec840b3e8fe509e834b96b6fb1ae14d83960001b6120c2565b6135478282614c15565b5050565b6135777ff18828f34a77d25fd2a204d334ae8c7b2b0d98ae51df09f97d54f49563d6834c60001b6120c2565b6135a37f7e1d277935cf039dd06e2f077f2fb3e92eed84a15a655dfb01efe6784dc1802d60001b6120c2565b6135cf7fe69fb858002425942ccd46bf74bcb82d08e11a613d73dad7feaf5fe333df716c60001b6120c2565b6135fb7fbebccc5bfed7845ceddfadd20eaca584f424d9d9c7204e543499cb92efef0fca60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561369e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4c6f636b656446756e643a20496e76616c696420416464726573732e0000000081525060200191505060405180910390fd5b6136ca7f7743e52bcb6872bf1d1a937ebffe9f93c9cf6cfffb1bf3ac5c947c84e799c54b60001b6120c2565b6136f67f9f8622f8282425a9cf50dd7a52322b2ad4c903f8e62cdc6745d32739db7ef8c260001b6120c2565b6137227f3d124cacafc426f63ea78db7a3bd7621a904df790271474212172e5dda5bc24c60001b6120c2565b61374e7f11397a69873ece5b3016d5f0f65eb0f51d418c7b8e6995442a3ee8397d16504560001b6120c2565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156137f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806160976025913960400191505060405180910390fd5b61381d7f3dc3b3cf7884ec478650b70fd4882a0c18568511fd8ca387834303e35572414960001b6120c2565b6138497f3bd22af39de246e0772e4ff2b3b658497468aca05614d8772890732d3ff0d05e60001b6120c2565b6138757f5d29ca3aa4f9c24c944ebad343879784c0b979dd7bce772475ac26142fd40c7060001b6120c2565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506138f97f1b52293c92f7800ec1b7dd5149bccc729b7e1599fc3610c2808db0974f694a4960001b6120c2565b6139257f3e6b6bee3e1f8cbe9adff4eba70247b9ba8ce5db4391da18ba233600c2dca11e60001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a350565b6139ae7f5a7a4a8cd4eaed25a4abce89994aed5294195b3b0dce256f325c75c679a333f260001b6120c2565b6139da7f2ea55fa634713a02b5d6764e96fc31afa709e45e72e8b9667a85d9d5af41ab1660001b6120c2565b613a067f157208259828fd14e6db7c4c1fb519aa08d05e8f34094be9c284a326abdf031860001b6120c2565b613a327fb6bf6d447545e6a05b6d1d4e2ad50d22c22889c7f038a18a98e2fec70165337960001b6120c2565b6000821415613a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615f8e6024913960400191505060405180910390fd5b613ab87fe6c1959a4bd7642de42aa166d79e92f8c040f7a2a9b9da551d0e7dd266a8031760001b6120c2565b613ae47f72ebec2be4c64905c5190d3476d5fac853390d90e7cb030878356c4884492fea60001b6120c2565b613b107f657b203a0ab3025e05e209a75625e8e0e326abf328416dc5b0543b685cc852d660001b6120c2565b613b3c7f5ed0253e0e090a4bbe09ca14086f8bc78434ae36fa6463c54f1c3f368dec345360001b6120c2565b60258210613b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061602f6021913960400191505060405180910390fd5b613bc17f2eed951e0f6fd85710b5ddacc0c441d570d487ad3d9d6bb3ce74c287c28eae5460001b6120c2565b613bed7f06b0c5e165e6b159b79071367de627eb9406eba71179a88e94c994659997383d60001b6120c2565b613c197fa1eb142fecc059a467791ca6d6d916bc7049adc667f5660a0a95fb84d9ce610660001b6120c2565b613c457fe1c512f481e37ada1c419df8141bc3123fce9186fb456bf10442ca84afb0473960001b6120c2565b6127108110613c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615fdc6032913960400191505060405180910390fd5b613ccb7f4253d588a70c7932665c1fef05bdbce22dc7b675a4a5626a90b995294c9c396f60001b6120c2565b613cf77fc242cedfee87f54a801135683992ccbc0d0ae84ceb8ceb85f886488358947aab60001b6120c2565b613d237fea8c76a324989741e1dd0a9d1938853daefd5e77df28f1745d2c8cd622e299a960001b6120c2565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613e0257600080fd5b505af1158015613e16573d6000803e3d6000fd5b505050506040513d6020811015613e2c57600080fd5b81019080805190602001909291905050509050613e6b7f6f3212c288a091864b826af7cdfc5895d4eecd85115d69cbe24612e4cfc47d3860001b6120c2565b613e977f371fdd23407273151153089a7d8ead8dd2a23b631b156d17c55ec18a7a00ce6e60001b6120c2565b613ec37fb145cd25e93b0c3d1289d4013a60e3a92f05eb2c7ce3bb2508143547524e934760001b6120c2565b80613f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180615f246046913960600191505060405180910390fd5b613f457ffd7f9919678fa90bd5a0197e1d95f21b9fc319f0daf8fa43f83f734a25a0625560001b6120c2565b613f717f8c03b4278000ac923acdf3bb7f44bd699f67061267ac0506f5dce4662d85d22060001b6120c2565b613f9d7f25a8823d3e88d176ff318d07f8a70764545891a2c53df8172b2bbeb6f2986fe660001b6120c2565b6000613fc6612710613fb885896153b590919063ffffffff16565b6156cf90919063ffffffff16565b9050613ff47f785eb8af4bbc16ef7f37647b0a9e6042d83e3c60dbdbf8095919c3405e7a170c60001b6120c2565b6140207f97572340a11e9c9ba0709fa6c0235b126bae0f0b847f77a455566a7d93cdca3060001b6120c2565b61407281600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461579d90919063ffffffff16565b600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140e17fadd1acf0558b4df378e30ee799df9098c787a34db3c977bb6231bfbb47cbbda060001b6120c2565b61410d7f7ff04435c561f5dc27abad6c9b50bbf086c7047a5f114602c32e97730cc3ee5d60001b6120c2565b6141718161416388600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461579d90919063ffffffff16565b6159b290919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141e07f4e1ba96dc6dff93cd4b0ebdd540fb6b9492977f4c01f6b6a4cc684b63547c35060001b6120c2565b61420c7fe87f7523fe7dab0124360bae8f11fe0103d7d2ed7171cc712ff9f3b7c78124b260001b6120c2565b6224ea008502600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142817f8fa49e8ec1acb1c8f61af22aa79df5a600ca9c0589f9607be7a9d2586495405560001b6120c2565b6142ad7f5285cfdf1009da32f49963f221a40b03b4ae76728d108f047aab6e33af37be4c60001b6120c2565b6224ea008402600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506143227ffddfb9e3c8aa09f940363e40c5592c355be323a85a1d97f0b8d1c12ff534123960001b6120c2565b61434e7f45108368a3cfb977088f1abe4f46f7ddf2b4039728eaa6a8afac558c6a23262960001b6120c2565b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a888888886040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050505050565b6144007ff2de3703434f4415d392044b2002bf19052f7d34e8e414c9211f70bb9efeeea060001b6120c2565b61442c7f8eeb39b944b7e122a8ccf6531dc802ff8b07024e9a755bf85324358d8f2ea7fb60001b6120c2565b6144587fa217a7a5a481254b17960363327bc44da12c57c0446f197c2453aa637a4d6b3060001b6120c2565b6144847fb38b09ea1ce8acd0b415e30a3ae35c65793a4e1cb58ba5a849d09f738416c07660001b6120c2565b60008114156144de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806160506025913960400191505060405180910390fd5b61450a7f97d122643e292d81b5791e4c087b9666a84128e1a8190a996b942ddabcfa3d3f60001b6120c2565b6145367fbd7d4313f21bef8a2bd6e6a6a9b6b8363f25128f70b3fc6bf43cf9f919630be660001b6120c2565b6145627f778665f1c1361780f502c9c40634f21e09027025bcdd4b4559aad4fb34890e2660001b6120c2565b806000819055506145957fd281c46a21343f29aba5e462dc693ee3044c3a7196cade580f93f1e332f0a92d60001b6120c2565b6145c17ff841ddb5987747e91d4aec7afbc303ddc406ccf020e4d9447dfb4a6dcef9fcfa60001b6120c2565b3373ffffffffffffffffffffffffffffffffffffffff167f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94826040518082815260200191505060405180910390a250565b60006146407f099f0f4beeab2d0d5cfc3ed6f138c76f54d9d12d77632ac7804bed5d63ee6a8060001b6120c2565b61466c7f15cd849300d0cff158bd75207e492192e0295f70644b5f4724230661b274b44e60001b6120c2565b6146987f9a67bf8a00c89a911f932c5beb691d0440d62ef939be823ef70d442d123967d760001b6120c2565b6146c47fe63e824a9bc7f2d2070611413f079002396a3d1249045dc306fc13f7f93c755860001b6120c2565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415801561475457506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b6147a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806160bc602a913960400191505060405180910390fd5b6147d57fd36eb2707a929bdb9a82d43f125ed9f218c00f2a6349a2f8ec307708e8d101fa60001b6120c2565b6148017fa13b9cb0ded95be2ef3d610472bacb461d86efd966cc54da338d358b25c5052860001b6120c2565b61482d7fc431137e542fba43a12946ab234f1b3348051f808ecb3e400e548d6f2e5492cd60001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630665a06f836000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b15801561496557600080fd5b505af1158015614979573d6000803e3d6000fd5b505050506149a97feb84e2e98f750099f6a12a17b228af6efd14a45da9e69be26ae85d53c515c55f60001b6120c2565b6149d57fe8839bdbfa2bdbe86ab6787c83e7b71342245fde9588f805178faef4218ff64160001b6120c2565b6149de82614aae565b9050614a0c7f46c4cb90b19235ff6fc55c36f5cab4c48da6b5b8d21f3c76ae7b26c2fc3227db60001b6120c2565b614a387feb82bf1014f20ad76c1c4f125593e206ad75ae708562bc456b6f67551d5c9bce60001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6000614adc7f8e56a657ee9eeb3841541aaac5ac2331d9fe55b98ba2604ff388324c3304f94160001b6120c2565b614b087fa56f2526df98a4a70429179464d83e976b8e368014d183fa1d1c1626ddb743f960001b6120c2565b614b347fee62d1035803aaafaa50e3933f0c497ee2a20a70f029681972e31474307e125860001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cc49ede7836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614bd357600080fd5b505afa158015614be7573d6000803e3d6000fd5b505050506040513d6020811015614bfd57600080fd5b81019080805190602001909291905050509050919050565b614c417f67d7a523c6f24336e024fa1df492c977d7c45c6fabbcd04f65f6507c577b462c60001b6120c2565b614c6d7fbb54d59daf6decb198ad8eedf74bdbcd6ad7ab89808f3b18f4368677140ee28f60001b6120c2565b614c997fe1fab23ebdc2c288439ffaeaf42d881626225d35a4821134710cd5801ef61bb960001b6120c2565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050614d097f6810bbb868a8216ac25357ea1ef57233aad728bd62c242eed32ed9f39b7e111b60001b6120c2565b614d357f63d84521e884c74b1fe88b373f6febb7ba4662bf4024653f0eba75f3815c33a560001b6120c2565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614da67f36b2a7113f91194c9a121ee53ed579159bc757a407eb6587325b8cffef5a668360001b6120c2565b614dd27f83543865e5dc44996ed2a9a837377fa8ed9df96577e25fc05ed06955644d924160001b6120c2565b614dfe7fdfe401b06ceea015e072c2d169acb077d0dc07536c0f8edfe4d2f3b4ef9973c460001b6120c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614ea757600080fd5b505af1158015614ebb573d6000803e3d6000fd5b505050506040513d6020811015614ed157600080fd5b8101908080519060200190929190505050614f54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4c6f636b656446756e643a20417070726f7665206661696c65642e000000000081525060200191505060405180910390fd5b614f807f1e7d28e374b4ad17a701f458bfc23c911dccaeff672d9a612ba9dccd5e5a7b2860001b6120c2565b614fac7f4f755a415ac5cda9cd6382b525ba935b084793a9bfece614cfc557ac15751a9560001b6120c2565b614fd87f9c25cbcd62d96a993bf63d2f683525dc41f4e9afc4974a16356111a70728849560001b6120c2565b8173ffffffffffffffffffffffffffffffffffffffff16637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561502b57600080fd5b505af115801561503f573d6000803e3d6000fd5b5050505061506f7f85730c4b1ed5602564ee4ca31b9c2186db04dc3c2442acdc60cc7018657b4fb760001b6120c2565b61509b7f158adb9e1c2ba2701a3774d50f2bf0b454ca0149a9017067c1a27d97556bbdc460001b6120c2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b836040518082815260200191505060405180910390a3505050565b6151317f1c2e0ab2daa50c6af223e5a4a38cda73244e06754019097bac898d3a8d0ad72b60001b6120c2565b61515d7ff709447a43d916016620baffa27e0b612c237dfde458a4cd3158a24f95e59c5660001b6120c2565b6151897f072ca76825e34184e852e51358abb0403ef001ce51650bb3e3270104cece56c860001b6120c2565b6151b57ffbf68d9cba3602380a8dd1ea5133db55631c6cacf3ae6134922c59642f9f233c60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561523b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806161096030913960400191505060405180910390fd5b6152677f632367eae68bc60b4b3ed9477d92656f8d6385849cff8a98fb471c4ab72a6f2960001b6120c2565b6152937fe7dde9282727830d8509f7af4624b918a6f95fe48dcaf6b5360d028443839f3560001b6120c2565b6152bf7f1c6020d90b840db2fedeedf9fd0518b690cce2e8392ebe6f9455a97eb9e875a960001b6120c2565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061532c7f9d988d582446515dd8de8177f2f020288f17d4e406967c6a2f07fa08a5de473b60001b6120c2565b6153587ffcc3a502f003451fda9ba1c6236e289cf035e776d54d9424ad2e2701a513380660001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e760405160405180910390a350565b60006153e37f44698d1e9a904ed1284ff1ffbc3dd61250c83d2c71afd5df19fbf19c6190a1c260001b615a80565b61540f7fa3a4b98cb2a23eda9dbb54b77b676d94ca9d1d4bafcc15caee09e68074b0ef8d60001b615a80565b61543b7f3c0e96b55c01aeef942723329b7f27779568810ddd00a05282ffd2e3b5d233d760001b615a80565b60008314156154d1576154707ff802f4a238c6bfb87737692d90643ed6d1e91071b816804127f57dca78bfaab660001b615a80565b61549c7f9c7552f9a426f225c2850fa12a0dc5fb398b1adc4885e41fd5a32fae1dbf05d760001b615a80565b6154c87f88253dfa1829ebe573c7def7f8d624e362791a1e5da86330776d1836a357555360001b615a80565b600090506156c9565b6154fc7ec5af928e6c63fb10ff91a6c5a4e910c4f39f595f742d8e52dc11b03ad6250f60001b615a80565b6155287f5e551b5129d493f012d238e272eb615eaa6959509de842125d5c3b203db4ec2660001b615a80565b6155547f6eeef49995c967235a764d0bfc2ddf3ad4e6890ca3a3e7024c52da8393db1ce160001b615a80565b600082840290506155877fab80a6313ea3c5926e33d7cfa6c464eb729cc09a2e212bce50dc9d97fae0ed7260001b615a80565b6155b37fcf8cc8694fe56eef0897d8bf5580925daf8927e537ada7fb46a3727fe18d423260001b615a80565b6155df7ff5b30a17ff5e5b532b98d8059efeb460d05236f98b90e61b8794894cfad8502d60001b615a80565b828482816155e957fe5b0414615640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061600e6021913960400191505060405180910390fd5b61566c7f9fdef838f8fa27d2dbdb6cfecf3f275aa85c5ae07d712150d6e17c19c215bfd560001b615a80565b6156987fe9975f5879861c66ca2a2d35617f5a37951b7cf797008080c2db7371f45b3b1460001b615a80565b6156c47f1040ca89b272f25ce391ff02203288f6f7b9bee30a94da64205ca6d937da6b3460001b615a80565b809150505b92915050565b60006156fd7f996468adab2cfba5de081e00c611ca70c15d8fec7d5bf522494a62c1469ffa6a60001b615a80565b6157297f9f1ba2348d57cab76c102a92e631d7e3d939d3a1ce6cb3a01a504d1656b19f5060001b615a80565b6157557f46d4aa33cd017349564c3524038979baabbfc921b9cf218610f32f2cefa7e6de60001b615a80565b61579583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615a83565b905092915050565b60006157cb7fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b615a80565b6157f77fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b615a80565b6158237fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b615a80565b600082840190506158567fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b615a80565b6158827fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b615a80565b6158ae7fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b615a80565b83811015615924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b6159507f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b615a80565b61597c7f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b615a80565b6159a87fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b615a80565b8091505092915050565b60006159e07f692a0cfdea6cb12cdfcaa599c058fa5662531cebd540556a6d1c27ae01b4cea360001b615a80565b615a0c7f2cce8d8afd666e4919d1ece0b47a35eda094c843996926984c8b17a0d5cd2f7160001b615a80565b615a387f936781d4063de1913a3eda99a7c2145fe8a9c61ba2abe4fa4e7dd270bf8b933960001b615a80565b615a7883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615cd7565b905092915050565b50565b6000615ab17f196dd912071b7ac5c8a10b8a236898e903a5c95f5189a9aeb16dc1191096752060001b615a80565b615add7ff25ec16e9c80532b14a66f8cd16ae291eebc856235e409a39c3fbd9dc53e53fb60001b615a80565b615b097ffb609f676697fca43f3242dd637f8af44d19e0456d05ec1547a1557478b8a1ea60001b615a80565b615b357ffc25a7e532044dc446303b3445457a6ba5f30c2ec2085a7b37e4ae0e05b09ba260001b615a80565b60008314158290615be1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615ba6578082015181840152602081019050615b8b565b50505050905090810190601f168015615bd35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50615c0e7f295ce5b61523fe81f08b0e41715a55fb7cc4323fa58af5f536a59e28b507ad6660001b615a80565b615c3a7f4460e22500904e71005e8ef95355467cd96d8038ca3b358379ef52915f4cd11a60001b615a80565b615c667f898838ee4191c5d93d43aba28d5dace210f5b5fe59d06155be60fc494d99a9f060001b615a80565b6000838581615c7157fe5b049050615ca07f6d2a274d329c86c87e9d63cea7c87a6fd3d3ca9ab129144ff43f4724a38a4a5960001b615a80565b615ccc7fbb4fe2c1c37d48811af5ff17eb49f43a22d0b33ae049d66f26c63e5ac81928dc60001b615a80565b809150509392505050565b6000615d057f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b615a80565b615d317f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b615a80565b615d5d7f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b615a80565b615d897fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b615a80565b838311158290615e34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615df9578082015181840152602081019050615dde565b50505050905090810190601f168015615e265780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50615e617f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b615a80565b615e8d7f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b615a80565b615eb97f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b615a80565b60008385039050615eec7f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b615a80565b615f187f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b615a80565b80915050939250505056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a723158207f62dae5e609d06a020f3af63364576272b32cd2f9bfd3c84e0615da999df87764736f6c634300051100324c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20496e76616c696420546f6b656e20416464726573732e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642e", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806389facb201161011a578063c227cbd8116100ad578063cdce101b1161007c578063cdce101b14610a10578063ce46643b14610a68578063e554586414610a72578063ec3ea7d414610ab6578063fc0c546a14610afa57610206565b8063c227cbd8146108cc578063c408689314610916578063cb3fdb611461096e578063cc6f0333146109c657610206565b80639114557e116100e95780639114557e14610796578063a2dcc234146107ee578063aaba2c0d1461081c578063b36760a31461087457610206565b806389facb20146106a85780638c8ba66d146106c65780638efd94f31461071e578063904c5b8f1461074c57610206565b80633e4a89d11161019d578063594092db1161016c578063594092db1461053757806361ade4261461059657806370480275146105da57806377a69b521461061e578063849a68171461063c57610206565b80633e4a89d11461046f5780634558269f146104cb5780634c2a295c146104d557806355e715cf146104f357610206565b806324276777116101d9578063242767771461034957806324d7806c146103a15780632b6df82a146103fd5780633a2cb6431461044157610206565b80630483a7f61461020b578063129de5bf146102635780631785f53c146102bb57806321df0da7146102ff575b600080fd5b61024d6004803603602081101561022157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b44565b6040518082815260200191505060405180910390f35b6102a56004803603602081101561027957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b5c565b6040518082815260200191505060405180910390f35b6102fd600480360360208110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c29565b005b610307610e80565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61038b6004803603602081101561035f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f2e565b6040518082815260200191505060405180910390f35b6103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f46565b604051808215151515815260200191505060405180910390f35b61043f6004803603602081101561041357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f66565b005b61046d6004803603602081101561045757600080fd5b8101908080359060200190929190505050611058565b005b6104b16004803603602081101561048557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061105b565b604051808215151515815260200191505060405180910390f35b6104d3611135565b005b6104dd6111c4565b6040518082815260200191505060405180910390f35b6105356004803603602081101561050957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611252565b005b6105796004803603602081101561054d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112e3565b604051808381526020018281526020019250505060405180910390f35b6105d8600480360360208110156105ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113f3565b005b61061c600480360360208110156105f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061189d565b005b610626611af4565b6040518082815260200191505060405180910390f35b6106a6600480360360a081101561065257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611afa565b005b6106b0611d59565b6040518082815260200191505060405180910390f35b610708600480360360208110156106dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d60565b6040518082815260200191505060405180910390f35b61074a6004803603602081101561073457600080fd5b8101908080359060200190929190505050611d78565b005b610754611fcf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107d8600480360360208110156107ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff5565b6040518082815260200191505060405180910390f35b61081a6004803603602081101561080457600080fd5b81019080803590602001909291905050506120c2565b005b61085e6004803603602081101561083257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120c5565b6040518082815260200191505060405180910390f35b6108b66004803603602081101561088a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612192565b6040518082815260200191505060405180910390f35b6108d46121aa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109586004803603602081101561092c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612258565b6040518082815260200191505060405180910390f35b6109b06004803603602081101561098457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612325565b6040518082815260200191505060405180910390f35b6109ce61233d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5260048036036020811015610a2657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d1565b6040518082815260200191505060405180910390f35b610a706123e9565b005b610ab460048036036020811015610a8857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612770565b005b610af860048036036020811015610acc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612862565b005b610b02612ab9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60046020528060005260406000206000915090505481565b6000610b8a7f8d30935436f9763ba510dd452958b894e82a2f2df9a715965b97948f5f6554bb60001b6120c2565b610bb67f540ab7eb13a723764abb54f31073978e1a056e582ae6a5a0462b01c9077e85c560001b6120c2565b610be27fe89437c01d8f61ffb579f3817688b3b2fbfaa05125a88b3c67261c31e48cd44b60001b6120c2565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c557f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b610c817f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b610cad7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b610cd97ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b610dc47feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b610df07f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b610e1c7f199ebc860835465e653d5f3529ded97a9d1d9022f6a04982dd25452629221ee460001b6120c2565b610e487f563873a770b8bec6c59dd33118c9e859a94e8aee7dab1c5aaa34a297fc5eaffe60001b6120c2565b610e747fe94c66a7af827134e7fe7641210fb3bc7410bb9ab0820d57284ad6983a9a039560001b6120c2565b610e7d816113f3565b50565b6000610eae7fb8636c7958b2fdcf394fbad77445c90a04f8af4b6ad54b77f1a699e3368d679b60001b6120c2565b610eda7f51780eda96ae13557d50a5b0cc4f15a32d8df830427810f7cb0ee5d4c5138f4360001b6120c2565b610f067fc0ee94f7785a9e0558c697f8caf882ae82cbbd38140f3c8b1e051698035f586e60001b6120c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60056020528060005260406000206000915090505481565b60076020528060005260406000206000915054906101000a900460ff1681565b610f927f382d93b023531f50d6d42dbf5fe8f53204083df223b210824a01ef5f7520096660001b6120c2565b610fbe7fadc7fd506dcb3e07a4df382c007ba0ff2b382bb2e6a9753d634c5f84c9a9e5ac60001b6120c2565b610fea7fca342ce8f32afa93a60e822a8b9a4f120c7ddcaff19eed0f11ef7730bde2c32160001b6120c2565b610ff48182612adf565b6110207fcd7c4dd121825dfe35bd543ed991e5b92769ac7c2cb8cc905b68dcfc05e9c89a60001b6120c2565b61104c7f7367f857ab7ad88aa02bf5a6cc895925a742b39c9cbc26299bbfeff7b8a125e060001b6120c2565b61105581613306565b50565b50565b60006110897ff0f9cf48eee00d8f448690e37784a00c3bf23ea568148c965338e354a680222660001b6120c2565b6110b57f4fdf2705d02263a6902b49c2650d9c5eb2f6e6c188bbdf3d669517f00df9d43960001b6120c2565b6110e17f206f4dcaee767055ddbe59219dac22cf00ffc5d83e188ea173839274bba3162360001b6120c2565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6111617fb91b9b727b80d64410258aaaeb2918528367562dcb351fbd1347d559bf6c4da060001b6120c2565b61118d7fdfffe4fc27319050bc90f35199a1ee2f81aae6c04c243a07f47b829a24c24c5a60001b6120c2565b6111b97ffc9a8226693a490df5afc1bc05198b488e62e2bd169913a44814015ae75976fe60001b6120c2565b6111c233613306565b565b60006111f27f51b86fedfcfb91e992427db7b7bb8e4a5c18bd400e42cfb707b09e3f87f01bd960001b6120c2565b61121e7f22c8e3a309c720a2be6d2c9e0a35f67f2e09f39b5eeb08b95383cb975d84a97760001b6120c2565b61124a7fdec4cfd3d5a2b977603d79e7e261c177504206d10b0a7d090b71c1d06b8d5b8160001b6120c2565b600054905090565b61127e7fb582cf390bc69e2bbac202e7146ab40217adff3e1a610636e74e550273a68fe160001b6120c2565b6112aa7fc5c6a2503d880fbafecb6eca6cffd4e7e6ff32d94cfd5f333af4a08dc61b61e960001b6120c2565b6112d67f5945bb6025bd4be7317bf83d7156dfe74eaed755e7761781c9158d875170175660001b6120c2565b6112e03382612adf565b50565b6000806113127f6d21d91f53e64636833842af0b1ff2bc91c7deff6136dd6e5d84ea94b3f5629b60001b6120c2565b61133e7f7801a63eb869b2941daf4dac41de65d2eefb48d8356043ef087d0b91707344a560001b6120c2565b61136a7f1824962066b83997c42ddde0df8506b198d63cf5534af2fa4e98f0da27315a0260001b6120c2565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491509150915091565b61141f7f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b61144b7f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6114777fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b6114a37ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b61158e7feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b6115ba7f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b6115e67fd44bd0a5a8e1b1cf5c40e8686ea93068735e46e04ea8f7451f1dbe4b5663cb1660001b6120c2565b6116127f413a061529df923ef1df668287e71961f34c644bda5d9e7c50a1b688bc70d0ad60001b6120c2565b61163e7fa0947243ffec2f263e5a42db60281289ab7d30cf30c815dab76aff61fbb4c8d960001b6120c2565b61166a7fae293520888da26834f1f7d0a5e180bd2fd7b38315e3b43eb9880ec9f72d398360001b6120c2565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615f6a6024913960400191505060405180910390fd5b6117387fc94e9860303bddde773e258e690fd77fa94f62f34eef08dbeeb3caa6a1084ccb60001b6120c2565b6117647f07236db6fdb4f04851861d5a02b6b19e07aa173215ba87f713c843661572e31260001b6120c2565b6117907ff0a3ed86d5bf70a045cc857c964a0dfe3697009ba02afde0539b93640dac70df60001b6120c2565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118147fec8cd4d3ba6bf27673f2a51d49743c00e0efad87c40afe43a105b4534b6f900b60001b6120c2565b6118407fbb06e7a5566421d5268a045ca7a8df7c8b9180d63cfdcaf8868c914322ae9a0660001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce60405160405180910390a350565b6118c97f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b6118f57f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6119217fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b61194d7ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611a387feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611a647f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611a907f185510b26e4533633eb9e81fb4b278833126a4775ec9f935437561596b8fbf8260001b6120c2565b611abc7fc4030fe5ed91aa493625bb81b13feeecb9e75e87930bafb8fac1198a6452865060001b6120c2565b611ae87f51d743be5efbbdc9d2345ad2165a5a694d136119509a608dc84a2dcecdaf9e9960001b6120c2565b611af18161354b565b50565b60005481565b611b267f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b611b527f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b611b7e7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b611baa7ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611c957feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611cc17f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611ced7f21a9d6adbb1fd2de9a3b4799706cfb5dc3ee5c9af765ce13c20fdb74c70d1c4260001b6120c2565b611d197f7eb8a4b485304918653e2946f4e38710f4a2ad63d00554abb94b7c96d4d87ce060001b6120c2565b611d457fee20a448205dafb1c9c05e9e3994ab8008ffb03d46d12f8b589d8986f15cc00a60001b6120c2565b611d528585858585613982565b5050505050565b6224ea0081565b60066020528060005260406000206000915090505481565b611da47f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b611dd07f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b611dfc7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b611e287ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ee7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611f137feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611f3f7f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611f6b7f72a0cb4c872172de61485421f90edfb4d8b580103d590c9815615d237091e8b360001b6120c2565b611f977fe884888a461226ffd96fa58e88cac64db1c2a8e894e4fe7ebb766267f7b26b8f60001b6120c2565b611fc37f64794ea099490c3fdef8853b08d1bb0af5a67d5476535117e5aa01a4198ebbc960001b6120c2565b611fcc816143d4565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120237faa62d4170cca1279af59222ff9a3dd683190db71504fa7808a11f923f3fa446960001b6120c2565b61204f7f8b718ba75c06aeb0de3a5aa438ed8cc94723969ef94d5068fcf00aaeb66d7e9160001b6120c2565b61207b7fbb444eb32e956dd5e2d37c58284e3bdb898d19da6cf88ec9116b6bfd6a4a2a8260001b6120c2565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b50565b60006120f37f6cca1833a7ce056afde293c960b4f2537dd26784f8a782136db017fd40c9096460001b6120c2565b61211f7fa2d8e93e3e54cdb3a4b2be05ad5da16750f117ef63999c06dbf9089b22ecda5460001b6120c2565b61214b7fb8c1c0de814152d59088b12c96fded18e84d6f6fb43281820f77bf6e9b25718660001b6120c2565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60096020528060005260406000206000915090505481565b60006121d87fd581639942bd57930cb26494ed1b3c78df4df5f646cd5f8b2b5c68f75b924d0d60001b6120c2565b6122047fa92746ef821f9af86a5a2aa242d7c500a7a4f5a6aa936e45e2fc76fc5a5823dd60001b6120c2565b6122307fab2768db8421a0c4a45b361d9891d7febb37d69838636c7e2c8fe90600589de660001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006122867f73e1231b72914553ce72612130cb14ceb3ea72283d3da549062ea7d875eee8a760001b6120c2565b6122b27fc431eaf4e43e60aadf886c5a1e82e5602b3d7842ed669f7643af99e0efe78a4f60001b6120c2565b6122de7ff4bf8ff9452e138ad4fe4f977582d11086773eb283e291a0184982fde2da3c1560001b6120c2565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60036020528060005260406000206000915090505481565b600061236b7f410111e00ef9ea45fc8fe867b2dd3eb522b31a8ac610bc223fd87a135907b5dc60001b6120c2565b6123977fe1f47c334c4e9ac1b77463fb4c86c993e198ef2af8158ee26e70a90732f4b3c660001b6120c2565b6123c37f3ed97b31d10d9a32d15072a2b0ad8c3464a76d6b4e835e77b51ebbd9c754f6a460001b6120c2565b6123cc33614612565b905090565b60086020528060005260406000206000915090505481565b6124157fc9b6161bb463010133b07b3749dab52b3b5bae2ffa5b0ff771e4fef924920d2160001b6120c2565b6124417f956b27ac437c4177acf2f585d679a7be824018549fd6a06e59ec7233953fea7960001b6120c2565b61246d7fb0735d6f0b9c25f5f6203d19e16f4b02a736026c69752d5916e6f71e83812c6460001b6120c2565b600061247833614aae565b90506124a67fe696d5a9526c91685a4614699f77b000bcc2cb035a6cfe7328a6aa299314643760001b6120c2565b6124d27fa346e4761b70576222cdc29bd041506125aa6ffb80e99f2513dc0396d2b7d75060001b6120c2565b6124fe7f1e0acd9d879f08925c14ccb1a2be1b6ff30b93bb33efe31099881695c33697d260001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b15801561254457600080fd5b505afa158015612558573d6000803e3d6000fd5b505050506040513d602081101561256e57600080fd5b8101908080519060200190929190505050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414801561268a57508073ffffffffffffffffffffffffffffffffffffffff16630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561260d57600080fd5b505afa158015612621573d6000803e3d6000fd5b505050506040513d602081101561263757600080fd5b8101908080519060200190929190505050600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b6126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806160e66023913960400191505060405180910390fd5b61270b7fedcc2b993deb24a268a31f29b0aeadd64f14cad64f21629bb4dbe26c763cfc3f60001b6120c2565b6127377f57b0e8fe5ec7cb3130f9a658584b9bd13dbdf7739a8cc97a4bc746c05581c4db60001b6120c2565b6127637fdba9e5889e452afdfe10e6b8afe1c40d17eaa101d67423b51150febcb8f4b7dd60001b6120c2565b61276d3382614c15565b50565b61279c7f8a345477d48d5c4876763e8543ab319c75e4a162841ec51453ff17080145877660001b6120c2565b6127c87f69de36af6f1868ff74eb03f10513d1a7d169a885219eccf3b49a68c322fd7b8760001b6120c2565b6127f47f8236a71187ed4b4f256819879b85f6f3d6fee1044971a09ad0ca9ca78d26a48f60001b6120c2565b6127fe3382612adf565b61282a7f9817baab47b1a224bd209595f3f433f7401137b769c7fbbeef71a519617afdf860001b6120c2565b6128567fa6e9521ce627d0abf4d9eafde16ab9e44241d35719ef6efedac81e8f88994dcc60001b6120c2565b61285f33613306565b50565b61288e7f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b6128ba7f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6128e67fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b6129127ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b6129fd7feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b612a297f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b612a557fa14fe3830a4c36831d7f5efe9e432a58097763811f509158662eadc5ae5917e560001b6120c2565b612a817f2885d693c641f52d08156618f9f73d171fae6b6660c227fa5c80213a9ef9904960001b6120c2565b612aad7fecca3a7f5f9ce183e3b4c016c435c9f543fcc3d10f0f4fdefb65062049cfcf9a60001b6120c2565b612ab681615105565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b0b7f32d1b74cc50d16562974e82f053f152d08e1bb420e63931fe9b5548a2bd8194160001b6120c2565b612b377f1abcf5dbb19ca541ee32650c8d112828f082170b302d16d5a773d5e7564d837060001b6120c2565b612b637f9758af99550fa21a43fd8f7ff032795ca121478eecb185975b1190737cfd7ab160001b6120c2565b612b8f7f0dc75cfdeeb4f9f45072e6495ac1995aa97020794bb9c8176a2ae13f5f85c1ef60001b6120c2565b600080541415612bea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806160756022913960400191505060405180910390fd5b612c167f8b2a4d4c360cc2484c70c9a9bc8c2509849e5aa23fddfd83279a144e2361182260001b6120c2565b612c427f044e09fc509c9773bb976a1b726e44622d5a2657d467b373dd5c5c7ea7db388d60001b6120c2565b612c6e7f28c85247847e3581a4d13260fd45b3d97ab1443e6bca3b40ceedb79f92f4d73e60001b6120c2565b612c9a7fd9484fd18ba5d363b2031df5a9295c2270e5ac91c89ebb88f4c819f3fd24701d60001b6120c2565b4260005410612cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615fb2602a913960400191505060405180910390fd5b612d207f59c7059dcc5c3f2b92467ad40a7ea55a33e7840fb0968e42b96a2996966b92fe60001b6120c2565b612d4c7f9a8ed0e72d8e07021da192b401b38d39f235fc59db778d6f7e8d2d46dc13afe060001b6120c2565b612d787fc1c47e132db7835f40e66c902a83846ca56226491c2239bb55744318497afd5f60001b6120c2565b6000819050612da97f12df37e7c609a9266da89a1bc569fa090c6ad938fcc150a2413e4a435fe371ae60001b6120c2565b612dd57f5fa5d1e4013ceb89c9335056ebeb83bb5f8cb76bb4d8e5bb5a9eb7284fc2fb4f60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e9657612e367fcb0a00123a753151361074c70cee2b2d91d0304f6588e422759ebe04d4c6490460001b6120c2565b612e627fa6d4da324a5de41fea5db60e4df1902776e66f7f509e95be5aef8de53016bf2760001b6120c2565b612e8e7f6aaef27a6b716a0c22d672c70b57623d539c47ec9aefa2a2e63c61d2ee04452160001b6120c2565b829050612ec3565b612ec27fceca843deb6474bc8a1191d4d0a5ab2aeb7630cc6199606ce51e50c3e81862ac60001b6120c2565b5b612eef7f3b9fa9174dc6a4df4dc32fa9ed7ac7a4ad41138b23992e0e32995f37c9356bd860001b6120c2565b612f1b7fe72fe8b7995975f8e43e041a03b116eb5b7e3ba3825986ca73b041e76677ebd260001b6120c2565b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612f8b7ffd340739b7a2c38ae28baa65c897a82da8873f8c782f7bb81650c8c8dbd3182c60001b6120c2565b612fb77f298b1cb32cce7c3c3a683636fa7fbcd793e9c765bc02f426fa2cde06a8d8802d60001b6120c2565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130287f9ab63a8a3fe7cc91de6d80ee7b9d58d61d586f2b285fd1c9843a1eb9eacdead260001b6120c2565b6130547fb013a37e78aa2d0477a3339ccc81cc15daab83c6e480f1fee57e12248cd7aba960001b6120c2565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130ff57600080fd5b505af1158015613113573d6000803e3d6000fd5b505050506040513d602081101561312957600080fd5b810190808051906020019092919050505090506131687fb52cf5bec8ea5f7740d5f106b51e9f48043e54aea5d1b44b2b7a031917eb8c0360001b6120c2565b6131947fbfbcf3b75bb4c7a828f089c50140ee2348a61442ba222d6c5db7192a019f90d360001b6120c2565b6131c07fd7dfa52a48ab69979694c9fa26d8ccf10a13b50c29e8799eb48a9e9531da2abf60001b6120c2565b80613216576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180615f246046913960600191505060405180910390fd5b6132427f9821cdb90d8dbb520d9787cf22665329f055aaaae5a0076c46e8f352cfe129d460001b6120c2565b61326e7fb46cdacb2840ef568a3c58e3e42155b9e9490c6e2380320bffb91c2cfc1f961760001b6120c2565b61329a7fdb12fa92c7609773d48220182794f03c4ce1140c7d56e73be39c86b30306a34e60001b6120c2565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6133327ff2f6aa91ba57661874aba566e7c9eb97c0ce0af60a04acd51e253bdc478fa7a160001b6120c2565b61335e7fa52ecb22b17614096a67aa7139209b6836e8905e5f4452bfb14bc03876ee0e2060001b6120c2565b61338a7fb1fd726d0379bd894395ba13777c96880bcc4203fbdcb7f5cf6b7c8d0c0c21e760001b6120c2565b600061339582614aae565b90506133c37fc21ba7f7c1927e8b6d2353cb128b2a0370fa4d5524d9a3f0f1e964630dcc300d60001b6120c2565b6133ef7f1c13d451ad86d5806bca5b1fc6edfd66aca99e858a7d15029fb4017235cd93f560001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156134b8576134507fea0eaed7eef9dfefa8a117d7f8f49b5fac08cfa69d0ffd93681e04a4a9f3f34a60001b6120c2565b61347c7fc73b7c611574449ac1805d22452156c2b6a8b610ecf792c5c492be085a8f4dc360001b6120c2565b6134a87f858b6b1b7b76300c4bc2637e7d0f837152627611e8997eba542112f6a3ec089360001b6120c2565b6134b182614612565b90506134e5565b6134e47f51b6041242fe87c23613c4ca83c0ce6cc782f984daa1175b5282198f4cbae01360001b6120c2565b5b6135117f179004e13c69c281c926ed9a60d5197d533b662af042352a71862de1d486126b60001b6120c2565b61353d7f14b43749593568faccdaf6c0f2da5fec840b3e8fe509e834b96b6fb1ae14d83960001b6120c2565b6135478282614c15565b5050565b6135777ff18828f34a77d25fd2a204d334ae8c7b2b0d98ae51df09f97d54f49563d6834c60001b6120c2565b6135a37f7e1d277935cf039dd06e2f077f2fb3e92eed84a15a655dfb01efe6784dc1802d60001b6120c2565b6135cf7fe69fb858002425942ccd46bf74bcb82d08e11a613d73dad7feaf5fe333df716c60001b6120c2565b6135fb7fbebccc5bfed7845ceddfadd20eaca584f424d9d9c7204e543499cb92efef0fca60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561369e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4c6f636b656446756e643a20496e76616c696420416464726573732e0000000081525060200191505060405180910390fd5b6136ca7f7743e52bcb6872bf1d1a937ebffe9f93c9cf6cfffb1bf3ac5c947c84e799c54b60001b6120c2565b6136f67f9f8622f8282425a9cf50dd7a52322b2ad4c903f8e62cdc6745d32739db7ef8c260001b6120c2565b6137227f3d124cacafc426f63ea78db7a3bd7621a904df790271474212172e5dda5bc24c60001b6120c2565b61374e7f11397a69873ece5b3016d5f0f65eb0f51d418c7b8e6995442a3ee8397d16504560001b6120c2565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156137f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806160976025913960400191505060405180910390fd5b61381d7f3dc3b3cf7884ec478650b70fd4882a0c18568511fd8ca387834303e35572414960001b6120c2565b6138497f3bd22af39de246e0772e4ff2b3b658497468aca05614d8772890732d3ff0d05e60001b6120c2565b6138757f5d29ca3aa4f9c24c944ebad343879784c0b979dd7bce772475ac26142fd40c7060001b6120c2565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506138f97f1b52293c92f7800ec1b7dd5149bccc729b7e1599fc3610c2808db0974f694a4960001b6120c2565b6139257f3e6b6bee3e1f8cbe9adff4eba70247b9ba8ce5db4391da18ba233600c2dca11e60001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a350565b6139ae7f5a7a4a8cd4eaed25a4abce89994aed5294195b3b0dce256f325c75c679a333f260001b6120c2565b6139da7f2ea55fa634713a02b5d6764e96fc31afa709e45e72e8b9667a85d9d5af41ab1660001b6120c2565b613a067f157208259828fd14e6db7c4c1fb519aa08d05e8f34094be9c284a326abdf031860001b6120c2565b613a327fb6bf6d447545e6a05b6d1d4e2ad50d22c22889c7f038a18a98e2fec70165337960001b6120c2565b6000821415613a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615f8e6024913960400191505060405180910390fd5b613ab87fe6c1959a4bd7642de42aa166d79e92f8c040f7a2a9b9da551d0e7dd266a8031760001b6120c2565b613ae47f72ebec2be4c64905c5190d3476d5fac853390d90e7cb030878356c4884492fea60001b6120c2565b613b107f657b203a0ab3025e05e209a75625e8e0e326abf328416dc5b0543b685cc852d660001b6120c2565b613b3c7f5ed0253e0e090a4bbe09ca14086f8bc78434ae36fa6463c54f1c3f368dec345360001b6120c2565b60258210613b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061602f6021913960400191505060405180910390fd5b613bc17f2eed951e0f6fd85710b5ddacc0c441d570d487ad3d9d6bb3ce74c287c28eae5460001b6120c2565b613bed7f06b0c5e165e6b159b79071367de627eb9406eba71179a88e94c994659997383d60001b6120c2565b613c197fa1eb142fecc059a467791ca6d6d916bc7049adc667f5660a0a95fb84d9ce610660001b6120c2565b613c457fe1c512f481e37ada1c419df8141bc3123fce9186fb456bf10442ca84afb0473960001b6120c2565b6127108110613c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615fdc6032913960400191505060405180910390fd5b613ccb7f4253d588a70c7932665c1fef05bdbce22dc7b675a4a5626a90b995294c9c396f60001b6120c2565b613cf77fc242cedfee87f54a801135683992ccbc0d0ae84ceb8ceb85f886488358947aab60001b6120c2565b613d237fea8c76a324989741e1dd0a9d1938853daefd5e77df28f1745d2c8cd622e299a960001b6120c2565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613e0257600080fd5b505af1158015613e16573d6000803e3d6000fd5b505050506040513d6020811015613e2c57600080fd5b81019080805190602001909291905050509050613e6b7f6f3212c288a091864b826af7cdfc5895d4eecd85115d69cbe24612e4cfc47d3860001b6120c2565b613e977f371fdd23407273151153089a7d8ead8dd2a23b631b156d17c55ec18a7a00ce6e60001b6120c2565b613ec37fb145cd25e93b0c3d1289d4013a60e3a92f05eb2c7ce3bb2508143547524e934760001b6120c2565b80613f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180615f246046913960600191505060405180910390fd5b613f457ffd7f9919678fa90bd5a0197e1d95f21b9fc319f0daf8fa43f83f734a25a0625560001b6120c2565b613f717f8c03b4278000ac923acdf3bb7f44bd699f67061267ac0506f5dce4662d85d22060001b6120c2565b613f9d7f25a8823d3e88d176ff318d07f8a70764545891a2c53df8172b2bbeb6f2986fe660001b6120c2565b6000613fc6612710613fb885896153b590919063ffffffff16565b6156cf90919063ffffffff16565b9050613ff47f785eb8af4bbc16ef7f37647b0a9e6042d83e3c60dbdbf8095919c3405e7a170c60001b6120c2565b6140207f97572340a11e9c9ba0709fa6c0235b126bae0f0b847f77a455566a7d93cdca3060001b6120c2565b61407281600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461579d90919063ffffffff16565b600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140e17fadd1acf0558b4df378e30ee799df9098c787a34db3c977bb6231bfbb47cbbda060001b6120c2565b61410d7f7ff04435c561f5dc27abad6c9b50bbf086c7047a5f114602c32e97730cc3ee5d60001b6120c2565b6141718161416388600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461579d90919063ffffffff16565b6159b290919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141e07f4e1ba96dc6dff93cd4b0ebdd540fb6b9492977f4c01f6b6a4cc684b63547c35060001b6120c2565b61420c7fe87f7523fe7dab0124360bae8f11fe0103d7d2ed7171cc712ff9f3b7c78124b260001b6120c2565b6224ea008502600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142817f8fa49e8ec1acb1c8f61af22aa79df5a600ca9c0589f9607be7a9d2586495405560001b6120c2565b6142ad7f5285cfdf1009da32f49963f221a40b03b4ae76728d108f047aab6e33af37be4c60001b6120c2565b6224ea008402600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506143227ffddfb9e3c8aa09f940363e40c5592c355be323a85a1d97f0b8d1c12ff534123960001b6120c2565b61434e7f45108368a3cfb977088f1abe4f46f7ddf2b4039728eaa6a8afac558c6a23262960001b6120c2565b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a888888886040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050505050565b6144007ff2de3703434f4415d392044b2002bf19052f7d34e8e414c9211f70bb9efeeea060001b6120c2565b61442c7f8eeb39b944b7e122a8ccf6531dc802ff8b07024e9a755bf85324358d8f2ea7fb60001b6120c2565b6144587fa217a7a5a481254b17960363327bc44da12c57c0446f197c2453aa637a4d6b3060001b6120c2565b6144847fb38b09ea1ce8acd0b415e30a3ae35c65793a4e1cb58ba5a849d09f738416c07660001b6120c2565b60008114156144de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806160506025913960400191505060405180910390fd5b61450a7f97d122643e292d81b5791e4c087b9666a84128e1a8190a996b942ddabcfa3d3f60001b6120c2565b6145367fbd7d4313f21bef8a2bd6e6a6a9b6b8363f25128f70b3fc6bf43cf9f919630be660001b6120c2565b6145627f778665f1c1361780f502c9c40634f21e09027025bcdd4b4559aad4fb34890e2660001b6120c2565b806000819055506145957fd281c46a21343f29aba5e462dc693ee3044c3a7196cade580f93f1e332f0a92d60001b6120c2565b6145c17ff841ddb5987747e91d4aec7afbc303ddc406ccf020e4d9447dfb4a6dcef9fcfa60001b6120c2565b3373ffffffffffffffffffffffffffffffffffffffff167f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94826040518082815260200191505060405180910390a250565b60006146407f099f0f4beeab2d0d5cfc3ed6f138c76f54d9d12d77632ac7804bed5d63ee6a8060001b6120c2565b61466c7f15cd849300d0cff158bd75207e492192e0295f70644b5f4724230661b274b44e60001b6120c2565b6146987f9a67bf8a00c89a911f932c5beb691d0440d62ef939be823ef70d442d123967d760001b6120c2565b6146c47fe63e824a9bc7f2d2070611413f079002396a3d1249045dc306fc13f7f93c755860001b6120c2565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415801561475457506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b6147a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806160bc602a913960400191505060405180910390fd5b6147d57fd36eb2707a929bdb9a82d43f125ed9f218c00f2a6349a2f8ec307708e8d101fa60001b6120c2565b6148017fa13b9cb0ded95be2ef3d610472bacb461d86efd966cc54da338d358b25c5052860001b6120c2565b61482d7fc431137e542fba43a12946ab234f1b3348051f808ecb3e400e548d6f2e5492cd60001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630665a06f836000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b15801561496557600080fd5b505af1158015614979573d6000803e3d6000fd5b505050506149a97feb84e2e98f750099f6a12a17b228af6efd14a45da9e69be26ae85d53c515c55f60001b6120c2565b6149d57fe8839bdbfa2bdbe86ab6787c83e7b71342245fde9588f805178faef4218ff64160001b6120c2565b6149de82614aae565b9050614a0c7f46c4cb90b19235ff6fc55c36f5cab4c48da6b5b8d21f3c76ae7b26c2fc3227db60001b6120c2565b614a387feb82bf1014f20ad76c1c4f125593e206ad75ae708562bc456b6f67551d5c9bce60001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6000614adc7f8e56a657ee9eeb3841541aaac5ac2331d9fe55b98ba2604ff388324c3304f94160001b6120c2565b614b087fa56f2526df98a4a70429179464d83e976b8e368014d183fa1d1c1626ddb743f960001b6120c2565b614b347fee62d1035803aaafaa50e3933f0c497ee2a20a70f029681972e31474307e125860001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cc49ede7836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614bd357600080fd5b505afa158015614be7573d6000803e3d6000fd5b505050506040513d6020811015614bfd57600080fd5b81019080805190602001909291905050509050919050565b614c417f67d7a523c6f24336e024fa1df492c977d7c45c6fabbcd04f65f6507c577b462c60001b6120c2565b614c6d7fbb54d59daf6decb198ad8eedf74bdbcd6ad7ab89808f3b18f4368677140ee28f60001b6120c2565b614c997fe1fab23ebdc2c288439ffaeaf42d881626225d35a4821134710cd5801ef61bb960001b6120c2565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050614d097f6810bbb868a8216ac25357ea1ef57233aad728bd62c242eed32ed9f39b7e111b60001b6120c2565b614d357f63d84521e884c74b1fe88b373f6febb7ba4662bf4024653f0eba75f3815c33a560001b6120c2565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614da67f36b2a7113f91194c9a121ee53ed579159bc757a407eb6587325b8cffef5a668360001b6120c2565b614dd27f83543865e5dc44996ed2a9a837377fa8ed9df96577e25fc05ed06955644d924160001b6120c2565b614dfe7fdfe401b06ceea015e072c2d169acb077d0dc07536c0f8edfe4d2f3b4ef9973c460001b6120c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614ea757600080fd5b505af1158015614ebb573d6000803e3d6000fd5b505050506040513d6020811015614ed157600080fd5b8101908080519060200190929190505050614f54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4c6f636b656446756e643a20417070726f7665206661696c65642e000000000081525060200191505060405180910390fd5b614f807f1e7d28e374b4ad17a701f458bfc23c911dccaeff672d9a612ba9dccd5e5a7b2860001b6120c2565b614fac7f4f755a415ac5cda9cd6382b525ba935b084793a9bfece614cfc557ac15751a9560001b6120c2565b614fd87f9c25cbcd62d96a993bf63d2f683525dc41f4e9afc4974a16356111a70728849560001b6120c2565b8173ffffffffffffffffffffffffffffffffffffffff16637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561502b57600080fd5b505af115801561503f573d6000803e3d6000fd5b5050505061506f7f85730c4b1ed5602564ee4ca31b9c2186db04dc3c2442acdc60cc7018657b4fb760001b6120c2565b61509b7f158adb9e1c2ba2701a3774d50f2bf0b454ca0149a9017067c1a27d97556bbdc460001b6120c2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b836040518082815260200191505060405180910390a3505050565b6151317f1c2e0ab2daa50c6af223e5a4a38cda73244e06754019097bac898d3a8d0ad72b60001b6120c2565b61515d7ff709447a43d916016620baffa27e0b612c237dfde458a4cd3158a24f95e59c5660001b6120c2565b6151897f072ca76825e34184e852e51358abb0403ef001ce51650bb3e3270104cece56c860001b6120c2565b6151b57ffbf68d9cba3602380a8dd1ea5133db55631c6cacf3ae6134922c59642f9f233c60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561523b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806161096030913960400191505060405180910390fd5b6152677f632367eae68bc60b4b3ed9477d92656f8d6385849cff8a98fb471c4ab72a6f2960001b6120c2565b6152937fe7dde9282727830d8509f7af4624b918a6f95fe48dcaf6b5360d028443839f3560001b6120c2565b6152bf7f1c6020d90b840db2fedeedf9fd0518b690cce2e8392ebe6f9455a97eb9e875a960001b6120c2565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061532c7f9d988d582446515dd8de8177f2f020288f17d4e406967c6a2f07fa08a5de473b60001b6120c2565b6153587ffcc3a502f003451fda9ba1c6236e289cf035e776d54d9424ad2e2701a513380660001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e760405160405180910390a350565b60006153e37f44698d1e9a904ed1284ff1ffbc3dd61250c83d2c71afd5df19fbf19c6190a1c260001b615a80565b61540f7fa3a4b98cb2a23eda9dbb54b77b676d94ca9d1d4bafcc15caee09e68074b0ef8d60001b615a80565b61543b7f3c0e96b55c01aeef942723329b7f27779568810ddd00a05282ffd2e3b5d233d760001b615a80565b60008314156154d1576154707ff802f4a238c6bfb87737692d90643ed6d1e91071b816804127f57dca78bfaab660001b615a80565b61549c7f9c7552f9a426f225c2850fa12a0dc5fb398b1adc4885e41fd5a32fae1dbf05d760001b615a80565b6154c87f88253dfa1829ebe573c7def7f8d624e362791a1e5da86330776d1836a357555360001b615a80565b600090506156c9565b6154fc7ec5af928e6c63fb10ff91a6c5a4e910c4f39f595f742d8e52dc11b03ad6250f60001b615a80565b6155287f5e551b5129d493f012d238e272eb615eaa6959509de842125d5c3b203db4ec2660001b615a80565b6155547f6eeef49995c967235a764d0bfc2ddf3ad4e6890ca3a3e7024c52da8393db1ce160001b615a80565b600082840290506155877fab80a6313ea3c5926e33d7cfa6c464eb729cc09a2e212bce50dc9d97fae0ed7260001b615a80565b6155b37fcf8cc8694fe56eef0897d8bf5580925daf8927e537ada7fb46a3727fe18d423260001b615a80565b6155df7ff5b30a17ff5e5b532b98d8059efeb460d05236f98b90e61b8794894cfad8502d60001b615a80565b828482816155e957fe5b0414615640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061600e6021913960400191505060405180910390fd5b61566c7f9fdef838f8fa27d2dbdb6cfecf3f275aa85c5ae07d712150d6e17c19c215bfd560001b615a80565b6156987fe9975f5879861c66ca2a2d35617f5a37951b7cf797008080c2db7371f45b3b1460001b615a80565b6156c47f1040ca89b272f25ce391ff02203288f6f7b9bee30a94da64205ca6d937da6b3460001b615a80565b809150505b92915050565b60006156fd7f996468adab2cfba5de081e00c611ca70c15d8fec7d5bf522494a62c1469ffa6a60001b615a80565b6157297f9f1ba2348d57cab76c102a92e631d7e3d939d3a1ce6cb3a01a504d1656b19f5060001b615a80565b6157557f46d4aa33cd017349564c3524038979baabbfc921b9cf218610f32f2cefa7e6de60001b615a80565b61579583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615a83565b905092915050565b60006157cb7fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b615a80565b6157f77fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b615a80565b6158237fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b615a80565b600082840190506158567fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b615a80565b6158827fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b615a80565b6158ae7fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b615a80565b83811015615924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b6159507f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b615a80565b61597c7f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b615a80565b6159a87fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b615a80565b8091505092915050565b60006159e07f692a0cfdea6cb12cdfcaa599c058fa5662531cebd540556a6d1c27ae01b4cea360001b615a80565b615a0c7f2cce8d8afd666e4919d1ece0b47a35eda094c843996926984c8b17a0d5cd2f7160001b615a80565b615a387f936781d4063de1913a3eda99a7c2145fe8a9c61ba2abe4fa4e7dd270bf8b933960001b615a80565b615a7883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615cd7565b905092915050565b50565b6000615ab17f196dd912071b7ac5c8a10b8a236898e903a5c95f5189a9aeb16dc1191096752060001b615a80565b615add7ff25ec16e9c80532b14a66f8cd16ae291eebc856235e409a39c3fbd9dc53e53fb60001b615a80565b615b097ffb609f676697fca43f3242dd637f8af44d19e0456d05ec1547a1557478b8a1ea60001b615a80565b615b357ffc25a7e532044dc446303b3445457a6ba5f30c2ec2085a7b37e4ae0e05b09ba260001b615a80565b60008314158290615be1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615ba6578082015181840152602081019050615b8b565b50505050905090810190601f168015615bd35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50615c0e7f295ce5b61523fe81f08b0e41715a55fb7cc4323fa58af5f536a59e28b507ad6660001b615a80565b615c3a7f4460e22500904e71005e8ef95355467cd96d8038ca3b358379ef52915f4cd11a60001b615a80565b615c667f898838ee4191c5d93d43aba28d5dace210f5b5fe59d06155be60fc494d99a9f060001b615a80565b6000838581615c7157fe5b049050615ca07f6d2a274d329c86c87e9d63cea7c87a6fd3d3ca9ab129144ff43f4724a38a4a5960001b615a80565b615ccc7fbb4fe2c1c37d48811af5ff17eb49f43a22d0b33ae049d66f26c63e5ac81928dc60001b615a80565b809150509392505050565b6000615d057f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b615a80565b615d317f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b615a80565b615d5d7f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b615a80565b615d897fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b615a80565b838311158290615e34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615df9578082015181840152602081019050615dde565b50505050905090810190601f168015615e265780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50615e617f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b615a80565b615e8d7f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b615a80565b615eb97f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b615a80565b60008385039050615eec7f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b615a80565b615f187f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b615a80565b80915050939250505056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a723158207f62dae5e609d06a020f3af63364576272b32cd2f9bfd3c84e0615da999df87764736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Openzeppelin/Address.sol/Address.json b/artifacts/contracts/Openzeppelin/Address.sol/Address.json index 306abec..63df167 100644 --- a/artifacts/contracts/Openzeppelin/Address.sol/Address.json +++ b/artifacts/contracts/Openzeppelin/Address.sol/Address.json @@ -2,9 +2,25 @@ "_format": "hh-sol-artifact-1", "contractName": "Address", "sourceName": "contracts/Openzeppelin/Address.sol", - "abi": [], - "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723158205937740270c64775b05a5ffa30d0311e2674bb6aa0227c96dadead14f1cd0de364736f6c63430005110032", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723158205937740270c64775b05a5ffa30d0311e2674bb6aa0227c96dadead14f1cd0de364736f6c63430005110032", + "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0xfd43e276", + "type": "bytes32" + } + ], + "name": "c_0xfd43e276", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x609b610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80639e7bfcfe146038575b600080fd5b606160048036036020811015604c57600080fd5b81019080803590602001909291905050506063565b005b5056fea265627a7a72315820f4e82dc9108eb66f5414c22e23950d7f61f154528904f77d0fad1661e2c5182f64736f6c63430005110032", + "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80639e7bfcfe146038575b600080fd5b606160048036036020811015604c57600080fd5b81019080803590602001909291905050506063565b005b5056fea265627a7a72315820f4e82dc9108eb66f5414c22e23950d7f61f154528904f77d0fad1661e2c5182f64736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Openzeppelin/Context.sol/Context.json b/artifacts/contracts/Openzeppelin/Context.sol/Context.json index b861471..566ee4d 100644 --- a/artifacts/contracts/Openzeppelin/Context.sol/Context.json +++ b/artifacts/contracts/Openzeppelin/Context.sol/Context.json @@ -8,6 +8,21 @@ "payable": false, "stateMutability": "nonpayable", "type": "constructor" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0xdb7cf3fd", + "type": "bytes32" + } + ], + "name": "c_0xdb7cf3fd", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" } ], "bytecode": "0x", diff --git a/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json b/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json index ed43432..9abcc2a 100644 --- a/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json +++ b/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json @@ -126,6 +126,36 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x42d820d8", + "type": "bytes32" + } + ], + "name": "c_0x42d820d8", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0xdb7cf3fd", + "type": "bytes32" + } + ], + "name": "c_0xdb7cf3fd", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": false, "inputs": [ @@ -251,8 +281,8 @@ "type": "function" } ], - "bytecode": "0x608060405261083b806100136000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a0823114610149578063a457c2d71461016f578063a9059cbb1461019b578063dd62ed3e146101c757610088565b8063095ea7b31461008d57806318160ddd146100cd57806323b872dd146100e7578063395093511461011d575b600080fd5b6100b9600480360360408110156100a357600080fd5b506001600160a01b0381351690602001356101f5565b604080519115158252519081900360200190f35b6100d5610212565b60408051918252519081900360200190f35b6100b9600480360360608110156100fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610218565b6100b96004803603604081101561013357600080fd5b506001600160a01b0381351690602001356102a5565b6100d56004803603602081101561015f57600080fd5b50356001600160a01b03166102f9565b6100b96004803603604081101561018557600080fd5b506001600160a01b038135169060200135610314565b6100b9600480360360408110156101b157600080fd5b506001600160a01b038135169060200135610382565b6100d5600480360360408110156101dd57600080fd5b506001600160a01b0381358116916020013516610396565b60006102096102026103c1565b84846103c5565b50600192915050565b60025490565b60006102258484846104b1565b61029b846102316103c1565b61029685604051806060016040528060288152602001610771602891396001600160a01b038a1660009081526001602052604081209061026f6103c1565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61060d16565b6103c5565b5060019392505050565b60006102096102b26103c1565b8461029685600160006102c36103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6106a416565b6001600160a01b031660009081526020819052604090205490565b60006102096103216103c1565b84610296856040518060600160405280602581526020016107e2602591396001600061034b6103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61060d16565b600061020961038f6103c1565b84846104b1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661040a5760405162461bcd60e51b81526004018080602001828103825260248152602001806107be6024913960400191505060405180910390fd5b6001600160a01b03821661044f5760405162461bcd60e51b81526004018080602001828103825260228152602001806107296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166104f65760405162461bcd60e51b81526004018080602001828103825260258152602001806107996025913960400191505060405180910390fd5b6001600160a01b03821661053b5760405162461bcd60e51b81526004018080602001828103825260238152602001806107066023913960400191505060405180910390fd5b61057e8160405180606001604052806026815260200161074b602691396001600160a01b038616600090815260208190526040902054919063ffffffff61060d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105b3908263ffffffff6106a416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561069c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610661578181015183820152602001610649565b50505050905090810190601f16801561068e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156106fe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202b065b6405111e5e88a2151ff2c365680198043a1a70f31cdde369fba031945a64736f6c63430005110032", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a0823114610149578063a457c2d71461016f578063a9059cbb1461019b578063dd62ed3e146101c757610088565b8063095ea7b31461008d57806318160ddd146100cd57806323b872dd146100e7578063395093511461011d575b600080fd5b6100b9600480360360408110156100a357600080fd5b506001600160a01b0381351690602001356101f5565b604080519115158252519081900360200190f35b6100d5610212565b60408051918252519081900360200190f35b6100b9600480360360608110156100fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610218565b6100b96004803603604081101561013357600080fd5b506001600160a01b0381351690602001356102a5565b6100d56004803603602081101561015f57600080fd5b50356001600160a01b03166102f9565b6100b96004803603604081101561018557600080fd5b506001600160a01b038135169060200135610314565b6100b9600480360360408110156101b157600080fd5b506001600160a01b038135169060200135610382565b6100d5600480360360408110156101dd57600080fd5b506001600160a01b0381358116916020013516610396565b60006102096102026103c1565b84846103c5565b50600192915050565b60025490565b60006102258484846104b1565b61029b846102316103c1565b61029685604051806060016040528060288152602001610771602891396001600160a01b038a1660009081526001602052604081209061026f6103c1565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61060d16565b6103c5565b5060019392505050565b60006102096102b26103c1565b8461029685600160006102c36103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6106a416565b6001600160a01b031660009081526020819052604090205490565b60006102096103216103c1565b84610296856040518060600160405280602581526020016107e2602591396001600061034b6103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61060d16565b600061020961038f6103c1565b84846104b1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661040a5760405162461bcd60e51b81526004018080602001828103825260248152602001806107be6024913960400191505060405180910390fd5b6001600160a01b03821661044f5760405162461bcd60e51b81526004018080602001828103825260228152602001806107296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166104f65760405162461bcd60e51b81526004018080602001828103825260258152602001806107996025913960400191505060405180910390fd5b6001600160a01b03821661053b5760405162461bcd60e51b81526004018080602001828103825260238152602001806107066023913960400191505060405180910390fd5b61057e8160405180606001604052806026815260200161074b602691396001600160a01b038616600090815260208190526040902054919063ffffffff61060d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105b3908263ffffffff6106a416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561069c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610661578181015183820152602001610649565b50505050905090810190601f16801561068e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156106fe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202b065b6405111e5e88a2151ff2c365680198043a1a70f31cdde369fba031945a64736f6c63430005110032", + "bytecode": "0x60806040526100367f1648ed9a3a549f0d89d1da17e5d55a7f910027e202bf03f77ecab104844d19fb60001b61003b60201b60201c565b61003e565b50565b611d518061004d6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a2d69fe116100665780639a2d69fe1461026b578063a457c2d714610299578063a9059cbb146102ff578063dd62ed3e14610365578063de786db2146103dd5761009e565b8063095ea7b3146100a357806318160ddd1461010957806323b872dd1461012757806339509351146101ad57806370a0823114610213575b600080fd5b6100ef600480360360408110156100b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061040b565b604051808215151515815260200191505060405180910390f35b610111610505565b6040518082815260200191505060405180910390f35b6101936004803603606081101561013d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610593565b604051808215151515815260200191505060405180910390f35b6101f9600480360360408110156101c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107a0565b604051808215151515815260200191505060405180910390f35b6102556004803603602081101561022957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061092f565b6040518082815260200191505060405180910390f35b6102976004803603602081101561028157600080fd5b81019080803590602001909291905050506109fb565b005b6102e5600480360360408110156102af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109fe565b604051808215151515815260200191505060405180910390f35b61034b6004803603604081101561031557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ba7565b604051808215151515815260200191505060405180910390f35b6103c76004803603604081101561037b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ca1565b6040518082815260200191505060405180910390f35b610409600480360360208110156103f357600080fd5b8101908080359060200190929190505050610dac565b005b60006104397f0d42ccaca515977830f39e5becdbabcee85221bd96d2dbe4f5c4fd1c85faa4f260001b6109fb565b6104657f754bf2ca5c77b407378982e552328835db434ca83ce9a717a1653fe5711d1fae60001b6109fb565b6104917f29963cee0945aee92c2445dde7b8b4f3a6cdcfaf73de48985b894b146fc0e32b60001b6109fb565b6104a361049c610daf565b8484610e3b565b6104cf7fd3d5e5509e5cf6e120dccb4bdb71e3ac08a9e249b3c368b228f693ebe00d3a0c60001b6109fb565b6104fb7f3c8e72bb3eb97920d5ce54b49094b721dd40891cd173090f708ac710354a271f60001b6109fb565b6001905092915050565b60006105337f5ab4b2827b7adc7d1615b3fff4b96378a946b2c2d915dc989b69a1cfcfba8cc660001b6109fb565b61055f7fb8c09fff4908341d91dd69c3e87ca7844a6698b0819fb96dc538c250ed62eca460001b6109fb565b61058b7f9d0a15e22e847c149e2b58fc2aedb22922b840474f89eb4d312b3c5b78cd5b2c60001b6109fb565b600254905090565b60006105c17ffaf709f346fe3db8ae0124b295421b4e2b2c9b1cd0cadcc780c22f8a4384d59760001b6109fb565b6105ed7f7ad44ef5d3f1e0e833b1e92fd1e3f2c7e5a53bd5e7a5d3dce9beff11464374ef60001b6109fb565b6106197fd6c24c3dfc7552619edd906094e7f17001e775b65b5ccebefca8043e02757a4360001b6109fb565b61062484848461126e565b6106507f5b96f9469c516dbe56cd327c0f8f634d794798325c948710798a5a94c2789d2d60001b6109fb565b61067c7fd2eb81ff83f28d13475a9de327d36049bc434c4548fcd2a76c3780941f5e48cf60001b6109fb565b61073d84610688610daf565b61073885604051806060016040528060288152602001611c8760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106ee610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b610e3b565b6107697f57a15dd9623caa237d7a7077577ded38892410b0a25de72d4b5adfe6113396ac60001b6109fb565b6107957f8e9ad68ec491eabdf1812f7053db0a03a049f6d15f2f69fa88fc20490192df2a60001b6109fb565b600190509392505050565b60006107ce7f608255447736a1e05dd20beee2382814ccf870fa753087ba4a4b1a310552ff6460001b6109fb565b6107fa7f492dc0c5b05a7ffc5af47ee5ef898af0284d44aee2414161ab3e4261c102d68660001b6109fb565b6108267f2e5597593e4b1d6a198285b1b266864576ee1af09905ea75857aca096ce2701f60001b6109fb565b6108cd610831610daf565b846108c88560016000610842610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0390919063ffffffff16565b610e3b565b6108f97f39abdd95fe79d7662434a95e5d54b0c5e184cb933c1d0897b06a0562bc18393560001b6109fb565b6109257fc91754ec9db384f5fea245dc2da3a47b5f0264482ea0037319b98e8c0eab928560001b6109fb565b6001905092915050565b600061095d7fbf11abd02ab3bb802d2e5f99795b3e2f0029c94a76dd17c98892daea64bc72d060001b6109fb565b6109897ffef5ad299e7a3e9ab91375c4e51e155903c0d60b3c990446a6d5ada35300700360001b6109fb565b6109b57f968ebb724aec6bce5faeca202a01f8fd8e5da1bfac5b100527b14d2da30e8fd560001b6109fb565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b50565b6000610a2c7f5f443dd38a143da0f9225497f53288bf2c714176cdbfb41d31674d74dd4ccba660001b6109fb565b610a587f1e28cf5cf881aaf56d724265c30c1e508a3efc1746b5abd59aa73f92949aa54160001b6109fb565b610a847f5d481fd5d46258a2f5daaa0cc18e1ec9f00090010bc8914548e7db894864093e60001b6109fb565b610b45610a8f610daf565b84610b4085604051806060016040528060258152602001611cf86025913960016000610ab9610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b610e3b565b610b717f76d6074abc30f881ff6d416b956be4b2a4d50495113e3ca703a2344d7a87e3f760001b6109fb565b610b9d7faef4d09f98e81fa40d6d23e067fb3d1945292b6116de91c5123cc4d87829085760001b6109fb565b6001905092915050565b6000610bd57fd1f99140089561020c26495e4bff4faf43bf4723034291712a0fe085c62ca0e360001b6109fb565b610c017ff026da482222cc112cbda53a49693b193e42fc7e6df13d27c671ea172127d27a60001b6109fb565b610c2d7fa39db9fb95f48df90321e4f29a2e109b146bcd3b09c341f7996f1a0d4d4693f460001b6109fb565b610c3f610c38610daf565b848461126e565b610c6b7f61cbed024b9eb9b0e7f025bcdc6d8a53b1b9afaacd0490efcf41be17bbc2cd5060001b6109fb565b610c977fa6cc3c9fa193e9f2deca62efcdddb5b1be98dd9414c484d713df4a3f8f84ebe760001b6109fb565b6001905092915050565b6000610ccf7f5fbe00c778dfdb68f544193be7026e7d9e1f3d155e039c4441c5ce99487ab58760001b6109fb565b610cfb7f0b66eb1b4ba67f8a2debbfa264bcc88a0c5a5585942322e8da2048b536ca688760001b6109fb565b610d277fc1dc7f6e3323267ffbfbc407dff8089abe4733ce9c57ed5a38364df62e27a54a60001b6109fb565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b50565b6000610ddd7ff34b2a8b2e9e739c67260af773ba5665e40bdf8d965ecab3b00bcae74560b64260001b610dac565b610e097f2ba39a87f17acfb11161f566e253783aebea98ccbb9bbfbb6309a7334892b2da60001b610dac565b610e357fc9dcf20a261df4fd57144851da3a3c427cb24d07d5a6f61638c5df6df65791d660001b610dac565b33905090565b610e677fc4d20d5bea6a9f16ba818d7e36ebcc778b72081a85c2980911b37f77473fcfe560001b6109fb565b610e937f53a971d56012e06d193c95146c05704674d6e63fc426486c8fc2adbde49f84fd60001b6109fb565b610ebf7f2d4547104a0d1e6b7a26118aab4f1ac602ed4719bf6108961548c4ee7a73459d60001b6109fb565b610eeb7f6686b2cbcfa8e7d83a64eeaefc2795ddf534e4ce251cc44ba22e831f2437bf1160001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611cd46024913960400191505060405180910390fd5b610f9d7f0621319e4b9b2a4be42926b4f3681e8c61351af22cc728be4fb560dcf026149460001b6109fb565b610fc97facce556ea82a7bc65b74b437598ffa3c91a2151624ad0fdafcb5c57a1dbdc83260001b6109fb565b610ff57f030def8372bf273c3d4812a3ccd9d503df582007a5422ab807966de1b113eb7260001b6109fb565b6110217f503fb5eac9225f9e9280e8eba5d49bfb7bf68adec8dd52e1565488204947c14360001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611c3f6022913960400191505060405180910390fd5b6110d37f9ed4ed8864b8acef5391f32c30a28b0d033373f6188e5cc79ef27beac4148c6a60001b6109fb565b6110ff7f46fa9573d78386238685625e980e0f7f0a52dca1988af56fff3bdb10409d086e60001b6109fb565b61112b7f43b10bb899642d0a27f99a76700962d8963f86d8639183df04123c90c177a30d60001b6109fb565b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111d87f10d4eadbc4bbaab320133533ceba51208f926314315c162ec2c6dd7acead3fb360001b6109fb565b6112047f7194093eb53c4d1b4220bea3da2922947134cf794a518c973b6a580217ed3c5b60001b6109fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b61129a7ffde53eb1b51a405de289b72e6ae4f964bc2970a7117d1c47c687807402d255b660001b6109fb565b6112c57efbda40eef188545a791f6a7136ca520097a9320e8f312112f68b8bad2c16b860001b6109fb565b6112f17f6d4de5512cca78b838932b1f8d3cb7c612645bb722a0d6bfcf532069b72224bb60001b6109fb565b61131d7f5d44d165dd8d78b755d21a81cb1a4d992ad809c5e757138c6fed7ff50fc6d36860001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113a3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611caf6025913960400191505060405180910390fd5b6113cf7f59fbff3d39bb2f794bbfd9b9596a8bf931739db75955ab8eba2240faabdefbd660001b6109fb565b6113fb7f6a7fac40ea7c0f2b86fd31cf5d040ec026b12e03e3012a4207463f5cb0b6401760001b6109fb565b6114277f404bae8f46c77c858095a0384310c85d4e3c2c4af808377e00b6ea36dfd2455c60001b6109fb565b6114537f4d0a9f54abc8d4274701fba20e505fab043d19e4155bd38b00dcf61ca94b656260001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611c1c6023913960400191505060405180910390fd5b6115057f3b15337a07af433b0102767f6d3f9f3f02078cce7caf7b0c8348218f676f4fc260001b6109fb565b6115317f5ee77e5f423175b79dbc44db8005605cb46b5c106510cab1dcc8f63cf0a23af560001b6109fb565b61155d7ff0304b05d1bc1dcbaa53187232eb51ca84f6e8b18d1e9b6bacf309e0a65bc66660001b6109fb565b6115c881604051806060016040528060268152602001611c61602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506116367f31f6a3ec25469db3ba150cd99148071cf2ef11e59f546101d0eda2ba11ab7c9e60001b6109fb565b6116627fac00036bf582646016737d71ca4d2fcae576e4c6c2623398c132780429fc2d2660001b6109fb565b6116b3816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117217f403b0476122d0361189c31d4006929f7a7fbe9b62788d2a27ec1c0da0907738060001b6109fb565b61174d7f55cec332cefddbc58eb87639930830627e390ed0ba7604e23446e43a57b355a160001b6109fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60006117e57f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b611c18565b6118117f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b611c18565b61183d7f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b611c18565b6118697fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b611c18565b838311158290611914576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156118d95780820151818401526020810190506118be565b50505050905090810190601f1680156119065780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506119417f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b611c18565b61196d7f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b611c18565b6119997f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b611c18565b600083850390506119cc7f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b611c18565b6119f87f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b611c18565b809150509392505050565b6000611a317fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b611c18565b611a5d7fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b611c18565b611a897fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b611c18565b60008284019050611abc7fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b611c18565b611ae87fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b611c18565b611b147fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b611c18565b83811015611b8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b611bb67f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b611c18565b611be27f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b611c18565b611c0e7fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b611c18565b8091505092915050565b5056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582098e1fd6168f47b4e8ee3726611e0bbdd70d6bbe9449cc68668bfb1591f1ba3df64736f6c63430005110032", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a2d69fe116100665780639a2d69fe1461026b578063a457c2d714610299578063a9059cbb146102ff578063dd62ed3e14610365578063de786db2146103dd5761009e565b8063095ea7b3146100a357806318160ddd1461010957806323b872dd1461012757806339509351146101ad57806370a0823114610213575b600080fd5b6100ef600480360360408110156100b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061040b565b604051808215151515815260200191505060405180910390f35b610111610505565b6040518082815260200191505060405180910390f35b6101936004803603606081101561013d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610593565b604051808215151515815260200191505060405180910390f35b6101f9600480360360408110156101c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107a0565b604051808215151515815260200191505060405180910390f35b6102556004803603602081101561022957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061092f565b6040518082815260200191505060405180910390f35b6102976004803603602081101561028157600080fd5b81019080803590602001909291905050506109fb565b005b6102e5600480360360408110156102af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109fe565b604051808215151515815260200191505060405180910390f35b61034b6004803603604081101561031557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ba7565b604051808215151515815260200191505060405180910390f35b6103c76004803603604081101561037b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ca1565b6040518082815260200191505060405180910390f35b610409600480360360208110156103f357600080fd5b8101908080359060200190929190505050610dac565b005b60006104397f0d42ccaca515977830f39e5becdbabcee85221bd96d2dbe4f5c4fd1c85faa4f260001b6109fb565b6104657f754bf2ca5c77b407378982e552328835db434ca83ce9a717a1653fe5711d1fae60001b6109fb565b6104917f29963cee0945aee92c2445dde7b8b4f3a6cdcfaf73de48985b894b146fc0e32b60001b6109fb565b6104a361049c610daf565b8484610e3b565b6104cf7fd3d5e5509e5cf6e120dccb4bdb71e3ac08a9e249b3c368b228f693ebe00d3a0c60001b6109fb565b6104fb7f3c8e72bb3eb97920d5ce54b49094b721dd40891cd173090f708ac710354a271f60001b6109fb565b6001905092915050565b60006105337f5ab4b2827b7adc7d1615b3fff4b96378a946b2c2d915dc989b69a1cfcfba8cc660001b6109fb565b61055f7fb8c09fff4908341d91dd69c3e87ca7844a6698b0819fb96dc538c250ed62eca460001b6109fb565b61058b7f9d0a15e22e847c149e2b58fc2aedb22922b840474f89eb4d312b3c5b78cd5b2c60001b6109fb565b600254905090565b60006105c17ffaf709f346fe3db8ae0124b295421b4e2b2c9b1cd0cadcc780c22f8a4384d59760001b6109fb565b6105ed7f7ad44ef5d3f1e0e833b1e92fd1e3f2c7e5a53bd5e7a5d3dce9beff11464374ef60001b6109fb565b6106197fd6c24c3dfc7552619edd906094e7f17001e775b65b5ccebefca8043e02757a4360001b6109fb565b61062484848461126e565b6106507f5b96f9469c516dbe56cd327c0f8f634d794798325c948710798a5a94c2789d2d60001b6109fb565b61067c7fd2eb81ff83f28d13475a9de327d36049bc434c4548fcd2a76c3780941f5e48cf60001b6109fb565b61073d84610688610daf565b61073885604051806060016040528060288152602001611c8760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106ee610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b610e3b565b6107697f57a15dd9623caa237d7a7077577ded38892410b0a25de72d4b5adfe6113396ac60001b6109fb565b6107957f8e9ad68ec491eabdf1812f7053db0a03a049f6d15f2f69fa88fc20490192df2a60001b6109fb565b600190509392505050565b60006107ce7f608255447736a1e05dd20beee2382814ccf870fa753087ba4a4b1a310552ff6460001b6109fb565b6107fa7f492dc0c5b05a7ffc5af47ee5ef898af0284d44aee2414161ab3e4261c102d68660001b6109fb565b6108267f2e5597593e4b1d6a198285b1b266864576ee1af09905ea75857aca096ce2701f60001b6109fb565b6108cd610831610daf565b846108c88560016000610842610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0390919063ffffffff16565b610e3b565b6108f97f39abdd95fe79d7662434a95e5d54b0c5e184cb933c1d0897b06a0562bc18393560001b6109fb565b6109257fc91754ec9db384f5fea245dc2da3a47b5f0264482ea0037319b98e8c0eab928560001b6109fb565b6001905092915050565b600061095d7fbf11abd02ab3bb802d2e5f99795b3e2f0029c94a76dd17c98892daea64bc72d060001b6109fb565b6109897ffef5ad299e7a3e9ab91375c4e51e155903c0d60b3c990446a6d5ada35300700360001b6109fb565b6109b57f968ebb724aec6bce5faeca202a01f8fd8e5da1bfac5b100527b14d2da30e8fd560001b6109fb565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b50565b6000610a2c7f5f443dd38a143da0f9225497f53288bf2c714176cdbfb41d31674d74dd4ccba660001b6109fb565b610a587f1e28cf5cf881aaf56d724265c30c1e508a3efc1746b5abd59aa73f92949aa54160001b6109fb565b610a847f5d481fd5d46258a2f5daaa0cc18e1ec9f00090010bc8914548e7db894864093e60001b6109fb565b610b45610a8f610daf565b84610b4085604051806060016040528060258152602001611cf86025913960016000610ab9610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b610e3b565b610b717f76d6074abc30f881ff6d416b956be4b2a4d50495113e3ca703a2344d7a87e3f760001b6109fb565b610b9d7faef4d09f98e81fa40d6d23e067fb3d1945292b6116de91c5123cc4d87829085760001b6109fb565b6001905092915050565b6000610bd57fd1f99140089561020c26495e4bff4faf43bf4723034291712a0fe085c62ca0e360001b6109fb565b610c017ff026da482222cc112cbda53a49693b193e42fc7e6df13d27c671ea172127d27a60001b6109fb565b610c2d7fa39db9fb95f48df90321e4f29a2e109b146bcd3b09c341f7996f1a0d4d4693f460001b6109fb565b610c3f610c38610daf565b848461126e565b610c6b7f61cbed024b9eb9b0e7f025bcdc6d8a53b1b9afaacd0490efcf41be17bbc2cd5060001b6109fb565b610c977fa6cc3c9fa193e9f2deca62efcdddb5b1be98dd9414c484d713df4a3f8f84ebe760001b6109fb565b6001905092915050565b6000610ccf7f5fbe00c778dfdb68f544193be7026e7d9e1f3d155e039c4441c5ce99487ab58760001b6109fb565b610cfb7f0b66eb1b4ba67f8a2debbfa264bcc88a0c5a5585942322e8da2048b536ca688760001b6109fb565b610d277fc1dc7f6e3323267ffbfbc407dff8089abe4733ce9c57ed5a38364df62e27a54a60001b6109fb565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b50565b6000610ddd7ff34b2a8b2e9e739c67260af773ba5665e40bdf8d965ecab3b00bcae74560b64260001b610dac565b610e097f2ba39a87f17acfb11161f566e253783aebea98ccbb9bbfbb6309a7334892b2da60001b610dac565b610e357fc9dcf20a261df4fd57144851da3a3c427cb24d07d5a6f61638c5df6df65791d660001b610dac565b33905090565b610e677fc4d20d5bea6a9f16ba818d7e36ebcc778b72081a85c2980911b37f77473fcfe560001b6109fb565b610e937f53a971d56012e06d193c95146c05704674d6e63fc426486c8fc2adbde49f84fd60001b6109fb565b610ebf7f2d4547104a0d1e6b7a26118aab4f1ac602ed4719bf6108961548c4ee7a73459d60001b6109fb565b610eeb7f6686b2cbcfa8e7d83a64eeaefc2795ddf534e4ce251cc44ba22e831f2437bf1160001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611cd46024913960400191505060405180910390fd5b610f9d7f0621319e4b9b2a4be42926b4f3681e8c61351af22cc728be4fb560dcf026149460001b6109fb565b610fc97facce556ea82a7bc65b74b437598ffa3c91a2151624ad0fdafcb5c57a1dbdc83260001b6109fb565b610ff57f030def8372bf273c3d4812a3ccd9d503df582007a5422ab807966de1b113eb7260001b6109fb565b6110217f503fb5eac9225f9e9280e8eba5d49bfb7bf68adec8dd52e1565488204947c14360001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611c3f6022913960400191505060405180910390fd5b6110d37f9ed4ed8864b8acef5391f32c30a28b0d033373f6188e5cc79ef27beac4148c6a60001b6109fb565b6110ff7f46fa9573d78386238685625e980e0f7f0a52dca1988af56fff3bdb10409d086e60001b6109fb565b61112b7f43b10bb899642d0a27f99a76700962d8963f86d8639183df04123c90c177a30d60001b6109fb565b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111d87f10d4eadbc4bbaab320133533ceba51208f926314315c162ec2c6dd7acead3fb360001b6109fb565b6112047f7194093eb53c4d1b4220bea3da2922947134cf794a518c973b6a580217ed3c5b60001b6109fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b61129a7ffde53eb1b51a405de289b72e6ae4f964bc2970a7117d1c47c687807402d255b660001b6109fb565b6112c57efbda40eef188545a791f6a7136ca520097a9320e8f312112f68b8bad2c16b860001b6109fb565b6112f17f6d4de5512cca78b838932b1f8d3cb7c612645bb722a0d6bfcf532069b72224bb60001b6109fb565b61131d7f5d44d165dd8d78b755d21a81cb1a4d992ad809c5e757138c6fed7ff50fc6d36860001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113a3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611caf6025913960400191505060405180910390fd5b6113cf7f59fbff3d39bb2f794bbfd9b9596a8bf931739db75955ab8eba2240faabdefbd660001b6109fb565b6113fb7f6a7fac40ea7c0f2b86fd31cf5d040ec026b12e03e3012a4207463f5cb0b6401760001b6109fb565b6114277f404bae8f46c77c858095a0384310c85d4e3c2c4af808377e00b6ea36dfd2455c60001b6109fb565b6114537f4d0a9f54abc8d4274701fba20e505fab043d19e4155bd38b00dcf61ca94b656260001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611c1c6023913960400191505060405180910390fd5b6115057f3b15337a07af433b0102767f6d3f9f3f02078cce7caf7b0c8348218f676f4fc260001b6109fb565b6115317f5ee77e5f423175b79dbc44db8005605cb46b5c106510cab1dcc8f63cf0a23af560001b6109fb565b61155d7ff0304b05d1bc1dcbaa53187232eb51ca84f6e8b18d1e9b6bacf309e0a65bc66660001b6109fb565b6115c881604051806060016040528060268152602001611c61602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506116367f31f6a3ec25469db3ba150cd99148071cf2ef11e59f546101d0eda2ba11ab7c9e60001b6109fb565b6116627fac00036bf582646016737d71ca4d2fcae576e4c6c2623398c132780429fc2d2660001b6109fb565b6116b3816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117217f403b0476122d0361189c31d4006929f7a7fbe9b62788d2a27ec1c0da0907738060001b6109fb565b61174d7f55cec332cefddbc58eb87639930830627e390ed0ba7604e23446e43a57b355a160001b6109fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60006117e57f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b611c18565b6118117f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b611c18565b61183d7f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b611c18565b6118697fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b611c18565b838311158290611914576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156118d95780820151818401526020810190506118be565b50505050905090810190601f1680156119065780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506119417f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b611c18565b61196d7f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b611c18565b6119997f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b611c18565b600083850390506119cc7f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b611c18565b6119f87f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b611c18565b809150509392505050565b6000611a317fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b611c18565b611a5d7fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b611c18565b611a897fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b611c18565b60008284019050611abc7fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b611c18565b611ae87fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b611c18565b611b147fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b611c18565b83811015611b8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b611bb67f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b611c18565b611be27f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b611c18565b611c0e7fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b611c18565b8091505092915050565b5056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582098e1fd6168f47b4e8ee3726611e0bbdd70d6bbe9449cc68668bfb1591f1ba3df64736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json b/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json index 9019a60..d4ac0cb 100644 --- a/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json +++ b/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json @@ -148,6 +148,21 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0xc9bbb881", + "type": "bytes32" + } + ], + "name": "c_0xc9bbb881", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [], diff --git a/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json b/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json index 494672e..fc3121f 100644 --- a/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json +++ b/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json @@ -28,6 +28,36 @@ "name": "OwnershipTransferred", "type": "event" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0xd8e745d9", + "type": "bytes32" + } + ], + "name": "c_0xd8e745d9", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0xdb7cf3fd", + "type": "bytes32" + } + ], + "name": "c_0xdb7cf3fd", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [], diff --git a/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json b/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json index 4ab44f7..c2af3fd 100644 --- a/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json +++ b/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json @@ -2,9 +2,25 @@ "_format": "hh-sol-artifact-1", "contractName": "ReentrancyGuard", "sourceName": "contracts/Openzeppelin/ReentrancyGuard.sol", - "abi": [], - "bytecode": "0x60806040526001600055348015601457600080fd5b50603e8060226000396000f3fe6080604052600080fdfea265627a7a723158203788d8b2241852354e8f19939d533dabc145e0bae35eca067031c2bfa406146064736f6c63430005110032", - "deployedBytecode": "0x6080604052600080fdfea265627a7a723158203788d8b2241852354e8f19939d533dabc145e0bae35eca067031c2bfa406146064736f6c63430005110032", + "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x43034809", + "type": "bytes32" + } + ], + "name": "c_0x43034809", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x60806040526001600055348015601457600080fd5b506090806100236000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80638101299c14602d575b600080fd5b605660048036036020811015604157600080fd5b81019080803590602001909291905050506058565b005b5056fea265627a7a72315820de575c51a031385798978fe01d10462c4f0c8b6c620c7b85dfc5d4d4d6af7d4264736f6c63430005110032", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c80638101299c14602d575b600080fd5b605660048036036020811015604157600080fd5b81019080803590602001909291905050506058565b005b5056fea265627a7a72315820de575c51a031385798978fe01d10462c4f0c8b6c620c7b85dfc5d4d4d6af7d4264736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json b/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json index 31bcc6c..1c2e5f7 100644 --- a/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json +++ b/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json @@ -2,9 +2,25 @@ "_format": "hh-sol-artifact-1", "contractName": "SafeMath", "sourceName": "contracts/Openzeppelin/SafeMath.sol", - "abi": [], - "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72315820afbfb598f394b83d986407677d26d9a954705283684f0c5d4d9de47c9f54693864736f6c63430005110032", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72315820afbfb598f394b83d986407677d26d9a954705283684f0c5d4d9de47c9f54693864736f6c63430005110032", + "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x4263dba6", + "type": "bytes32" + } + ], + "name": "c_0x4263dba6", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x609b610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80637e6ddb90146038575b600080fd5b606160048036036020811015604c57600080fd5b81019080803590602001909291905050506063565b005b5056fea265627a7a72315820e3476cdf88e896cec8997a9311dd5b3773beee775ccb18f45d3f85021f8e06b664736f6c63430005110032", + "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80637e6ddb90146038575b600080fd5b606160048036036020811015604c57600080fd5b81019080803590602001909291905050506063565b005b5056fea265627a7a72315820e3476cdf88e896cec8997a9311dd5b3773beee775ccb18f45d3f85021f8e06b664736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json b/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json index 7ced857..402c5ef 100644 --- a/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json +++ b/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json @@ -121,6 +121,21 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x55aecb26", + "type": "bytes32" + } + ], + "name": "c_0x55aecb26", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [ diff --git a/artifacts/contracts/OriginsBase.sol/OriginsBase.json b/artifacts/contracts/OriginsBase.sol/OriginsBase.json index dd0bea7..e1cb229 100644 --- a/artifacts/contracts/OriginsBase.sol/OriginsBase.json +++ b/artifacts/contracts/OriginsBase.sol/OriginsBase.json @@ -589,6 +589,81 @@ "stateMutability": "payable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x2b1a913c", + "type": "bytes32" + } + ], + "name": "c_0x2b1a913c", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x4ad0f1fc", + "type": "bytes32" + } + ], + "name": "c_0x4ad0f1fc", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x55aecb26", + "type": "bytes32" + } + ], + "name": "c_0x55aecb26", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x7d365384", + "type": "bytes32" + } + ], + "name": "c_0x7d365384", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x8209a966", + "type": "bytes32" + } + ], + "name": "c_0x8209a966", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [ @@ -1319,8 +1394,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b506040516200469c3803806200469c833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82518660208202830111640100000000821117156200008c57600080fd5b82525081516020918201928201910280838360005b83811015620000bb578181015183820152602001620000a1565b50505050919091016040525060200151835190925083915060005b81811015620002325760026000848381518110620000f057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615620001555760405162461bcd60e51b81526004018080602001828103825260308152602001806200466c6030913960400191505060405180910390fd5b6001600260008584815181106200016857fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000838281518110620001b657fe5b602090810291909101810151825460018101845560009384529282902090920180546001600160a01b0319166001600160a01b03909316929092179091556040805133808252915191927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92918290030190a2600101620000d6565b5050506001600160a01b038116156200029157600580546001600160a01b0319166001600160a01b03831690811790915560405160009033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc50908390a45b50506143c980620002a36000396000f3fe6080604052600436106101f95760003560e01c8063836e386d1161010d578063b3ce74c7116100a0578063e0e3671c1161006f578063e0e3671c146109ed578063e87471a514610a20578063ea4ba2fa14610a53578063ee56797514610a9e578063fdc704d714610ab3576101f9565b8063b3ce74c7146108c1578063ca2dfd0a146108fa578063d6febde81461092d578063d96e9de314610950576101f9565b8063a0e67e2b116100dc578063a0e67e2b1461079a578063a935e766146107ff578063ab18af2714610814578063af7cea7d14610847576101f9565b8063836e386d146106235780638acb0e6b146106615780638e1ba962146106ec5780639000b3d614610767576101f9565b806321df0da7116101905780636e1b400b1161015f5780636e1b400b1461053c5780637065cb481461055157806376d73a76146105845780637baec6ae146105ba5780638259ab11146105f3576101f9565b806321df0da71461049757806343a40e3f146104ac57806365e168d3146104df57806367184e2814610527576101f9565b806315cccf8e116101cc57806315cccf8e146103d157806316a6288914610410578063173825d91461043a578063194e13621461046d576101f9565b80630487e0b2146101fe57806309d5ff14146102495780631291e84f146102d357806312b0d400146103a0575b600080fd5b34801561020a57600080fd5b506102376004803603604081101561022157600080fd5b506001600160a01b038135169060200135610ae6565b60408051918252519081900360200190f35b34801561025557600080fd5b5061023760048036036101a081101561026d57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906001600160a01b03610100820135169060ff610120820135811691610140810135821691610160820135811691610180013516610b11565b3480156102df57600080fd5b5061039e600480360360408110156102f657600080fd5b810190602081018135600160201b81111561031057600080fd5b82018360208201111561032257600080fd5b803590602001918460208302840111600160201b8311171561034357600080fd5b919390929091602081019035600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b509092509050610beb565b005b3480156103ac57600080fd5b506103b5610cc8565b604080516001600160a01b039092168252519081900360200190f35b3480156103dd57600080fd5b5061039e600480360360808110156103f457600080fd5b508035906020810135906040810135906060013560ff16610cd7565b34801561041c57600080fd5b506102376004803603602081101561043357600080fd5b5035610d37565b34801561044657600080fd5b5061039e6004803603602081101561045d57600080fd5b50356001600160a01b0316610d4c565b34801561047957600080fd5b506102376004803603602081101561049057600080fd5b5035610da6565b3480156104a357600080fd5b506103b5610db8565b3480156104b857600080fd5b5061039e600480360360408110156104cf57600080fd5b508035906020013560ff16610dc7565b3480156104eb57600080fd5b5061039e6004803603608081101561050257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610e23565b34801561053357600080fd5b50610237610e7d565b34801561054857600080fd5b506103b5610e83565b34801561055d57600080fd5b5061039e6004803603602081101561057457600080fd5b50356001600160a01b0316610e92565b34801561059057600080fd5b5061039e600480360360608110156105a757600080fd5b5080359060208101359060400135610ee9565b3480156105c657600080fd5b5061039e600480360360408110156105dd57600080fd5b506001600160a01b038135169060200135610f47565b3480156105ff57600080fd5b5061039e6004803603604081101561061657600080fd5b5080359060200135610f9f565b34801561062f57600080fd5b5061064d6004803603602081101561064657600080fd5b5035610ff7565b604080519115158252519081900360200190f35b34801561066d57600080fd5b5061039e6004803603604081101561068457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b50909250905061100c565b3480156106f857600080fd5b5061039e6004803603604081101561070f57600080fd5b810190602081018135600160201b81111561072957600080fd5b82018360208201111561073b57600080fd5b803590602001918460208302840111600160201b8311171561075c57600080fd5b91935091503561107d565b34801561077357600080fd5b5061039e6004803603602081101561078a57600080fd5b50356001600160a01b0316611103565b3480156107a657600080fd5b506107af61115a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107eb5781810151838201526020016107d3565b505050509050019250505060405180910390f35b34801561080b57600080fd5b506107af6111bc565b34801561082057600080fd5b5061039e6004803603602081101561083757600080fd5b50356001600160a01b031661121c565b34801561085357600080fd5b506108716004803603602081101561086a57600080fd5b5035611273565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b3480156108cd57600080fd5b5061064d600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611427565b34801561090657600080fd5b5061039e6004803603602081101561091d57600080fd5b50356001600160a01b0316611452565b61039e6004803603604081101561094357600080fd5b50803590602001356114a9565b34801561095c57600080fd5b5061097a6004803603602081101561097357600080fd5b50356114b3565b6040516001600160a01b03861681526020810185600181111561099957fe5b60ff1681526020018460028111156109ad57fe5b60ff1681526020018360038111156109c157fe5b60ff1681526020018260048111156109d557fe5b60ff1681526020019550505050505060405180910390f35b3480156109f957600080fd5b5061064d60048036036020811015610a1057600080fd5b50356001600160a01b0316611638565b348015610a2c57600080fd5b5061039e60048036036020811015610a4357600080fd5b50356001600160a01b0316611656565b348015610a5f57600080fd5b5061039e600480360360c0811015610a7657600080fd5b5080359060208101359060408101359060608101359060808101359060a0013560ff166116ad565b348015610aaa57600080fd5b5061039e611711565b348015610abf57600080fd5b5061064d60048036036020811015610ad657600080fd5b50356001600160a01b031661171b565b6001600160a01b03821660009081526009602090815260408083208484529091529020545b92915050565b3360009081526002602052604081205460ff16610b5f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b50600480546001019081905560408051828152905133917eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b919081900360200190a2610baa8185611739565b610bb6818888886117c7565b610bc0818f61190e565b610bce818a8a8e8e87611ca7565b610bda818e8e86611ddd565b9d9c50505050505050505050505050565b3360009081526003602052604090205460ff16610c395760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b828114610c775760405162461bcd60e51b8152600401808060200182810382526034815260200180613e366034913960400191505060405180910390fd5b60005b83811015610cc157610cb9858583818110610c9157fe5b905060200201356001600160a01b0316848484818110610cad57fe5b90506020020135611f99565b600101610c7a565b5050505050565b6005546001600160a01b031690565b3360009081526002602052604090205460ff16610d255760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d3184848484611ddd565b50505050565b6000818152600b60205260409020545b919050565b3360009081526002602052604090205460ff16610d9a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612043565b50565b6000908152600a602052604090205490565b6006546001600160a01b031690565b3360009081526002602052604090205460ff16610e155760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f8282611739565b5050565b3360009081526002602052604090205460ff16610e715760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d31848484846117c7565b60045490565b6007546001600160a01b031690565b3360009081526002602052604090205460ff16610ee05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816121d4565b3360009081526002602052604090205460ff16610f375760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610f42838383612323565b505050565b3360009081526003602052604090205460ff16610f955760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b610e1f8282611f99565b3360009081526002602052604090205460ff16610fed5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f828261190e565b6000908152600c602052604090205460ff1690565b3360009081526003602052604090205460ff1661105a5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b81811015610d315761107584848484818110610cad57fe5b60010161105d565b3360009081526003602052604090205460ff166110cb5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b82811015610d31576110fb8484838181106110e557fe5b905060200201356001600160a01b031683611f99565b6001016110ce565b3360009081526002602052604090205460ff166111515760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816123c2565b606060008054806020026020016040519081016040528092919081815260200182805480156111b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611194575b5050505050905090565b606060018054806020026020016040519081016040528092919081815260200182805480156111b2576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611194575050505050905090565b3360009081526002602052604090205460ff1661126a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612510565b60008060008060008060008060008061128a613c88565b60008c81526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561133957fe5b600181111561134457fe5b8152602001600a820160159054906101000a900460ff16600281111561136657fe5b600281111561137157fe5b8152602001600a820160169054906101000a900460ff16600381111561139357fe5b600381111561139e57fe5b8152602001600a820160179054906101000a900460ff1660048111156113c057fe5b60048111156113cb57fe5b815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b6001600160a01b03919091166000908152600d60209081526040808320938352929052205460ff1690565b3360009081526002602052604090205460ff166114a05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816125b3565b610e1f8282612746565b60008060008060006114c3613c88565b60008781526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561157257fe5b600181111561157d57fe5b8152602001600a820160159054906101000a900460ff16600281111561159f57fe5b60028111156115aa57fe5b8152602001600a820160169054906101000a900460ff1660038111156115cc57fe5b60038111156115d757fe5b8152602001600a820160179054906101000a900460ff1660048111156115f957fe5b600481111561160457fe5b9052506101408101516101608201516101808301516101a08401516101c090940151929b919a509850919650945092505050565b6001600160a01b031660009081526002602052604090205460ff1690565b3360009081526002602052604090205460ff166116a45760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612db8565b3360009081526002602052604090205460ff166116fb5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b611709868686868686611ca7565b505050505050565b611719612e5b565b565b6001600160a01b031660009081526003602052604090205460ff1690565b6000828152600860205260409020600a01805482919060ff60a81b1916600160a81b83600281111561176757fe5b0217905550336001600160a01b03167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a482378383604051808381526020018260028111156117af57fe5b60ff1681526020019250505060405180910390a25050565b600083116118065760405162461bcd60e51b815260040180806020018281038252602981526020018061425e6029913960400191505060405180910390fd5b600181600181111561181457fe5b141561185f576001600160a01b03821661185f5760405162461bcd60e51b81526004018080602001828103825260328152602001806140a86032913960400191505060405180910390fd5b600084815260086020526040902060098101849055600a0180546001600160a01b0319166001600160a01b0384161780825582919060ff60a01b1916600160a01b8360018111156118ac57fe5b02179055508060018111156118bd57fe5b60408051868152602081018690526001600160a01b03851681830152905133917f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7919081900360600190a350505050565b6000811161194d5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e6a603c913960400191505060405180910390fd5b600082815260086020526040902060098101546001909101548291611978919063ffffffff6130e416565b11156119b55760405162461bcd60e51b815260040180806020018281038252604c8152602001806142c1604c913960600191505060405180910390fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d6020811015611a2a57600080fd5b505160008481526008602052604081206002015491925090611a6a90611a5e85611a52613144565b9063ffffffff61318316565b9063ffffffff6131dd16565b905081811115611b72576006546000906001600160a01b03166323b872dd3330611a9a868863ffffffff6131dd16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b505050506040513d6020811015611b2c57600080fd5b5051905080611b6c5760405162461bcd60e51b815260040180806020018281038252603e8152602001806141ea603e913960400191505060405180910390fd5b50611c52565b6006546000906001600160a01b031663a9059cbb33611b97868663ffffffff6131dd16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b5051905080611c505760405162461bcd60e51b8152600401808060200182810382526038815260200180613fdf6038913960400191505060405180910390fd5b505b6000848152600860209081526040918290206002018590558151868152908101859052815133927fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca95928290030190a250505050565b83851115611ce65760405162461bcd60e51b8152600401808060200182810382526029815260200180613fb66029913960400191505060405180910390fd5b612710821115611d275760405162461bcd60e51b81526004018080602001828103825260378152602001806140386037913960400191505060405180910390fd5b6000868152600860208190526040909120600781018790559081018590556005810184905560068101839055600a01805482919060ff60b81b1916600160b81b836004811115611d7357fe5b0217905550806004811115611d8457fe5b60408051888152602081018890528082018790526060810186905260808101859052905133917f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e3919081900360a00190a3505050505050565b8215801590611deb57508115155b8015611e0257506002816003811115611e0057fe5b145b15611e595742611e18848463ffffffff61318316565b11611e545760405162461bcd60e51b815260040180806020018281038252603a815260200180614287603a913960400191505060405180910390fd5b611efe565b82151580611e6657508115155b8015611e7d57506003816003811115611e7b57fe5b145b15611efe57818310611ec05760405162461bcd60e51b815260040180806020018281038252603b815260200180613dcf603b913960400191505060405180910390fd5b428211611efe5760405162461bcd60e51b81526004018080602001828103825260368152602001806142286036913960400191505060405180910390fd5b6000848152600860205260409020600380820185905560048201849055600a9091018054839260ff60b01b1990911690600160b01b908490811115611f3f57fe5b0217905550806003811115611f5057fe5b6040805186815260208101869052808201859052905133917f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f582650919081900360600190a350505050565b6001600160a01b038216611fde5760405162461bcd60e51b8152600401808060200182810382526033815260200180613ea66033913960400191505060405180910390fd5b6001600160a01b0382166000818152600d60209081526040808320858452825291829020805460ff191660011790558151848152915133927fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f492908290030190a35050565b6001600160a01b03811660009081526002602052604090205460ff1661209a5760405162461bcd60e51b815260040180806020018281038252602681526020018061430d6026913960400191505060405180910390fd5b6001600160a01b0381166000908152600260205260408120805460ff191690558054905b8181101561216157600081815481106120d357fe5b6000918252602090912001546001600160a01b0384811691161415612159576000600183038154811061210257fe5b600091825260208220015481546001600160a01b0390911691908390811061212657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612161565b6001016120be565b50600080548061216d57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f93003679928290030190a25050565b6001600160a01b03811661222f576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156122875760405162461bcd60e51b815260040180806020018281038252602a815260200180613da5602a913960400191505060405180910390fd5b6001600160a01b0381166000818152600260209081526040808320805460ff19166001908117909155835490810184559280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390920180546001600160a01b031916841790558151928352905133927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92908290030190a250565b808211156123625760405162461bcd60e51b815260040180806020018281038252603981526020018061406f6039913960400191505060405180910390fd5b6000838152600860209081526040918290208481556001018390558151858152908101849052808201839052905133917fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c919081900360600190a2505050565b6001600160a01b03811661241d576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16156124755760405162461bcd60e51b815260040180806020018281038252602c815260200180613ed9602c913960400191505060405180910390fd5b6001600160a01b0381166000818152600360209081526040808320805460ff191660019081179091558054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b031916841790558151928352905133927fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e92908290030190a250565b6001600160a01b0381166125555760405162461bcd60e51b815260040180806020018281038252602c815260200180613e0a602c913960400191505060405180910390fd5b6005546040516001600160a01b0380841692169033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5090600090a4600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604090205460ff1661260a5760405162461bcd60e51b81526004018080602001828103825260288152602001806141976028913960400191505060405180910390fd5b6001600160a01b0381166000908152600360205260408120805460ff19169055600154905b818110156126d3576001818154811061264457fe5b6000918252602090912001546001600160a01b03848116911614156126cb5760018083038154811061267257fe5b600091825260209091200154600180546001600160a01b03909216918390811061269857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506126d3565b60010161262f565b5060018054806126df57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed6928290030190a25050565b61274f8261321f565b6127a0576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6127a8613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561285757fe5b600181111561286257fe5b8152602001600a820160159054906101000a900460ff16600281111561288457fe5b600281111561288f57fe5b8152602001600a820160169054906101000a900460ff1660038111156128b157fe5b60038111156128bc57fe5b8152602001600a820160179054906101000a900460ff1660048111156128de57fe5b60048111156128e957fe5b90525090506000816101800151600281111561290157fe5b141561293e5760405162461bcd60e51b815260040180806020018281038252602881526020018061436d6028913960400191505060405180910390fd5b6002816101800151600281111561295157fe5b14156129b057336000908152600d6020908152604080832086845290915290205460ff166129b05760405162461bcd60e51b8152600401808060200182810382526028815260200180613f686028913960400191505060405180910390fd5b336000908152600960209081526040808320868452825290912054908201518110612a0c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613f056031913960400191505060405180910390fd5b6000808361016001516001811115612a2057fe5b1415612a2d575034612b7e565b83612a695760405162461bcd60e51b81526004018080602001828103825260238152602001806141486023913960400191505060405180910390fd5b6101408301516001600160a01b0316612ab35760405162461bcd60e51b815260040180806020018281038252602c81526020018061416b602c913960400191505060405180910390fd5b610140830151604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015612b0f57600080fd5b505af1158015612b23573d6000803e3d6000fd5b505050506040513d6020811015612b3957600080fd5b5051905080612b795760405162461bcd60e51b815260040180806020018281038252603a815260200180614333603a913960400191505060405180910390fd5b849150505b8251600090821015612bc15760405162461bcd60e51b8152600401808060200182810382526032815260200180613f366032913960400191505060405180910390fd5b60208401518290612bd8908563ffffffff6131dd16565b11612c11576020840151612bf690611a5e848663ffffffff61318316565b6020850151909150612c0e908463ffffffff6131dd16565b91505b6000612c2b856101200151846130e490919063ffffffff16565b6040860151909150612c43908263ffffffff6131dd16565b604080870191909152336000908152600960209081528282208a835290522054612c73908263ffffffff61318316565b3360009081526009602090815260408083208b8452909152902055612c988782613463565b612ca18761388f565b612cad87848684613af5565b8115612d75576101408501516040805163a9059cbb60e01b81523360048201526024810185905290516000926001600160a01b03169163a9059cbb91604480830192602092919082900301818787803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506040513d6020811015612d3357600080fd5b5051905080612d735760405162461bcd60e51b815260040180806020018281038252603981526020018061410f6039913960400191505060405180910390fd5b505b6040805188815260208101839052815133927f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba0928290030190a250505050505050565b6001600160a01b038116612dfd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d756030913960400191505060405180910390fd5b6007546040516001600160a01b0380841692169033907f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce190600090a4600780546001600160a01b0319166001600160a01b0392909216919091179055565b612e6433611638565b80612e7957506005546001600160a01b031633145b612eb45760405162461bcd60e51b81526004018080602001828103825260358152602001806140da6035913960400191505060405180910390fd5b60055433906001600160a01b031615612ed557506005546001600160a01b03165b60015b6004548111610e1f576000818152600c602052604090205460ff16156130dc57600081815260086020908152604080832060090154600b909252822054612f249163ffffffff613b4a16565b9050600080838152600860205260409020600a0154600160a01b900460ff166001811115612f4e57fe5b1415612ffa576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612f8a573d6000803e3d6000fd5b50826001600160a01b0316336001600160a01b03167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c8460008560405180848152602001836001811115612fda57fe5b60ff168152602001828152602001935050505060405180910390a36130da565b6000828152600860209081526040808320600a0154815163a9059cbb60e01b81526001600160a01b038881166004830152602482018790529251929091169363a9059cbb9360448084019491939192918390030190829087803b15801561306057600080fd5b505af1158015613074573d6000803e3d6000fd5b505050506040513d602081101561308a57600080fd5b5050604080518381526001602082015280820183905290516001600160a01b0385169133917fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c9181900360600190a35b505b600101612ed8565b6000826130f357506000610b0b565b8282028284828161310057fe5b041461313d5760405162461bcd60e51b81526004018080602001828103825260218152602001806140176021913960400191505060405180910390fd5b9392505050565b600060015b600454811161317f5760008181526008602052604090206002015461317590839063ffffffff61318316565b9150600101613149565b5090565b60008282018381101561313d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061313d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8c565b60008181526008602052604081206003015461326c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613f906026913960400191505060405180910390fd5b6000828152600c602052604090205460ff16156132d0576040805162461bcd60e51b815260206004820152601860248201527f4f726967696e73426173653a2053616c6520656e6465642e0000000000000000604482015290519081900360640190fd5b600080838152600860205260409020600a0154600160b01b900460ff1660038111156132f857fe5b141561330657506000610d47565b60016000838152600860205260409020600a0154600160b01b900460ff16600381111561332f57fe5b14801561334b5750600082815260086020526040902060020154155b1561336f57506000818152600c60205260408120805460ff19166001179055610d47565b60036000838152600860205260409020600a0154600160b01b900460ff16600381111561339857fe5b1480156133b5575060008281526008602052604090206004015442115b156133d957506000818152600c60205260408120805460ff19166001179055610d47565b60026000838152600860205260409020600a0154600160b01b900460ff16600381111561340257fe5b1480156134375750600082815260086020526040902060048101546003909101544291613435919063ffffffff61318316565b105b1561345b57506000818152600c60205260408120805460ff19166001179055610d47565b506001919050565b61346b613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561351a57fe5b600181111561352557fe5b8152602001600a820160159054906101000a900460ff16600281111561354757fe5b600281111561355257fe5b8152602001600a820160169054906101000a900460ff16600381111561357457fe5b600381111561357f57fe5b8152602001600a820160179054906101000a900460ff1660048111156135a157fe5b60048111156135ac57fe5b90525090506000816101c0015160048111156135c457fe5b14156136015760405162461bcd60e51b815260040180806020018281038252602b8152602001806141bf602b913960400191505060405180910390fd5b6001816101c00151600481111561361457fe5b14156136a3576101408101516040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50610f429050565b6002816101c0015160048111156136b657fe5b1415613700576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b6003816101c00151600481111561371357fe5b1415613832576006546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561377257600080fd5b505af1158015613786573d6000803e3d6000fd5b505050506040513d602081101561379c57600080fd5b505060075460e082015161010083015160c08401516040805163849a681760e01b815233600482015260248101889052604481019490945260648401929092526084830152516001600160a01b039092169163849a68179160a48082019260009290919082900301818387803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b50505050610f42565b6004816101c00151600481111561384557fe5b1415610f42576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b613897613c88565b60008281526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561394657fe5b600181111561395157fe5b8152602001600a820160159054906101000a900460ff16600281111561397357fe5b600281111561397e57fe5b8152602001600a820160169054906101000a900460ff1660038111156139a057fe5b60038111156139ab57fe5b8152602001600a820160179054906101000a900460ff1660048111156139cd57fe5b60048111156139d857fe5b815250509050806020015181604001511015610e1f57805160408201511015613a9c576040810151613a54576000828152600c6020908152604091829020805460ff191660011790558151848152915133927f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c492908290030190a25b6000828152600860209081526040808320929092558151848152915133927f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a7892908290030190a25b6040808201805160008581526008602090815290849020600101919091559051825185815291820152815133927f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445928290030190a25050565b8215610d315781613b16576000848152600a60205260409020805460010190555b6000848152600b6020526040902054613b35908263ffffffff61318316565b6000858152600b602052604090205550505050565b600061313d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c23565b60008184841115613c1b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be0578181015183820152602001613bc8565b50505050905090810190601f168015613c0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c725760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be0578181015183820152602001613bc8565b506000838581613c7e57fe5b0495945050505050565b604051806101e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001811115613cf757fe5b81526020016000815260200160008152602001600090529056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158201af36c62015c55f48b1b93810fd5dacf4fb278b800aee7e218cc1503740f4c5964736f6c634300051100324f726967696e7341646d696e3a2045616368206f776e65722063616e206265206164646564206f6e6c79206f6e63652e", - "deployedBytecode": "0x6080604052600436106101f95760003560e01c8063836e386d1161010d578063b3ce74c7116100a0578063e0e3671c1161006f578063e0e3671c146109ed578063e87471a514610a20578063ea4ba2fa14610a53578063ee56797514610a9e578063fdc704d714610ab3576101f9565b8063b3ce74c7146108c1578063ca2dfd0a146108fa578063d6febde81461092d578063d96e9de314610950576101f9565b8063a0e67e2b116100dc578063a0e67e2b1461079a578063a935e766146107ff578063ab18af2714610814578063af7cea7d14610847576101f9565b8063836e386d146106235780638acb0e6b146106615780638e1ba962146106ec5780639000b3d614610767576101f9565b806321df0da7116101905780636e1b400b1161015f5780636e1b400b1461053c5780637065cb481461055157806376d73a76146105845780637baec6ae146105ba5780638259ab11146105f3576101f9565b806321df0da71461049757806343a40e3f146104ac57806365e168d3146104df57806367184e2814610527576101f9565b806315cccf8e116101cc57806315cccf8e146103d157806316a6288914610410578063173825d91461043a578063194e13621461046d576101f9565b80630487e0b2146101fe57806309d5ff14146102495780631291e84f146102d357806312b0d400146103a0575b600080fd5b34801561020a57600080fd5b506102376004803603604081101561022157600080fd5b506001600160a01b038135169060200135610ae6565b60408051918252519081900360200190f35b34801561025557600080fd5b5061023760048036036101a081101561026d57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906001600160a01b03610100820135169060ff610120820135811691610140810135821691610160820135811691610180013516610b11565b3480156102df57600080fd5b5061039e600480360360408110156102f657600080fd5b810190602081018135600160201b81111561031057600080fd5b82018360208201111561032257600080fd5b803590602001918460208302840111600160201b8311171561034357600080fd5b919390929091602081019035600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b509092509050610beb565b005b3480156103ac57600080fd5b506103b5610cc8565b604080516001600160a01b039092168252519081900360200190f35b3480156103dd57600080fd5b5061039e600480360360808110156103f457600080fd5b508035906020810135906040810135906060013560ff16610cd7565b34801561041c57600080fd5b506102376004803603602081101561043357600080fd5b5035610d37565b34801561044657600080fd5b5061039e6004803603602081101561045d57600080fd5b50356001600160a01b0316610d4c565b34801561047957600080fd5b506102376004803603602081101561049057600080fd5b5035610da6565b3480156104a357600080fd5b506103b5610db8565b3480156104b857600080fd5b5061039e600480360360408110156104cf57600080fd5b508035906020013560ff16610dc7565b3480156104eb57600080fd5b5061039e6004803603608081101561050257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610e23565b34801561053357600080fd5b50610237610e7d565b34801561054857600080fd5b506103b5610e83565b34801561055d57600080fd5b5061039e6004803603602081101561057457600080fd5b50356001600160a01b0316610e92565b34801561059057600080fd5b5061039e600480360360608110156105a757600080fd5b5080359060208101359060400135610ee9565b3480156105c657600080fd5b5061039e600480360360408110156105dd57600080fd5b506001600160a01b038135169060200135610f47565b3480156105ff57600080fd5b5061039e6004803603604081101561061657600080fd5b5080359060200135610f9f565b34801561062f57600080fd5b5061064d6004803603602081101561064657600080fd5b5035610ff7565b604080519115158252519081900360200190f35b34801561066d57600080fd5b5061039e6004803603604081101561068457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b50909250905061100c565b3480156106f857600080fd5b5061039e6004803603604081101561070f57600080fd5b810190602081018135600160201b81111561072957600080fd5b82018360208201111561073b57600080fd5b803590602001918460208302840111600160201b8311171561075c57600080fd5b91935091503561107d565b34801561077357600080fd5b5061039e6004803603602081101561078a57600080fd5b50356001600160a01b0316611103565b3480156107a657600080fd5b506107af61115a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107eb5781810151838201526020016107d3565b505050509050019250505060405180910390f35b34801561080b57600080fd5b506107af6111bc565b34801561082057600080fd5b5061039e6004803603602081101561083757600080fd5b50356001600160a01b031661121c565b34801561085357600080fd5b506108716004803603602081101561086a57600080fd5b5035611273565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b3480156108cd57600080fd5b5061064d600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611427565b34801561090657600080fd5b5061039e6004803603602081101561091d57600080fd5b50356001600160a01b0316611452565b61039e6004803603604081101561094357600080fd5b50803590602001356114a9565b34801561095c57600080fd5b5061097a6004803603602081101561097357600080fd5b50356114b3565b6040516001600160a01b03861681526020810185600181111561099957fe5b60ff1681526020018460028111156109ad57fe5b60ff1681526020018360038111156109c157fe5b60ff1681526020018260048111156109d557fe5b60ff1681526020019550505050505060405180910390f35b3480156109f957600080fd5b5061064d60048036036020811015610a1057600080fd5b50356001600160a01b0316611638565b348015610a2c57600080fd5b5061039e60048036036020811015610a4357600080fd5b50356001600160a01b0316611656565b348015610a5f57600080fd5b5061039e600480360360c0811015610a7657600080fd5b5080359060208101359060408101359060608101359060808101359060a0013560ff166116ad565b348015610aaa57600080fd5b5061039e611711565b348015610abf57600080fd5b5061064d60048036036020811015610ad657600080fd5b50356001600160a01b031661171b565b6001600160a01b03821660009081526009602090815260408083208484529091529020545b92915050565b3360009081526002602052604081205460ff16610b5f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b50600480546001019081905560408051828152905133917eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b919081900360200190a2610baa8185611739565b610bb6818888886117c7565b610bc0818f61190e565b610bce818a8a8e8e87611ca7565b610bda818e8e86611ddd565b9d9c50505050505050505050505050565b3360009081526003602052604090205460ff16610c395760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b828114610c775760405162461bcd60e51b8152600401808060200182810382526034815260200180613e366034913960400191505060405180910390fd5b60005b83811015610cc157610cb9858583818110610c9157fe5b905060200201356001600160a01b0316848484818110610cad57fe5b90506020020135611f99565b600101610c7a565b5050505050565b6005546001600160a01b031690565b3360009081526002602052604090205460ff16610d255760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d3184848484611ddd565b50505050565b6000818152600b60205260409020545b919050565b3360009081526002602052604090205460ff16610d9a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612043565b50565b6000908152600a602052604090205490565b6006546001600160a01b031690565b3360009081526002602052604090205460ff16610e155760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f8282611739565b5050565b3360009081526002602052604090205460ff16610e715760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d31848484846117c7565b60045490565b6007546001600160a01b031690565b3360009081526002602052604090205460ff16610ee05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816121d4565b3360009081526002602052604090205460ff16610f375760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610f42838383612323565b505050565b3360009081526003602052604090205460ff16610f955760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b610e1f8282611f99565b3360009081526002602052604090205460ff16610fed5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f828261190e565b6000908152600c602052604090205460ff1690565b3360009081526003602052604090205460ff1661105a5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b81811015610d315761107584848484818110610cad57fe5b60010161105d565b3360009081526003602052604090205460ff166110cb5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b82811015610d31576110fb8484838181106110e557fe5b905060200201356001600160a01b031683611f99565b6001016110ce565b3360009081526002602052604090205460ff166111515760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816123c2565b606060008054806020026020016040519081016040528092919081815260200182805480156111b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611194575b5050505050905090565b606060018054806020026020016040519081016040528092919081815260200182805480156111b2576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611194575050505050905090565b3360009081526002602052604090205460ff1661126a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612510565b60008060008060008060008060008061128a613c88565b60008c81526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561133957fe5b600181111561134457fe5b8152602001600a820160159054906101000a900460ff16600281111561136657fe5b600281111561137157fe5b8152602001600a820160169054906101000a900460ff16600381111561139357fe5b600381111561139e57fe5b8152602001600a820160179054906101000a900460ff1660048111156113c057fe5b60048111156113cb57fe5b815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b6001600160a01b03919091166000908152600d60209081526040808320938352929052205460ff1690565b3360009081526002602052604090205460ff166114a05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816125b3565b610e1f8282612746565b60008060008060006114c3613c88565b60008781526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561157257fe5b600181111561157d57fe5b8152602001600a820160159054906101000a900460ff16600281111561159f57fe5b60028111156115aa57fe5b8152602001600a820160169054906101000a900460ff1660038111156115cc57fe5b60038111156115d757fe5b8152602001600a820160179054906101000a900460ff1660048111156115f957fe5b600481111561160457fe5b9052506101408101516101608201516101808301516101a08401516101c090940151929b919a509850919650945092505050565b6001600160a01b031660009081526002602052604090205460ff1690565b3360009081526002602052604090205460ff166116a45760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612db8565b3360009081526002602052604090205460ff166116fb5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b611709868686868686611ca7565b505050505050565b611719612e5b565b565b6001600160a01b031660009081526003602052604090205460ff1690565b6000828152600860205260409020600a01805482919060ff60a81b1916600160a81b83600281111561176757fe5b0217905550336001600160a01b03167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a482378383604051808381526020018260028111156117af57fe5b60ff1681526020019250505060405180910390a25050565b600083116118065760405162461bcd60e51b815260040180806020018281038252602981526020018061425e6029913960400191505060405180910390fd5b600181600181111561181457fe5b141561185f576001600160a01b03821661185f5760405162461bcd60e51b81526004018080602001828103825260328152602001806140a86032913960400191505060405180910390fd5b600084815260086020526040902060098101849055600a0180546001600160a01b0319166001600160a01b0384161780825582919060ff60a01b1916600160a01b8360018111156118ac57fe5b02179055508060018111156118bd57fe5b60408051868152602081018690526001600160a01b03851681830152905133917f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7919081900360600190a350505050565b6000811161194d5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e6a603c913960400191505060405180910390fd5b600082815260086020526040902060098101546001909101548291611978919063ffffffff6130e416565b11156119b55760405162461bcd60e51b815260040180806020018281038252604c8152602001806142c1604c913960600191505060405180910390fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d6020811015611a2a57600080fd5b505160008481526008602052604081206002015491925090611a6a90611a5e85611a52613144565b9063ffffffff61318316565b9063ffffffff6131dd16565b905081811115611b72576006546000906001600160a01b03166323b872dd3330611a9a868863ffffffff6131dd16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b505050506040513d6020811015611b2c57600080fd5b5051905080611b6c5760405162461bcd60e51b815260040180806020018281038252603e8152602001806141ea603e913960400191505060405180910390fd5b50611c52565b6006546000906001600160a01b031663a9059cbb33611b97868663ffffffff6131dd16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b5051905080611c505760405162461bcd60e51b8152600401808060200182810382526038815260200180613fdf6038913960400191505060405180910390fd5b505b6000848152600860209081526040918290206002018590558151868152908101859052815133927fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca95928290030190a250505050565b83851115611ce65760405162461bcd60e51b8152600401808060200182810382526029815260200180613fb66029913960400191505060405180910390fd5b612710821115611d275760405162461bcd60e51b81526004018080602001828103825260378152602001806140386037913960400191505060405180910390fd5b6000868152600860208190526040909120600781018790559081018590556005810184905560068101839055600a01805482919060ff60b81b1916600160b81b836004811115611d7357fe5b0217905550806004811115611d8457fe5b60408051888152602081018890528082018790526060810186905260808101859052905133917f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e3919081900360a00190a3505050505050565b8215801590611deb57508115155b8015611e0257506002816003811115611e0057fe5b145b15611e595742611e18848463ffffffff61318316565b11611e545760405162461bcd60e51b815260040180806020018281038252603a815260200180614287603a913960400191505060405180910390fd5b611efe565b82151580611e6657508115155b8015611e7d57506003816003811115611e7b57fe5b145b15611efe57818310611ec05760405162461bcd60e51b815260040180806020018281038252603b815260200180613dcf603b913960400191505060405180910390fd5b428211611efe5760405162461bcd60e51b81526004018080602001828103825260368152602001806142286036913960400191505060405180910390fd5b6000848152600860205260409020600380820185905560048201849055600a9091018054839260ff60b01b1990911690600160b01b908490811115611f3f57fe5b0217905550806003811115611f5057fe5b6040805186815260208101869052808201859052905133917f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f582650919081900360600190a350505050565b6001600160a01b038216611fde5760405162461bcd60e51b8152600401808060200182810382526033815260200180613ea66033913960400191505060405180910390fd5b6001600160a01b0382166000818152600d60209081526040808320858452825291829020805460ff191660011790558151848152915133927fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f492908290030190a35050565b6001600160a01b03811660009081526002602052604090205460ff1661209a5760405162461bcd60e51b815260040180806020018281038252602681526020018061430d6026913960400191505060405180910390fd5b6001600160a01b0381166000908152600260205260408120805460ff191690558054905b8181101561216157600081815481106120d357fe5b6000918252602090912001546001600160a01b0384811691161415612159576000600183038154811061210257fe5b600091825260208220015481546001600160a01b0390911691908390811061212657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612161565b6001016120be565b50600080548061216d57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f93003679928290030190a25050565b6001600160a01b03811661222f576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156122875760405162461bcd60e51b815260040180806020018281038252602a815260200180613da5602a913960400191505060405180910390fd5b6001600160a01b0381166000818152600260209081526040808320805460ff19166001908117909155835490810184559280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390920180546001600160a01b031916841790558151928352905133927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92908290030190a250565b808211156123625760405162461bcd60e51b815260040180806020018281038252603981526020018061406f6039913960400191505060405180910390fd5b6000838152600860209081526040918290208481556001018390558151858152908101849052808201839052905133917fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c919081900360600190a2505050565b6001600160a01b03811661241d576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16156124755760405162461bcd60e51b815260040180806020018281038252602c815260200180613ed9602c913960400191505060405180910390fd5b6001600160a01b0381166000818152600360209081526040808320805460ff191660019081179091558054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b031916841790558151928352905133927fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e92908290030190a250565b6001600160a01b0381166125555760405162461bcd60e51b815260040180806020018281038252602c815260200180613e0a602c913960400191505060405180910390fd5b6005546040516001600160a01b0380841692169033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5090600090a4600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604090205460ff1661260a5760405162461bcd60e51b81526004018080602001828103825260288152602001806141976028913960400191505060405180910390fd5b6001600160a01b0381166000908152600360205260408120805460ff19169055600154905b818110156126d3576001818154811061264457fe5b6000918252602090912001546001600160a01b03848116911614156126cb5760018083038154811061267257fe5b600091825260209091200154600180546001600160a01b03909216918390811061269857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506126d3565b60010161262f565b5060018054806126df57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed6928290030190a25050565b61274f8261321f565b6127a0576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6127a8613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561285757fe5b600181111561286257fe5b8152602001600a820160159054906101000a900460ff16600281111561288457fe5b600281111561288f57fe5b8152602001600a820160169054906101000a900460ff1660038111156128b157fe5b60038111156128bc57fe5b8152602001600a820160179054906101000a900460ff1660048111156128de57fe5b60048111156128e957fe5b90525090506000816101800151600281111561290157fe5b141561293e5760405162461bcd60e51b815260040180806020018281038252602881526020018061436d6028913960400191505060405180910390fd5b6002816101800151600281111561295157fe5b14156129b057336000908152600d6020908152604080832086845290915290205460ff166129b05760405162461bcd60e51b8152600401808060200182810382526028815260200180613f686028913960400191505060405180910390fd5b336000908152600960209081526040808320868452825290912054908201518110612a0c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613f056031913960400191505060405180910390fd5b6000808361016001516001811115612a2057fe5b1415612a2d575034612b7e565b83612a695760405162461bcd60e51b81526004018080602001828103825260238152602001806141486023913960400191505060405180910390fd5b6101408301516001600160a01b0316612ab35760405162461bcd60e51b815260040180806020018281038252602c81526020018061416b602c913960400191505060405180910390fd5b610140830151604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015612b0f57600080fd5b505af1158015612b23573d6000803e3d6000fd5b505050506040513d6020811015612b3957600080fd5b5051905080612b795760405162461bcd60e51b815260040180806020018281038252603a815260200180614333603a913960400191505060405180910390fd5b849150505b8251600090821015612bc15760405162461bcd60e51b8152600401808060200182810382526032815260200180613f366032913960400191505060405180910390fd5b60208401518290612bd8908563ffffffff6131dd16565b11612c11576020840151612bf690611a5e848663ffffffff61318316565b6020850151909150612c0e908463ffffffff6131dd16565b91505b6000612c2b856101200151846130e490919063ffffffff16565b6040860151909150612c43908263ffffffff6131dd16565b604080870191909152336000908152600960209081528282208a835290522054612c73908263ffffffff61318316565b3360009081526009602090815260408083208b8452909152902055612c988782613463565b612ca18761388f565b612cad87848684613af5565b8115612d75576101408501516040805163a9059cbb60e01b81523360048201526024810185905290516000926001600160a01b03169163a9059cbb91604480830192602092919082900301818787803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506040513d6020811015612d3357600080fd5b5051905080612d735760405162461bcd60e51b815260040180806020018281038252603981526020018061410f6039913960400191505060405180910390fd5b505b6040805188815260208101839052815133927f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba0928290030190a250505050505050565b6001600160a01b038116612dfd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d756030913960400191505060405180910390fd5b6007546040516001600160a01b0380841692169033907f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce190600090a4600780546001600160a01b0319166001600160a01b0392909216919091179055565b612e6433611638565b80612e7957506005546001600160a01b031633145b612eb45760405162461bcd60e51b81526004018080602001828103825260358152602001806140da6035913960400191505060405180910390fd5b60055433906001600160a01b031615612ed557506005546001600160a01b03165b60015b6004548111610e1f576000818152600c602052604090205460ff16156130dc57600081815260086020908152604080832060090154600b909252822054612f249163ffffffff613b4a16565b9050600080838152600860205260409020600a0154600160a01b900460ff166001811115612f4e57fe5b1415612ffa576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612f8a573d6000803e3d6000fd5b50826001600160a01b0316336001600160a01b03167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c8460008560405180848152602001836001811115612fda57fe5b60ff168152602001828152602001935050505060405180910390a36130da565b6000828152600860209081526040808320600a0154815163a9059cbb60e01b81526001600160a01b038881166004830152602482018790529251929091169363a9059cbb9360448084019491939192918390030190829087803b15801561306057600080fd5b505af1158015613074573d6000803e3d6000fd5b505050506040513d602081101561308a57600080fd5b5050604080518381526001602082015280820183905290516001600160a01b0385169133917fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c9181900360600190a35b505b600101612ed8565b6000826130f357506000610b0b565b8282028284828161310057fe5b041461313d5760405162461bcd60e51b81526004018080602001828103825260218152602001806140176021913960400191505060405180910390fd5b9392505050565b600060015b600454811161317f5760008181526008602052604090206002015461317590839063ffffffff61318316565b9150600101613149565b5090565b60008282018381101561313d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061313d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8c565b60008181526008602052604081206003015461326c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613f906026913960400191505060405180910390fd5b6000828152600c602052604090205460ff16156132d0576040805162461bcd60e51b815260206004820152601860248201527f4f726967696e73426173653a2053616c6520656e6465642e0000000000000000604482015290519081900360640190fd5b600080838152600860205260409020600a0154600160b01b900460ff1660038111156132f857fe5b141561330657506000610d47565b60016000838152600860205260409020600a0154600160b01b900460ff16600381111561332f57fe5b14801561334b5750600082815260086020526040902060020154155b1561336f57506000818152600c60205260408120805460ff19166001179055610d47565b60036000838152600860205260409020600a0154600160b01b900460ff16600381111561339857fe5b1480156133b5575060008281526008602052604090206004015442115b156133d957506000818152600c60205260408120805460ff19166001179055610d47565b60026000838152600860205260409020600a0154600160b01b900460ff16600381111561340257fe5b1480156134375750600082815260086020526040902060048101546003909101544291613435919063ffffffff61318316565b105b1561345b57506000818152600c60205260408120805460ff19166001179055610d47565b506001919050565b61346b613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561351a57fe5b600181111561352557fe5b8152602001600a820160159054906101000a900460ff16600281111561354757fe5b600281111561355257fe5b8152602001600a820160169054906101000a900460ff16600381111561357457fe5b600381111561357f57fe5b8152602001600a820160179054906101000a900460ff1660048111156135a157fe5b60048111156135ac57fe5b90525090506000816101c0015160048111156135c457fe5b14156136015760405162461bcd60e51b815260040180806020018281038252602b8152602001806141bf602b913960400191505060405180910390fd5b6001816101c00151600481111561361457fe5b14156136a3576101408101516040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50610f429050565b6002816101c0015160048111156136b657fe5b1415613700576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b6003816101c00151600481111561371357fe5b1415613832576006546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561377257600080fd5b505af1158015613786573d6000803e3d6000fd5b505050506040513d602081101561379c57600080fd5b505060075460e082015161010083015160c08401516040805163849a681760e01b815233600482015260248101889052604481019490945260648401929092526084830152516001600160a01b039092169163849a68179160a48082019260009290919082900301818387803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b50505050610f42565b6004816101c00151600481111561384557fe5b1415610f42576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b613897613c88565b60008281526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561394657fe5b600181111561395157fe5b8152602001600a820160159054906101000a900460ff16600281111561397357fe5b600281111561397e57fe5b8152602001600a820160169054906101000a900460ff1660038111156139a057fe5b60038111156139ab57fe5b8152602001600a820160179054906101000a900460ff1660048111156139cd57fe5b60048111156139d857fe5b815250509050806020015181604001511015610e1f57805160408201511015613a9c576040810151613a54576000828152600c6020908152604091829020805460ff191660011790558151848152915133927f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c492908290030190a25b6000828152600860209081526040808320929092558151848152915133927f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a7892908290030190a25b6040808201805160008581526008602090815290849020600101919091559051825185815291820152815133927f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445928290030190a25050565b8215610d315781613b16576000848152600a60205260409020805460010190555b6000848152600b6020526040902054613b35908263ffffffff61318316565b6000858152600b602052604090205550505050565b600061313d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c23565b60008184841115613c1b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be0578181015183820152602001613bc8565b50505050905090810190601f168015613c0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c725760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be0578181015183820152602001613bc8565b506000838581613c7e57fe5b0495945050505050565b604051806101e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001811115613cf757fe5b81526020016000815260200160008152602001600090529056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158201af36c62015c55f48b1b93810fd5dacf4fb278b800aee7e218cc1503740f4c5964736f6c63430005110032", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200efdf3803806200efdf833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b838201915060208201858111156200006f57600080fd5b82518660208202830111640100000000821117156200008d57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015620000c6578082015181840152602081019050620000a9565b505050509050016040526020018051906020019092919050505081620001157f6606e9315b5cd322e9e75d0bf66cecde08990782c06ea2b8381c7e80cf52dcbd60001b620008f760201b60201c565b620001497f4d0fe5155d4ddd75c573bf7655c384fa4cc874df6ad11778e96ac71bfe337e6e60001b620008f760201b60201c565b6200017d7f8611bc546acb8292ec57a1e4304b2973826be5e3afc714ae1b44ab062b4bb7e660001b620008f760201b60201c565b600081519050620001b77fddb410b0ccdbea8a2918cb919132015345ccc5d2f515a947c235a5ddd1c01c9360001b620008f760201b60201c565b620001eb7fdd0d46d161926a6c5bd5e1553156c92f44bf76c8b65370f320e301ebd482286b60001b620008f760201b60201c565b60008090505b8181101562000629576200022e7f364139ab54e6661d78b8c726d6103e9d9f3f44056aa0fc51408678e6187f4a7360001b620008f760201b60201c565b620002627f76bc192982e7e255c90ad98bdfb39125f05cc2930e1b4ce525f70d4754c08ede60001b620008f760201b60201c565b620002967f1d71322f4af999fc9d23f397b4979d138f9a8dfc1694197ad817514a3ac0885660001b620008f760201b60201c565b60026000848381518110620002a757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156200034f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806200efaf6030913960400191505060405180910390fd5b620003837fe28209ea2edc51b80092bbe3ca5c30f941b2c912c2b8234043ee901ad0355ceb60001b620008f760201b60201c565b620003b77f6d489369ea5090099ca5b857f55429b828c1d919a61895a1705f7bcf23eab97460001b620008f760201b60201c565b620003eb7f436049d09d81151a7f85bb1760cc9b5e905dc10d08ec83ec023022d7eb93721f60001b620008f760201b60201c565b600160026000858481518110620003fe57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200048b7fb44440019d8b4869c1418dab281e3d340d42465a30e9f77c20d40b3fe436feb860001b620008f760201b60201c565b620004bf7ff20bbb7fcf0915c88e7db8586316903bdcd995db9788a11669c8050e9398a5e060001b620008f760201b60201c565b6000838281518110620004ce57fe5b602002602001015190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200056d7f5096bf0eae835f3e3db50123c33fc6f8ba650bbae2aad89c37815cf8e24afb1760001b620008f760201b60201c565b620005a17fd2cf87d0fb4a1f07db9387a495f8f681dd5016859db5ce8343951ed2c95c4bef60001b620008f760201b60201c565b3373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28080600101915050620001f1565b505050620006607f64375e5cd7423843b1137d84dc5ee15643b0752aa7d7eddd705d266ba393102360001b620008fa60201b60201c565b620006947faf689f34ac246f17fcd59063b1cf929be9f060280f1b820c6890f0bb02e7fbba60001b620008fa60201b60201c565b620006c87fcb3f889ee7ee76e77de6db2fd3cba68ca6cc567c9cefe90fda5afb8f011f978f60001b620008fa60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620008ba57620007317f0415a31c30f22b314fe48917d409dc240521176a492ca71ceeee7b5bb077a3e960001b620008fa60201b60201c565b620007657fc47efb7ab218fc981d3fa74d6410d5841948d001cdfd341fc5954ba8e2adecc560001b620008fa60201b60201c565b620007997fce85838b6e544feb4b5a48f19715a918f24a67344b5f8e76a20355d706ee120660001b620008fa60201b60201c565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200080e7f0781ea1b0e35ee57bb8cc3dca471f35d519a1dd9d25a70094af0030e0c2e5b5460001b620008fa60201b60201c565b620008427f6fdadf503239be04a657b22e41c6f94475044d8d60e8d354756af84ff12597bb60001b620008fa60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5060405160405180910390a4620008ef565b620008ee7f316a48b4f36146a60f85ebbb639e0241b27d5284462cc6de8634938f9ce1331c60001b620008fa60201b60201c565b5b5050620008fd565b50565b50565b61e6a2806200090d6000396000f3fe6080604052600436106102305760003560e01c80638acb0e6b1161012e578063d1a494f4116100ab578063e0e3671c1161006f578063e0e3671c14610f61578063e87471a514610fca578063ea4ba2fa1461101b578063ee5679751461108b578063fdc704d7146110a257610230565b8063d1a494f414610da9578063d6febde814610de4578063d8c8469514610e1c578063d96e9de314610e57578063dca21bfc14610f2657610230565b8063a935e766116100f2578063a935e76614610b9a578063ab18af2714610c06578063af7cea7d14610c57578063b3ce74c714610ce5578063ca2dfd0a14610d5857610230565b80638acb0e6b1461096c5780638e1ba96214610a125780639000b3d614610aa25780639fa1832514610af3578063a0e67e2b14610b2e57610230565b80632d46d9d9116101bc5780637065cb48116101805780637065cb48146107d957806376d73a761461082a5780637baec6ae146108795780638259ab11146108d4578063836e386d1461091957610230565b80632d46d9d91461066257806343a40e3f1461069d57806365e168d3146106e557806367184e28146107575780636e1b400b1461078257610230565b806315cccf8e1161020357806315cccf8e146104c057806316a628891461051c578063173825d91461056b578063194e1362146105bc57806321df0da71461060b57610230565b80630487e0b21461023557806309d5ff14146102a45780631291e84f1461038e57806312b0d40014610469575b600080fd5b34801561024157600080fd5b5061028e6004803603604081101561025857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110b565b6040518082815260200191505060405180910390f35b3480156102b057600080fd5b5061037860048036036101a08110156102c857600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff1690602001909291905050506111ea565b6040518082815260200191505060405180910390f35b34801561039a57600080fd5b50610467600480360360408110156103b157600080fd5b81019080803590602001906401000000008111156103ce57600080fd5b8201836020820111156103e057600080fd5b8035906020019184602083028401116401000000008311171561040257600080fd5b90919293919293908035906020019064010000000081111561042357600080fd5b82018360208201111561043557600080fd5b8035906020019184602083028401116401000000008311171561045757600080fd5b9091929391929390505050611705565b005b34801561047557600080fd5b5061047e611b02565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104cc57600080fd5b5061051a600480360360808110156104e357600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050611bb0565b005b34801561052857600080fd5b506105556004803603602081101561053f57600080fd5b8101908080359060200190929190505050611df0565b6040518082815260200191505060405180910390f35b34801561057757600080fd5b506105ba6004803603602081101561058e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e90565b005b3480156105c857600080fd5b506105f5600480360360208110156105df57600080fd5b81019080803590602001909291905050506120ca565b6040518082815260200191505060405180910390f35b34801561061757600080fd5b5061062061216b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561066e57600080fd5b5061069b6004803603602081101561068557600080fd5b8101908080359060200190929190505050612219565b005b3480156106a957600080fd5b506106e3600480360360408110156106c057600080fd5b8101908080359060200190929190803560ff16906020019092919050505061221c565b005b3480156106f157600080fd5b506107556004803603608081101561070857600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612458565b005b34801561076357600080fd5b5061076c612698565b6040518082815260200191505060405180910390f35b34801561078e57600080fd5b50610797612726565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107e557600080fd5b50610828600480360360208110156107fc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d4565b005b34801561083657600080fd5b506108776004803603606081101561084d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612a0e565b005b34801561088557600080fd5b506108d26004803603604081101561089c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c4c565b005b3480156108e057600080fd5b50610917600480360360408110156108f757600080fd5b810190808035906020019092919080359060200190929190505050612e88565b005b34801561092557600080fd5b506109526004803603602081101561093c57600080fd5b81019080803590602001909291905050506130c4565b604051808215151515815260200191505060405180910390f35b34801561097857600080fd5b50610a106004803603604081101561098f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109cc57600080fd5b8201836020820111156109de57600080fd5b80359060200191846020830284011164010000000083111715610a0057600080fd5b9091929391929390505050613172565b005b348015610a1e57600080fd5b50610aa060048036036040811015610a3557600080fd5b8101908080359060200190640100000000811115610a5257600080fd5b820183602082011115610a6457600080fd5b80359060200191846020830284011164010000000083111715610a8657600080fd5b909192939192939080359060200190929190505050613438565b005b348015610aae57600080fd5b50610af160048036036020811015610ac557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613714565b005b348015610aff57600080fd5b50610b2c60048036036020811015610b1657600080fd5b810190808035906020019092919050505061394e565b005b348015610b3a57600080fd5b50610b43613951565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b86578082015181840152602081019050610b6b565b505050509050019250505060405180910390f35b348015610ba657600080fd5b50610baf613a63565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c5560048036036020811015610c2957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b75565b005b348015610c6357600080fd5b50610c9060048036036020811015610c7a57600080fd5b8101908080359060200190929190505050613daf565b604051808b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b348015610cf157600080fd5b50610d3e60048036036040811015610d0857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614087565b604051808215151515815260200191505060405180910390f35b348015610d6457600080fd5b50610da760048036036020811015610d7b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614173565b005b348015610db557600080fd5b50610de260048036036020811015610dcc57600080fd5b81019080803590602001909291905050506143ad565b005b610e1a60048036036040811015610dfa57600080fd5b8101908080359060200190929190803590602001909291905050506143b0565b005b348015610e2857600080fd5b50610e5560048036036020811015610e3f57600080fd5b8101908080359060200190929190505050614442565b005b348015610e6357600080fd5b50610e9060048036036020811015610e7a57600080fd5b8101908080359060200190929190505050614445565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001856001811115610ed257fe5b60ff168152602001846002811115610ee657fe5b60ff168152602001836003811115610efa57fe5b60ff168152602001826004811115610f0e57fe5b60ff1681526020019550505050505060405180910390f35b348015610f3257600080fd5b50610f5f60048036036020811015610f4957600080fd5b81019080803590602001909291905050506146f2565b005b348015610f6d57600080fd5b50610fb060048036036020811015610f8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506146f5565b604051808215151515815260200191505060405180910390f35b348015610fd657600080fd5b5061101960048036036020811015610fed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147cf565b005b34801561102757600080fd5b50611089600480360360c081101561103e57600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050614a09565b005b34801561109757600080fd5b506110a0614c4d565b005b3480156110ae57600080fd5b506110f1600480360360208110156110c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614cdb565b604051808215151515815260200191505060405180910390f35b60006111397ff95f356390113da9949697b1940b741282a41047ee6a524da66bd2bc3991d55f60001b6143ad565b6111657fceed6f495f3fb222935bf7886330fa5b8d40ad62923cf45af2aaab31e6a7a7ee60001b6143ad565b6111917fa5fe6a08e078c68865f2ae79ddf706b1461305921fa9b614fa811291fd1c49ff60001b6143ad565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006112187fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6112447f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6112707f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b61129c7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61136a7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6113967f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6113c27f6b9661cfe4145666108c08d49cc095e7899fd2f8d10f710df531efe4c0b8a1c460001b6143ad565b6113ee7f8833b00d2b4a2590902b94be3ecdac6017e64abc6b60f4827d186ff2cd45db3d60001b6143ad565b60046000815480929190600101919050555061142c7f0113759a83325f9f6e2abe5c989dc175e945e80a027cf4446563aae0c19d851d60001b6143ad565b6114587fef395f4334ecf7add11195b1503869c4df8eff95bb6219e5fd66f468388859dd60001b6143ad565b60045490506114897f1ce98346381735d51548def916e3db2c12830bac6a2df4c2e38cdd35030ba5f160001b6143ad565b6114b57f91d3dea52c36d1824b758fe672088b3c90677d94d0406558fc26cf9f639a483e60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b826040518082815260200191505060405180910390a261152e7f1372d95eebf4faf6ae9550551603fbe9fb5abcf4a42e8c205c3d2b91f5709aeb60001b6143ad565b61155a7fbe6de7377e6087a49f8f0ceea5ee2d40fcc7c5d3543f7fa9a96d18055dde5abd60001b6143ad565b6115648185614db5565b6115907fd684e9c1acb35d1b8de7b798bb3767c147dc77b5ee2a0db37d9788833679ca9f60001b6143ad565b6115bc7fcc149f0fe2d8389adfcb5b7964821744229b0db7d8425cb1dd0696d9f15db0f960001b6143ad565b6115c881888888614f30565b6115f47f189adf1f8a59761cc16870f8e1b847c421f7009489cdd079b980f939770d9d6b60001b6143ad565b6116207fdfb28cd97c0643bfb263431cb26e73d4e56bfec868e004718fcb7422b86647eb60001b6143ad565b61162a818f615512565b6116567f9543a9ce4649c688e8a082a2f30f77969f0ba852362e57f935a9ae33f5edfdb360001b6143ad565b6116827f7f7c55df46f61ca1d10e36c6360b2ce91fb724c51a6c998099e037fd15f9da2160001b6143ad565b611690818a8a8e8e8761602d565b6116bc7fb6268ebad9bf0b802db63db9ef5a03ef762e7fe2191d28fd6710f18790bd1b2060001b6143ad565b6116e87f4e0f28087d320fc4990c2527c4d02d503913c3677c0ea014f6932bab3a1bfddc60001b6143ad565b6116f4818e8e866165a2565b9d9c50505050505050505050505050565b6117317f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b61175d7fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6117897f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6117b57f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6118837f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b6118af7f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b6118db7f9efa1c4f33094678dc6d5b61854b0266669a8ea26c73edb5e33ab6a625ba39ed60001b6143ad565b6119077f37469080bbed0cfa814adf66d6eb5f4dd5173f2d07e478ed0d78c69c02c6800060001b6143ad565b6119337f9d3f2b442aae3fd690acaf46f5a667e12e3e7c72370dda73873057b875df4ad360001b6143ad565b61195f7f0ed42e055d2ecc5194ea63d758605de3ba4c4655e8beaaed60f15d7278fc134060001b6143ad565b8181905084849050146119bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061e10f6034913960400191505060405180910390fd5b6119e97fe28ba615be5bffa4c8e5d38edcabe6403ec916ceaf7eb84911ed5bf329d2515e60001b6143ad565b611a157fbcd3c4b1719dd0c0c2ae6b918474dc81368ab5ea1a7324041c5d9e55e08cca9160001b6143ad565b611a417f0b859bb4e1959553ef5fdbe7c9b227a5e7b2f362b92cb1e07a028435f3edff7560001b6143ad565b60008090505b84849050811015611afb57611a7e7fefc6b00e5c1efadc711df8957de1b2700bfe81b3275405d12c3658780b93c32a60001b6143ad565b611aaa7ffaf3aeaf9076815c7373c25637920a67cb7d988a20c967f9613e5432235b172560001b6143ad565b611aee858583818110611ab957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16848484818110611ae257fe5b90506020020135616ce5565b8080600101915050611a47565b5050505050565b6000611b307ff250fb4106da45b8066bde94a6a4fa918a58684a978275e7004029740a01ffce60001b6143ad565b611b5c7fddfeb7fb167b56ea073db84579fbafabad5de8c5b537e360aeb5a80ee5c4d2da60001b6143ad565b611b887f065d6cf404fabcb70aabc8a0be82d8cb5ac9dde9f7dd2112e2b8eb58a60e8fbe60001b6143ad565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bdc7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b611c087f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b611c347f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b611c607f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b611d2e7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b611d5a7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b611d867f0149f83e5c09fe41d5baa192d327cce8e8df54e53304215949b8f33cfd90f57460001b6143ad565b611db27ff72e40643ec7ec6eb31930d5a594c46b7d23cc85856fa6b836eea572c08ab7c160001b6143ad565b611dde7f9529e2b00685ea59961613bd638efc3c7baed24e703e76b6055041481231799960001b6143ad565b611dea848484846165a2565b50505050565b6000611e1e7fd761c6f2cac214b7917e00d69a47127c9f92589762dfb407d0d378723fb22a9d60001b6143ad565b611e4a7f4eedb79c36a42e58ee94547fef467a4e6a7c520b3405838e3ffb28cf04a5e4dd60001b6143ad565b611e757e9a29a22ba445229ba2f451327edbc2ee256f686363bbd15278a5219e85118d60001b6143ad565b600b6000838152602001908152602001600020549050919050565b611ebc7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b611ee87f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b611f147f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b611f407f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61200e7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61203a7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6120667f0e44747b587cb0ce7592cff3df77f645755c5f10eeb3a3aa0ddac17f65b5b18b60001b6146f2565b6120927f538d135c9cc4037a61d553c365a022ce1d01b218c9b4e6687864161a8994013b60001b6146f2565b6120be7fad6e2327c3430532e2391fc71d4270553fb8d051f4b664d870acb608d3e0a81260001b6146f2565b6120c781616fc9565b50565b60006120f87f73f8d38ee2d03f10c8338074464e3dc2118ae9334c851ac34fcf7b60b5221bcd60001b6143ad565b6121247ff8b0c898982141b996348d1498840d79c5958f12f9cdd9cb7461dab14668bfc260001b6143ad565b6121507fb731ff315b4591651a849c4d7c291305e26db10765ed4144ca9b9aa64228e82260001b6143ad565b600a6000838152602001908152602001600020549050919050565b60006121997f3ae3ac9b140e1ca340ab44d2f76b19bec7eee3c6788c7d92befd85b5806aa13a60001b6143ad565b6121c57f2d5182a7e367116b083e493062ad4003212e7c0091095fbb8235bc218f2744dc60001b6143ad565b6121f17f23c7ba278f6ca83f66a22789ff962bfb742f06b3724c6e353fdc89063e146a2960001b6143ad565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b50565b6122487fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6122747f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6122a07f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6122cc7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61239a7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6123c67f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6123f27f03874e6ffa5fe98a062d13b8ea744f5aaa681ff2f5197c3bbad57580417b8b7160001b6143ad565b61241e7f5b26afb9ffeb55e6b5522f6aeac1c61e1c7c077a5aeb107b42adfad3ddab58ac60001b6143ad565b61244a7f4bac114fbc8385f334d62bc98815ccecb4a83a66673f028c15b66f0c6cab144260001b6143ad565b6124548282614db5565b5050565b6124847fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6124b07f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6124dc7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6125087f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6125d67f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6126027f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b61262e7fe3dfcc5b5189e5abfa73d307ddea55fb7cfef0f15f2679d14e6c6ec352f921fe60001b6143ad565b61265a7f2a5cc306f40e1f0873c0a1e6fef2e52da9500bd790ef95e0125a286f71b3e02c60001b6143ad565b6126867f04e043a0896a57e6c6f1575cb62916ef540a5b4316ae5a062583b03f313935c260001b6143ad565b61269284848484614f30565b50505050565b60006126c67ff84b99b34260ab143ba1a2002db4556e56878320e9645dc009e5d5e51973aba060001b6143ad565b6126f27f62eceebeb156885d0e295ffe9505ba53988ce1eed8b34cb09667f5758a28d7e560001b6143ad565b61271e7ff358e692aa91d2ba30e2ca2c0469f56f94c71e3f2f36d8522a64d93ece77959960001b6143ad565b600454905090565b60006127547f590b35ea19199ac618d9c7feb5571ca76b4217683165bab79135f56ca5bed80360001b6143ad565b6127807f1366e9b6711f13dc255671dd1b4c9f515a3573f0c730f8241c85556c4209486a60001b6143ad565b6127ac7f83abadf0b52662c6e4bc22e41089d19321a5cc14e680cbb978c16f84d5c5fe6c60001b6143ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6128007fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b61282c7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6128587f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6128847f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6129527f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61297e7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6129aa7fafcb0b4f682c50a9679687cd57fb195565d3b3594cec41e61652d70bb7a9797360001b6146f2565b6129d67f1044e613c1c3d7cc5b42b22374c3d222c8151549a65f809328dc5e6291659a2a60001b6146f2565b612a027ffc4b144d7908223b9fd317ce3643b657d8063803df44b93493003820111a195a60001b6146f2565b612a0b8161766e565b50565b612a3a7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b612a667f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b612a927f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b612abe7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b612b8c7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b612bb87f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b612be47f058b7cc1e32d92b658f81d197d0fa3a6315ff52fa3766fc235cdd6184aeaf6bb60001b6143ad565b612c107f4bbc365d77f708c101238713d1389549b9fca1c939a50fbd26688686651536d060001b6143ad565b612c3c7f156c58f60604d237776fdd592b3a5d5106d7264c6b1df17fdc1cafe6fd436e7660001b6143ad565b612c47838383617b83565b505050565b612c787f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b612ca47fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b612cd07f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b612cfc7f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b612dca7f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b612df67f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b612e227f365ddb943024ef7fbffec94f1ec31ca43322aaa115f40bff1879e034ae5d399d60001b6143ad565b612e4e7fd5a18db95fb4d6eb8e6f7df8fd781832bf8d93cad15393f48207ca45d27e095e60001b6143ad565b612e7a7fdf3532a1113d5a3b2e6cd389aef8b24c97a5016a6f46ecf36aee0e60017958aa60001b6143ad565b612e848282616ce5565b5050565b612eb47fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b612ee07f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b612f0c7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b612f387f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612fda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6130067f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6130327f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b61305e7ffa544545449131d5912ef311088e3d688f1f81c5aca54dca7bd178d77c7c736660001b6143ad565b61308a7f6ba150ce46fe01575d927263b4c4bac99de30926f52d71fd618239c7014a6e8860001b6143ad565b6130b67f0424dba2aa9324f4a4b86f4b373bcb5abc521061fe9c7cc37664970751cd0fdc60001b6143ad565b6130c08282615512565b5050565b60006130f27f7603f4cc7eed5aea26c8363aae808228050de4a1df7313c6e816cbdd5cb707be60001b6143ad565b61311e7f581f876caee8a1d16cfb1d2b0eeb4066d220ad66d031ace5d7fb1a6986cc168a60001b6143ad565b61314a7f70ebfddc39a6e980574278522e377c07bf10df50e1dfb83090fd786dfe5be09760001b6143ad565b600c600083815260200190815260200160002060009054906101000a900460ff169050919050565b61319e7f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b6131ca7fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6131f67f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6132227f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6132f07f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b61331c7f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b6133487ff0165474b2d676fea0b8023064cf7421d1272f4919b87d871eda274681c4ed5c60001b6143ad565b6133747f15b42621139ada08336951eba2f041f2cc3ebcaa539d2a13f87329a8d7d6b45960001b6143ad565b6133a07f0894d12fe48c69e5bd5ecb1dd45590a9e1e97f03743be95a97f9a1a6ac3aaa5160001b6143ad565b60008090505b82829050811015613432576133dd7f86f852a70d408d4a2f186f3c923eaa78cc9d6cbd42657492ed1a9e6edfabb16960001b6143ad565b6134097f664a28c3c931dfc99c22d2ca503fc214685e19f7a6f4eef328f35d06b432ad6260001b6143ad565b6134258484848481811061341957fe5b90506020020135616ce5565b80806001019150506133a6565b50505050565b6134647f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b6134907fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6134bc7f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6134e87f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661358a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6135b67f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b6135e27f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b61360e7ff9afe9483ad45314c1f9334d19579a96e2ced1bfaa29927b11048af7c43f747460001b6143ad565b61363a7f56f19aeb9abc0578ab8355d3bf3c2995ffbc732cf2888b835db28c76406a378960001b6143ad565b6136667f587bf7ffa332928533e0732161cd434483e7c1232a30656d658364c71310c93260001b6143ad565b60008090505b8383905081101561370e576136a37f43404884baef5c6f58bf4186141b647b0f7643199b28bc515a5cf75127f2592660001b6143ad565b6136cf7f8733fd543eed7949dc81ceb8e7f3cc4d9ebef97e59999d0e6181f70672b219de60001b6143ad565b6137018484838181106136de57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1683616ce5565b808060010191505061366c565b50505050565b6137407fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b61376c7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6137987f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6137c47f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6138927f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6138be7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6138ea7f5fceccf80f991d1a72d8282836518ae01c2f8c5f7b370385d7f1f56e93e49e6d60001b6146f2565b6139167ffc15d1b5d4b2aa6b36a36f4aa2415983c696e5f2faf3aa4fa7bfd6790e00635f60001b6146f2565b6139427fe1f2ad91109a6da48347f79de13c9e0b5c9146ac5743cf02594a0b249d88013360001b6146f2565b61394b81617e59565b50565b50565b606061397f7fdee10534b67278fca285b5798f07e3aee921e04ea89b6427272f1c6d6bd2f07260001b6146f2565b6139ab7f3322398ce67959ada7f766b6e33744c7138512194c5f473b04cdef087872bd8560001b6146f2565b6139d77ffcf826e84f2f086c38453fef179ab177aeb6adabb1238ea14a8a0037d3a7bef560001b6146f2565b6000805480602002602001604051908101604052809291908181526020018280548015613a5957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613a0f575b5050505050905090565b6060613a917f1968df1ae1af4ccf2947ce153fb93b718eaf164c8d31064c2ab9fe17f7ab787f60001b6146f2565b613abd7ff6485d61a14d2ce81eda90d0faf17bfe09fa1f03b3b9d25da0c56e10d29b358a60001b6146f2565b613ae97fce84cd58e76472fb9aafbae1c6be70596e5c3c548848cff1bcf4ae4c5a8d463060001b6146f2565b6001805480602002602001604051908101604052809291908181526020018280548015613b6b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613b21575b5050505050905090565b613ba17fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b613bcd7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b613bf97f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b613c257f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b613cf37f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b613d1f7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b613d4b7f84e280d8ef73d617ad191175570656211211680af5d3af1916b8c3b74eb87d2660001b6143ad565b613d777fa9fce485d82159126ba460fccbeb5fe1d1bc03805210cc687e57a255b73b2add60001b6143ad565b613da37f6eca83d9083e75e2a3f7b8114af75f8eb6b8bf2d085643556ef15c64f15917fc60001b6143ad565b613dac8161836d565b50565b600080600080600080600080600080613dea7fc01bbac0be84aa1b4c0c25b6337e23c4de47459c73aefa21948938538902b61160001b6143ad565b613e167fb7dba9c95b85da3742679e5a15c844fdcec126e421b9bcc04dd5c3b6b883400b60001b6143ad565b613e427f5c949520df6e4d45be0a34078ee2b75af4f840f65a2bf029394ac650d583964760001b6143ad565b613e4a61df32565b600860008d8152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff166001811115613f4157fe5b6001811115613f4c57fe5b8152602001600a820160159054906101000a900460ff166002811115613f6e57fe5b6002811115613f7957fe5b8152602001600a820160169054906101000a900460ff166003811115613f9b57fe5b6003811115613fa657fe5b8152602001600a820160179054906101000a900460ff166004811115613fc857fe5b6004811115613fd357fe5b8152505090506140057f5641371c260632485a2c7951a3426b4c6a09489acdf2b75b5ba946bc273652a460001b6143ad565b6140317f21b357d9716b44f55edbadcf761d797b3ff4ae625af2d0036ebd00efe356313f60001b6143ad565b806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b60006140b57f2f044751597a5a8448dd0fec10b4a9ecf1cca91ec39a079f3c61189918a3c9f060001b6143ad565b6140e17f4d65a25251c4d8d187eb2dc7e740fba5892d2f0e718119819bc1fea1a96f520760001b6143ad565b61410d7ffd4ec04f3a327bdc8303ec93b58ba2293ee7c5d05d4f7bfa667a037eec01d37a60001b6143ad565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b61419f7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6141cb7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6141f77f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6142237f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166142c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6142f17f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61431d7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6143497fd72986c3c44c1d5ac88f2d9a620526767054d36ed01780fd7c5bd0abd034856660001b6146f2565b6143757f40f644c9aeac123922ec2c6c0c1e9c9d0674d611148b2dfa40b21d14dc9ef47a60001b6146f2565b6143a17f2af20acfe5b44ee8182e2b6cf4952a0c410c0f34bc2d107cd97898a913719ad360001b6146f2565b6143aa81618656565b50565b50565b6143dc7f9b67cb87edbf1b285a4456858f5ea43f9e90c6789ee561a38eec036e8c96a0e160001b6143ad565b6144087fa6f73ea1122a2d55f48cc65aab356fa301c628597d16685bda7145fdc83c755e60001b6143ad565b6144347fcad0c443ceabd51e9e352e7a9e23a1cb40f79b7e4ebf8ac36451e630661d1bf060001b6143ad565b61443e8282618cfb565b5050565b50565b60008060008060006144797fd80e4b0e704aaee7c2cd219cbaaee88c199983cfe317dd565857686bd95f29e360001b6143ad565b6144a57f6089b93f6e3be32640c6d4a4770dad763dcefc1aafb87a192de84fdd8e58731060001b6143ad565b6144d17f30c7ea5e12414c1160c3fe174172fe7df1c6c09cac2ebdb3b7acf1eac62d522e60001b6143ad565b6144d961df32565b60086000888152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff1660018111156145d057fe5b60018111156145db57fe5b8152602001600a820160159054906101000a900460ff1660028111156145fd57fe5b600281111561460857fe5b8152602001600a820160169054906101000a900460ff16600381111561462a57fe5b600381111561463557fe5b8152602001600a820160179054906101000a900460ff16600481111561465757fe5b600481111561466257fe5b8152505090506146947f6742e5a3c901e3f7ef457c846a4d3051aaf0a89b197c4df74ba31329f8e3dd7460001b6143ad565b6146c07f19db536cb0b2f2a9d64756c54dca130ce01b38d4288670ab3a84c4eaa2cb38e460001b6143ad565b806101400151816101600151826101800151836101a00151846101c00151955095509550955095505091939590929450565b50565b60006147237f577effea934a13eb763bd5030eabed77904faf301d881602f42a6ebcbc7a604e60001b6146f2565b61474f7fbb81baaea4c4b28bbc1d13dff27dbf9353fd16a0e3e36f65902214241e42cba160001b6146f2565b61477b7fe9518f1e53d0e620902d55c987d198a69cd18409929e43b6e296336ef0d6cd2b60001b6146f2565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6147fb7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6148277f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6148537f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b61487f7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16614921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61494d7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6149797f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6149a57f280f52310c9e33d58dd6e79b5c5912f6ca3c1a6010de72db583c6e062ac6ab1e60001b6143ad565b6149d17fe7d5b593d9ac6c31bc17718c4b09566aa6a5af305ad74a2caabab76be5277c9960001b6143ad565b6149fd7fc188440d869dff5854f9333235a3985cec8135ac8ca9318939e51297ac26cf6d60001b6143ad565b614a068161a604565b50565b614a357fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b614a617f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b614a8d7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b614ab97f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16614b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b614b877f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b614bb37f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b614bdf7fd7f3982298842262d0d3835371f6fcdc4721cf1cd25fca10020262f34be4575f60001b6143ad565b614c0b7fa4e3936f8772243a55f290a79ac7ed71d75f7591187eeb1847d6894e4b4490d660001b6143ad565b614c377f9dcd50b588f14a22d2a0b7c2fff5fa644b92b6aaeecccd0cc5758dc03d7cec3a60001b6143ad565b614c4586868686868661602d565b505050505050565b614c797f644bc30d71a91056913103fb286c5d6e6878e22b12367a33e25983338dcb38c860001b6143ad565b614ca57f2aad60e99f98d7f7f01fc23e07d033d9cc942df38e24a572840b7a0b6106275060001b6143ad565b614cd17f5fdd58e066d9996a13b91c1a64ac7eb4856857717dfd8a7f86dc4f178e25d98460001b6143ad565b614cd961a8ed565b565b6000614d097fa6c21053ff12ef2ea63fc3b7fceffb89314837d2895efacb436d990ee35a401f60001b6146f2565b614d357fdcd08d0c75c64b5d345be711b358e160e369fc901a89d7273809705290673d3b60001b6146f2565b614d617fcaa3ecc68ee1fee4e69069f97e1ae9751fa89bd0701e64f90f31339b236e31bc60001b6146f2565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b614de17f122ea7a04be238890d39ee4c39f677a9666b21467340f1e07775d72cb6a07bb060001b6143ad565b614e0d7ff100e2a0ec6c680fb31ea22c3a4d3629e3f3e6aed96113545d1ea6bb3e51ea6960001b6143ad565b614e397fb764663b6d601a47c295bb8a5c3b6b2d1daeccc53154317063356b7ff119d0fa60001b6143ad565b8060086000848152602001908152602001600020600a0160156101000a81548160ff02191690836002811115614e6b57fe5b0217905550614e9c7f38249e063d3fcbe5a090acd69e3a382cc22138be031696cba2ee8c2ba9952c5b60001b6143ad565b614ec87fc28fcabc3e7c13c11dd1172edbd0946cf5e2adf9af6e80a317bed0ecb3244f0260001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a48237838360405180838152602001826002811115614f1857fe5b60ff1681526020019250505060405180910390a25050565b614f5c7fed825f7b8c3c3e45d4dc2a5e87727343bacea9b0dc423bf3e4933bc55d4c37fd60001b6143ad565b614f887f957384c62aadad73377cc12f84f2ee8c89109c3e3b9a54c1ce0165ec0a6fd8d360001b6143ad565b614fb47f7205092310434b6fa9e4421b4bc973d467cd548a3892d32957db2355a0d1861960001b6143ad565b614fe07f1d48333a6d44118dba2f520bbc90b7e02f5ea59ac1880892ebac8d0bede1950860001b6143ad565b60008311615039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061e5376029913960400191505060405180910390fd5b6150657f6965ad8b98a3980648e61404cf417a35be7c22e98813e4ab90bba22d2ea0e88660001b6143ad565b6150917f20626e8269ed4379993d00982ad0c119605bb3fce32dc3d16b7764a05e491c9c60001b6143ad565b6150bd7f9c2a4d1fbc32ce38423e051cd0f7bbe7537e93e14c41ad89bff97eee1ca2d8c260001b6143ad565b6001808111156150c957fe5b8160018111156150d557fe5b1415615242576151077f9d9461bf08bf1860ec22910d1379c0eb90197d02012729d80948f236697023ce60001b6143ad565b6151337febaeaee198eecbc5805ed14a9b78445bce0ccb6a0e6a35531f22485f4fc6789c60001b6143ad565b61515f7f475276f08bca14e4c443497a6ffbfe9173163e863f6243a805a5f647c72ac9a260001b6143ad565b61518b7fdf51ae266c48f787523a341ff3998b7f0b0574e36ef3dd9d8c29a889b31b00fc60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415615211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061e3816032913960400191505060405180910390fd5b61523d7f913541607e5e91b55cb4f16c76f9709825a60bf8462d8157441f05c4ca683a7a60001b6143ad565b61526f565b61526e7fda7ec91a637265ac8ad552d49b46c26151ef524b53f3ff6142fa491b021475ea60001b6143ad565b5b61529b7f37ddc9d8edfb9dc8d127301bfaa8f8a7b92a2b2bf7ca3c91b3a2ff98b6f2576b60001b6143ad565b6152c77f5ff071b7ffb5f7b797d0727331ae2ac7fafb2a1d5a825dcefaccff8dbfe3b55760001b6143ad565b82600860008681526020019081526020016000206009018190555061530e7f820749fd9dfc5d609160a592b32465f604d5db316d7563f0fec45bd708ccbd6160001b6143ad565b61533a7fba1497d331880b69f12f955cf4ce7fc0789133a27d38f60a44466b15ae9bd86c60001b6143ad565b8160086000868152602001908152602001600020600a0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506153bb7f314c295ffccf2302820d9eb9445dec802a5236dd4bbb455979e07beaf34b02f260001b6143ad565b6153e77f34b4f7591745b98e34e0e3b956487264be036d70bd839ca7f338348e2304812760001b6143ad565b8060086000868152602001908152602001600020600a0160146101000a81548160ff0219169083600181111561541957fe5b021790555061544a7f671d523b8e46684621413dd52501073b7e8ce6f2d98e834aa3773ab9d09c787d60001b6143ad565b6154767f0da0b1dc0de98497f9b9e2bf8aa3dd60c8f0ed970bc5762ddc6d64bfdafd7e5060001b6143ad565b80600181111561548257fe5b3373ffffffffffffffffffffffffffffffffffffffff167f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7868686604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a350505050565b61553e7fecf230a40b2be638a67a3e016d54ca00407285c0b7f8a3ba088fa1db26cac54860001b6143ad565b61556a7f5418af54dea59d6595ce4cb67334ab548f2d9c5ded7361b9d0d52645a8847f0f60001b6143ad565b6155967f7ae85ccb8188cfddd17704600cb3a6f9b3c16d2ef9147611cbd5a567481aacd660001b6143ad565b6155c27f81d10b8cab60a2eb1a0fbe2e22b59ffacbdac6176edb45ea268f108c1693a5bc60001b6143ad565b6000811161561b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061e143603c913960400191505060405180910390fd5b6156477f09126acdc05e46c873e67eef6d04e822d425716cd48f9c404f42eb1f3d46510060001b6143ad565b6156737f4aeeacf647acd63f3619510bfe4618937a93c9ed97792af8f06ad0b42f6a228060001b6143ad565b61569f7f3e11dbac7f5898421cc76adf88343ef3e8cfe89aefe8947c11abb5a55feffc2560001b6143ad565b6156cb7f011ff70e219f3659e8233d7fd1a43d2aa313097d6bb53f3584df5d74c9bd73cf60001b6143ad565b8061570b6008600085815260200190815260200160002060090154600860008681526020019081526020016000206001015461b2f390919063ffffffff16565b1115615762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061e59a604c913960600191505060405180910390fd5b61578e7f95721c738e1ac2429459c3c29d52119c26359a27b9973efa3ff7930b2a49986f60001b6143ad565b6157ba7f8b90a97ee96e24819c66f2609d987c5644d2aeb79aca2c428846d0b4b3379edf60001b6143ad565b6157e67f4be3435a0df75f0492865b6be1ebceade299cef1c224f3d5ca03b0de4c5338b860001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561588757600080fd5b505afa15801561589b573d6000803e3d6000fd5b505050506040513d60208110156158b157600080fd5b810190808051906020019092919050505090506158f07f2fdfc0ab65d3e49424cb0ba1e5d7b87c617e2544d18897855394a0352cb0a24a60001b6143ad565b61591c7fa1cc7ddd437aaeb2d9ab7f1526fb9fb6cd85b09030d4027e7604bf44613020b060001b6143ad565b600061596060086000868152602001908152602001600020600201546159528561594461b60d565b61b73790919063ffffffff16565b61b94c90919063ffffffff16565b905061598e7f8d50cbf28544cf39cc844dd688cb3ee8a801da805bdce48122e54d0365bda69260001b6143ad565b6159ba7fbec77acf36c91924b383de6ad43efaa98b5ec2e149d1e7abe452423935f3727c60001b6143ad565b81811115615c80576159ee7f43098ae67737f822e3ff2097838dadbabfc78bf04daa19250c54455f4c80f14760001b6143ad565b615a1a7f5b70d4b1a6e3125d12424a3cd5e793eb5d5bfd589b11bd09103c665fbf1b042d60001b6143ad565b615a467f858832c8c82758b27429eb7c4b26243cf10f9e8bd4b3317916c95d99fecfbaef60001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330615a9b878761b94c90919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015615b3757600080fd5b505af1158015615b4b573d6000803e3d6000fd5b505050506040513d6020811015615b6157600080fd5b81019080805190602001909291905050509050615ba07f91fc860a964c6213fc4f1a4be3ddbadcf45adac66d00c53077a7e4d6fd6cd64b60001b6143ad565b615bcc7f765c30bf565f66100e936d9e8f622ee2526b54965d482d8781350987129bb54160001b6143ad565b615bf87fc925a81951de4e60ba28c6bc408df4c8e39e48977c8cd4cc7bd8eb96b451f37860001b6143ad565b80615c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061e4c3603e913960400191505060405180910390fd5b615c7a7f85399c177e2dfe42fface10a4b9dd887d91200128550500fd48f4973a0ec990e60001b6143ad565b50615f06565b615cac7f81305073e6fbc263fb363c8bcd9e5bd98e23bdca49670c06b371a126471719a360001b6143ad565b615cd87fc37098fe5e0736b102340771d005a9b0ed3e851c0fe6a6f0e39f2a38bbc35b4060001b6143ad565b615d047f3a16f78a716f60e999043b54b2f93aa83330e7bc6b1c890b623421e5a6177f2b60001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33615d58858761b94c90919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015615dc157600080fd5b505af1158015615dd5573d6000803e3d6000fd5b505050506040513d6020811015615deb57600080fd5b81019080805190602001909291905050509050615e2a7f5e09912529725adbcb8cfee6ef6b1bdee2a5bf2fc7941874ceb9a0d5bc47671860001b6143ad565b615e567f7f950e57126ffdd0aa5f3d2e56f6c84183444dd734931fd1e68111b3e959a04260001b6143ad565b615e827f877b92785ac8e374663c20b1c57e17ddf013325fb34add1aea55f4af57fa326b60001b6143ad565b80615ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061e2b86038913960400191505060405180910390fd5b615f047f64c9424e19f736d6ecac4c08e8794f56d05a8a1340d9a35aaa2d07d19426ff0c60001b6143ad565b505b615f327ffa6383d11c7791a723aebf4a83b3bb1b46dc513024fe1d74398efaedac8d1bf960001b6143ad565b615f5e7f6c929d80831ced67a0ead1e6cbbd82997c3a55794d0d5e93673c67435f024cb160001b6143ad565b826008600086815260200190815260200160002060020181905550615fa57f912fa0859998254482042fe8743a62f4eb07370c0ad2419a3eed850e0a9aecfb60001b6143ad565b615fd17f46e8938c5c0f15bf571ed91ad58dc77e96f76aa2c2d796352200428584e711ca60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca958585604051808381526020018281526020019250505060405180910390a250505050565b6160597f1b3353359c8de12e2f480c20a042fb6d8937d999189cc7b2f61e0a47bd7d857360001b6143ad565b6160857ff5db568c4ae8844d8e9362b8cc6d5e50a18b8d7a4481f4dcce12267f4be6d9ad60001b6143ad565b6160b17f3a7b5cb256681b80b220f767705e745ce69d13a4e7f0c04cd470ea34a65900ac60001b6143ad565b6160dd7f865ca80e7e548bc580e7ede6adc7ecf72d9a382873ec4a9c9f76dbf6943681b460001b6143ad565b83851115616136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061e28f6029913960400191505060405180910390fd5b6161627ff8f80fd3cefa7a7cc203254aee1419486d68368befc721db13b067d7442ff38f60001b6143ad565b61618e7f7f13d3d7a6608bd7ee12c1e71c074310d2bfc1cdbffddab2898d147e6a0a30ef60001b6143ad565b6161ba7fdba95786a11cbd4c989d9125ab10dcfa581cc921f71a064055a738c60f89f59460001b6143ad565b6161e67f1d79365cf401d3df0c1ecfee8eab687a0aa20b5effa0d1585742bbe7cab61c2a60001b6143ad565b612710821115616241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061e3116037913960400191505060405180910390fd5b61626d7f1282bf62a8d8b4afb769fab242d328d1202d75f4e4b37b6f7c2fd17ad47ffd5760001b6143ad565b6162997f33a32c6c91c3ac51f1d618d14226b8591b18861ce18bdee41369aa1b993d491560001b6143ad565b6162c57f7fcf6fb208806dc071efd4b33deeb209018fc175bae6797c179b4df934f3a74960001b6143ad565b84600860008881526020019081526020016000206007018190555061630c7f88d64ba1ad776fff48b5ebd0a4f2ad2efc4e4e43c79c49f81e1cfe47a82b0a5260001b6143ad565b6163387f54c14671f268dd2a3f41e308094782072daa25a9ddddd1dcfa4efeef86a9b14960001b6143ad565b83600860008881526020019081526020016000206008018190555061637f7fd568db0eb806b88be822ed5545aa2e0c57ddcbf50dd4f3c869d58de248b52b3a60001b6143ad565b6163ab7f43c7146c7c378a823a47d11f26549eb0ee98ab65168926039be111add8571f0e60001b6143ad565b8260086000888152602001908152602001600020600501819055506163f27f3b5c0ad8a3c0eff656e65aa62e911afb4f7f721979bd0386fb693bc4a75930b460001b6143ad565b61641e7f59edc21c65c13b50ebb7bd66d1efc067cba78144c9c67c772a7d7deb718c85de60001b6143ad565b8160086000888152602001908152602001600020600601819055506164657f077faa548dc765f5f5126d8189236fe72521d790ad6ca430b7631a36f0b02f4560001b6143ad565b6164917f53dc4f5d23e95949364e9f548a82cde38bdc8be788ba4b067df45b0cc8f1980760001b6143ad565b8060086000888152602001908152602001600020600a0160176101000a81548160ff021916908360048111156164c357fe5b02179055506164f47fc80fb2e0558d8bc614a52b814972c1c8d9512a48fe54d245e45147b425b1189660001b6143ad565b6165207f10cb77838e53a0c21258c3537289082b923aa705f94d8c3b32ea4914adb8791b60001b6143ad565b80600481111561652c57fe5b3373ffffffffffffffffffffffffffffffffffffffff167f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e38888888888604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a3505050505050565b6165ce7f5d08d12e6dd58531e82f3cd0441090cb975e67ebb0eb9360ec90e791e6955f5b60001b6143ad565b6165fa7fde9869e900a43dd34ea9c86000d6b8a8508fb2bdacdcff9904ab31c3ef4cb77e60001b6143ad565b6166267fd343801d572415df84fcad7e215541b4020f5fec0feacb5af1863171571966b360001b6143ad565b60008314158015616638575060008214155b801561665a57506002600381111561664c57fe5b81600381111561665857fe5b145b156167aa5761668b7f6bae2d03b455a7a9b10328c8b405745d1696c8444fa62695982191f8d16cbeba60001b6143ad565b6166b77f52a7817d5839a5e06041cb14e3cf71048eb6ae71ef01fe8fd74a9d4f72c5cbf360001b6143ad565b6166e37f03c4f103acca8588bba857f891e80364e6aa4a67c8f059dfdfff58fe09611fec60001b6143ad565b61670f7f70568dadfc090b2d0b5acbb650fa2b84f622ae2e374e265fa49fc2845ba09d3f60001b6143ad565b42616723838561b73790919063ffffffff16565b11616779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061e560603a913960400191505060405180910390fd5b6167a57f04a1dfcec1da39984189a74a8273fa1686b02fe776955d9d84e1bd58b701047060001b6143ad565b616aa8565b6167d67fa907e52c8d495c805089afc2a74e419dce3573d269d8f36e859ef273f5754b0160001b6143ad565b6168027f287a8c97a1c083f381274edb5a2da7edbcf5a6bdc676640ec7d3168a74d7cad060001b6143ad565b600083141580616813575060008214155b8015616834575060038081111561682657fe5b81600381111561683257fe5b145b15616a7a576168657f43dbeec0e23e52c489715a7499e1b6da79916f82520979fed4fd7cbca4d8d25a60001b6143ad565b6168917f61d08bd9a2cd49bc78012b5217d080fec17170bb38f5bda30b076ffdd4afcc9960001b6143ad565b6168bd7f45a7dda59938ef4cc0af25d4415c9454ebf8bc4eb5943af56401fd0b74acca6560001b6143ad565b6168e97f19899c754a2f9d2c54d71f8bc9e4c0f283456a24abe06ef0e2a5a0c78248427e60001b6143ad565b818310616941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b81526020018061e0a8603b913960400191505060405180910390fd5b61696d7f6a9487a8fd087760a80a890f016a406c68ba84fbe545f48ff691b844d7a06fcd60001b6143ad565b6169997ffa51f45e1a79e0271124be98b6b21239c0a493403876f7ba9d7ad07f2b8ec60260001b6143ad565b6169c57fdced9495e1cb7a042ce1b1debb1c80dbdddef2f5dd17f141e31b4088963710fe60001b6143ad565b6169f17f22f89d6a4cb17a8430462ec90917b43c6f1cabe39443e1006f938f40925a13fc60001b6143ad565b428211616a49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061e5016036913960400191505060405180910390fd5b616a757f3603a554f5a38eef1c480ae7465e68d7d9d92595dca7ad21a8460f4b7749f77c60001b6143ad565b616aa7565b616aa67f7769d73f20c312808c44bcf4c095bb33de44f37e126a68445ed9e6a9d1e0237760001b6143ad565b5b5b616ad47f181defdc185e813bc1cfee1da797ea7e51e9352b60a59eed6ce6b72ba4604bff60001b6143ad565b616b007ff0ca6a6619605c711367d043591fd86589f3949a7139d19bac086bc66d026bc460001b6143ad565b826008600086815260200190815260200160002060030181905550616b477f33b0a5ec2fe0e48eedd105050f1b54cb262d09a58e7a6dabdeb35f6d791a402060001b6143ad565b616b737f55f9b29385bb9d38f80f9e2743a72e413f4434f7ddc9af3a2f199183504018b460001b6143ad565b816008600086815260200190815260200160002060040181905550616bba7fc5060a6d532bd70c701784212380c5170718749ffb1d51f2548a74d7cdfa588460001b6143ad565b616be67f15698c1b3cb52400e2802364df0351e3d1aa7d292c1d8c62cf2c1f435617b52060001b6143ad565b8060086000868152602001908152602001600020600a0160166101000a81548160ff02191690836003811115616c1857fe5b0217905550616c497faabbc9d9ff60abcfa85df20e2069d7b0a924890b05b56fd1c2d5eb6e38097fbe60001b6143ad565b616c757fefefd74c076ed596d3469a4f07a18c069e3dfdd68c0284e3a902d7fc9829f6a360001b6143ad565b806003811115616c8157fe5b3373ffffffffffffffffffffffffffffffffffffffff167f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f58265086868660405180848152602001838152602001828152602001935050505060405180910390a350505050565b616d117fa20e9072ca5bccb0956d7b70673b62df0e8f854aaca548bf2a87333e81ccb22b60001b6143ad565b616d3d7fbaa046c6a8d17aa4b6f1810990f1054514bf088bb5bc1e81d5732bd6f6a235cb60001b6143ad565b616d697f88b63b099711ee3d3e1af10a3bba9f3d9301e0adb99126d0374b159a96921a5d60001b6143ad565b616d957f8320f66fb4260736c088321a124394194d69169e7af5e342b2a20f851eac7cdc60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415616e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e17f6033913960400191505060405180910390fd5b616e477f977978066d0e142e1696050762c76390e97fbd2e9b6ba1f423063ee89460851860001b6143ad565b616e737fa80e110af0c2c6fd0bbe09007ca8e400824f910616eebb194fbbc5a0e13af44d60001b6143ad565b616e9f7f387c72f65effbc0ff45f52c28451e2d253ad566da18c81fd819d90fc6a7f076260001b6143ad565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550616f347f438a8bbfeffe60243e14fbeda7e4da070c1fb87331572bfc9ff67707b881ab3d60001b6143ad565b616f607f43bf98f8bca5675df904cebf4ff4d8e6c5f93a3dc1a7769ea1e39878b37399f560001b6143ad565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f4836040518082815260200191505060405180910390a35050565b616ff57f700a658c4da4d353a417b77c970de433d453c8f2699839dae49ad56bc95247a360001b6146f2565b6170217f0442258b08cc70eb8e8ec53ae49bd385424a7b28fb72a01d5f07863cd8ef7bbb60001b6146f2565b61704d7f73beb8663fb3696cb086686c524e4708b28c4ea65f280dff39d4827e7ca4872d60001b6146f2565b6170797fe6766aa48ddfcd976772424bbfb446c43bd564638adb3eae442483ef3d47d2d860001b6146f2565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661711b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061e5e66026913960400191505060405180910390fd5b6171477fe3eeb77f132279c29353bda0a45a6b8069b3d81ae1d35ff6ce332bf4f2f1498c60001b6146f2565b6171737f826c811e8f0f23125d7835fae7fd9617b4c6646b1b180244448e1abc0a49cae760001b6146f2565b61719f7ff604418593dc16a35b826d8368fc2d80c0cbe277b3875ea2501693e6c787629e60001b6146f2565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506172237fdfd972c9e0ed23e7b9b39cc0eb70745f9edf91cea7d1f5ef8cbf934ab71a383360001b6146f2565b61724f7fb812f9acc0ad6954fb47c6f67e2ec9e576031902c70f7d19cf34ebd4c99a83b460001b6146f2565b6000808054905090506172847f4f3d52591d32856fceaa0875b19a1a6971c5907ca132a5d94cb043c091ae335b60001b6146f2565b6172b07f4248074121f47fe89626ab2bd1ddcdd17b3244ad291d57f5f2dc8d7bc0ffe37260001b6146f2565b60008090505b818110156174ff576172ea7fb1dcfab9fb921132d8f94a37743105cde00a71eac40f219501ac2186954f9d4560001b6146f2565b6173167fa7b3c5f14af4838df8ff89a66ce529ae4fe4e2b9b809d49ff43144b6f0b4329b60001b6146f2565b6000818154811061732357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156174c6576173ad7f5d85e0c498670283c294314ea52bb35d04f5b20382ead62f26a5637ba330e26560001b6146f2565b6173d97f1e61341ff4265c16c11520f2bcaa2c67455ac8a5a44789639a1f3953467185b560001b6146f2565b6174057f69cb5f1d8d86470f85ba42b186f442cf39602df325e0be82fd2638d49b8fcf9c60001b6146f2565b6000600183038154811061741557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000828154811061744d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506174c17fba71d897b1e65b8d75cc479d698f33254ca674ae100465305a4d3cd901887edf60001b6146f2565b6174ff565b6174f27f38f3b15268ac0d983bee23492eb7af2d86e2b2ac5f404db8797ba0870dfbb7a260001b6146f2565b80806001019150506172b6565b5061752c7f623fa6edfa9ede1ec69f5c6f0990a64e40c5a746c07a3dee242d3098a062bf6960001b6146f2565b6175587f29c2e5f8e4b3b2b601f7c3f6ad17144c78e76415ff9a7c26b5c5211d3e6528ec60001b6146f2565b600080548061756357fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556175c47f4c7711e3c15de7bc64756f0ad4342539a47405097c1b755ace49d174dd92c3e260001b6146f2565b6175f07f5ca3edf5634600b786f6eed93e841b0073d00b1d590ad098af78f5186c06fa7660001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367983604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b61769a7f0fba0ac44bebc1d19c1e2598d2143f4e40b91a1a479424b23cdc51a111f61a6260001b6146f2565b6176c67f5ac0587170cfc2ba6bca9c191a377f7088efdcd9232cc7a7b59fc66f09eed57d60001b6146f2565b6176f27fd54f82f5ebc658384e7f4f6b81e3425d2f6de6e397fc9febc0aab1c766fc2b1160001b6146f2565b61771e7f66b0600d033d88be9320a9667148c885b2d7b11a2276b7b191d0b7989194188660001b6146f2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156177c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e7341646d696e3a20496e76616c696420416464726573732e000081525060200191505060405180910390fd5b6177ed7f458dc0e526126de1c7a7d155bfd97e0e38ce74f4f30e24edbd3e337037df892060001b6146f2565b6178197f0ec391908240ca8cbf3d254c56a7a359eca3012f94f3eecd5cc663259fce8eab60001b6146f2565b6178457f52c66d7b17c6b65853f94500e1a91fd6b9c552cbbde0cfa175c5615cb3ef5ff760001b6146f2565b6178717f09fb6f28ec832827cf8fe8440c8432e239ca50ca47ceadfdea1d94df42d988bf60001b6146f2565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615617914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061e07e602a913960400191505060405180910390fd5b6179407f75beac7cc6466e3d793f5efc9a7ed5f6c7864caa408c6e40adc7cb53b1f61df160001b6146f2565b61796c7f1bee40b5901ac349124754918e7e26cbe2858df5ecb1e94400402e260b6eacea60001b6146f2565b6179987f410a93128c50bbb38e509b51ade3c351cda1871ea9459114a6e83965661089a760001b6146f2565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550617a1c7fbc537b56eb8ce420f84eb8f690214bb5de06021c78fed4ceb0d761a7e511757e60001b6146f2565b617a487f8163b1d3ff7133aebf587ffdcb3605813a526f23621691ead884c8cd67cfd1ad60001b6146f2565b60008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050617ada7f595f5761b1bd17a702d9ab83f65b7b6418be9c4566ab772c2b4058530a29151760001b6146f2565b617b067f329571cfb247df28874d5a0cf2727b30c25d584b478323281c9165c3293ca4ee60001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250565b617baf7f41b1c8dd8d5910327e36a8bb359ff178cb1ded39297acb346e950db929c576dd60001b6143ad565b617bdb7fc23662d16f17d6ecca993f94dd9551e348982183b566a73f7a40d619af6fdf1360001b6143ad565b617c077f879ec18b3d166ffa5960af417819dff7ee0d07413638c758e33ec0dccb3d930260001b6143ad565b617c337f44978c5c4629b2a7ab5043bebc39e8d85967adf244fe0b68b72e7a50635eff7d60001b6143ad565b80821115617c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603981526020018061e3486039913960400191505060405180910390fd5b617cb87faa08a2064548d9b97d5846eb088eceb4e1c090b8783ce22baba19f9da920386260001b6143ad565b617ce47f399eac91c298367f416eedc509a56bd2476a549a931edb555a81f8fe60cf557560001b6143ad565b617d107f9c36bf7fbee120301da8f080504949f5fea67c26c08e91aa980acffcec93315360001b6143ad565b816008600085815260200190815260200160002060000181905550617d577f8dc1ec87cb4139cd9cdc5d2b6e4be1d82cc50c63a0d4ef574b7e240e4606412760001b6143ad565b617d837f916d4403cb99a72d9a3762d9de0cdba327dba7a3921902662d86c2ad4130362060001b6143ad565b806008600085815260200190815260200160002060010181905550617dca7f8cd4bbf71b3526b04e357b05fcb732a62bbdcbc8e40448894cdfabf67621f7e060001b6143ad565b617df67f51022f8a36dd964c45e4d3a6492a638f7dfb12f1a0e3441b7cd6c3319f36862760001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c84848460405180848152602001838152602001828152602001935050505060405180910390a2505050565b617e857f0cda559503cba2917545521066a16a465405f3bbd1b9a568831628dd598bf73f60001b6146f2565b617eb17f6b222ddf38757b30ad5587a0535d9026e827452508a0d467684c66d3c1a6e1a760001b6146f2565b617edd7fb3aec005e80804c1f7f09812f4651fa1987bd48659bb0cec15eab29527043ed960001b6146f2565b617f097fe2143ab519096b44a68bcf2dfa76788884d93aba95b22f702333728f6047eb6f60001b6146f2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415617fac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e7341646d696e3a20496e76616c696420416464726573732e000081525060200191505060405180910390fd5b617fd87f0af5dc5d575f70ea5f62d1f6520cd98e700cf178485f32277cceadbd1e71e57160001b6146f2565b6180047fa295903c4a81047b622dc3979b142baeb453eb062d4af1e70c3b168d54ff4db460001b6146f2565b6180307f057aaa7ce8c5bb2593674b3c4e9a379586088e150b4e9328ea1f7230b5b575c360001b6146f2565b61805c7f19ab008ed7da7f2961714050ce173a4cbb5e258f90574a237eccac673b998b8b60001b6146f2565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156180ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e1b2602c913960400191505060405180910390fd5b61812b7f1eb2f8712484e5abd0a0092e69ce0a0fdbfa077b87ce2bed2e1e2d441795d8be60001b6146f2565b6181577f39376fae5bf4169c93cba7dd7d2db4ff9a588c360bad5ce5f74cb23f8f62d0b660001b6146f2565b6181827efbdfc6de6200e1a108d4723d0ca109493d1be7d9be54dc015b2fb1c3de109460001b6146f2565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506182067f8d877c7bc5a5dbc94317477967e48e0985065b67fab01a1e53c0ded7d800873b60001b6146f2565b6182327f303e14c184af88d06ec969b6d5b59bc876c93916a2567d399297edd11603cdea60001b6146f2565b60018190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506182c47fdee67bc05f6f2a2ade56b3cd51a23a19307ba012452f287806627fc0885e7fe660001b6146f2565b6182f07f97391ea682f435686bd9306ab387f34a2948a811c2b43c07d281efbfc35c85ed60001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250565b6183997f5e14273f5c91e0a425e5ff20d66fac314255425ea45439ee5a8393add92130bc60001b6143ad565b6183c57f48f46a01af4ce3a539166ff52f8d4401b418b4f8775fee2b2ae5c23a23719dd960001b6143ad565b6183f17f4fe4b9e48544e4e272516831ae8ddf0ab27b542463238f44eb8c0d71a0612e2b60001b6143ad565b61841d7f119db01a8b1080f48a3f7378f9ca67e2646897f170396476efa321693d4ff00560001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156184a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e0e3602c913960400191505060405180910390fd5b6184cf7f8fa921b0f7a0d3a8574cdeb502e15747d35f8b09998b794d530c052c4576836f60001b6143ad565b6184fb7f3d7f019fdf59c5a7bfb4c68e66b965313f01dad1d486d7ecc93d8ed59ea2462160001b6143ad565b6185277f0df6f2ff2bee7f68bcb81d874d46e0e6195f311deeeaa45c8af0cc1a6e61c00960001b6143ad565b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5060405160405180910390a46185e67f40dbcbc5a1d19ec229f1911b629cd90d135184611e4c9e3bb124567fc12c785760001b6143ad565b6186127fba04dfa1aac058af28bacc3d9d16235f5f6b951a31ed8287aff297eb13883da860001b6143ad565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6186827f2d2b17008c81c729a76e9b31f1d60af1e815996dcf2ed234a6f5817f40d52edf60001b6146f2565b6186ae7ff2935ae4ff1369b36a1c9f8bbbc07d39433b3a0fe3721f87f0fed6c1b1637b6660001b6146f2565b6186da7f1110a884fa927bc46ef946125d7a67d5467c8bad7f7ee2e2ba61a7098176705260001b6146f2565b6187067f8fc70272bce9244fe3660ca50a4662d8732531a39a60c46470dd2c5d9f48323b60001b6146f2565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166187a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e4706028913960400191505060405180910390fd5b6187d47f7521ea7e11981e10530712e844a34703b2c3b7c8eeeeb0931806d36889a547b660001b6146f2565b6188007f3b1c6f84d325922bb0bc5c0679dc3d0f32d479d5d5566538162a0fcf525e8e8260001b6146f2565b61882c7f7c050e1b8d81590aabc562aae5f958dd9c5687079ec3df0524a2d348ac819cdc60001b6146f2565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506188b07f134639f4262b32365893cb88bac2370c1c291e206b3ece0f4730e376462cfbd460001b6146f2565b6188dc7fa815fd6ced88aac874c0da0fa0b813c59c7aeb91751e67bd0f4423cda199b8d160001b6146f2565b600060018054905090506189127fa6913cd67d5f0d909416aee3f9cf2377e5c612ae34580c3177a5a770e408c22260001b6146f2565b61893e7fe943dc5f4e6a6cefcc2516b51415c1ead670c42e9493440627cd57477b67fb9360001b6146f2565b60008090505b81811015618b8c576189787fa6bc8e73465d3c28d34d39dfaeb150a7220b50bca4cb3d8a8f0d183c7ab8fdc560001b6146f2565b6189a47f47fd655f1c87712d6c2fcde17ba3980d7a61f61d50ebdb03ce8bf91aab23e4af60001b6146f2565b600181815481106189b157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415618b5357618a3b7f402f5cbf01c18812984ffdfdd5c6e7c94e407c478e6eaace4366cdf0c4265d4160001b6146f2565b618a677fd948e5cfc2af9f31c734b9c1c0b843eeff749be6afd8209e3e8438c5f564072660001b6146f2565b618a937f02c3308c524bb2acb655bb78998e62a581922af54056dd9491629eca52ec310e60001b6146f2565b600180830381548110618aa257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018281548110618ada57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550618b4e7f596f90392997038f3189a37b4d309212bd69538bd8410712475516f2451aebab60001b6146f2565b618b8c565b618b7f7f2673001b1f599afb4c3b709b761aa53d6a8c3b9e764ebdf31bd8c0f85078072460001b6146f2565b8080600101915050618944565b50618bb97f2ee0d065b1399cafa57e27594b8338d1a48e7bf3ccdea71ca9ad58d142ee85a360001b6146f2565b618be57f2f345d77625ed83c6efee45dad4557514fb8be7e15977ed2da588e5c0763744d60001b6146f2565b6001805480618bf057fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055618c517fecec104046e3f1916b39682fad4322ade6c412b59aaed7c2812d0a74b2115c5660001b6146f2565b618c7d7f1f9cab3bd3f01a3c928ca45ee19f88cc1f6a7aa38a7160be8c2acd2784476a1460001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed683604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b618d277f1258a28ec2752da0da5b922195692f92154f9af007061c0031dfae38f41042d460001b6143ad565b618d537fddeac64170ad0cfab7d37ad18ff38299b858230b1c1d6fcf2f5162165025f8f160001b6143ad565b618d7f7fc779b5ce7d4e7f68b735dbef130f39b7b18140a48b900af4608e8f33cc7fdab760001b6143ad565b618dab7fc401c8ebbf36b2904cf2aa800439e0006d933e6a0c6bc7ca0caa037e25f9e46a60001b6143ad565b618db48261ba1a565b618e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e000081525060200191505060405180910390fd5b618e527f29f0beb74a22943da13a889c0309ce9b7bcba9e0b859609cb709d3b7f48a612560001b6143ad565b618e7e7f5da3dd6d41bb3fa4553d2275da31ebfb28d2cb93fc8795a40fbc74b933afc4a260001b6143ad565b618eaa7f3b3a5721379bb182ea96103d2c22146d68f7c77ed0b1b39197e69d84a84ad6b160001b6143ad565b618eb261df32565b60086000848152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff166001811115618fa957fe5b6001811115618fb457fe5b8152602001600a820160159054906101000a900460ff166002811115618fd657fe5b6002811115618fe157fe5b8152602001600a820160169054906101000a900460ff16600381111561900357fe5b600381111561900e57fe5b8152602001600a820160179054906101000a900460ff16600481111561903057fe5b600481111561903b57fe5b81525050905061906d7f15737ba16ddbdaf5979fcda90e7bd0afd6c3d9e5c31633b1a2c14c7a5aa8ad5d60001b6143ad565b6190997f3f6caf161f7ed8380ad6cbf612075d07de3ec83c9aadfe08d65846fd0c3b303860001b6143ad565b600060028111156190a657fe5b81610180015160028111156190b757fe5b1415619192576190e97fd11f70b7df494c275c522313109d065894a77213e72b4c790ee9662a34b4492060001b6143ad565b6191157f82667fc40443f50677083ec8ea3822102a0855b04b9f4998f4969b76aa12ab8c60001b6143ad565b6191417f52cb36432d95f0bf1f875532fbafa21140eafd816b8fd434b76542d22cfb30f560001b6143ad565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e6466028913960400191505060405180910390fd5b6191be7fc3840ef3457c4fd7aca311ee3a2af97df56cae48002f1e4ea0092844f370846b60001b6143ad565b6191ea7f2ac1026d2ac6c5f93c27f427ca6d8de1bd5d9fc3be04ba59d23c01380eabd61e60001b6143ad565b6002808111156191f657fe5b816101800151600281111561920757fe5b14156193a1576192397f35ca1646c9d9b334a5bcfb8ffce7bbca02d12e14dbfb5e1cfeb69f06f410879b60001b6143ad565b6192657f3469385da5907e86f9649c10713f56bb94b9f4b51c39bfd0e9e599f3e619f6b460001b6143ad565b6192917f2354e318a94d00cd4efa5780954f2329c444d8d31a97fbc36ccf7c2887150fbd60001b6143ad565b6192bd7fcdf790e12d7bb8faadcfdb21ef2737b02fa9234f5dae5a12b4d1276a35708c6a60001b6143ad565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16619370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e2416028913960400191505060405180910390fd5b61939c7f69cb708d22dcd13a128b9b64bde4c4b5e385ea75ac5f187f931caa425971e77460001b6143ad565b6193ce565b6193cd7ff6ad38514dd03862364ac35fc06de1049dbdd7ac394780bf86732dfeabbe38d560001b6143ad565b5b6193fa7fedd422ab79c33b72062546e74c932928579dee65755eb022c09d3a6c8c736f8060001b6143ad565b6194267f3a179772423b910911a51b8c3244b938316058d70f0198d842876c5faf1a5b0660001b6143ad565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205490506194a77fae6d9864bd3217c36f5a35cff1d0dc35b89cec47100dc3104fd6b06d9f4246be60001b6143ad565b6194d37f87259a496a95529266f8ec006291a81718473d8a03fe89348004ad8bdb68fcc260001b6143ad565b6194ff7ffad4e2aac2db0affd87e8b5c6d525efa79c2a40803aab367e5e0b97825813da260001b6143ad565b8160200151811061955b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061e1de6031913960400191505060405180910390fd5b6195877fbf320ddede2786d819111ad52aa3356dc915413f4761bee74f5e044b0f2cbb7260001b6143ad565b6195b37f438fb6dc27845e10e217be78aa727ac3708c408bad0eee20cb71242068c5e7dc60001b6143ad565b6195df7f35a879d5c51a4691e775600ee0be7925c36ae8bed698285c680e2b947d695fdd60001b6143ad565b600061960d7f0a7df4e4eac2ffc32eec0d3649039ebd3e16bd42819ea94384a58addc970120060001b6143ad565b6196397fc46b65538395c0a40dcacdea0190842053f78072bf15628ffb7f55c5f833af6160001b6143ad565b6000600181111561964657fe5b836101600151600181111561965757fe5b14156196e9576196897f14332d445b62c44fb5b7bbb9ffd16168952e8000d39bdc6b3b0a719d52d3e59260001b6143ad565b6196b57fd1c788de06a3290f7d716e94e2697a347aae0c15cfc85ccbb0132751df57e6c360001b6143ad565b6196e17f28260e6d36c9d45b949b3e3680dae0db0c059432fb64191d1295c677027f23e560001b6143ad565b349050619c14565b6197157f02f74aa8364872739c5e859f2fe47061d952d965ecdb14b2fdd88cae3a3f8ed060001b6143ad565b6197417f18c9b05cebc9984e5ff788895ceff933a7fcf425b2fc51324686ffa357fdc30e60001b6143ad565b61976d7fe5fe355b75925c098a1a7a2d43219daa7dc998f19244a6b2a66b79959dc135b460001b6143ad565b6197997fbfa3469fd27f859021f4e9801e12b194f32082bd7e555218f3c648f514624b1960001b6143ad565b60008414156197f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061e4216023913960400191505060405180910390fd5b61981f7fb855a542a405cab7b781bfdcef99c439f86be5ffabc0e0f0eab43aeb676c1dbc60001b6143ad565b61984b7fdb6e6cc1b4d84a4d50611137baa461eadc963963cef9491c0f80ad45fe6b218260001b6143ad565b6198777f0eb26e92e7452c913728874ca9e2ee657b30f7cb71d07719586b00a4bdd4353f60001b6143ad565b6198a37fa879878c8ee82050fede45179d4ddb3d4f957a17453e0b13244910d7d21c5c9760001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff1683610140015173ffffffffffffffffffffffffffffffffffffffff16141561992e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e444602c913960400191505060405180910390fd5b61995a7f2e3dc7cce37d23feb1ac9722a7ffbb1ba457d0697b2c4409623652b90bd60ae660001b6143ad565b6199867ff7f4250817492223a9e3ae1c9a793b77986b35c6c1d35449bc864b444e6db26c60001b6143ad565b6199b27f5da45ea63a160dd06ba6a43e526b63aa786b1a6ff4800caa416c30a399ffac6c60001b6143ad565b600083610140015173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015619a7457600080fd5b505af1158015619a88573d6000803e3d6000fd5b505050506040513d6020811015619a9e57600080fd5b81019080805190602001909291905050509050619add7fdb3a48f1931805e6b76e814837db0a8060ea54950041474bb48ebcc1acd9a84b60001b6143ad565b619b097f715774f3e46f4846ba248e25cf89b1518fa20c4f8981e4f5bf25445ed7d5746460001b6143ad565b619b357f12b185d84750e06dadc28ca5afa26a01791cb68a10436a62d586a46f7f61087460001b6143ad565b80619b8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061e60c603a913960400191505060405180910390fd5b619bb77f4dea6bdf1555e9f9ff79432d61c11b733f40a193c889d33ff045614d03186e1360001b6143ad565b619be37f4af8fc6941598eb1ff7882852e49a5a50a8cd9f8b611aca905d859d25185f7cd60001b6143ad565b619c0f7f268d5c820b55f3ee2e01733de4a71d59f977ab9b51666e5cd66786183bc65b3760001b6143ad565b849150505b619c407f22fc79eb8c07045526084769af97e3fd12ce7e530414b7bdb9164cd37dead24660001b6143ad565b619c6c7f41ff2f4f5eb8b953587115ebe393897702323585340ad81482673ecc1646341c60001b6143ad565b6000619c9a7fbdcb60ef26bac120bd2a12589d35f652a81452fff0f088f524188d9e1749217360001b6143ad565b619cc67fe5fdd48b4d65b3d8ecf154886cda5936cde965c0d67aa82902895c315c8b811a60001b6143ad565b619cf27f94118ce43c1caa71cd400b60b4fbf222bab2e4d10a6a0b2bbd406e8527091dc860001b6143ad565b8360000151821015619d4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061e20f6032913960400191505060405180910390fd5b619d7b7f060959094a8435b0731bc6aacf7a2181a403678c56a23af36609844395e1657a60001b6143ad565b619da77fbc5eb22848b26ca8b383487d48b3f875b710d6a3a039676e5f4dc8c5a2e51e9560001b6143ad565b619dd37f245343befc94d5861f352fc505db1a41760bc4d5eeb3fa52c56ef19c5c9f6d7d60001b6143ad565b81619deb84866020015161b94c90919063ffffffff16565b11619f1557619e1c7fcb4835a354754a3aefb7a645b76b3c8bd9de549baead3d813031647c4309a0f760001b6143ad565b619e487fc1cad96269dacc8cc05d8deb9d4757af3d97ee65c4774ce5684a2d2ccd13812060001b6143ad565b619e747f43e12f4fbe464a6989660a3769978a442d6f7401e9bfbf3d027b1f570928d43060001b6143ad565b619e9d8460200151619e8f858561b73790919063ffffffff16565b61b94c90919063ffffffff16565b9050619ecb7fa3a10396e3827dd8312c751f436a7d3b85d92d8efc27da40eed10d541369f67460001b6143ad565b619ef77fa17eeab935b0d2d26f5dc67cd3c51c44ec599998c1fd6b67701a875be0a0b2bd60001b6143ad565b619f0e83856020015161b94c90919063ffffffff16565b9150619f42565b619f417fb14125e75dc7e4bac8c8de914081aa5df53f65d7a89b96d386f4318b0859e7cf60001b6143ad565b5b619f6e7f0213bb603a5d2df16016de8956610f8d8cc84636937297faf34422b5738cbcb860001b6143ad565b619f9a7f8174c7a27ae29d870a99a2ec0392f2118d60c96259df3457c05db358c0c3a88060001b6143ad565b6000619fb48561012001518461b2f390919063ffffffff16565b9050619fe27fb89290c05bbfeb36574611a6d71c190d7aaaef99becb7ad25e43cdb75b2e0a5560001b6143ad565b61a00e7f031b1ac2c2858eb8088e177b84c3acce229050e18f5bda27fb7104282d348b8060001b6143ad565b61a02581866040015161b94c90919063ffffffff16565b85604001818152505061a05a7f91da45c4841333e728e3c00acf7cd3f489ab80dababd72a7e1509d4c6b191ef160001b6143ad565b61a0867f28740585bd2ea60e0382082f2fa7d973034fd70b770cfe93b5162a7a45765d6760001b6143ad565b61a0e981600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000205461b73790919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000208190555061a1697fec2f3253ba1e944ec9c28171fade64664209f5748718535925f66cd33fa2e27e60001b6143ad565b61a1957fe4dd45286e94de0fdd22deaca4af48374806881f99c81b9e3b84dd4bf77ba46c60001b6143ad565b61a19f878261c3ed565b61a1cb7f034592d0b9623a55e32c47ee9dfc560a536d0a3a7bce93b8610441f9c31f7ac760001b6143ad565b61a1f77fde423aac9e758f41f80ed74e6ade2674e350c4ea50322763492937bd4ffc044f60001b6143ad565b61a2008761cf52565b61a22c7f8640db2afcaf537ecffa727847ad75bd703d4852d25b1c7af5be0b0c5e31a29660001b6143ad565b61a2587ff8290a9d6a058bc7a6c13f5c147c8b949a58ad770b333aa3a4d79b13d2a6cc3160001b6143ad565b61a2648784868461d72d565b61a2907f143914d68f5fc7c320d157e36b3554cdc8c5e177532eef24eb6e602e69b9dc9c60001b6143ad565b61a2bc7f8143e64078e3a57a9b83fb5a248209688ffb9d0b4ea807fdcd32a2c9ce74c99b60001b6143ad565b600082111561a5205761a2f17f1737d0e182b71646dca77932cb19ba5935c7ab24b49798d9fc2dc561a8a7180c60001b6143ad565b61a31d7f2ff0fa203b13a8a0753e0c4a98955d9e3bfd0d0718d1e76ea2afda3185fb067d60001b6143ad565b61a3497f3a76b33099114723596b34f4808854bf0d31c403c90e9215d73e9af7211281ac60001b6143ad565b600085610140015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561a3d757600080fd5b505af115801561a3eb573d6000803e3d6000fd5b505050506040513d602081101561a40157600080fd5b8101908080519060200190929190505050905061a4407f7a45cece3f1a5b9eb94ed8d55a4ac1032c771c3ed7763440dffd58a07f47e8b460001b6143ad565b61a46c7f84da53a161eb34959bee64ef2d056ada10d1417da934a724d01acd431cfcb3b060001b6143ad565b61a4987f82e77a5fb53cfad710080846366998b48370af6e15b1b0342f28c2278b76ce7260001b6143ad565b8061a4ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603981526020018061e3e86039913960400191505060405180910390fd5b61a51a7f5a89ad8ab5452a75c918bf5e84f60666d4067aaf8ab5d74028d20672d1e29f1960001b6143ad565b5061a54d565b61a54c7f33d0fd640530abb15087447dc7bced848fe1259c47d0817f8ad1e7506f1b975960001b6143ad565b5b61a5797f43eb29afcdcef52f4105ce66d594152fbf8cf9a345f38166f980511e40b2645b60001b6143ad565b61a5a57fc55b5598b3cddbcb5a546dc90cd117aded4d1bd7a665069ee4f92e8fea63abff60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba08883604051808381526020018281526020019250505060405180910390a250505050505050565b61a6307fcd966935353bda444816eec693f810b1bcd54d4d073398cf308bf2fbe3b263e360001b6143ad565b61a65c7f0b74fe531ffaab939a53b7189096ede82dbb739ff99eb19a85bc9e815a4bf99460001b6143ad565b61a6887fa87e72442e527d7532bf613592e6383a135437fed068fc3d9fef77090a63ee9760001b6143ad565b61a6b47f8a8f02a5a4fef27b28cf23e0bd5c5283abcc790a81549bee87f7096940de35b060001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561a73a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061e04e6030913960400191505060405180910390fd5b61a7667f4abb75ba6e20ad9a8eaad46ec10eabfbf8b8185420bd7c2ceedecee8764e84b360001b6143ad565b61a7927ff904c5fd956edcd18ded43fadb89d3e5311a88bc1fdc4242774ab45fa666462b60001b6143ad565b61a7be7f63e0f6b55c5a25766a8ee5960e284924cd6cb69f392d660b7c2e69454731fe5f60001b6143ad565b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce160405160405180910390a461a87d7fa89b56f9cbff042ddbd40975d849a6c306c28b9c7a9f59679a46cffebfa481c360001b6143ad565b61a8a97f8baa7b1fdb6eb7b3f361bbf4c808c060c7478ebdbeacb7009b0093519eef4e5360001b6143ad565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61a9197f5dba51d03ea8e4fa7fcf50453a95d2d0be10d32a3fb8e98eb04a03a8c924dc0b60001b6143ad565b61a9457f256e203c5516bed84ff857fae390e709522aed56b5cf4fb0b8b1aa605787009c60001b6143ad565b61a9717f9dd2ce83121fc9a27c44702515c7e5bad4f1b0fc189aef59bd8db773f23fcd2660001b6143ad565b61a99d7fcb7235a5ded29d8c765b01592980bc36ab36482f6fb9a6d64ccdbf6154c9515c60001b6143ad565b61a9a6336146f5565b8061a9fe57503373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61aa53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603581526020018061e3b36035913960400191505060405180910390fd5b61aa7f7f9462da58c4b4f9c2fefd8ef2f7c3a4909f4f2533a97706783988aa71bc49918e60001b6143ad565b61aaab7f764d97a34b52dc1cf73063621efe7ec2d1c55ef109c70bbe0a50b56d1b89fcbc60001b6143ad565b61aad77fb37b9345fd1da1ede1d452a366df2b72de7d60ce79d6e6d5991ad6814b5f0c3460001b6143ad565b600033905061ab087f07ff9d09acb29e01f82a65be19be798992a7e4fafb16b900a9bcf9ca77ac3f5a60001b6143ad565b61ab347f988e3c68c7acd53b40e77dd1ea4241338cd10182889550fdd80e29696f860bbf60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461ac385761abb67f54780788f9bf8584d54bf4cc4943ba8bc83ac804011e89520b6005be9177230f60001b6143ad565b61abe27fc5ed745f2e70dd07837a392031fde8061823885b1b011e514c52439e76b9af8560001b6143ad565b61ac0e7f5f9a3bd40716d7d9e7574395891f7f0aa323c6e4bd5273dbc66d5ba7879b64e960001b6143ad565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061ac65565b61ac647fa4d6b933fdd56f426de28e539a047494a257eef4f7dbaf320da04f3e054de5a960001b6143ad565b5b61ac917ff04c20c949e6b72c0681623026083ad51672b7d73cdaf61c3802dc3d142b33e460001b6143ad565b61acbd7f6ce14dfe14fe605ba57ca5162006ee712d87bc3428fa047328131ce4c95e237460001b6143ad565b6000600190505b600454811161b2ef5761acf97f53bee2e90458706d235e231a96c5b79963ea992231858c035a0de1541745fc7560001b6143ad565b61ad257fcc9e461887b8ef6bb19351d4694ae99d8113429af1662c5ee29171cf4a9c38c260001b6143ad565b600c600082815260200190815260200160002060009054906101000a900460ff161561b2b55761ad777fa100bfa14d290e8c70ebe5cbdf9ef24dfb02756548d260e9b50d8ecf964f0cb460001b6143ad565b61ada37f1b202c8dae0740c20a2ff89c1968d1637a7ab161c581b7a08e7f0711ba57c66560001b6143ad565b61adcf7f9ed0b892a0766e12e16b26d2363ae060b1b211302a9031481f6b889c68cb2cc760001b6143ad565b600061ae0d6008600084815260200190815260200160002060090154600b60008581526020019081526020016000205461d9c190919063ffffffff16565b905061ae3b7f4bcbecea127467b89a4a8dda4664bc821f8bacbeaa0ab35a76ade67f2ae1eb3c60001b6143ad565b61ae677ffabf93cdb41ad7545395829064c555d40a030b1472b4f3ae285035f2e60bc1df60001b6143ad565b6000600181111561ae7457fe5b60086000848152602001908152602001600020600a0160149054906101000a900460ff16600181111561aea357fe5b141561b0555761aed57f3aff474ad01699d604d96308d7b9d46bc34cfeb1ee9b00283139d53f41f6bf2f60001b6143ad565b61af017fe347bbb2c2c2f2b613338725c02b85846a5984878a308afbcde227470dba130b60001b6143ad565b61af2d7f7bc1d58153fe8fefbe3fb33440a1f638f9314904835fb95b41348628b942c23a60001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561af73573d6000803e3d6000fd5b5061afa07f42bcb0901f7bd1072a3a83ef19776668acd8109066a530bf2a3e38906ae5066360001b6143ad565b61afcc7f33cab331a764e35fc37ff2c2cdf63a57170dfe29a679ae421ba932d29d3fb47460001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c846000856040518084815260200183600181111561b03557fe5b60ff168152602001828152602001935050505060405180910390a361b2af565b61b0817fda7bd1ac43e85971a4b38d5c812fd5315e71e18533fcfcbab9b10ea11e84b13260001b6143ad565b61b0ad7f01bcca6890dfae3a0d9483b2efb1e73c2ed75fddb2055013fc255921fcffd0af60001b6143ad565b61b0d97f1a9ddb01a03292ce9c72f562c4d9a2dcba1a7baa5bd2021078a57342416e71a760001b6143ad565b60086000838152602001908152602001600020600a0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561b19657600080fd5b505af115801561b1aa573d6000803e3d6000fd5b505050506040513d602081101561b1c057600080fd5b81019080805190602001909291905050505061b1fe7fd31bfc3837838ab3e8e5e344901b69827ee0a1b43710efeb2eb6e48bb2bf377360001b6143ad565b61b22a7f0e313dc839520594387bfc146ea64cf13546e043ce6cca7dbf207acc326f335e60001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c846001856040518084815260200183600181111561b29357fe5b60ff168152602001828152602001935050505060405180910390a35b5061b2e2565b61b2e17f1044dc8eca2327d29135df74b3a1c5a71ea389acec3722b97c86e029cd3cb01360001b6143ad565b5b808060010191505061acc4565b5050565b600061b3217f44698d1e9a904ed1284ff1ffbc3dd61250c83d2c71afd5df19fbf19c6190a1c260001b61da8f565b61b34d7fa3a4b98cb2a23eda9dbb54b77b676d94ca9d1d4bafcc15caee09e68074b0ef8d60001b61da8f565b61b3797f3c0e96b55c01aeef942723329b7f27779568810ddd00a05282ffd2e3b5d233d760001b61da8f565b600083141561b40f5761b3ae7ff802f4a238c6bfb87737692d90643ed6d1e91071b816804127f57dca78bfaab660001b61da8f565b61b3da7f9c7552f9a426f225c2850fa12a0dc5fb398b1adc4885e41fd5a32fae1dbf05d760001b61da8f565b61b4067f88253dfa1829ebe573c7def7f8d624e362791a1e5da86330776d1836a357555360001b61da8f565b6000905061b607565b61b43a7ec5af928e6c63fb10ff91a6c5a4e910c4f39f595f742d8e52dc11b03ad6250f60001b61da8f565b61b4667f5e551b5129d493f012d238e272eb615eaa6959509de842125d5c3b203db4ec2660001b61da8f565b61b4927f6eeef49995c967235a764d0bfc2ddf3ad4e6890ca3a3e7024c52da8393db1ce160001b61da8f565b6000828402905061b4c57fab80a6313ea3c5926e33d7cfa6c464eb729cc09a2e212bce50dc9d97fae0ed7260001b61da8f565b61b4f17fcf8cc8694fe56eef0897d8bf5580925daf8927e537ada7fb46a3727fe18d423260001b61da8f565b61b51d7ff5b30a17ff5e5b532b98d8059efeb460d05236f98b90e61b8794894cfad8502d60001b61da8f565b8284828161b52757fe5b041461b57e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061e2f06021913960400191505060405180910390fd5b61b5aa7f9fdef838f8fa27d2dbdb6cfecf3f275aa85c5ae07d712150d6e17c19c215bfd560001b61da8f565b61b5d67fe9975f5879861c66ca2a2d35617f5a37951b7cf797008080c2db7371f45b3b1460001b61da8f565b61b6027f1040ca89b272f25ce391ff02203288f6f7b9bee30a94da64205ca6d937da6b3460001b61da8f565b809150505b92915050565b600061b63b7fa4b53dcce60c93e2c60fa6b35fc2caf97736f23642ea2c793c86b5d9cefcd35860001b6143ad565b61b6677f44ec31de0477863a6a67fb31990250562be4f59a3de73987c9b17df05712c84760001b6143ad565b61b6937f4ba13b49aac54e2bb0a57da2ad46f0e1c87f0187ebfe5380cfad544e45408a2960001b6143ad565b6000600190505b600454811161b7335761b6cf7f012e5bf791c6ab6bcd46b6def5c735bf330edcd8b5d954d843712c31d88f54a860001b6143ad565b61b6fb7f488aedc98a520bd06ef1e1f00a48c0beaf7cfb84d17cf76a58f0472a0e87535460001b6143ad565b61b72460086000838152602001908152602001600020600201548361b73790919063ffffffff16565b9150808060010191505061b69a565b5090565b600061b7657fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b61da8f565b61b7917fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b61da8f565b61b7bd7fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b61da8f565b6000828401905061b7f07fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b61da8f565b61b81c7fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b61da8f565b61b8487fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b61da8f565b8381101561b8be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b61b8ea7f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b61da8f565b61b9167f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b61da8f565b61b9427fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b61da8f565b8091505092915050565b600061b97a7f692a0cfdea6cb12cdfcaa599c058fa5662531cebd540556a6d1c27ae01b4cea360001b61da8f565b61b9a67f2cce8d8afd666e4919d1ece0b47a35eda094c843996926984c8b17a0d5cd2f7160001b61da8f565b61b9d27f936781d4063de1913a3eda99a7c2145fe8a9c61ba2abe4fa4e7dd270bf8b933960001b61da8f565b61ba1283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061da92565b905092915050565b600061ba487f91e9553b8f91db975c749d5c94abbce1e296644e5342b3f6db822e21c132911d60001b6143ad565b61ba747f2b0e88aaa0157cb7c3170221a6f349f6c3fcc28be6325238a0caeff455bfecc860001b6143ad565b61baa07f1d7d2b6b4d5f5d125a5de72a1a2749ffb2cc381a603a980b27bf0cd3f8942e2f60001b6143ad565b61bacc7f42f0e56580982a6b9555e748d4a68e977f7ca06549add8b930c033de27969dc660001b6143ad565b60006008600084815260200190815260200160002060030154141561bb3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061e2696026913960400191505060405180910390fd5b61bb687f05c1468418341081ac7af113c7504e8a76d43f3f721fffdba85f56bd3a3fd44860001b6143ad565b61bb947fc5666b5dd4c45e66a17e768e0d794b9c8e8301e98fd8b84da8112d5fa58867da60001b6143ad565b61bbc07f81a4305675c0b8c084beeb0305b97d9991983301d80bc035b0011f8f2e379bfb60001b6143ad565b61bbec7fbdce033008dfa407030bb5743bf2d2b929c1bf01137a44eb27b043b471b374cf60001b6143ad565b600c600083815260200190815260200160002060009054906101000a900460ff161561bc80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4f726967696e73426173653a2053616c6520656e6465642e000000000000000081525060200191505060405180910390fd5b61bcac7f653a3ae263eaf8831f43619f01c20299737aa4d8f81cda08ccf8b9db7440c63460001b6143ad565b61bcd87f60489549f00dabf3d8324064990191794c79718e9053e38ab4b836b51fd5e46260001b6143ad565b61bd047f381a648954f161b51106d4756e1291f86490cea3294456d842807618ef7a6cad60001b6143ad565b6000600381111561bd1157fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561bd4057fe5b141561bdd35761bd727f826ea340f58bb5144a38b450ef6a727af6ac000785087f32e40388aa0d28bc0060001b6143ad565b61bd9e7fe82ce36dc34b7add076f895646759c91899df7907fb34448e5e235136e3aef0f60001b6143ad565b61bdca7ff0c51105c5ae5ed1776e253721e6e6f6e31dbaded74414dea4624c571a6bde0860001b6143ad565b6000905061c3e8565b61bdff7f101852a9113711b402240923b0d1e629ae7d7ca5becbb76d66a05b64cc60980860001b6143ad565b61be2b7fe590d18255fe7891cffc828b79baeb6523a8568fd69b61e086a6f0fcbc243dfc60001b6143ad565b6001600381111561be3857fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561be6757fe5b14801561be8a575060006008600084815260200190815260200160002060020154145b1561bfa05761bebb7fbb458ef8a39e3e067daebcb5d53d3fb5c54e8616f13b9f0ddabd3e74845ff6d760001b6143ad565b61bee77ff4ed907481f89ff0c1bc33110ba6502e011bd9385bbef7dca729ef2e1cdc561a60001b6143ad565b61bf137ffc0bd6854809a04915e21229932f4d6892de984da37d8e1517e037b93ef734fe60001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061bf6b7f254a8656b5fcf06b0083312b35c2328e28b344405392342d659d4602c150e85560001b6143ad565b61bf977faa9b6b98fd178e750fd3baad7d056b4bffc4ef09a87fb998236bbaf1b9fb35cb60001b6143ad565b6000905061c3e8565b61bfcc7fd68bec896d7bd84e20354a179d9a4ddc80288c801366b87ce9f21b6da33f71f560001b6143ad565b61bff87f9652e4144468065a760c5139b65fc3a9a9e73e4dca62146ddc7134b9b8a759d060001b6143ad565b60038081111561c00457fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561c03357fe5b14801561c0555750426008600084815260200190815260200160002060040154105b1561c16b5761c0867f5bd9787c3c7e9cc75eb59e9dffbf4bee43e3821e4d31038dbd7d10c58feb689360001b6143ad565b61c0b27fa37d83cc6b868a73454d58877d9ac7dda9eefbe6334346696914e9232bb1745360001b6143ad565b61c0de7f8158d57ef96ba67047c30800db4577dfe0ca4104153b7eb1d2fc218ff883236460001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061c1367f9c5c553679000555d9cf4875be4fc3479b69a32c9a03bd9c66e8a3341a31089260001b6143ad565b61c1627ff8976ff97af1198bada7dd45ed38eab3545a835a672714f9b76d56ff8b6cd8e360001b6143ad565b6000905061c3e8565b61c1977f0301057208a5a94ac013849972790f73743de9034b62f377fe9f5c237e9d66e960001b6143ad565b61c1c37f9590711820a2098d2a92e95d5f7212b561679efdc9c4db663cb9bdb355249b3560001b6143ad565b6002600381111561c1d057fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561c1ff57fe5b14801561c24957504261c2476008600085815260200190815260200160002060040154600860008681526020019081526020016000206003015461b73790919063ffffffff16565b105b1561c35f5761c27a7feefd72a8f312758bc56ea318d6313df2c3ce2363d6554f604f72a1900b38440d60001b6143ad565b61c2a67f5dd6f7d37fb6b95e7a85674a2788b3aac501bb21ead7dad51bbfe508b19b47bb60001b6143ad565b61c2d27fa9d499257f48a23cb752e3464ba0e74cf95379dacb39e2c44001f700cceb512560001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061c32a7f06e6f52020f1acba7fa1f013fb60c488b63064153300fd0970afa15aa44e12ba60001b6143ad565b61c3567fad082986a549b72bb2ef917d00601e76577fd7381a00a89b3a9c5fc65681f1c660001b6143ad565b6000905061c3e8565b61c38b7f20641234ff965e95be45927e2d84e19418ef9e5028b6410f9913bede8882bbff60001b6143ad565b61c3b77f18fdd12d7afd7d16cb2175687f3cf4e83bf565af96ba931b780cafc804c964b960001b6143ad565b61c3e37f35102aa52645102ead5ee786c00236873bc202acc71a26ad08b7cf01985d5ae560001b6143ad565b600190505b919050565b61c4197ff9fc9ac43adb81975cb7ac1a0522b5a6e3b89bc5266550411e6aa9bc3086e27760001b6143ad565b61c4457ff2b20dcbb930dc8499f5be0056f5d8a86d9471b468b1182d64d7a71c0091c22a60001b6143ad565b61c4717f19e92a1895816eb2ff4889583b6b387302e2956541120ceb6338e149ec62e7f560001b6143ad565b61c47961df32565b60086000848152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff16600181111561c57057fe5b600181111561c57b57fe5b8152602001600a820160159054906101000a900460ff16600281111561c59d57fe5b600281111561c5a857fe5b8152602001600a820160169054906101000a900460ff16600381111561c5ca57fe5b600381111561c5d557fe5b8152602001600a820160179054906101000a900460ff16600481111561c5f757fe5b600481111561c60257fe5b81525050905061c6347f3b054abf37860a2714d0a9ad1b783fcd0e6fa94498355b7754c156895bb146ce60001b6143ad565b61c6607fb9926ce079f4125ae597e1f719cab9c393336bf1750e2b071ac199d4debd923760001b6143ad565b61c68c7fcddfccff0f8bf32503b213e9063756621cb8fdd325eda0caccd4d497f74eed8060001b6143ad565b6000600481111561c69957fe5b816101c00151600481111561c6aa57fe5b141561c701576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061e498602b913960400191505060405180910390fd5b61c72d7f4416945b53319e4ec9deb47af2e8fd52893733890f4c86c3681566b771f5b9b960001b6143ad565b61c7597fc52ba53c69ee645c69c2585d01f189150442bdb44c254d65df22aa68034332b260001b6143ad565b61c7857f0253630e1c054ff74ded9a339dbd79e70ff306a663f3338ba5f46834a9db5df960001b6143ad565b6001600481111561c79257fe5b816101c00151600481111561c7a357fe5b141561c8fa5761c7d57f3646fd7f09fd85b09a73c6c602668804954450315ab76a6390e37f6c20db361360001b6143ad565b61c8017f8f62bd1130d507a580f5087fce789459ec9fc6521daa2a25afb672feae556e3c60001b6143ad565b61c82d7f11c02fd97e6999549fec07fd06f0149b10f5a46178cdaf5f01568690f7ac7ed960001b6143ad565b80610140015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561c8b957600080fd5b505af115801561c8cd573d6000803e3d6000fd5b505050506040513d602081101561c8e357600080fd5b81019080805190602001909291905050505061cf4d565b61c9267f83fa75b60aa16ae1534b5f2fd98463374e1d6cce3f80626b98e69819250be0f960001b6143ad565b61c9527f536f130e6c202974e8b57bcbfaff295ec0d3a76da482c0116a104957fe491aa460001b6143ad565b6002600481111561c95f57fe5b816101c00151600481111561c97057fe5b141561ca685761c9a27f3f32af1864c7fca16884088dd7358f997f88a1dd36e82b3002006e98d16a4bd860001b6143ad565b61c9ce7f37d067185cf0ed8d38419803410f1716088ceb2af32ec97fdf4e2d331149b92960001b6143ad565b61c9fa7f311e27a538d4f9b27d119434d744ab7ca0157cf414ff70f500cf1c0382b6acb060001b6143ad565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f7420696d706c656d656e746564207965742e00000000000000000000000081525060200191505060405180910390fd5b61ca947f831edd8210081558c15f72013015cf79e66f53d988b1b4ce035db416a390af4960001b6143ad565b61cac07f69ab85ec1959dae9399396c29c979dc439babcd144afb503f45f7df1715d8d6560001b6143ad565b6003600481111561cacd57fe5b816101c00151600481111561cade57fe5b141561cdb25761cb107f89e3055aa3d91f79a08f927d0783eaec5f061d5d18142239b36fc869cecce8d160001b6143ad565b61cb3c7f8648e6d12fba90b4a76b0937cd0bd474d9bc3629ffb893cd4dfc16efc6fcf0ca60001b6143ad565b61cb687fc5900c41f695300e3626c31031248b7a646c5771ea4758814d32cd34f76175ee60001b6143ad565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561cc3357600080fd5b505af115801561cc47573d6000803e3d6000fd5b505050506040513d602081101561cc5d57600080fd5b81019080805190602001909291905050505061cc9b7f5453e20c79af3f5ab1b0bfb522abccf809e6639a18ecfa1ba10d11966d76dce160001b6143ad565b61ccc77f7ad0f6dfc11c66b408b60669b07af67ea76aca820ad0c3b5e055132cbc1ec49a60001b6143ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663849a681733848460e001518561010001518660c001516040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200182815260200195505050505050600060405180830381600087803b15801561cd9557600080fd5b505af115801561cda9573d6000803e3d6000fd5b5050505061cf4c565b61cdde7ffefa5cec4fa9064e36404a692aad2a4db3f00a8438648b79ac58c8efda8e9a6f60001b6143ad565b61ce0a7fca3dc0d5614ae19551e6f058c959c337c5c22c82754df388da3734d2a0a4ab7f60001b6143ad565b60048081111561ce1657fe5b816101c00151600481111561ce2757fe5b141561cf1f5761ce597f60f55a1f103c9a1119f2497ee621a398ee03b5d78d344f124836bbcf3c1df60860001b6143ad565b61ce857f3e656205ddf82be935d887b89005da8de1b8f0e9fb6eafd4f983417c1b4f3f1160001b6143ad565b61ceb17fcc79ab918c227816062423fa2b69e1d6e910682193d3fad9f566c9765af7345760001b6143ad565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f7420696d706c656d656e746564207965742e00000000000000000000000081525060200191505060405180910390fd5b61cf4b7f06dbd710029f7ef5b7e4d709a390227aa1309e1157bd871634c025f139dec06060001b6143ad565b5b5b505050565b61cf7e7faf3334b7c8f6d3571478be0fc8dedeb7d18379480990f62375c3e54d4e07291060001b6143ad565b61cfaa7fbce63d97d8517956c409d8ba2f4af181e55e9272dd33c2559555d7561886a81c60001b6143ad565b61cfd67f5573ca7618e5e970e32cfff13dc92fae4d07074f0a60674bd0323856b82dc4a860001b6143ad565b61cfde61df32565b60086000838152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff16600181111561d0d557fe5b600181111561d0e057fe5b8152602001600a820160159054906101000a900460ff16600281111561d10257fe5b600281111561d10d57fe5b8152602001600a820160169054906101000a900460ff16600381111561d12f57fe5b600381111561d13a57fe5b8152602001600a820160179054906101000a900460ff16600481111561d15c57fe5b600481111561d16757fe5b81525050905061d1997f0edbd8684422fb9a817dfb39ad51a6a1e2ed8648c97fc8a7fd0eaa2148d416cd60001b6143ad565b61d1c57f4bbdbd7e92b7036b97cfc18306e32bafa852ed102613433655646047a3ee832060001b6143ad565b80602001518160400151101561d6fc5761d2017f7658ecdfd8d8732b312cb32404eb8d2c51fdf1272693c3e65e4d69eaf05e1b7160001b6143ad565b61d22d7f0bc72c8210072183a51df76e29add60aecd74d1ac04eab9ab49463c9ae8c79fd60001b6143ad565b61d2597f3362701b0fca282af2a6c7370630e708ad0e557aae21b3fe9f3c91bf8f75de5160001b6143ad565b80600001518160400151101561d5a15761d2957fedcb6f6f1db5453ea62f665a6f8190343173138fee00abcc2d3f4807541a1bbf60001b6143ad565b61d2c17f6ac1fab115fffec528b63d7e86dba3e43cc0486724b6bc5e52d26d99168bc32060001b6143ad565b61d2ed7f8c482dd675875ec477f98d4b91ac0d816c7763012a250fab27dae22204553d4e60001b6143ad565b60008160400151141561d4555761d3267f10687479cf4574c2105c199a52cac67e2019daf1c8ef301b5ff4ad14564a221a60001b6143ad565b61d3527f36f3a9227aebacea9bfb503b14bf9c36f8f9aa7f1c073bfdf619f5df0e50914e60001b6143ad565b61d37e7f01460a329248328cb216d4b91efbd57f5db308662bd43304c76d362bf5419c6c60001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061d3d67f9adabe64395d42bffe49041aff12f726a4a0a44a732c5c0f5ed69da48c88809260001b6143ad565b61d4027f20e0bffb0ca556643787e529f37d5a80a10aca3b39b848da077554d802ba120260001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c4836040518082815260200191505060405180910390a261d482565b61d4817f7694c969c62f9945319c007faa03014817bc8474475e9c963d15f911e6ddf8ce60001b6143ad565b5b61d4ae7f16b4a42193624e455f269dbec524a47b6715975e1d67daa1dc528f28b28c564160001b6143ad565b61d4da7f6a2e55800ed2e29e8b25b0e69ccd2c3842e1f527bcc4f182a81bb709626c4ec260001b6143ad565b6000600860008481526020019081526020016000206000018190555061d5227ffa6894585a102862dae64ff945e57671f07556d1a9b4d6be4e1f4dc80ff1e0e160001b6143ad565b61d54e7f69608a2dcae66b886b77f166bc9161003095e9d8533e0085acb033e467c6035060001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a78836040518082815260200191505060405180910390a261d5ce565b61d5cd7f56602399bae5070426a7fa62c091b4571e081a365a0572bc6ea7c655c7e707a960001b6143ad565b5b61d5fa7ff8b907cd3ac179fc67d3c7aacc1abaf591c3d2525c2360fdc4560fa55586f1c760001b6143ad565b61d6267f8f6f28520c12dc533734858bf8c6deb833cab0ee52a95989c9b8cd94bcc671d960001b6143ad565b8060400151600860008481526020019081526020016000206001018190555061d6717f4c4d4990333d7eed3525c1319acf2143a7564db66bd55ab8e353d9129ecaadca60001b6143ad565b61d69d7fb9509c3e46ba4d92ae4139a29ec9ef2edcc63696d6d01ad73f000d286a6cdd7e60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445838360400151604051808381526020018281526020019250505060405180910390a261d729565b61d7287faab15ab76b90c26265bd5f07e0d3d0c779296891961aa0ea3e0803d9416027f660001b6143ad565b5b5050565b61d7597f82a5e4398186d30836ca01d3cd79052da3dfe0fc6e6f5e95d9bd4fd201d9d3a660001b6143ad565b61d7857ffbdb91767839145a3acf8d28f55e70eb505cebf298ad36c4574f8cc847e8957a60001b6143ad565b61d7b17f9cac980eb64a1c6e5488bdf9379084f165f4a5e81de9f309ba6b440cf521f91060001b6143ad565b600083111561d98e5761d7e67f8c875204c918e371346e600056c894e469f9f20bc9547d475c7c67298f54e5bc60001b6143ad565b61d8127f2a2f652ea5aad0bccc9a596ab07c1cedab273df7b97111fbf2ffa761c6a28fc960001b6143ad565b61d83e7fa74c5c3487b6db5f33bf5df8b0e8257d1485f02835ef86bb78c8ed5b9534c9cf60001b6143ad565b600082141561d8c75761d8737ff1ceaf83779cc9c0312cc98b8c4b4e2b2ce710ebb082e56df01af4300f30601060001b6143ad565b61d89f7f87bdef1c9e2c992f5ab8653535516a2f27b1f437def6d03005e86d206d50faaf60001b6143ad565b600a60008581526020019081526020016000206000815480929190600101919050555061d8f4565b61d8f37fd63c5e3214fae63baeab271f67717051a18c05e03c45ceec5535c23419d9569760001b6143ad565b5b61d9207f99fb4d88d545ba183efc65749f0818469151bf1246ce9a8e33ccf072787875b060001b6143ad565b61d94c7f70a5c4b8a4b90ec8fd3d111a6f07737186dcb95fb911e1f48e962ff7dd292de560001b6143ad565b61d97281600b60008781526020019081526020016000205461b73790919063ffffffff16565b600b60008681526020019081526020016000208190555061d9bb565b61d9ba7fcd54273b660ce6cffd80afefdec59b42d4679a3bf27ad2452ca7dd7ebf9064a060001b6143ad565b5b50505050565b600061d9ef7f996468adab2cfba5de081e00c611ca70c15d8fec7d5bf522494a62c1469ffa6a60001b61da8f565b61da1b7f9f1ba2348d57cab76c102a92e631d7e3d939d3a1ce6cb3a01a504d1656b19f5060001b61da8f565b61da477f46d4aa33cd017349564c3524038979baabbfc921b9cf218610f32f2cefa7e6de60001b61da8f565b61da8783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061dcde565b905092915050565b50565b600061dac07f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b61da8f565b61daec7f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b61da8f565b61db187f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b61da8f565b61db447fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b61da8f565b83831115829061dbef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561dbb457808201518184015260208101905061db99565b50505050905090810190601f16801561dbe15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061dc1c7f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b61da8f565b61dc487f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b61da8f565b61dc747f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b61da8f565b6000838503905061dca77f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b61da8f565b61dcd37f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b61da8f565b809150509392505050565b600061dd0c7f196dd912071b7ac5c8a10b8a236898e903a5c95f5189a9aeb16dc1191096752060001b61da8f565b61dd387ff25ec16e9c80532b14a66f8cd16ae291eebc856235e409a39c3fbd9dc53e53fb60001b61da8f565b61dd647ffb609f676697fca43f3242dd637f8af44d19e0456d05ec1547a1557478b8a1ea60001b61da8f565b61dd907ffc25a7e532044dc446303b3445457a6ba5f30c2ec2085a7b37e4ae0e05b09ba260001b61da8f565b6000831415829061de3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561de0157808201518184015260208101905061dde6565b50505050905090810190601f16801561de2e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061de697f295ce5b61523fe81f08b0e41715a55fb7cc4323fa58af5f536a59e28b507ad6660001b61da8f565b61de957f4460e22500904e71005e8ef95355467cd96d8038ca3b358379ef52915f4cd11a60001b61da8f565b61dec17f898838ee4191c5d93d43aba28d5dace210f5b5fe59d06155be60fc494d99a9f060001b61da8f565b600083858161decc57fe5b04905061defb7f6d2a274d329c86c87e9d63cea7c87a6fd3d3ca9ab129144ff43f4724a38a4a5960001b61da8f565b61df277fbb4fe2c1c37d48811af5ff17eb49f43a22d0b33ae049d66f26c63e5ac81928dc60001b61da8f565b809150509392505050565b604051806101e0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000600181111561dfae57fe5b81526020016000600281111561dfc057fe5b81526020016000600381111561dfd257fe5b81526020016000600481111561dfe457fe5b8152509056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158204455e84ba3cbafc26c52c9ae32267af0c9cfb94d4e062e3afa07cf8e81f0521664736f6c634300051100324f726967696e7341646d696e3a2045616368206f776e65722063616e206265206164646564206f6e6c79206f6e63652e", + "deployedBytecode": "0x6080604052600436106102305760003560e01c80638acb0e6b1161012e578063d1a494f4116100ab578063e0e3671c1161006f578063e0e3671c14610f61578063e87471a514610fca578063ea4ba2fa1461101b578063ee5679751461108b578063fdc704d7146110a257610230565b8063d1a494f414610da9578063d6febde814610de4578063d8c8469514610e1c578063d96e9de314610e57578063dca21bfc14610f2657610230565b8063a935e766116100f2578063a935e76614610b9a578063ab18af2714610c06578063af7cea7d14610c57578063b3ce74c714610ce5578063ca2dfd0a14610d5857610230565b80638acb0e6b1461096c5780638e1ba96214610a125780639000b3d614610aa25780639fa1832514610af3578063a0e67e2b14610b2e57610230565b80632d46d9d9116101bc5780637065cb48116101805780637065cb48146107d957806376d73a761461082a5780637baec6ae146108795780638259ab11146108d4578063836e386d1461091957610230565b80632d46d9d91461066257806343a40e3f1461069d57806365e168d3146106e557806367184e28146107575780636e1b400b1461078257610230565b806315cccf8e1161020357806315cccf8e146104c057806316a628891461051c578063173825d91461056b578063194e1362146105bc57806321df0da71461060b57610230565b80630487e0b21461023557806309d5ff14146102a45780631291e84f1461038e57806312b0d40014610469575b600080fd5b34801561024157600080fd5b5061028e6004803603604081101561025857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110b565b6040518082815260200191505060405180910390f35b3480156102b057600080fd5b5061037860048036036101a08110156102c857600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff1690602001909291905050506111ea565b6040518082815260200191505060405180910390f35b34801561039a57600080fd5b50610467600480360360408110156103b157600080fd5b81019080803590602001906401000000008111156103ce57600080fd5b8201836020820111156103e057600080fd5b8035906020019184602083028401116401000000008311171561040257600080fd5b90919293919293908035906020019064010000000081111561042357600080fd5b82018360208201111561043557600080fd5b8035906020019184602083028401116401000000008311171561045757600080fd5b9091929391929390505050611705565b005b34801561047557600080fd5b5061047e611b02565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104cc57600080fd5b5061051a600480360360808110156104e357600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050611bb0565b005b34801561052857600080fd5b506105556004803603602081101561053f57600080fd5b8101908080359060200190929190505050611df0565b6040518082815260200191505060405180910390f35b34801561057757600080fd5b506105ba6004803603602081101561058e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e90565b005b3480156105c857600080fd5b506105f5600480360360208110156105df57600080fd5b81019080803590602001909291905050506120ca565b6040518082815260200191505060405180910390f35b34801561061757600080fd5b5061062061216b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561066e57600080fd5b5061069b6004803603602081101561068557600080fd5b8101908080359060200190929190505050612219565b005b3480156106a957600080fd5b506106e3600480360360408110156106c057600080fd5b8101908080359060200190929190803560ff16906020019092919050505061221c565b005b3480156106f157600080fd5b506107556004803603608081101561070857600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612458565b005b34801561076357600080fd5b5061076c612698565b6040518082815260200191505060405180910390f35b34801561078e57600080fd5b50610797612726565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107e557600080fd5b50610828600480360360208110156107fc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d4565b005b34801561083657600080fd5b506108776004803603606081101561084d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612a0e565b005b34801561088557600080fd5b506108d26004803603604081101561089c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c4c565b005b3480156108e057600080fd5b50610917600480360360408110156108f757600080fd5b810190808035906020019092919080359060200190929190505050612e88565b005b34801561092557600080fd5b506109526004803603602081101561093c57600080fd5b81019080803590602001909291905050506130c4565b604051808215151515815260200191505060405180910390f35b34801561097857600080fd5b50610a106004803603604081101561098f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109cc57600080fd5b8201836020820111156109de57600080fd5b80359060200191846020830284011164010000000083111715610a0057600080fd5b9091929391929390505050613172565b005b348015610a1e57600080fd5b50610aa060048036036040811015610a3557600080fd5b8101908080359060200190640100000000811115610a5257600080fd5b820183602082011115610a6457600080fd5b80359060200191846020830284011164010000000083111715610a8657600080fd5b909192939192939080359060200190929190505050613438565b005b348015610aae57600080fd5b50610af160048036036020811015610ac557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613714565b005b348015610aff57600080fd5b50610b2c60048036036020811015610b1657600080fd5b810190808035906020019092919050505061394e565b005b348015610b3a57600080fd5b50610b43613951565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b86578082015181840152602081019050610b6b565b505050509050019250505060405180910390f35b348015610ba657600080fd5b50610baf613a63565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c5560048036036020811015610c2957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b75565b005b348015610c6357600080fd5b50610c9060048036036020811015610c7a57600080fd5b8101908080359060200190929190505050613daf565b604051808b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b348015610cf157600080fd5b50610d3e60048036036040811015610d0857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614087565b604051808215151515815260200191505060405180910390f35b348015610d6457600080fd5b50610da760048036036020811015610d7b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614173565b005b348015610db557600080fd5b50610de260048036036020811015610dcc57600080fd5b81019080803590602001909291905050506143ad565b005b610e1a60048036036040811015610dfa57600080fd5b8101908080359060200190929190803590602001909291905050506143b0565b005b348015610e2857600080fd5b50610e5560048036036020811015610e3f57600080fd5b8101908080359060200190929190505050614442565b005b348015610e6357600080fd5b50610e9060048036036020811015610e7a57600080fd5b8101908080359060200190929190505050614445565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001856001811115610ed257fe5b60ff168152602001846002811115610ee657fe5b60ff168152602001836003811115610efa57fe5b60ff168152602001826004811115610f0e57fe5b60ff1681526020019550505050505060405180910390f35b348015610f3257600080fd5b50610f5f60048036036020811015610f4957600080fd5b81019080803590602001909291905050506146f2565b005b348015610f6d57600080fd5b50610fb060048036036020811015610f8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506146f5565b604051808215151515815260200191505060405180910390f35b348015610fd657600080fd5b5061101960048036036020811015610fed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147cf565b005b34801561102757600080fd5b50611089600480360360c081101561103e57600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050614a09565b005b34801561109757600080fd5b506110a0614c4d565b005b3480156110ae57600080fd5b506110f1600480360360208110156110c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614cdb565b604051808215151515815260200191505060405180910390f35b60006111397ff95f356390113da9949697b1940b741282a41047ee6a524da66bd2bc3991d55f60001b6143ad565b6111657fceed6f495f3fb222935bf7886330fa5b8d40ad62923cf45af2aaab31e6a7a7ee60001b6143ad565b6111917fa5fe6a08e078c68865f2ae79ddf706b1461305921fa9b614fa811291fd1c49ff60001b6143ad565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006112187fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6112447f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6112707f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b61129c7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61136a7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6113967f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6113c27f6b9661cfe4145666108c08d49cc095e7899fd2f8d10f710df531efe4c0b8a1c460001b6143ad565b6113ee7f8833b00d2b4a2590902b94be3ecdac6017e64abc6b60f4827d186ff2cd45db3d60001b6143ad565b60046000815480929190600101919050555061142c7f0113759a83325f9f6e2abe5c989dc175e945e80a027cf4446563aae0c19d851d60001b6143ad565b6114587fef395f4334ecf7add11195b1503869c4df8eff95bb6219e5fd66f468388859dd60001b6143ad565b60045490506114897f1ce98346381735d51548def916e3db2c12830bac6a2df4c2e38cdd35030ba5f160001b6143ad565b6114b57f91d3dea52c36d1824b758fe672088b3c90677d94d0406558fc26cf9f639a483e60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b826040518082815260200191505060405180910390a261152e7f1372d95eebf4faf6ae9550551603fbe9fb5abcf4a42e8c205c3d2b91f5709aeb60001b6143ad565b61155a7fbe6de7377e6087a49f8f0ceea5ee2d40fcc7c5d3543f7fa9a96d18055dde5abd60001b6143ad565b6115648185614db5565b6115907fd684e9c1acb35d1b8de7b798bb3767c147dc77b5ee2a0db37d9788833679ca9f60001b6143ad565b6115bc7fcc149f0fe2d8389adfcb5b7964821744229b0db7d8425cb1dd0696d9f15db0f960001b6143ad565b6115c881888888614f30565b6115f47f189adf1f8a59761cc16870f8e1b847c421f7009489cdd079b980f939770d9d6b60001b6143ad565b6116207fdfb28cd97c0643bfb263431cb26e73d4e56bfec868e004718fcb7422b86647eb60001b6143ad565b61162a818f615512565b6116567f9543a9ce4649c688e8a082a2f30f77969f0ba852362e57f935a9ae33f5edfdb360001b6143ad565b6116827f7f7c55df46f61ca1d10e36c6360b2ce91fb724c51a6c998099e037fd15f9da2160001b6143ad565b611690818a8a8e8e8761602d565b6116bc7fb6268ebad9bf0b802db63db9ef5a03ef762e7fe2191d28fd6710f18790bd1b2060001b6143ad565b6116e87f4e0f28087d320fc4990c2527c4d02d503913c3677c0ea014f6932bab3a1bfddc60001b6143ad565b6116f4818e8e866165a2565b9d9c50505050505050505050505050565b6117317f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b61175d7fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6117897f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6117b57f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6118837f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b6118af7f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b6118db7f9efa1c4f33094678dc6d5b61854b0266669a8ea26c73edb5e33ab6a625ba39ed60001b6143ad565b6119077f37469080bbed0cfa814adf66d6eb5f4dd5173f2d07e478ed0d78c69c02c6800060001b6143ad565b6119337f9d3f2b442aae3fd690acaf46f5a667e12e3e7c72370dda73873057b875df4ad360001b6143ad565b61195f7f0ed42e055d2ecc5194ea63d758605de3ba4c4655e8beaaed60f15d7278fc134060001b6143ad565b8181905084849050146119bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061e10f6034913960400191505060405180910390fd5b6119e97fe28ba615be5bffa4c8e5d38edcabe6403ec916ceaf7eb84911ed5bf329d2515e60001b6143ad565b611a157fbcd3c4b1719dd0c0c2ae6b918474dc81368ab5ea1a7324041c5d9e55e08cca9160001b6143ad565b611a417f0b859bb4e1959553ef5fdbe7c9b227a5e7b2f362b92cb1e07a028435f3edff7560001b6143ad565b60008090505b84849050811015611afb57611a7e7fefc6b00e5c1efadc711df8957de1b2700bfe81b3275405d12c3658780b93c32a60001b6143ad565b611aaa7ffaf3aeaf9076815c7373c25637920a67cb7d988a20c967f9613e5432235b172560001b6143ad565b611aee858583818110611ab957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16848484818110611ae257fe5b90506020020135616ce5565b8080600101915050611a47565b5050505050565b6000611b307ff250fb4106da45b8066bde94a6a4fa918a58684a978275e7004029740a01ffce60001b6143ad565b611b5c7fddfeb7fb167b56ea073db84579fbafabad5de8c5b537e360aeb5a80ee5c4d2da60001b6143ad565b611b887f065d6cf404fabcb70aabc8a0be82d8cb5ac9dde9f7dd2112e2b8eb58a60e8fbe60001b6143ad565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bdc7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b611c087f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b611c347f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b611c607f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b611d2e7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b611d5a7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b611d867f0149f83e5c09fe41d5baa192d327cce8e8df54e53304215949b8f33cfd90f57460001b6143ad565b611db27ff72e40643ec7ec6eb31930d5a594c46b7d23cc85856fa6b836eea572c08ab7c160001b6143ad565b611dde7f9529e2b00685ea59961613bd638efc3c7baed24e703e76b6055041481231799960001b6143ad565b611dea848484846165a2565b50505050565b6000611e1e7fd761c6f2cac214b7917e00d69a47127c9f92589762dfb407d0d378723fb22a9d60001b6143ad565b611e4a7f4eedb79c36a42e58ee94547fef467a4e6a7c520b3405838e3ffb28cf04a5e4dd60001b6143ad565b611e757e9a29a22ba445229ba2f451327edbc2ee256f686363bbd15278a5219e85118d60001b6143ad565b600b6000838152602001908152602001600020549050919050565b611ebc7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b611ee87f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b611f147f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b611f407f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61200e7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61203a7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6120667f0e44747b587cb0ce7592cff3df77f645755c5f10eeb3a3aa0ddac17f65b5b18b60001b6146f2565b6120927f538d135c9cc4037a61d553c365a022ce1d01b218c9b4e6687864161a8994013b60001b6146f2565b6120be7fad6e2327c3430532e2391fc71d4270553fb8d051f4b664d870acb608d3e0a81260001b6146f2565b6120c781616fc9565b50565b60006120f87f73f8d38ee2d03f10c8338074464e3dc2118ae9334c851ac34fcf7b60b5221bcd60001b6143ad565b6121247ff8b0c898982141b996348d1498840d79c5958f12f9cdd9cb7461dab14668bfc260001b6143ad565b6121507fb731ff315b4591651a849c4d7c291305e26db10765ed4144ca9b9aa64228e82260001b6143ad565b600a6000838152602001908152602001600020549050919050565b60006121997f3ae3ac9b140e1ca340ab44d2f76b19bec7eee3c6788c7d92befd85b5806aa13a60001b6143ad565b6121c57f2d5182a7e367116b083e493062ad4003212e7c0091095fbb8235bc218f2744dc60001b6143ad565b6121f17f23c7ba278f6ca83f66a22789ff962bfb742f06b3724c6e353fdc89063e146a2960001b6143ad565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b50565b6122487fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6122747f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6122a07f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6122cc7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61239a7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6123c67f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6123f27f03874e6ffa5fe98a062d13b8ea744f5aaa681ff2f5197c3bbad57580417b8b7160001b6143ad565b61241e7f5b26afb9ffeb55e6b5522f6aeac1c61e1c7c077a5aeb107b42adfad3ddab58ac60001b6143ad565b61244a7f4bac114fbc8385f334d62bc98815ccecb4a83a66673f028c15b66f0c6cab144260001b6143ad565b6124548282614db5565b5050565b6124847fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6124b07f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6124dc7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6125087f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6125d67f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6126027f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b61262e7fe3dfcc5b5189e5abfa73d307ddea55fb7cfef0f15f2679d14e6c6ec352f921fe60001b6143ad565b61265a7f2a5cc306f40e1f0873c0a1e6fef2e52da9500bd790ef95e0125a286f71b3e02c60001b6143ad565b6126867f04e043a0896a57e6c6f1575cb62916ef540a5b4316ae5a062583b03f313935c260001b6143ad565b61269284848484614f30565b50505050565b60006126c67ff84b99b34260ab143ba1a2002db4556e56878320e9645dc009e5d5e51973aba060001b6143ad565b6126f27f62eceebeb156885d0e295ffe9505ba53988ce1eed8b34cb09667f5758a28d7e560001b6143ad565b61271e7ff358e692aa91d2ba30e2ca2c0469f56f94c71e3f2f36d8522a64d93ece77959960001b6143ad565b600454905090565b60006127547f590b35ea19199ac618d9c7feb5571ca76b4217683165bab79135f56ca5bed80360001b6143ad565b6127807f1366e9b6711f13dc255671dd1b4c9f515a3573f0c730f8241c85556c4209486a60001b6143ad565b6127ac7f83abadf0b52662c6e4bc22e41089d19321a5cc14e680cbb978c16f84d5c5fe6c60001b6143ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6128007fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b61282c7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6128587f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6128847f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6129527f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61297e7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6129aa7fafcb0b4f682c50a9679687cd57fb195565d3b3594cec41e61652d70bb7a9797360001b6146f2565b6129d67f1044e613c1c3d7cc5b42b22374c3d222c8151549a65f809328dc5e6291659a2a60001b6146f2565b612a027ffc4b144d7908223b9fd317ce3643b657d8063803df44b93493003820111a195a60001b6146f2565b612a0b8161766e565b50565b612a3a7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b612a667f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b612a927f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b612abe7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b612b8c7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b612bb87f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b612be47f058b7cc1e32d92b658f81d197d0fa3a6315ff52fa3766fc235cdd6184aeaf6bb60001b6143ad565b612c107f4bbc365d77f708c101238713d1389549b9fca1c939a50fbd26688686651536d060001b6143ad565b612c3c7f156c58f60604d237776fdd592b3a5d5106d7264c6b1df17fdc1cafe6fd436e7660001b6143ad565b612c47838383617b83565b505050565b612c787f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b612ca47fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b612cd07f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b612cfc7f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b612dca7f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b612df67f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b612e227f365ddb943024ef7fbffec94f1ec31ca43322aaa115f40bff1879e034ae5d399d60001b6143ad565b612e4e7fd5a18db95fb4d6eb8e6f7df8fd781832bf8d93cad15393f48207ca45d27e095e60001b6143ad565b612e7a7fdf3532a1113d5a3b2e6cd389aef8b24c97a5016a6f46ecf36aee0e60017958aa60001b6143ad565b612e848282616ce5565b5050565b612eb47fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b612ee07f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b612f0c7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b612f387f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612fda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6130067f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6130327f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b61305e7ffa544545449131d5912ef311088e3d688f1f81c5aca54dca7bd178d77c7c736660001b6143ad565b61308a7f6ba150ce46fe01575d927263b4c4bac99de30926f52d71fd618239c7014a6e8860001b6143ad565b6130b67f0424dba2aa9324f4a4b86f4b373bcb5abc521061fe9c7cc37664970751cd0fdc60001b6143ad565b6130c08282615512565b5050565b60006130f27f7603f4cc7eed5aea26c8363aae808228050de4a1df7313c6e816cbdd5cb707be60001b6143ad565b61311e7f581f876caee8a1d16cfb1d2b0eeb4066d220ad66d031ace5d7fb1a6986cc168a60001b6143ad565b61314a7f70ebfddc39a6e980574278522e377c07bf10df50e1dfb83090fd786dfe5be09760001b6143ad565b600c600083815260200190815260200160002060009054906101000a900460ff169050919050565b61319e7f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b6131ca7fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6131f67f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6132227f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6132f07f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b61331c7f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b6133487ff0165474b2d676fea0b8023064cf7421d1272f4919b87d871eda274681c4ed5c60001b6143ad565b6133747f15b42621139ada08336951eba2f041f2cc3ebcaa539d2a13f87329a8d7d6b45960001b6143ad565b6133a07f0894d12fe48c69e5bd5ecb1dd45590a9e1e97f03743be95a97f9a1a6ac3aaa5160001b6143ad565b60008090505b82829050811015613432576133dd7f86f852a70d408d4a2f186f3c923eaa78cc9d6cbd42657492ed1a9e6edfabb16960001b6143ad565b6134097f664a28c3c931dfc99c22d2ca503fc214685e19f7a6f4eef328f35d06b432ad6260001b6143ad565b6134258484848481811061341957fe5b90506020020135616ce5565b80806001019150506133a6565b50505050565b6134647f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b6134907fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6134bc7f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6134e87f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661358a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6135b67f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b6135e27f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b61360e7ff9afe9483ad45314c1f9334d19579a96e2ced1bfaa29927b11048af7c43f747460001b6143ad565b61363a7f56f19aeb9abc0578ab8355d3bf3c2995ffbc732cf2888b835db28c76406a378960001b6143ad565b6136667f587bf7ffa332928533e0732161cd434483e7c1232a30656d658364c71310c93260001b6143ad565b60008090505b8383905081101561370e576136a37f43404884baef5c6f58bf4186141b647b0f7643199b28bc515a5cf75127f2592660001b6143ad565b6136cf7f8733fd543eed7949dc81ceb8e7f3cc4d9ebef97e59999d0e6181f70672b219de60001b6143ad565b6137018484838181106136de57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1683616ce5565b808060010191505061366c565b50505050565b6137407fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b61376c7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6137987f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6137c47f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6138927f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6138be7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6138ea7f5fceccf80f991d1a72d8282836518ae01c2f8c5f7b370385d7f1f56e93e49e6d60001b6146f2565b6139167ffc15d1b5d4b2aa6b36a36f4aa2415983c696e5f2faf3aa4fa7bfd6790e00635f60001b6146f2565b6139427fe1f2ad91109a6da48347f79de13c9e0b5c9146ac5743cf02594a0b249d88013360001b6146f2565b61394b81617e59565b50565b50565b606061397f7fdee10534b67278fca285b5798f07e3aee921e04ea89b6427272f1c6d6bd2f07260001b6146f2565b6139ab7f3322398ce67959ada7f766b6e33744c7138512194c5f473b04cdef087872bd8560001b6146f2565b6139d77ffcf826e84f2f086c38453fef179ab177aeb6adabb1238ea14a8a0037d3a7bef560001b6146f2565b6000805480602002602001604051908101604052809291908181526020018280548015613a5957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613a0f575b5050505050905090565b6060613a917f1968df1ae1af4ccf2947ce153fb93b718eaf164c8d31064c2ab9fe17f7ab787f60001b6146f2565b613abd7ff6485d61a14d2ce81eda90d0faf17bfe09fa1f03b3b9d25da0c56e10d29b358a60001b6146f2565b613ae97fce84cd58e76472fb9aafbae1c6be70596e5c3c548848cff1bcf4ae4c5a8d463060001b6146f2565b6001805480602002602001604051908101604052809291908181526020018280548015613b6b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613b21575b5050505050905090565b613ba17fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b613bcd7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b613bf97f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b613c257f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b613cf37f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b613d1f7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b613d4b7f84e280d8ef73d617ad191175570656211211680af5d3af1916b8c3b74eb87d2660001b6143ad565b613d777fa9fce485d82159126ba460fccbeb5fe1d1bc03805210cc687e57a255b73b2add60001b6143ad565b613da37f6eca83d9083e75e2a3f7b8114af75f8eb6b8bf2d085643556ef15c64f15917fc60001b6143ad565b613dac8161836d565b50565b600080600080600080600080600080613dea7fc01bbac0be84aa1b4c0c25b6337e23c4de47459c73aefa21948938538902b61160001b6143ad565b613e167fb7dba9c95b85da3742679e5a15c844fdcec126e421b9bcc04dd5c3b6b883400b60001b6143ad565b613e427f5c949520df6e4d45be0a34078ee2b75af4f840f65a2bf029394ac650d583964760001b6143ad565b613e4a61df32565b600860008d8152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff166001811115613f4157fe5b6001811115613f4c57fe5b8152602001600a820160159054906101000a900460ff166002811115613f6e57fe5b6002811115613f7957fe5b8152602001600a820160169054906101000a900460ff166003811115613f9b57fe5b6003811115613fa657fe5b8152602001600a820160179054906101000a900460ff166004811115613fc857fe5b6004811115613fd357fe5b8152505090506140057f5641371c260632485a2c7951a3426b4c6a09489acdf2b75b5ba946bc273652a460001b6143ad565b6140317f21b357d9716b44f55edbadcf761d797b3ff4ae625af2d0036ebd00efe356313f60001b6143ad565b806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b60006140b57f2f044751597a5a8448dd0fec10b4a9ecf1cca91ec39a079f3c61189918a3c9f060001b6143ad565b6140e17f4d65a25251c4d8d187eb2dc7e740fba5892d2f0e718119819bc1fea1a96f520760001b6143ad565b61410d7ffd4ec04f3a327bdc8303ec93b58ba2293ee7c5d05d4f7bfa667a037eec01d37a60001b6143ad565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b61419f7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6141cb7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6141f77f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6142237f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166142c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6142f17f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61431d7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6143497fd72986c3c44c1d5ac88f2d9a620526767054d36ed01780fd7c5bd0abd034856660001b6146f2565b6143757f40f644c9aeac123922ec2c6c0c1e9c9d0674d611148b2dfa40b21d14dc9ef47a60001b6146f2565b6143a17f2af20acfe5b44ee8182e2b6cf4952a0c410c0f34bc2d107cd97898a913719ad360001b6146f2565b6143aa81618656565b50565b50565b6143dc7f9b67cb87edbf1b285a4456858f5ea43f9e90c6789ee561a38eec036e8c96a0e160001b6143ad565b6144087fa6f73ea1122a2d55f48cc65aab356fa301c628597d16685bda7145fdc83c755e60001b6143ad565b6144347fcad0c443ceabd51e9e352e7a9e23a1cb40f79b7e4ebf8ac36451e630661d1bf060001b6143ad565b61443e8282618cfb565b5050565b50565b60008060008060006144797fd80e4b0e704aaee7c2cd219cbaaee88c199983cfe317dd565857686bd95f29e360001b6143ad565b6144a57f6089b93f6e3be32640c6d4a4770dad763dcefc1aafb87a192de84fdd8e58731060001b6143ad565b6144d17f30c7ea5e12414c1160c3fe174172fe7df1c6c09cac2ebdb3b7acf1eac62d522e60001b6143ad565b6144d961df32565b60086000888152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff1660018111156145d057fe5b60018111156145db57fe5b8152602001600a820160159054906101000a900460ff1660028111156145fd57fe5b600281111561460857fe5b8152602001600a820160169054906101000a900460ff16600381111561462a57fe5b600381111561463557fe5b8152602001600a820160179054906101000a900460ff16600481111561465757fe5b600481111561466257fe5b8152505090506146947f6742e5a3c901e3f7ef457c846a4d3051aaf0a89b197c4df74ba31329f8e3dd7460001b6143ad565b6146c07f19db536cb0b2f2a9d64756c54dca130ce01b38d4288670ab3a84c4eaa2cb38e460001b6143ad565b806101400151816101600151826101800151836101a00151846101c00151955095509550955095505091939590929450565b50565b60006147237f577effea934a13eb763bd5030eabed77904faf301d881602f42a6ebcbc7a604e60001b6146f2565b61474f7fbb81baaea4c4b28bbc1d13dff27dbf9353fd16a0e3e36f65902214241e42cba160001b6146f2565b61477b7fe9518f1e53d0e620902d55c987d198a69cd18409929e43b6e296336ef0d6cd2b60001b6146f2565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6147fb7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6148277f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6148537f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b61487f7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16614921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61494d7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6149797f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6149a57f280f52310c9e33d58dd6e79b5c5912f6ca3c1a6010de72db583c6e062ac6ab1e60001b6143ad565b6149d17fe7d5b593d9ac6c31bc17718c4b09566aa6a5af305ad74a2caabab76be5277c9960001b6143ad565b6149fd7fc188440d869dff5854f9333235a3985cec8135ac8ca9318939e51297ac26cf6d60001b6143ad565b614a068161a604565b50565b614a357fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b614a617f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b614a8d7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b614ab97f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16614b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b614b877f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b614bb37f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b614bdf7fd7f3982298842262d0d3835371f6fcdc4721cf1cd25fca10020262f34be4575f60001b6143ad565b614c0b7fa4e3936f8772243a55f290a79ac7ed71d75f7591187eeb1847d6894e4b4490d660001b6143ad565b614c377f9dcd50b588f14a22d2a0b7c2fff5fa644b92b6aaeecccd0cc5758dc03d7cec3a60001b6143ad565b614c4586868686868661602d565b505050505050565b614c797f644bc30d71a91056913103fb286c5d6e6878e22b12367a33e25983338dcb38c860001b6143ad565b614ca57f2aad60e99f98d7f7f01fc23e07d033d9cc942df38e24a572840b7a0b6106275060001b6143ad565b614cd17f5fdd58e066d9996a13b91c1a64ac7eb4856857717dfd8a7f86dc4f178e25d98460001b6143ad565b614cd961a8ed565b565b6000614d097fa6c21053ff12ef2ea63fc3b7fceffb89314837d2895efacb436d990ee35a401f60001b6146f2565b614d357fdcd08d0c75c64b5d345be711b358e160e369fc901a89d7273809705290673d3b60001b6146f2565b614d617fcaa3ecc68ee1fee4e69069f97e1ae9751fa89bd0701e64f90f31339b236e31bc60001b6146f2565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b614de17f122ea7a04be238890d39ee4c39f677a9666b21467340f1e07775d72cb6a07bb060001b6143ad565b614e0d7ff100e2a0ec6c680fb31ea22c3a4d3629e3f3e6aed96113545d1ea6bb3e51ea6960001b6143ad565b614e397fb764663b6d601a47c295bb8a5c3b6b2d1daeccc53154317063356b7ff119d0fa60001b6143ad565b8060086000848152602001908152602001600020600a0160156101000a81548160ff02191690836002811115614e6b57fe5b0217905550614e9c7f38249e063d3fcbe5a090acd69e3a382cc22138be031696cba2ee8c2ba9952c5b60001b6143ad565b614ec87fc28fcabc3e7c13c11dd1172edbd0946cf5e2adf9af6e80a317bed0ecb3244f0260001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a48237838360405180838152602001826002811115614f1857fe5b60ff1681526020019250505060405180910390a25050565b614f5c7fed825f7b8c3c3e45d4dc2a5e87727343bacea9b0dc423bf3e4933bc55d4c37fd60001b6143ad565b614f887f957384c62aadad73377cc12f84f2ee8c89109c3e3b9a54c1ce0165ec0a6fd8d360001b6143ad565b614fb47f7205092310434b6fa9e4421b4bc973d467cd548a3892d32957db2355a0d1861960001b6143ad565b614fe07f1d48333a6d44118dba2f520bbc90b7e02f5ea59ac1880892ebac8d0bede1950860001b6143ad565b60008311615039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061e5376029913960400191505060405180910390fd5b6150657f6965ad8b98a3980648e61404cf417a35be7c22e98813e4ab90bba22d2ea0e88660001b6143ad565b6150917f20626e8269ed4379993d00982ad0c119605bb3fce32dc3d16b7764a05e491c9c60001b6143ad565b6150bd7f9c2a4d1fbc32ce38423e051cd0f7bbe7537e93e14c41ad89bff97eee1ca2d8c260001b6143ad565b6001808111156150c957fe5b8160018111156150d557fe5b1415615242576151077f9d9461bf08bf1860ec22910d1379c0eb90197d02012729d80948f236697023ce60001b6143ad565b6151337febaeaee198eecbc5805ed14a9b78445bce0ccb6a0e6a35531f22485f4fc6789c60001b6143ad565b61515f7f475276f08bca14e4c443497a6ffbfe9173163e863f6243a805a5f647c72ac9a260001b6143ad565b61518b7fdf51ae266c48f787523a341ff3998b7f0b0574e36ef3dd9d8c29a889b31b00fc60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415615211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061e3816032913960400191505060405180910390fd5b61523d7f913541607e5e91b55cb4f16c76f9709825a60bf8462d8157441f05c4ca683a7a60001b6143ad565b61526f565b61526e7fda7ec91a637265ac8ad552d49b46c26151ef524b53f3ff6142fa491b021475ea60001b6143ad565b5b61529b7f37ddc9d8edfb9dc8d127301bfaa8f8a7b92a2b2bf7ca3c91b3a2ff98b6f2576b60001b6143ad565b6152c77f5ff071b7ffb5f7b797d0727331ae2ac7fafb2a1d5a825dcefaccff8dbfe3b55760001b6143ad565b82600860008681526020019081526020016000206009018190555061530e7f820749fd9dfc5d609160a592b32465f604d5db316d7563f0fec45bd708ccbd6160001b6143ad565b61533a7fba1497d331880b69f12f955cf4ce7fc0789133a27d38f60a44466b15ae9bd86c60001b6143ad565b8160086000868152602001908152602001600020600a0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506153bb7f314c295ffccf2302820d9eb9445dec802a5236dd4bbb455979e07beaf34b02f260001b6143ad565b6153e77f34b4f7591745b98e34e0e3b956487264be036d70bd839ca7f338348e2304812760001b6143ad565b8060086000868152602001908152602001600020600a0160146101000a81548160ff0219169083600181111561541957fe5b021790555061544a7f671d523b8e46684621413dd52501073b7e8ce6f2d98e834aa3773ab9d09c787d60001b6143ad565b6154767f0da0b1dc0de98497f9b9e2bf8aa3dd60c8f0ed970bc5762ddc6d64bfdafd7e5060001b6143ad565b80600181111561548257fe5b3373ffffffffffffffffffffffffffffffffffffffff167f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7868686604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a350505050565b61553e7fecf230a40b2be638a67a3e016d54ca00407285c0b7f8a3ba088fa1db26cac54860001b6143ad565b61556a7f5418af54dea59d6595ce4cb67334ab548f2d9c5ded7361b9d0d52645a8847f0f60001b6143ad565b6155967f7ae85ccb8188cfddd17704600cb3a6f9b3c16d2ef9147611cbd5a567481aacd660001b6143ad565b6155c27f81d10b8cab60a2eb1a0fbe2e22b59ffacbdac6176edb45ea268f108c1693a5bc60001b6143ad565b6000811161561b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061e143603c913960400191505060405180910390fd5b6156477f09126acdc05e46c873e67eef6d04e822d425716cd48f9c404f42eb1f3d46510060001b6143ad565b6156737f4aeeacf647acd63f3619510bfe4618937a93c9ed97792af8f06ad0b42f6a228060001b6143ad565b61569f7f3e11dbac7f5898421cc76adf88343ef3e8cfe89aefe8947c11abb5a55feffc2560001b6143ad565b6156cb7f011ff70e219f3659e8233d7fd1a43d2aa313097d6bb53f3584df5d74c9bd73cf60001b6143ad565b8061570b6008600085815260200190815260200160002060090154600860008681526020019081526020016000206001015461b2f390919063ffffffff16565b1115615762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061e59a604c913960600191505060405180910390fd5b61578e7f95721c738e1ac2429459c3c29d52119c26359a27b9973efa3ff7930b2a49986f60001b6143ad565b6157ba7f8b90a97ee96e24819c66f2609d987c5644d2aeb79aca2c428846d0b4b3379edf60001b6143ad565b6157e67f4be3435a0df75f0492865b6be1ebceade299cef1c224f3d5ca03b0de4c5338b860001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561588757600080fd5b505afa15801561589b573d6000803e3d6000fd5b505050506040513d60208110156158b157600080fd5b810190808051906020019092919050505090506158f07f2fdfc0ab65d3e49424cb0ba1e5d7b87c617e2544d18897855394a0352cb0a24a60001b6143ad565b61591c7fa1cc7ddd437aaeb2d9ab7f1526fb9fb6cd85b09030d4027e7604bf44613020b060001b6143ad565b600061596060086000868152602001908152602001600020600201546159528561594461b60d565b61b73790919063ffffffff16565b61b94c90919063ffffffff16565b905061598e7f8d50cbf28544cf39cc844dd688cb3ee8a801da805bdce48122e54d0365bda69260001b6143ad565b6159ba7fbec77acf36c91924b383de6ad43efaa98b5ec2e149d1e7abe452423935f3727c60001b6143ad565b81811115615c80576159ee7f43098ae67737f822e3ff2097838dadbabfc78bf04daa19250c54455f4c80f14760001b6143ad565b615a1a7f5b70d4b1a6e3125d12424a3cd5e793eb5d5bfd589b11bd09103c665fbf1b042d60001b6143ad565b615a467f858832c8c82758b27429eb7c4b26243cf10f9e8bd4b3317916c95d99fecfbaef60001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330615a9b878761b94c90919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015615b3757600080fd5b505af1158015615b4b573d6000803e3d6000fd5b505050506040513d6020811015615b6157600080fd5b81019080805190602001909291905050509050615ba07f91fc860a964c6213fc4f1a4be3ddbadcf45adac66d00c53077a7e4d6fd6cd64b60001b6143ad565b615bcc7f765c30bf565f66100e936d9e8f622ee2526b54965d482d8781350987129bb54160001b6143ad565b615bf87fc925a81951de4e60ba28c6bc408df4c8e39e48977c8cd4cc7bd8eb96b451f37860001b6143ad565b80615c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061e4c3603e913960400191505060405180910390fd5b615c7a7f85399c177e2dfe42fface10a4b9dd887d91200128550500fd48f4973a0ec990e60001b6143ad565b50615f06565b615cac7f81305073e6fbc263fb363c8bcd9e5bd98e23bdca49670c06b371a126471719a360001b6143ad565b615cd87fc37098fe5e0736b102340771d005a9b0ed3e851c0fe6a6f0e39f2a38bbc35b4060001b6143ad565b615d047f3a16f78a716f60e999043b54b2f93aa83330e7bc6b1c890b623421e5a6177f2b60001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33615d58858761b94c90919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015615dc157600080fd5b505af1158015615dd5573d6000803e3d6000fd5b505050506040513d6020811015615deb57600080fd5b81019080805190602001909291905050509050615e2a7f5e09912529725adbcb8cfee6ef6b1bdee2a5bf2fc7941874ceb9a0d5bc47671860001b6143ad565b615e567f7f950e57126ffdd0aa5f3d2e56f6c84183444dd734931fd1e68111b3e959a04260001b6143ad565b615e827f877b92785ac8e374663c20b1c57e17ddf013325fb34add1aea55f4af57fa326b60001b6143ad565b80615ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061e2b86038913960400191505060405180910390fd5b615f047f64c9424e19f736d6ecac4c08e8794f56d05a8a1340d9a35aaa2d07d19426ff0c60001b6143ad565b505b615f327ffa6383d11c7791a723aebf4a83b3bb1b46dc513024fe1d74398efaedac8d1bf960001b6143ad565b615f5e7f6c929d80831ced67a0ead1e6cbbd82997c3a55794d0d5e93673c67435f024cb160001b6143ad565b826008600086815260200190815260200160002060020181905550615fa57f912fa0859998254482042fe8743a62f4eb07370c0ad2419a3eed850e0a9aecfb60001b6143ad565b615fd17f46e8938c5c0f15bf571ed91ad58dc77e96f76aa2c2d796352200428584e711ca60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca958585604051808381526020018281526020019250505060405180910390a250505050565b6160597f1b3353359c8de12e2f480c20a042fb6d8937d999189cc7b2f61e0a47bd7d857360001b6143ad565b6160857ff5db568c4ae8844d8e9362b8cc6d5e50a18b8d7a4481f4dcce12267f4be6d9ad60001b6143ad565b6160b17f3a7b5cb256681b80b220f767705e745ce69d13a4e7f0c04cd470ea34a65900ac60001b6143ad565b6160dd7f865ca80e7e548bc580e7ede6adc7ecf72d9a382873ec4a9c9f76dbf6943681b460001b6143ad565b83851115616136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061e28f6029913960400191505060405180910390fd5b6161627ff8f80fd3cefa7a7cc203254aee1419486d68368befc721db13b067d7442ff38f60001b6143ad565b61618e7f7f13d3d7a6608bd7ee12c1e71c074310d2bfc1cdbffddab2898d147e6a0a30ef60001b6143ad565b6161ba7fdba95786a11cbd4c989d9125ab10dcfa581cc921f71a064055a738c60f89f59460001b6143ad565b6161e67f1d79365cf401d3df0c1ecfee8eab687a0aa20b5effa0d1585742bbe7cab61c2a60001b6143ad565b612710821115616241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061e3116037913960400191505060405180910390fd5b61626d7f1282bf62a8d8b4afb769fab242d328d1202d75f4e4b37b6f7c2fd17ad47ffd5760001b6143ad565b6162997f33a32c6c91c3ac51f1d618d14226b8591b18861ce18bdee41369aa1b993d491560001b6143ad565b6162c57f7fcf6fb208806dc071efd4b33deeb209018fc175bae6797c179b4df934f3a74960001b6143ad565b84600860008881526020019081526020016000206007018190555061630c7f88d64ba1ad776fff48b5ebd0a4f2ad2efc4e4e43c79c49f81e1cfe47a82b0a5260001b6143ad565b6163387f54c14671f268dd2a3f41e308094782072daa25a9ddddd1dcfa4efeef86a9b14960001b6143ad565b83600860008881526020019081526020016000206008018190555061637f7fd568db0eb806b88be822ed5545aa2e0c57ddcbf50dd4f3c869d58de248b52b3a60001b6143ad565b6163ab7f43c7146c7c378a823a47d11f26549eb0ee98ab65168926039be111add8571f0e60001b6143ad565b8260086000888152602001908152602001600020600501819055506163f27f3b5c0ad8a3c0eff656e65aa62e911afb4f7f721979bd0386fb693bc4a75930b460001b6143ad565b61641e7f59edc21c65c13b50ebb7bd66d1efc067cba78144c9c67c772a7d7deb718c85de60001b6143ad565b8160086000888152602001908152602001600020600601819055506164657f077faa548dc765f5f5126d8189236fe72521d790ad6ca430b7631a36f0b02f4560001b6143ad565b6164917f53dc4f5d23e95949364e9f548a82cde38bdc8be788ba4b067df45b0cc8f1980760001b6143ad565b8060086000888152602001908152602001600020600a0160176101000a81548160ff021916908360048111156164c357fe5b02179055506164f47fc80fb2e0558d8bc614a52b814972c1c8d9512a48fe54d245e45147b425b1189660001b6143ad565b6165207f10cb77838e53a0c21258c3537289082b923aa705f94d8c3b32ea4914adb8791b60001b6143ad565b80600481111561652c57fe5b3373ffffffffffffffffffffffffffffffffffffffff167f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e38888888888604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a3505050505050565b6165ce7f5d08d12e6dd58531e82f3cd0441090cb975e67ebb0eb9360ec90e791e6955f5b60001b6143ad565b6165fa7fde9869e900a43dd34ea9c86000d6b8a8508fb2bdacdcff9904ab31c3ef4cb77e60001b6143ad565b6166267fd343801d572415df84fcad7e215541b4020f5fec0feacb5af1863171571966b360001b6143ad565b60008314158015616638575060008214155b801561665a57506002600381111561664c57fe5b81600381111561665857fe5b145b156167aa5761668b7f6bae2d03b455a7a9b10328c8b405745d1696c8444fa62695982191f8d16cbeba60001b6143ad565b6166b77f52a7817d5839a5e06041cb14e3cf71048eb6ae71ef01fe8fd74a9d4f72c5cbf360001b6143ad565b6166e37f03c4f103acca8588bba857f891e80364e6aa4a67c8f059dfdfff58fe09611fec60001b6143ad565b61670f7f70568dadfc090b2d0b5acbb650fa2b84f622ae2e374e265fa49fc2845ba09d3f60001b6143ad565b42616723838561b73790919063ffffffff16565b11616779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061e560603a913960400191505060405180910390fd5b6167a57f04a1dfcec1da39984189a74a8273fa1686b02fe776955d9d84e1bd58b701047060001b6143ad565b616aa8565b6167d67fa907e52c8d495c805089afc2a74e419dce3573d269d8f36e859ef273f5754b0160001b6143ad565b6168027f287a8c97a1c083f381274edb5a2da7edbcf5a6bdc676640ec7d3168a74d7cad060001b6143ad565b600083141580616813575060008214155b8015616834575060038081111561682657fe5b81600381111561683257fe5b145b15616a7a576168657f43dbeec0e23e52c489715a7499e1b6da79916f82520979fed4fd7cbca4d8d25a60001b6143ad565b6168917f61d08bd9a2cd49bc78012b5217d080fec17170bb38f5bda30b076ffdd4afcc9960001b6143ad565b6168bd7f45a7dda59938ef4cc0af25d4415c9454ebf8bc4eb5943af56401fd0b74acca6560001b6143ad565b6168e97f19899c754a2f9d2c54d71f8bc9e4c0f283456a24abe06ef0e2a5a0c78248427e60001b6143ad565b818310616941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b81526020018061e0a8603b913960400191505060405180910390fd5b61696d7f6a9487a8fd087760a80a890f016a406c68ba84fbe545f48ff691b844d7a06fcd60001b6143ad565b6169997ffa51f45e1a79e0271124be98b6b21239c0a493403876f7ba9d7ad07f2b8ec60260001b6143ad565b6169c57fdced9495e1cb7a042ce1b1debb1c80dbdddef2f5dd17f141e31b4088963710fe60001b6143ad565b6169f17f22f89d6a4cb17a8430462ec90917b43c6f1cabe39443e1006f938f40925a13fc60001b6143ad565b428211616a49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061e5016036913960400191505060405180910390fd5b616a757f3603a554f5a38eef1c480ae7465e68d7d9d92595dca7ad21a8460f4b7749f77c60001b6143ad565b616aa7565b616aa67f7769d73f20c312808c44bcf4c095bb33de44f37e126a68445ed9e6a9d1e0237760001b6143ad565b5b5b616ad47f181defdc185e813bc1cfee1da797ea7e51e9352b60a59eed6ce6b72ba4604bff60001b6143ad565b616b007ff0ca6a6619605c711367d043591fd86589f3949a7139d19bac086bc66d026bc460001b6143ad565b826008600086815260200190815260200160002060030181905550616b477f33b0a5ec2fe0e48eedd105050f1b54cb262d09a58e7a6dabdeb35f6d791a402060001b6143ad565b616b737f55f9b29385bb9d38f80f9e2743a72e413f4434f7ddc9af3a2f199183504018b460001b6143ad565b816008600086815260200190815260200160002060040181905550616bba7fc5060a6d532bd70c701784212380c5170718749ffb1d51f2548a74d7cdfa588460001b6143ad565b616be67f15698c1b3cb52400e2802364df0351e3d1aa7d292c1d8c62cf2c1f435617b52060001b6143ad565b8060086000868152602001908152602001600020600a0160166101000a81548160ff02191690836003811115616c1857fe5b0217905550616c497faabbc9d9ff60abcfa85df20e2069d7b0a924890b05b56fd1c2d5eb6e38097fbe60001b6143ad565b616c757fefefd74c076ed596d3469a4f07a18c069e3dfdd68c0284e3a902d7fc9829f6a360001b6143ad565b806003811115616c8157fe5b3373ffffffffffffffffffffffffffffffffffffffff167f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f58265086868660405180848152602001838152602001828152602001935050505060405180910390a350505050565b616d117fa20e9072ca5bccb0956d7b70673b62df0e8f854aaca548bf2a87333e81ccb22b60001b6143ad565b616d3d7fbaa046c6a8d17aa4b6f1810990f1054514bf088bb5bc1e81d5732bd6f6a235cb60001b6143ad565b616d697f88b63b099711ee3d3e1af10a3bba9f3d9301e0adb99126d0374b159a96921a5d60001b6143ad565b616d957f8320f66fb4260736c088321a124394194d69169e7af5e342b2a20f851eac7cdc60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415616e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e17f6033913960400191505060405180910390fd5b616e477f977978066d0e142e1696050762c76390e97fbd2e9b6ba1f423063ee89460851860001b6143ad565b616e737fa80e110af0c2c6fd0bbe09007ca8e400824f910616eebb194fbbc5a0e13af44d60001b6143ad565b616e9f7f387c72f65effbc0ff45f52c28451e2d253ad566da18c81fd819d90fc6a7f076260001b6143ad565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550616f347f438a8bbfeffe60243e14fbeda7e4da070c1fb87331572bfc9ff67707b881ab3d60001b6143ad565b616f607f43bf98f8bca5675df904cebf4ff4d8e6c5f93a3dc1a7769ea1e39878b37399f560001b6143ad565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f4836040518082815260200191505060405180910390a35050565b616ff57f700a658c4da4d353a417b77c970de433d453c8f2699839dae49ad56bc95247a360001b6146f2565b6170217f0442258b08cc70eb8e8ec53ae49bd385424a7b28fb72a01d5f07863cd8ef7bbb60001b6146f2565b61704d7f73beb8663fb3696cb086686c524e4708b28c4ea65f280dff39d4827e7ca4872d60001b6146f2565b6170797fe6766aa48ddfcd976772424bbfb446c43bd564638adb3eae442483ef3d47d2d860001b6146f2565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661711b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061e5e66026913960400191505060405180910390fd5b6171477fe3eeb77f132279c29353bda0a45a6b8069b3d81ae1d35ff6ce332bf4f2f1498c60001b6146f2565b6171737f826c811e8f0f23125d7835fae7fd9617b4c6646b1b180244448e1abc0a49cae760001b6146f2565b61719f7ff604418593dc16a35b826d8368fc2d80c0cbe277b3875ea2501693e6c787629e60001b6146f2565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506172237fdfd972c9e0ed23e7b9b39cc0eb70745f9edf91cea7d1f5ef8cbf934ab71a383360001b6146f2565b61724f7fb812f9acc0ad6954fb47c6f67e2ec9e576031902c70f7d19cf34ebd4c99a83b460001b6146f2565b6000808054905090506172847f4f3d52591d32856fceaa0875b19a1a6971c5907ca132a5d94cb043c091ae335b60001b6146f2565b6172b07f4248074121f47fe89626ab2bd1ddcdd17b3244ad291d57f5f2dc8d7bc0ffe37260001b6146f2565b60008090505b818110156174ff576172ea7fb1dcfab9fb921132d8f94a37743105cde00a71eac40f219501ac2186954f9d4560001b6146f2565b6173167fa7b3c5f14af4838df8ff89a66ce529ae4fe4e2b9b809d49ff43144b6f0b4329b60001b6146f2565b6000818154811061732357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156174c6576173ad7f5d85e0c498670283c294314ea52bb35d04f5b20382ead62f26a5637ba330e26560001b6146f2565b6173d97f1e61341ff4265c16c11520f2bcaa2c67455ac8a5a44789639a1f3953467185b560001b6146f2565b6174057f69cb5f1d8d86470f85ba42b186f442cf39602df325e0be82fd2638d49b8fcf9c60001b6146f2565b6000600183038154811061741557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000828154811061744d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506174c17fba71d897b1e65b8d75cc479d698f33254ca674ae100465305a4d3cd901887edf60001b6146f2565b6174ff565b6174f27f38f3b15268ac0d983bee23492eb7af2d86e2b2ac5f404db8797ba0870dfbb7a260001b6146f2565b80806001019150506172b6565b5061752c7f623fa6edfa9ede1ec69f5c6f0990a64e40c5a746c07a3dee242d3098a062bf6960001b6146f2565b6175587f29c2e5f8e4b3b2b601f7c3f6ad17144c78e76415ff9a7c26b5c5211d3e6528ec60001b6146f2565b600080548061756357fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556175c47f4c7711e3c15de7bc64756f0ad4342539a47405097c1b755ace49d174dd92c3e260001b6146f2565b6175f07f5ca3edf5634600b786f6eed93e841b0073d00b1d590ad098af78f5186c06fa7660001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367983604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b61769a7f0fba0ac44bebc1d19c1e2598d2143f4e40b91a1a479424b23cdc51a111f61a6260001b6146f2565b6176c67f5ac0587170cfc2ba6bca9c191a377f7088efdcd9232cc7a7b59fc66f09eed57d60001b6146f2565b6176f27fd54f82f5ebc658384e7f4f6b81e3425d2f6de6e397fc9febc0aab1c766fc2b1160001b6146f2565b61771e7f66b0600d033d88be9320a9667148c885b2d7b11a2276b7b191d0b7989194188660001b6146f2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156177c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e7341646d696e3a20496e76616c696420416464726573732e000081525060200191505060405180910390fd5b6177ed7f458dc0e526126de1c7a7d155bfd97e0e38ce74f4f30e24edbd3e337037df892060001b6146f2565b6178197f0ec391908240ca8cbf3d254c56a7a359eca3012f94f3eecd5cc663259fce8eab60001b6146f2565b6178457f52c66d7b17c6b65853f94500e1a91fd6b9c552cbbde0cfa175c5615cb3ef5ff760001b6146f2565b6178717f09fb6f28ec832827cf8fe8440c8432e239ca50ca47ceadfdea1d94df42d988bf60001b6146f2565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615617914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061e07e602a913960400191505060405180910390fd5b6179407f75beac7cc6466e3d793f5efc9a7ed5f6c7864caa408c6e40adc7cb53b1f61df160001b6146f2565b61796c7f1bee40b5901ac349124754918e7e26cbe2858df5ecb1e94400402e260b6eacea60001b6146f2565b6179987f410a93128c50bbb38e509b51ade3c351cda1871ea9459114a6e83965661089a760001b6146f2565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550617a1c7fbc537b56eb8ce420f84eb8f690214bb5de06021c78fed4ceb0d761a7e511757e60001b6146f2565b617a487f8163b1d3ff7133aebf587ffdcb3605813a526f23621691ead884c8cd67cfd1ad60001b6146f2565b60008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050617ada7f595f5761b1bd17a702d9ab83f65b7b6418be9c4566ab772c2b4058530a29151760001b6146f2565b617b067f329571cfb247df28874d5a0cf2727b30c25d584b478323281c9165c3293ca4ee60001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250565b617baf7f41b1c8dd8d5910327e36a8bb359ff178cb1ded39297acb346e950db929c576dd60001b6143ad565b617bdb7fc23662d16f17d6ecca993f94dd9551e348982183b566a73f7a40d619af6fdf1360001b6143ad565b617c077f879ec18b3d166ffa5960af417819dff7ee0d07413638c758e33ec0dccb3d930260001b6143ad565b617c337f44978c5c4629b2a7ab5043bebc39e8d85967adf244fe0b68b72e7a50635eff7d60001b6143ad565b80821115617c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603981526020018061e3486039913960400191505060405180910390fd5b617cb87faa08a2064548d9b97d5846eb088eceb4e1c090b8783ce22baba19f9da920386260001b6143ad565b617ce47f399eac91c298367f416eedc509a56bd2476a549a931edb555a81f8fe60cf557560001b6143ad565b617d107f9c36bf7fbee120301da8f080504949f5fea67c26c08e91aa980acffcec93315360001b6143ad565b816008600085815260200190815260200160002060000181905550617d577f8dc1ec87cb4139cd9cdc5d2b6e4be1d82cc50c63a0d4ef574b7e240e4606412760001b6143ad565b617d837f916d4403cb99a72d9a3762d9de0cdba327dba7a3921902662d86c2ad4130362060001b6143ad565b806008600085815260200190815260200160002060010181905550617dca7f8cd4bbf71b3526b04e357b05fcb732a62bbdcbc8e40448894cdfabf67621f7e060001b6143ad565b617df67f51022f8a36dd964c45e4d3a6492a638f7dfb12f1a0e3441b7cd6c3319f36862760001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c84848460405180848152602001838152602001828152602001935050505060405180910390a2505050565b617e857f0cda559503cba2917545521066a16a465405f3bbd1b9a568831628dd598bf73f60001b6146f2565b617eb17f6b222ddf38757b30ad5587a0535d9026e827452508a0d467684c66d3c1a6e1a760001b6146f2565b617edd7fb3aec005e80804c1f7f09812f4651fa1987bd48659bb0cec15eab29527043ed960001b6146f2565b617f097fe2143ab519096b44a68bcf2dfa76788884d93aba95b22f702333728f6047eb6f60001b6146f2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415617fac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e7341646d696e3a20496e76616c696420416464726573732e000081525060200191505060405180910390fd5b617fd87f0af5dc5d575f70ea5f62d1f6520cd98e700cf178485f32277cceadbd1e71e57160001b6146f2565b6180047fa295903c4a81047b622dc3979b142baeb453eb062d4af1e70c3b168d54ff4db460001b6146f2565b6180307f057aaa7ce8c5bb2593674b3c4e9a379586088e150b4e9328ea1f7230b5b575c360001b6146f2565b61805c7f19ab008ed7da7f2961714050ce173a4cbb5e258f90574a237eccac673b998b8b60001b6146f2565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156180ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e1b2602c913960400191505060405180910390fd5b61812b7f1eb2f8712484e5abd0a0092e69ce0a0fdbfa077b87ce2bed2e1e2d441795d8be60001b6146f2565b6181577f39376fae5bf4169c93cba7dd7d2db4ff9a588c360bad5ce5f74cb23f8f62d0b660001b6146f2565b6181827efbdfc6de6200e1a108d4723d0ca109493d1be7d9be54dc015b2fb1c3de109460001b6146f2565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506182067f8d877c7bc5a5dbc94317477967e48e0985065b67fab01a1e53c0ded7d800873b60001b6146f2565b6182327f303e14c184af88d06ec969b6d5b59bc876c93916a2567d399297edd11603cdea60001b6146f2565b60018190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506182c47fdee67bc05f6f2a2ade56b3cd51a23a19307ba012452f287806627fc0885e7fe660001b6146f2565b6182f07f97391ea682f435686bd9306ab387f34a2948a811c2b43c07d281efbfc35c85ed60001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250565b6183997f5e14273f5c91e0a425e5ff20d66fac314255425ea45439ee5a8393add92130bc60001b6143ad565b6183c57f48f46a01af4ce3a539166ff52f8d4401b418b4f8775fee2b2ae5c23a23719dd960001b6143ad565b6183f17f4fe4b9e48544e4e272516831ae8ddf0ab27b542463238f44eb8c0d71a0612e2b60001b6143ad565b61841d7f119db01a8b1080f48a3f7378f9ca67e2646897f170396476efa321693d4ff00560001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156184a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e0e3602c913960400191505060405180910390fd5b6184cf7f8fa921b0f7a0d3a8574cdeb502e15747d35f8b09998b794d530c052c4576836f60001b6143ad565b6184fb7f3d7f019fdf59c5a7bfb4c68e66b965313f01dad1d486d7ecc93d8ed59ea2462160001b6143ad565b6185277f0df6f2ff2bee7f68bcb81d874d46e0e6195f311deeeaa45c8af0cc1a6e61c00960001b6143ad565b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5060405160405180910390a46185e67f40dbcbc5a1d19ec229f1911b629cd90d135184611e4c9e3bb124567fc12c785760001b6143ad565b6186127fba04dfa1aac058af28bacc3d9d16235f5f6b951a31ed8287aff297eb13883da860001b6143ad565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6186827f2d2b17008c81c729a76e9b31f1d60af1e815996dcf2ed234a6f5817f40d52edf60001b6146f2565b6186ae7ff2935ae4ff1369b36a1c9f8bbbc07d39433b3a0fe3721f87f0fed6c1b1637b6660001b6146f2565b6186da7f1110a884fa927bc46ef946125d7a67d5467c8bad7f7ee2e2ba61a7098176705260001b6146f2565b6187067f8fc70272bce9244fe3660ca50a4662d8732531a39a60c46470dd2c5d9f48323b60001b6146f2565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166187a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e4706028913960400191505060405180910390fd5b6187d47f7521ea7e11981e10530712e844a34703b2c3b7c8eeeeb0931806d36889a547b660001b6146f2565b6188007f3b1c6f84d325922bb0bc5c0679dc3d0f32d479d5d5566538162a0fcf525e8e8260001b6146f2565b61882c7f7c050e1b8d81590aabc562aae5f958dd9c5687079ec3df0524a2d348ac819cdc60001b6146f2565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506188b07f134639f4262b32365893cb88bac2370c1c291e206b3ece0f4730e376462cfbd460001b6146f2565b6188dc7fa815fd6ced88aac874c0da0fa0b813c59c7aeb91751e67bd0f4423cda199b8d160001b6146f2565b600060018054905090506189127fa6913cd67d5f0d909416aee3f9cf2377e5c612ae34580c3177a5a770e408c22260001b6146f2565b61893e7fe943dc5f4e6a6cefcc2516b51415c1ead670c42e9493440627cd57477b67fb9360001b6146f2565b60008090505b81811015618b8c576189787fa6bc8e73465d3c28d34d39dfaeb150a7220b50bca4cb3d8a8f0d183c7ab8fdc560001b6146f2565b6189a47f47fd655f1c87712d6c2fcde17ba3980d7a61f61d50ebdb03ce8bf91aab23e4af60001b6146f2565b600181815481106189b157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415618b5357618a3b7f402f5cbf01c18812984ffdfdd5c6e7c94e407c478e6eaace4366cdf0c4265d4160001b6146f2565b618a677fd948e5cfc2af9f31c734b9c1c0b843eeff749be6afd8209e3e8438c5f564072660001b6146f2565b618a937f02c3308c524bb2acb655bb78998e62a581922af54056dd9491629eca52ec310e60001b6146f2565b600180830381548110618aa257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018281548110618ada57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550618b4e7f596f90392997038f3189a37b4d309212bd69538bd8410712475516f2451aebab60001b6146f2565b618b8c565b618b7f7f2673001b1f599afb4c3b709b761aa53d6a8c3b9e764ebdf31bd8c0f85078072460001b6146f2565b8080600101915050618944565b50618bb97f2ee0d065b1399cafa57e27594b8338d1a48e7bf3ccdea71ca9ad58d142ee85a360001b6146f2565b618be57f2f345d77625ed83c6efee45dad4557514fb8be7e15977ed2da588e5c0763744d60001b6146f2565b6001805480618bf057fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055618c517fecec104046e3f1916b39682fad4322ade6c412b59aaed7c2812d0a74b2115c5660001b6146f2565b618c7d7f1f9cab3bd3f01a3c928ca45ee19f88cc1f6a7aa38a7160be8c2acd2784476a1460001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed683604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b618d277f1258a28ec2752da0da5b922195692f92154f9af007061c0031dfae38f41042d460001b6143ad565b618d537fddeac64170ad0cfab7d37ad18ff38299b858230b1c1d6fcf2f5162165025f8f160001b6143ad565b618d7f7fc779b5ce7d4e7f68b735dbef130f39b7b18140a48b900af4608e8f33cc7fdab760001b6143ad565b618dab7fc401c8ebbf36b2904cf2aa800439e0006d933e6a0c6bc7ca0caa037e25f9e46a60001b6143ad565b618db48261ba1a565b618e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e000081525060200191505060405180910390fd5b618e527f29f0beb74a22943da13a889c0309ce9b7bcba9e0b859609cb709d3b7f48a612560001b6143ad565b618e7e7f5da3dd6d41bb3fa4553d2275da31ebfb28d2cb93fc8795a40fbc74b933afc4a260001b6143ad565b618eaa7f3b3a5721379bb182ea96103d2c22146d68f7c77ed0b1b39197e69d84a84ad6b160001b6143ad565b618eb261df32565b60086000848152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff166001811115618fa957fe5b6001811115618fb457fe5b8152602001600a820160159054906101000a900460ff166002811115618fd657fe5b6002811115618fe157fe5b8152602001600a820160169054906101000a900460ff16600381111561900357fe5b600381111561900e57fe5b8152602001600a820160179054906101000a900460ff16600481111561903057fe5b600481111561903b57fe5b81525050905061906d7f15737ba16ddbdaf5979fcda90e7bd0afd6c3d9e5c31633b1a2c14c7a5aa8ad5d60001b6143ad565b6190997f3f6caf161f7ed8380ad6cbf612075d07de3ec83c9aadfe08d65846fd0c3b303860001b6143ad565b600060028111156190a657fe5b81610180015160028111156190b757fe5b1415619192576190e97fd11f70b7df494c275c522313109d065894a77213e72b4c790ee9662a34b4492060001b6143ad565b6191157f82667fc40443f50677083ec8ea3822102a0855b04b9f4998f4969b76aa12ab8c60001b6143ad565b6191417f52cb36432d95f0bf1f875532fbafa21140eafd816b8fd434b76542d22cfb30f560001b6143ad565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e6466028913960400191505060405180910390fd5b6191be7fc3840ef3457c4fd7aca311ee3a2af97df56cae48002f1e4ea0092844f370846b60001b6143ad565b6191ea7f2ac1026d2ac6c5f93c27f427ca6d8de1bd5d9fc3be04ba59d23c01380eabd61e60001b6143ad565b6002808111156191f657fe5b816101800151600281111561920757fe5b14156193a1576192397f35ca1646c9d9b334a5bcfb8ffce7bbca02d12e14dbfb5e1cfeb69f06f410879b60001b6143ad565b6192657f3469385da5907e86f9649c10713f56bb94b9f4b51c39bfd0e9e599f3e619f6b460001b6143ad565b6192917f2354e318a94d00cd4efa5780954f2329c444d8d31a97fbc36ccf7c2887150fbd60001b6143ad565b6192bd7fcdf790e12d7bb8faadcfdb21ef2737b02fa9234f5dae5a12b4d1276a35708c6a60001b6143ad565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16619370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e2416028913960400191505060405180910390fd5b61939c7f69cb708d22dcd13a128b9b64bde4c4b5e385ea75ac5f187f931caa425971e77460001b6143ad565b6193ce565b6193cd7ff6ad38514dd03862364ac35fc06de1049dbdd7ac394780bf86732dfeabbe38d560001b6143ad565b5b6193fa7fedd422ab79c33b72062546e74c932928579dee65755eb022c09d3a6c8c736f8060001b6143ad565b6194267f3a179772423b910911a51b8c3244b938316058d70f0198d842876c5faf1a5b0660001b6143ad565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205490506194a77fae6d9864bd3217c36f5a35cff1d0dc35b89cec47100dc3104fd6b06d9f4246be60001b6143ad565b6194d37f87259a496a95529266f8ec006291a81718473d8a03fe89348004ad8bdb68fcc260001b6143ad565b6194ff7ffad4e2aac2db0affd87e8b5c6d525efa79c2a40803aab367e5e0b97825813da260001b6143ad565b8160200151811061955b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061e1de6031913960400191505060405180910390fd5b6195877fbf320ddede2786d819111ad52aa3356dc915413f4761bee74f5e044b0f2cbb7260001b6143ad565b6195b37f438fb6dc27845e10e217be78aa727ac3708c408bad0eee20cb71242068c5e7dc60001b6143ad565b6195df7f35a879d5c51a4691e775600ee0be7925c36ae8bed698285c680e2b947d695fdd60001b6143ad565b600061960d7f0a7df4e4eac2ffc32eec0d3649039ebd3e16bd42819ea94384a58addc970120060001b6143ad565b6196397fc46b65538395c0a40dcacdea0190842053f78072bf15628ffb7f55c5f833af6160001b6143ad565b6000600181111561964657fe5b836101600151600181111561965757fe5b14156196e9576196897f14332d445b62c44fb5b7bbb9ffd16168952e8000d39bdc6b3b0a719d52d3e59260001b6143ad565b6196b57fd1c788de06a3290f7d716e94e2697a347aae0c15cfc85ccbb0132751df57e6c360001b6143ad565b6196e17f28260e6d36c9d45b949b3e3680dae0db0c059432fb64191d1295c677027f23e560001b6143ad565b349050619c14565b6197157f02f74aa8364872739c5e859f2fe47061d952d965ecdb14b2fdd88cae3a3f8ed060001b6143ad565b6197417f18c9b05cebc9984e5ff788895ceff933a7fcf425b2fc51324686ffa357fdc30e60001b6143ad565b61976d7fe5fe355b75925c098a1a7a2d43219daa7dc998f19244a6b2a66b79959dc135b460001b6143ad565b6197997fbfa3469fd27f859021f4e9801e12b194f32082bd7e555218f3c648f514624b1960001b6143ad565b60008414156197f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061e4216023913960400191505060405180910390fd5b61981f7fb855a542a405cab7b781bfdcef99c439f86be5ffabc0e0f0eab43aeb676c1dbc60001b6143ad565b61984b7fdb6e6cc1b4d84a4d50611137baa461eadc963963cef9491c0f80ad45fe6b218260001b6143ad565b6198777f0eb26e92e7452c913728874ca9e2ee657b30f7cb71d07719586b00a4bdd4353f60001b6143ad565b6198a37fa879878c8ee82050fede45179d4ddb3d4f957a17453e0b13244910d7d21c5c9760001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff1683610140015173ffffffffffffffffffffffffffffffffffffffff16141561992e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e444602c913960400191505060405180910390fd5b61995a7f2e3dc7cce37d23feb1ac9722a7ffbb1ba457d0697b2c4409623652b90bd60ae660001b6143ad565b6199867ff7f4250817492223a9e3ae1c9a793b77986b35c6c1d35449bc864b444e6db26c60001b6143ad565b6199b27f5da45ea63a160dd06ba6a43e526b63aa786b1a6ff4800caa416c30a399ffac6c60001b6143ad565b600083610140015173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015619a7457600080fd5b505af1158015619a88573d6000803e3d6000fd5b505050506040513d6020811015619a9e57600080fd5b81019080805190602001909291905050509050619add7fdb3a48f1931805e6b76e814837db0a8060ea54950041474bb48ebcc1acd9a84b60001b6143ad565b619b097f715774f3e46f4846ba248e25cf89b1518fa20c4f8981e4f5bf25445ed7d5746460001b6143ad565b619b357f12b185d84750e06dadc28ca5afa26a01791cb68a10436a62d586a46f7f61087460001b6143ad565b80619b8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061e60c603a913960400191505060405180910390fd5b619bb77f4dea6bdf1555e9f9ff79432d61c11b733f40a193c889d33ff045614d03186e1360001b6143ad565b619be37f4af8fc6941598eb1ff7882852e49a5a50a8cd9f8b611aca905d859d25185f7cd60001b6143ad565b619c0f7f268d5c820b55f3ee2e01733de4a71d59f977ab9b51666e5cd66786183bc65b3760001b6143ad565b849150505b619c407f22fc79eb8c07045526084769af97e3fd12ce7e530414b7bdb9164cd37dead24660001b6143ad565b619c6c7f41ff2f4f5eb8b953587115ebe393897702323585340ad81482673ecc1646341c60001b6143ad565b6000619c9a7fbdcb60ef26bac120bd2a12589d35f652a81452fff0f088f524188d9e1749217360001b6143ad565b619cc67fe5fdd48b4d65b3d8ecf154886cda5936cde965c0d67aa82902895c315c8b811a60001b6143ad565b619cf27f94118ce43c1caa71cd400b60b4fbf222bab2e4d10a6a0b2bbd406e8527091dc860001b6143ad565b8360000151821015619d4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061e20f6032913960400191505060405180910390fd5b619d7b7f060959094a8435b0731bc6aacf7a2181a403678c56a23af36609844395e1657a60001b6143ad565b619da77fbc5eb22848b26ca8b383487d48b3f875b710d6a3a039676e5f4dc8c5a2e51e9560001b6143ad565b619dd37f245343befc94d5861f352fc505db1a41760bc4d5eeb3fa52c56ef19c5c9f6d7d60001b6143ad565b81619deb84866020015161b94c90919063ffffffff16565b11619f1557619e1c7fcb4835a354754a3aefb7a645b76b3c8bd9de549baead3d813031647c4309a0f760001b6143ad565b619e487fc1cad96269dacc8cc05d8deb9d4757af3d97ee65c4774ce5684a2d2ccd13812060001b6143ad565b619e747f43e12f4fbe464a6989660a3769978a442d6f7401e9bfbf3d027b1f570928d43060001b6143ad565b619e9d8460200151619e8f858561b73790919063ffffffff16565b61b94c90919063ffffffff16565b9050619ecb7fa3a10396e3827dd8312c751f436a7d3b85d92d8efc27da40eed10d541369f67460001b6143ad565b619ef77fa17eeab935b0d2d26f5dc67cd3c51c44ec599998c1fd6b67701a875be0a0b2bd60001b6143ad565b619f0e83856020015161b94c90919063ffffffff16565b9150619f42565b619f417fb14125e75dc7e4bac8c8de914081aa5df53f65d7a89b96d386f4318b0859e7cf60001b6143ad565b5b619f6e7f0213bb603a5d2df16016de8956610f8d8cc84636937297faf34422b5738cbcb860001b6143ad565b619f9a7f8174c7a27ae29d870a99a2ec0392f2118d60c96259df3457c05db358c0c3a88060001b6143ad565b6000619fb48561012001518461b2f390919063ffffffff16565b9050619fe27fb89290c05bbfeb36574611a6d71c190d7aaaef99becb7ad25e43cdb75b2e0a5560001b6143ad565b61a00e7f031b1ac2c2858eb8088e177b84c3acce229050e18f5bda27fb7104282d348b8060001b6143ad565b61a02581866040015161b94c90919063ffffffff16565b85604001818152505061a05a7f91da45c4841333e728e3c00acf7cd3f489ab80dababd72a7e1509d4c6b191ef160001b6143ad565b61a0867f28740585bd2ea60e0382082f2fa7d973034fd70b770cfe93b5162a7a45765d6760001b6143ad565b61a0e981600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000205461b73790919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000208190555061a1697fec2f3253ba1e944ec9c28171fade64664209f5748718535925f66cd33fa2e27e60001b6143ad565b61a1957fe4dd45286e94de0fdd22deaca4af48374806881f99c81b9e3b84dd4bf77ba46c60001b6143ad565b61a19f878261c3ed565b61a1cb7f034592d0b9623a55e32c47ee9dfc560a536d0a3a7bce93b8610441f9c31f7ac760001b6143ad565b61a1f77fde423aac9e758f41f80ed74e6ade2674e350c4ea50322763492937bd4ffc044f60001b6143ad565b61a2008761cf52565b61a22c7f8640db2afcaf537ecffa727847ad75bd703d4852d25b1c7af5be0b0c5e31a29660001b6143ad565b61a2587ff8290a9d6a058bc7a6c13f5c147c8b949a58ad770b333aa3a4d79b13d2a6cc3160001b6143ad565b61a2648784868461d72d565b61a2907f143914d68f5fc7c320d157e36b3554cdc8c5e177532eef24eb6e602e69b9dc9c60001b6143ad565b61a2bc7f8143e64078e3a57a9b83fb5a248209688ffb9d0b4ea807fdcd32a2c9ce74c99b60001b6143ad565b600082111561a5205761a2f17f1737d0e182b71646dca77932cb19ba5935c7ab24b49798d9fc2dc561a8a7180c60001b6143ad565b61a31d7f2ff0fa203b13a8a0753e0c4a98955d9e3bfd0d0718d1e76ea2afda3185fb067d60001b6143ad565b61a3497f3a76b33099114723596b34f4808854bf0d31c403c90e9215d73e9af7211281ac60001b6143ad565b600085610140015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561a3d757600080fd5b505af115801561a3eb573d6000803e3d6000fd5b505050506040513d602081101561a40157600080fd5b8101908080519060200190929190505050905061a4407f7a45cece3f1a5b9eb94ed8d55a4ac1032c771c3ed7763440dffd58a07f47e8b460001b6143ad565b61a46c7f84da53a161eb34959bee64ef2d056ada10d1417da934a724d01acd431cfcb3b060001b6143ad565b61a4987f82e77a5fb53cfad710080846366998b48370af6e15b1b0342f28c2278b76ce7260001b6143ad565b8061a4ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603981526020018061e3e86039913960400191505060405180910390fd5b61a51a7f5a89ad8ab5452a75c918bf5e84f60666d4067aaf8ab5d74028d20672d1e29f1960001b6143ad565b5061a54d565b61a54c7f33d0fd640530abb15087447dc7bced848fe1259c47d0817f8ad1e7506f1b975960001b6143ad565b5b61a5797f43eb29afcdcef52f4105ce66d594152fbf8cf9a345f38166f980511e40b2645b60001b6143ad565b61a5a57fc55b5598b3cddbcb5a546dc90cd117aded4d1bd7a665069ee4f92e8fea63abff60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba08883604051808381526020018281526020019250505060405180910390a250505050505050565b61a6307fcd966935353bda444816eec693f810b1bcd54d4d073398cf308bf2fbe3b263e360001b6143ad565b61a65c7f0b74fe531ffaab939a53b7189096ede82dbb739ff99eb19a85bc9e815a4bf99460001b6143ad565b61a6887fa87e72442e527d7532bf613592e6383a135437fed068fc3d9fef77090a63ee9760001b6143ad565b61a6b47f8a8f02a5a4fef27b28cf23e0bd5c5283abcc790a81549bee87f7096940de35b060001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561a73a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061e04e6030913960400191505060405180910390fd5b61a7667f4abb75ba6e20ad9a8eaad46ec10eabfbf8b8185420bd7c2ceedecee8764e84b360001b6143ad565b61a7927ff904c5fd956edcd18ded43fadb89d3e5311a88bc1fdc4242774ab45fa666462b60001b6143ad565b61a7be7f63e0f6b55c5a25766a8ee5960e284924cd6cb69f392d660b7c2e69454731fe5f60001b6143ad565b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce160405160405180910390a461a87d7fa89b56f9cbff042ddbd40975d849a6c306c28b9c7a9f59679a46cffebfa481c360001b6143ad565b61a8a97f8baa7b1fdb6eb7b3f361bbf4c808c060c7478ebdbeacb7009b0093519eef4e5360001b6143ad565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61a9197f5dba51d03ea8e4fa7fcf50453a95d2d0be10d32a3fb8e98eb04a03a8c924dc0b60001b6143ad565b61a9457f256e203c5516bed84ff857fae390e709522aed56b5cf4fb0b8b1aa605787009c60001b6143ad565b61a9717f9dd2ce83121fc9a27c44702515c7e5bad4f1b0fc189aef59bd8db773f23fcd2660001b6143ad565b61a99d7fcb7235a5ded29d8c765b01592980bc36ab36482f6fb9a6d64ccdbf6154c9515c60001b6143ad565b61a9a6336146f5565b8061a9fe57503373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61aa53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603581526020018061e3b36035913960400191505060405180910390fd5b61aa7f7f9462da58c4b4f9c2fefd8ef2f7c3a4909f4f2533a97706783988aa71bc49918e60001b6143ad565b61aaab7f764d97a34b52dc1cf73063621efe7ec2d1c55ef109c70bbe0a50b56d1b89fcbc60001b6143ad565b61aad77fb37b9345fd1da1ede1d452a366df2b72de7d60ce79d6e6d5991ad6814b5f0c3460001b6143ad565b600033905061ab087f07ff9d09acb29e01f82a65be19be798992a7e4fafb16b900a9bcf9ca77ac3f5a60001b6143ad565b61ab347f988e3c68c7acd53b40e77dd1ea4241338cd10182889550fdd80e29696f860bbf60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461ac385761abb67f54780788f9bf8584d54bf4cc4943ba8bc83ac804011e89520b6005be9177230f60001b6143ad565b61abe27fc5ed745f2e70dd07837a392031fde8061823885b1b011e514c52439e76b9af8560001b6143ad565b61ac0e7f5f9a3bd40716d7d9e7574395891f7f0aa323c6e4bd5273dbc66d5ba7879b64e960001b6143ad565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061ac65565b61ac647fa4d6b933fdd56f426de28e539a047494a257eef4f7dbaf320da04f3e054de5a960001b6143ad565b5b61ac917ff04c20c949e6b72c0681623026083ad51672b7d73cdaf61c3802dc3d142b33e460001b6143ad565b61acbd7f6ce14dfe14fe605ba57ca5162006ee712d87bc3428fa047328131ce4c95e237460001b6143ad565b6000600190505b600454811161b2ef5761acf97f53bee2e90458706d235e231a96c5b79963ea992231858c035a0de1541745fc7560001b6143ad565b61ad257fcc9e461887b8ef6bb19351d4694ae99d8113429af1662c5ee29171cf4a9c38c260001b6143ad565b600c600082815260200190815260200160002060009054906101000a900460ff161561b2b55761ad777fa100bfa14d290e8c70ebe5cbdf9ef24dfb02756548d260e9b50d8ecf964f0cb460001b6143ad565b61ada37f1b202c8dae0740c20a2ff89c1968d1637a7ab161c581b7a08e7f0711ba57c66560001b6143ad565b61adcf7f9ed0b892a0766e12e16b26d2363ae060b1b211302a9031481f6b889c68cb2cc760001b6143ad565b600061ae0d6008600084815260200190815260200160002060090154600b60008581526020019081526020016000205461d9c190919063ffffffff16565b905061ae3b7f4bcbecea127467b89a4a8dda4664bc821f8bacbeaa0ab35a76ade67f2ae1eb3c60001b6143ad565b61ae677ffabf93cdb41ad7545395829064c555d40a030b1472b4f3ae285035f2e60bc1df60001b6143ad565b6000600181111561ae7457fe5b60086000848152602001908152602001600020600a0160149054906101000a900460ff16600181111561aea357fe5b141561b0555761aed57f3aff474ad01699d604d96308d7b9d46bc34cfeb1ee9b00283139d53f41f6bf2f60001b6143ad565b61af017fe347bbb2c2c2f2b613338725c02b85846a5984878a308afbcde227470dba130b60001b6143ad565b61af2d7f7bc1d58153fe8fefbe3fb33440a1f638f9314904835fb95b41348628b942c23a60001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561af73573d6000803e3d6000fd5b5061afa07f42bcb0901f7bd1072a3a83ef19776668acd8109066a530bf2a3e38906ae5066360001b6143ad565b61afcc7f33cab331a764e35fc37ff2c2cdf63a57170dfe29a679ae421ba932d29d3fb47460001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c846000856040518084815260200183600181111561b03557fe5b60ff168152602001828152602001935050505060405180910390a361b2af565b61b0817fda7bd1ac43e85971a4b38d5c812fd5315e71e18533fcfcbab9b10ea11e84b13260001b6143ad565b61b0ad7f01bcca6890dfae3a0d9483b2efb1e73c2ed75fddb2055013fc255921fcffd0af60001b6143ad565b61b0d97f1a9ddb01a03292ce9c72f562c4d9a2dcba1a7baa5bd2021078a57342416e71a760001b6143ad565b60086000838152602001908152602001600020600a0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561b19657600080fd5b505af115801561b1aa573d6000803e3d6000fd5b505050506040513d602081101561b1c057600080fd5b81019080805190602001909291905050505061b1fe7fd31bfc3837838ab3e8e5e344901b69827ee0a1b43710efeb2eb6e48bb2bf377360001b6143ad565b61b22a7f0e313dc839520594387bfc146ea64cf13546e043ce6cca7dbf207acc326f335e60001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c846001856040518084815260200183600181111561b29357fe5b60ff168152602001828152602001935050505060405180910390a35b5061b2e2565b61b2e17f1044dc8eca2327d29135df74b3a1c5a71ea389acec3722b97c86e029cd3cb01360001b6143ad565b5b808060010191505061acc4565b5050565b600061b3217f44698d1e9a904ed1284ff1ffbc3dd61250c83d2c71afd5df19fbf19c6190a1c260001b61da8f565b61b34d7fa3a4b98cb2a23eda9dbb54b77b676d94ca9d1d4bafcc15caee09e68074b0ef8d60001b61da8f565b61b3797f3c0e96b55c01aeef942723329b7f27779568810ddd00a05282ffd2e3b5d233d760001b61da8f565b600083141561b40f5761b3ae7ff802f4a238c6bfb87737692d90643ed6d1e91071b816804127f57dca78bfaab660001b61da8f565b61b3da7f9c7552f9a426f225c2850fa12a0dc5fb398b1adc4885e41fd5a32fae1dbf05d760001b61da8f565b61b4067f88253dfa1829ebe573c7def7f8d624e362791a1e5da86330776d1836a357555360001b61da8f565b6000905061b607565b61b43a7ec5af928e6c63fb10ff91a6c5a4e910c4f39f595f742d8e52dc11b03ad6250f60001b61da8f565b61b4667f5e551b5129d493f012d238e272eb615eaa6959509de842125d5c3b203db4ec2660001b61da8f565b61b4927f6eeef49995c967235a764d0bfc2ddf3ad4e6890ca3a3e7024c52da8393db1ce160001b61da8f565b6000828402905061b4c57fab80a6313ea3c5926e33d7cfa6c464eb729cc09a2e212bce50dc9d97fae0ed7260001b61da8f565b61b4f17fcf8cc8694fe56eef0897d8bf5580925daf8927e537ada7fb46a3727fe18d423260001b61da8f565b61b51d7ff5b30a17ff5e5b532b98d8059efeb460d05236f98b90e61b8794894cfad8502d60001b61da8f565b8284828161b52757fe5b041461b57e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061e2f06021913960400191505060405180910390fd5b61b5aa7f9fdef838f8fa27d2dbdb6cfecf3f275aa85c5ae07d712150d6e17c19c215bfd560001b61da8f565b61b5d67fe9975f5879861c66ca2a2d35617f5a37951b7cf797008080c2db7371f45b3b1460001b61da8f565b61b6027f1040ca89b272f25ce391ff02203288f6f7b9bee30a94da64205ca6d937da6b3460001b61da8f565b809150505b92915050565b600061b63b7fa4b53dcce60c93e2c60fa6b35fc2caf97736f23642ea2c793c86b5d9cefcd35860001b6143ad565b61b6677f44ec31de0477863a6a67fb31990250562be4f59a3de73987c9b17df05712c84760001b6143ad565b61b6937f4ba13b49aac54e2bb0a57da2ad46f0e1c87f0187ebfe5380cfad544e45408a2960001b6143ad565b6000600190505b600454811161b7335761b6cf7f012e5bf791c6ab6bcd46b6def5c735bf330edcd8b5d954d843712c31d88f54a860001b6143ad565b61b6fb7f488aedc98a520bd06ef1e1f00a48c0beaf7cfb84d17cf76a58f0472a0e87535460001b6143ad565b61b72460086000838152602001908152602001600020600201548361b73790919063ffffffff16565b9150808060010191505061b69a565b5090565b600061b7657fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b61da8f565b61b7917fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b61da8f565b61b7bd7fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b61da8f565b6000828401905061b7f07fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b61da8f565b61b81c7fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b61da8f565b61b8487fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b61da8f565b8381101561b8be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b61b8ea7f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b61da8f565b61b9167f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b61da8f565b61b9427fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b61da8f565b8091505092915050565b600061b97a7f692a0cfdea6cb12cdfcaa599c058fa5662531cebd540556a6d1c27ae01b4cea360001b61da8f565b61b9a67f2cce8d8afd666e4919d1ece0b47a35eda094c843996926984c8b17a0d5cd2f7160001b61da8f565b61b9d27f936781d4063de1913a3eda99a7c2145fe8a9c61ba2abe4fa4e7dd270bf8b933960001b61da8f565b61ba1283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061da92565b905092915050565b600061ba487f91e9553b8f91db975c749d5c94abbce1e296644e5342b3f6db822e21c132911d60001b6143ad565b61ba747f2b0e88aaa0157cb7c3170221a6f349f6c3fcc28be6325238a0caeff455bfecc860001b6143ad565b61baa07f1d7d2b6b4d5f5d125a5de72a1a2749ffb2cc381a603a980b27bf0cd3f8942e2f60001b6143ad565b61bacc7f42f0e56580982a6b9555e748d4a68e977f7ca06549add8b930c033de27969dc660001b6143ad565b60006008600084815260200190815260200160002060030154141561bb3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061e2696026913960400191505060405180910390fd5b61bb687f05c1468418341081ac7af113c7504e8a76d43f3f721fffdba85f56bd3a3fd44860001b6143ad565b61bb947fc5666b5dd4c45e66a17e768e0d794b9c8e8301e98fd8b84da8112d5fa58867da60001b6143ad565b61bbc07f81a4305675c0b8c084beeb0305b97d9991983301d80bc035b0011f8f2e379bfb60001b6143ad565b61bbec7fbdce033008dfa407030bb5743bf2d2b929c1bf01137a44eb27b043b471b374cf60001b6143ad565b600c600083815260200190815260200160002060009054906101000a900460ff161561bc80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4f726967696e73426173653a2053616c6520656e6465642e000000000000000081525060200191505060405180910390fd5b61bcac7f653a3ae263eaf8831f43619f01c20299737aa4d8f81cda08ccf8b9db7440c63460001b6143ad565b61bcd87f60489549f00dabf3d8324064990191794c79718e9053e38ab4b836b51fd5e46260001b6143ad565b61bd047f381a648954f161b51106d4756e1291f86490cea3294456d842807618ef7a6cad60001b6143ad565b6000600381111561bd1157fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561bd4057fe5b141561bdd35761bd727f826ea340f58bb5144a38b450ef6a727af6ac000785087f32e40388aa0d28bc0060001b6143ad565b61bd9e7fe82ce36dc34b7add076f895646759c91899df7907fb34448e5e235136e3aef0f60001b6143ad565b61bdca7ff0c51105c5ae5ed1776e253721e6e6f6e31dbaded74414dea4624c571a6bde0860001b6143ad565b6000905061c3e8565b61bdff7f101852a9113711b402240923b0d1e629ae7d7ca5becbb76d66a05b64cc60980860001b6143ad565b61be2b7fe590d18255fe7891cffc828b79baeb6523a8568fd69b61e086a6f0fcbc243dfc60001b6143ad565b6001600381111561be3857fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561be6757fe5b14801561be8a575060006008600084815260200190815260200160002060020154145b1561bfa05761bebb7fbb458ef8a39e3e067daebcb5d53d3fb5c54e8616f13b9f0ddabd3e74845ff6d760001b6143ad565b61bee77ff4ed907481f89ff0c1bc33110ba6502e011bd9385bbef7dca729ef2e1cdc561a60001b6143ad565b61bf137ffc0bd6854809a04915e21229932f4d6892de984da37d8e1517e037b93ef734fe60001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061bf6b7f254a8656b5fcf06b0083312b35c2328e28b344405392342d659d4602c150e85560001b6143ad565b61bf977faa9b6b98fd178e750fd3baad7d056b4bffc4ef09a87fb998236bbaf1b9fb35cb60001b6143ad565b6000905061c3e8565b61bfcc7fd68bec896d7bd84e20354a179d9a4ddc80288c801366b87ce9f21b6da33f71f560001b6143ad565b61bff87f9652e4144468065a760c5139b65fc3a9a9e73e4dca62146ddc7134b9b8a759d060001b6143ad565b60038081111561c00457fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561c03357fe5b14801561c0555750426008600084815260200190815260200160002060040154105b1561c16b5761c0867f5bd9787c3c7e9cc75eb59e9dffbf4bee43e3821e4d31038dbd7d10c58feb689360001b6143ad565b61c0b27fa37d83cc6b868a73454d58877d9ac7dda9eefbe6334346696914e9232bb1745360001b6143ad565b61c0de7f8158d57ef96ba67047c30800db4577dfe0ca4104153b7eb1d2fc218ff883236460001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061c1367f9c5c553679000555d9cf4875be4fc3479b69a32c9a03bd9c66e8a3341a31089260001b6143ad565b61c1627ff8976ff97af1198bada7dd45ed38eab3545a835a672714f9b76d56ff8b6cd8e360001b6143ad565b6000905061c3e8565b61c1977f0301057208a5a94ac013849972790f73743de9034b62f377fe9f5c237e9d66e960001b6143ad565b61c1c37f9590711820a2098d2a92e95d5f7212b561679efdc9c4db663cb9bdb355249b3560001b6143ad565b6002600381111561c1d057fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561c1ff57fe5b14801561c24957504261c2476008600085815260200190815260200160002060040154600860008681526020019081526020016000206003015461b73790919063ffffffff16565b105b1561c35f5761c27a7feefd72a8f312758bc56ea318d6313df2c3ce2363d6554f604f72a1900b38440d60001b6143ad565b61c2a67f5dd6f7d37fb6b95e7a85674a2788b3aac501bb21ead7dad51bbfe508b19b47bb60001b6143ad565b61c2d27fa9d499257f48a23cb752e3464ba0e74cf95379dacb39e2c44001f700cceb512560001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061c32a7f06e6f52020f1acba7fa1f013fb60c488b63064153300fd0970afa15aa44e12ba60001b6143ad565b61c3567fad082986a549b72bb2ef917d00601e76577fd7381a00a89b3a9c5fc65681f1c660001b6143ad565b6000905061c3e8565b61c38b7f20641234ff965e95be45927e2d84e19418ef9e5028b6410f9913bede8882bbff60001b6143ad565b61c3b77f18fdd12d7afd7d16cb2175687f3cf4e83bf565af96ba931b780cafc804c964b960001b6143ad565b61c3e37f35102aa52645102ead5ee786c00236873bc202acc71a26ad08b7cf01985d5ae560001b6143ad565b600190505b919050565b61c4197ff9fc9ac43adb81975cb7ac1a0522b5a6e3b89bc5266550411e6aa9bc3086e27760001b6143ad565b61c4457ff2b20dcbb930dc8499f5be0056f5d8a86d9471b468b1182d64d7a71c0091c22a60001b6143ad565b61c4717f19e92a1895816eb2ff4889583b6b387302e2956541120ceb6338e149ec62e7f560001b6143ad565b61c47961df32565b60086000848152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff16600181111561c57057fe5b600181111561c57b57fe5b8152602001600a820160159054906101000a900460ff16600281111561c59d57fe5b600281111561c5a857fe5b8152602001600a820160169054906101000a900460ff16600381111561c5ca57fe5b600381111561c5d557fe5b8152602001600a820160179054906101000a900460ff16600481111561c5f757fe5b600481111561c60257fe5b81525050905061c6347f3b054abf37860a2714d0a9ad1b783fcd0e6fa94498355b7754c156895bb146ce60001b6143ad565b61c6607fb9926ce079f4125ae597e1f719cab9c393336bf1750e2b071ac199d4debd923760001b6143ad565b61c68c7fcddfccff0f8bf32503b213e9063756621cb8fdd325eda0caccd4d497f74eed8060001b6143ad565b6000600481111561c69957fe5b816101c00151600481111561c6aa57fe5b141561c701576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061e498602b913960400191505060405180910390fd5b61c72d7f4416945b53319e4ec9deb47af2e8fd52893733890f4c86c3681566b771f5b9b960001b6143ad565b61c7597fc52ba53c69ee645c69c2585d01f189150442bdb44c254d65df22aa68034332b260001b6143ad565b61c7857f0253630e1c054ff74ded9a339dbd79e70ff306a663f3338ba5f46834a9db5df960001b6143ad565b6001600481111561c79257fe5b816101c00151600481111561c7a357fe5b141561c8fa5761c7d57f3646fd7f09fd85b09a73c6c602668804954450315ab76a6390e37f6c20db361360001b6143ad565b61c8017f8f62bd1130d507a580f5087fce789459ec9fc6521daa2a25afb672feae556e3c60001b6143ad565b61c82d7f11c02fd97e6999549fec07fd06f0149b10f5a46178cdaf5f01568690f7ac7ed960001b6143ad565b80610140015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561c8b957600080fd5b505af115801561c8cd573d6000803e3d6000fd5b505050506040513d602081101561c8e357600080fd5b81019080805190602001909291905050505061cf4d565b61c9267f83fa75b60aa16ae1534b5f2fd98463374e1d6cce3f80626b98e69819250be0f960001b6143ad565b61c9527f536f130e6c202974e8b57bcbfaff295ec0d3a76da482c0116a104957fe491aa460001b6143ad565b6002600481111561c95f57fe5b816101c00151600481111561c97057fe5b141561ca685761c9a27f3f32af1864c7fca16884088dd7358f997f88a1dd36e82b3002006e98d16a4bd860001b6143ad565b61c9ce7f37d067185cf0ed8d38419803410f1716088ceb2af32ec97fdf4e2d331149b92960001b6143ad565b61c9fa7f311e27a538d4f9b27d119434d744ab7ca0157cf414ff70f500cf1c0382b6acb060001b6143ad565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f7420696d706c656d656e746564207965742e00000000000000000000000081525060200191505060405180910390fd5b61ca947f831edd8210081558c15f72013015cf79e66f53d988b1b4ce035db416a390af4960001b6143ad565b61cac07f69ab85ec1959dae9399396c29c979dc439babcd144afb503f45f7df1715d8d6560001b6143ad565b6003600481111561cacd57fe5b816101c00151600481111561cade57fe5b141561cdb25761cb107f89e3055aa3d91f79a08f927d0783eaec5f061d5d18142239b36fc869cecce8d160001b6143ad565b61cb3c7f8648e6d12fba90b4a76b0937cd0bd474d9bc3629ffb893cd4dfc16efc6fcf0ca60001b6143ad565b61cb687fc5900c41f695300e3626c31031248b7a646c5771ea4758814d32cd34f76175ee60001b6143ad565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561cc3357600080fd5b505af115801561cc47573d6000803e3d6000fd5b505050506040513d602081101561cc5d57600080fd5b81019080805190602001909291905050505061cc9b7f5453e20c79af3f5ab1b0bfb522abccf809e6639a18ecfa1ba10d11966d76dce160001b6143ad565b61ccc77f7ad0f6dfc11c66b408b60669b07af67ea76aca820ad0c3b5e055132cbc1ec49a60001b6143ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663849a681733848460e001518561010001518660c001516040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200182815260200195505050505050600060405180830381600087803b15801561cd9557600080fd5b505af115801561cda9573d6000803e3d6000fd5b5050505061cf4c565b61cdde7ffefa5cec4fa9064e36404a692aad2a4db3f00a8438648b79ac58c8efda8e9a6f60001b6143ad565b61ce0a7fca3dc0d5614ae19551e6f058c959c337c5c22c82754df388da3734d2a0a4ab7f60001b6143ad565b60048081111561ce1657fe5b816101c00151600481111561ce2757fe5b141561cf1f5761ce597f60f55a1f103c9a1119f2497ee621a398ee03b5d78d344f124836bbcf3c1df60860001b6143ad565b61ce857f3e656205ddf82be935d887b89005da8de1b8f0e9fb6eafd4f983417c1b4f3f1160001b6143ad565b61ceb17fcc79ab918c227816062423fa2b69e1d6e910682193d3fad9f566c9765af7345760001b6143ad565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f7420696d706c656d656e746564207965742e00000000000000000000000081525060200191505060405180910390fd5b61cf4b7f06dbd710029f7ef5b7e4d709a390227aa1309e1157bd871634c025f139dec06060001b6143ad565b5b5b505050565b61cf7e7faf3334b7c8f6d3571478be0fc8dedeb7d18379480990f62375c3e54d4e07291060001b6143ad565b61cfaa7fbce63d97d8517956c409d8ba2f4af181e55e9272dd33c2559555d7561886a81c60001b6143ad565b61cfd67f5573ca7618e5e970e32cfff13dc92fae4d07074f0a60674bd0323856b82dc4a860001b6143ad565b61cfde61df32565b60086000838152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff16600181111561d0d557fe5b600181111561d0e057fe5b8152602001600a820160159054906101000a900460ff16600281111561d10257fe5b600281111561d10d57fe5b8152602001600a820160169054906101000a900460ff16600381111561d12f57fe5b600381111561d13a57fe5b8152602001600a820160179054906101000a900460ff16600481111561d15c57fe5b600481111561d16757fe5b81525050905061d1997f0edbd8684422fb9a817dfb39ad51a6a1e2ed8648c97fc8a7fd0eaa2148d416cd60001b6143ad565b61d1c57f4bbdbd7e92b7036b97cfc18306e32bafa852ed102613433655646047a3ee832060001b6143ad565b80602001518160400151101561d6fc5761d2017f7658ecdfd8d8732b312cb32404eb8d2c51fdf1272693c3e65e4d69eaf05e1b7160001b6143ad565b61d22d7f0bc72c8210072183a51df76e29add60aecd74d1ac04eab9ab49463c9ae8c79fd60001b6143ad565b61d2597f3362701b0fca282af2a6c7370630e708ad0e557aae21b3fe9f3c91bf8f75de5160001b6143ad565b80600001518160400151101561d5a15761d2957fedcb6f6f1db5453ea62f665a6f8190343173138fee00abcc2d3f4807541a1bbf60001b6143ad565b61d2c17f6ac1fab115fffec528b63d7e86dba3e43cc0486724b6bc5e52d26d99168bc32060001b6143ad565b61d2ed7f8c482dd675875ec477f98d4b91ac0d816c7763012a250fab27dae22204553d4e60001b6143ad565b60008160400151141561d4555761d3267f10687479cf4574c2105c199a52cac67e2019daf1c8ef301b5ff4ad14564a221a60001b6143ad565b61d3527f36f3a9227aebacea9bfb503b14bf9c36f8f9aa7f1c073bfdf619f5df0e50914e60001b6143ad565b61d37e7f01460a329248328cb216d4b91efbd57f5db308662bd43304c76d362bf5419c6c60001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061d3d67f9adabe64395d42bffe49041aff12f726a4a0a44a732c5c0f5ed69da48c88809260001b6143ad565b61d4027f20e0bffb0ca556643787e529f37d5a80a10aca3b39b848da077554d802ba120260001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c4836040518082815260200191505060405180910390a261d482565b61d4817f7694c969c62f9945319c007faa03014817bc8474475e9c963d15f911e6ddf8ce60001b6143ad565b5b61d4ae7f16b4a42193624e455f269dbec524a47b6715975e1d67daa1dc528f28b28c564160001b6143ad565b61d4da7f6a2e55800ed2e29e8b25b0e69ccd2c3842e1f527bcc4f182a81bb709626c4ec260001b6143ad565b6000600860008481526020019081526020016000206000018190555061d5227ffa6894585a102862dae64ff945e57671f07556d1a9b4d6be4e1f4dc80ff1e0e160001b6143ad565b61d54e7f69608a2dcae66b886b77f166bc9161003095e9d8533e0085acb033e467c6035060001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a78836040518082815260200191505060405180910390a261d5ce565b61d5cd7f56602399bae5070426a7fa62c091b4571e081a365a0572bc6ea7c655c7e707a960001b6143ad565b5b61d5fa7ff8b907cd3ac179fc67d3c7aacc1abaf591c3d2525c2360fdc4560fa55586f1c760001b6143ad565b61d6267f8f6f28520c12dc533734858bf8c6deb833cab0ee52a95989c9b8cd94bcc671d960001b6143ad565b8060400151600860008481526020019081526020016000206001018190555061d6717f4c4d4990333d7eed3525c1319acf2143a7564db66bd55ab8e353d9129ecaadca60001b6143ad565b61d69d7fb9509c3e46ba4d92ae4139a29ec9ef2edcc63696d6d01ad73f000d286a6cdd7e60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445838360400151604051808381526020018281526020019250505060405180910390a261d729565b61d7287faab15ab76b90c26265bd5f07e0d3d0c779296891961aa0ea3e0803d9416027f660001b6143ad565b5b5050565b61d7597f82a5e4398186d30836ca01d3cd79052da3dfe0fc6e6f5e95d9bd4fd201d9d3a660001b6143ad565b61d7857ffbdb91767839145a3acf8d28f55e70eb505cebf298ad36c4574f8cc847e8957a60001b6143ad565b61d7b17f9cac980eb64a1c6e5488bdf9379084f165f4a5e81de9f309ba6b440cf521f91060001b6143ad565b600083111561d98e5761d7e67f8c875204c918e371346e600056c894e469f9f20bc9547d475c7c67298f54e5bc60001b6143ad565b61d8127f2a2f652ea5aad0bccc9a596ab07c1cedab273df7b97111fbf2ffa761c6a28fc960001b6143ad565b61d83e7fa74c5c3487b6db5f33bf5df8b0e8257d1485f02835ef86bb78c8ed5b9534c9cf60001b6143ad565b600082141561d8c75761d8737ff1ceaf83779cc9c0312cc98b8c4b4e2b2ce710ebb082e56df01af4300f30601060001b6143ad565b61d89f7f87bdef1c9e2c992f5ab8653535516a2f27b1f437def6d03005e86d206d50faaf60001b6143ad565b600a60008581526020019081526020016000206000815480929190600101919050555061d8f4565b61d8f37fd63c5e3214fae63baeab271f67717051a18c05e03c45ceec5535c23419d9569760001b6143ad565b5b61d9207f99fb4d88d545ba183efc65749f0818469151bf1246ce9a8e33ccf072787875b060001b6143ad565b61d94c7f70a5c4b8a4b90ec8fd3d111a6f07737186dcb95fb911e1f48e962ff7dd292de560001b6143ad565b61d97281600b60008781526020019081526020016000205461b73790919063ffffffff16565b600b60008681526020019081526020016000208190555061d9bb565b61d9ba7fcd54273b660ce6cffd80afefdec59b42d4679a3bf27ad2452ca7dd7ebf9064a060001b6143ad565b5b50505050565b600061d9ef7f996468adab2cfba5de081e00c611ca70c15d8fec7d5bf522494a62c1469ffa6a60001b61da8f565b61da1b7f9f1ba2348d57cab76c102a92e631d7e3d939d3a1ce6cb3a01a504d1656b19f5060001b61da8f565b61da477f46d4aa33cd017349564c3524038979baabbfc921b9cf218610f32f2cefa7e6de60001b61da8f565b61da8783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061dcde565b905092915050565b50565b600061dac07f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b61da8f565b61daec7f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b61da8f565b61db187f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b61da8f565b61db447fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b61da8f565b83831115829061dbef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561dbb457808201518184015260208101905061db99565b50505050905090810190601f16801561dbe15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061dc1c7f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b61da8f565b61dc487f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b61da8f565b61dc747f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b61da8f565b6000838503905061dca77f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b61da8f565b61dcd37f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b61da8f565b809150509392505050565b600061dd0c7f196dd912071b7ac5c8a10b8a236898e903a5c95f5189a9aeb16dc1191096752060001b61da8f565b61dd387ff25ec16e9c80532b14a66f8cd16ae291eebc856235e409a39c3fbd9dc53e53fb60001b61da8f565b61dd647ffb609f676697fca43f3242dd637f8af44d19e0456d05ec1547a1557478b8a1ea60001b61da8f565b61dd907ffc25a7e532044dc446303b3445457a6ba5f30c2ec2085a7b37e4ae0e05b09ba260001b61da8f565b6000831415829061de3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561de0157808201518184015260208101905061dde6565b50505050905090810190601f16801561de2e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061de697f295ce5b61523fe81f08b0e41715a55fb7cc4323fa58af5f536a59e28b507ad6660001b61da8f565b61de957f4460e22500904e71005e8ef95355467cd96d8038ca3b358379ef52915f4cd11a60001b61da8f565b61dec17f898838ee4191c5d93d43aba28d5dace210f5b5fe59d06155be60fc494d99a9f060001b61da8f565b600083858161decc57fe5b04905061defb7f6d2a274d329c86c87e9d63cea7c87a6fd3d3ca9ab129144ff43f4724a38a4a5960001b61da8f565b61df277fbb4fe2c1c37d48811af5ff17eb49f43a22d0b33ae049d66f26c63e5ac81928dc60001b61da8f565b809150509392505050565b604051806101e0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000600181111561dfae57fe5b81526020016000600281111561dfc057fe5b81526020016000600381111561dfd257fe5b81526020016000600481111561dfe457fe5b8152509056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158204455e84ba3cbafc26c52c9ae32267af0c9cfb94d4e062e3afa07cf8e81f0521664736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json b/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json index ce9ad16..75626e9 100644 --- a/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json +++ b/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json @@ -532,6 +532,51 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x55aecb26", + "type": "bytes32" + } + ], + "name": "c_0x55aecb26", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x7d365384", + "type": "bytes32" + } + ], + "name": "c_0x7d365384", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x8209a966", + "type": "bytes32" + } + ], + "name": "c_0x8209a966", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [ diff --git a/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json b/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json index 3438a09..8ae3da7 100644 --- a/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json +++ b/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json @@ -109,6 +109,36 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x55aecb26", + "type": "bytes32" + } + ], + "name": "c_0x55aecb26", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bytes32", + "name": "c__0x8209a966", + "type": "bytes32" + } + ], + "name": "c_0x8209a966", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [ From 3f214e934dd66e0ca43c4f03af38b134a35930b0 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:20:12 +0530 Subject: [PATCH 025/112] Doc Updated --- docs/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/main.js b/docs/main.js index 93ecfe7..85d2d51 100644 --- a/docs/main.js +++ b/docs/main.js @@ -4,9 +4,9 @@ * (c) 2014-2021 Evan You * Released under the MIT License. */ -var a=Object.freeze({});function r(e){return null==e}function i(e){return null!=e}function s(e){return!0===e}function o(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function d(e){return null!==e&&"object"==typeof e}var u=Object.prototype.toString;function l(e){return"[object Object]"===u.call(e)}function p(e){return"[object RegExp]"===u.call(e)}function c(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function f(e){return i(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function y(e){return null==e?"":Array.isArray(e)||l(e)&&e.toString===u?JSON.stringify(e,null,2):String(e)}function m(e){var t=parseFloat(e);return isNaN(t)?e:t}function h(e,t){for(var n=Object.create(null),a=e.split(","),r=0;r-1)return e.splice(n,1)}}var T=Object.prototype.hasOwnProperty;function _(e,t){return T.call(e,t)}function w(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var k=/-(\w)/g,x=w((function(e){return e.replace(k,(function(e,t){return t?t.toUpperCase():""}))})),O=w((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),A=/\B([A-Z])/g,C=w((function(e){return e.replace(A,"-$1").toLowerCase()}));var S=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var a=arguments.length;return a?a>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function $(e,t){t=t||0;for(var n=e.length-t,a=new Array(n);n--;)a[n]=e[n+t];return a}function M(e,t){for(var n in t)e[n]=t[n];return e}function R(e){for(var t={},n=0;n0,Q=X&&X.indexOf("edge/")>0,ee=(X&&X.indexOf("android"),X&&/iphone|ipad|ipod|ios/.test(X)||"ios"===G),te=(X&&/chrome\/\d+/.test(X),X&&/phantomjs/.test(X),X&&X.match(/firefox\/(\d+)/)),ne={}.watch,ae=!1;if(K)try{var re={};Object.defineProperty(re,"passive",{get:function(){ae=!0}}),window.addEventListener("test-passive",null,re)}catch(e){}var ie=function(){return void 0===W&&(W=!K&&!J&&void 0!==e&&(e.process&&"server"===e.process.env.VUE_ENV)),W},se=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function oe(e){return"function"==typeof e&&/native code/.test(e.toString())}var de,ue="undefined"!=typeof Symbol&&oe(Symbol)&&"undefined"!=typeof Reflect&&oe(Reflect.ownKeys);de="undefined"!=typeof Set&&oe(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var le=I,pe=0,ce=function(){this.id=pe++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){b(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(i&&!_(r,"default"))s=!1;else if(""===s||s===C(e)){var d=He(String,r.type);(d<0||o0&&(ft((d=e(d,(n||"")+"_"+a))[0])&&ft(l)&&(p[u]=be(l.text+d[0].text),d.shift()),p.push.apply(p,d)):o(d)?ft(l)?p[u]=be(l.text+d):""!==d&&p.push(be(d)):ft(d)&&ft(l)?p[u]=be(l.text+d.text):(s(t._isVList)&&i(d.tag)&&r(d.key)&&i(n)&&(d.key="__vlist"+n+"_"+a+"__"),p.push(d)));return p}(e):void 0}function ft(e){return i(e)&&i(e.text)&&!1===e.isComment}function yt(e,t){if(e){for(var n=Object.create(null),a=ue?Reflect.ownKeys(e):Object.keys(e),r=0;r0,s=e?!!e.$stable:!i,o=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&n&&n!==a&&o===n.$key&&!i&&!n.$hasNormal)return n;for(var d in r={},e)e[d]&&"$"!==d[0]&&(r[d]=bt(t,d,e[d]))}else r={};for(var u in t)u in r||(r[u]=Tt(t,u));return e&&Object.isExtensible(e)&&(e._normalized=r),z(r,"$stable",s),z(r,"$key",o),z(r,"$hasNormal",i),r}function bt(e,t,n){var a=function(){var e=arguments.length?n.apply(null,arguments):n({}),t=(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:ct(e))&&e[0];return e&&(!t||t.isComment&&!vt(t))?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:a,enumerable:!0,configurable:!0}),a}function Tt(e,t){return function(){return e[t]}}function _t(e,t){var n,a,r,s,o;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),a=0,r=e.length;adocument.createEvent("Event").timeStamp&&(pn=function(){return cn.now()})}function fn(){var e,t;for(ln=pn(),dn=!0,an.sort((function(e,t){return e.id-t.id})),un=0;unun&&an[n].id>e.id;)n--;an.splice(n+1,0,e)}else an.push(e);on||(on=!0,rt(fn))}}(this)},mn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||d(e)||this.deep){var t=this.value;if(this.value=e,this.user){var n='callback for watcher "'+this.expression+'"';qe(this.cb,this.vm,[e,t],this.vm,n)}else this.cb.call(this.vm,e,t)}}},mn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},mn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},mn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||b(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:I,set:I};function vn(e,t,n){hn.get=function(){return this[t][n]},hn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,hn)}function gn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},a=e._props={},r=e.$options._propKeys=[];e.$parent&&Oe(!1);var i=function(i){r.push(i);var s=Ne(i,t,n,e);Se(a,i,s),i in e||vn(e,"_props",i)};for(var s in t)i(s);Oe(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?I:S(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;l(t=e._data="function"==typeof t?function(e,t){ye();try{return e.call(t,t)}catch(e){return We(e,t,"data()"),{}}finally{me()}}(t,e):t||{})||(t={});var n=Object.keys(t),a=e.$options.props,r=(e.$options.methods,n.length);for(;r--;){var i=n[r];0,a&&_(a,i)||U(i)||vn(e,"_data",i)}Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),a=ie();for(var r in t){var i=t[r],s="function"==typeof i?i:i.get;0,a||(n[r]=new mn(e,s||I,I,bn)),r in e||Tn(e,r,i)}}(e,t.computed),t.watch&&t.watch!==ne&&function(e,t){for(var n in t){var a=t[n];if(Array.isArray(a))for(var r=0;r-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!p(e)&&e.test(t)}function Mn(e,t){var n=e.cache,a=e.keys,r=e._vnode;for(var i in n){var s=n[i];if(s){var o=s.name;o&&!t(o)&&Rn(n,i,a,r)}}}function Rn(e,t,n,a){var r=e[t];!r||a&&r.tag===a.tag||r.componentInstance.$destroy(),e[t]=null,b(n,t)}!function(e){e.prototype._init=function(e){var t=this;t._uid=xn++,t._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),a=t._parentVnode;n.parent=t.parent,n._parentVnode=a;var r=a.componentOptions;n.propsData=r.propsData,n._parentListeners=r.listeners,n._renderChildren=r.children,n._componentTag=r.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=Fe(On(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Zt(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,r=n&&n.context;e.$slots=mt(t._renderChildren,r),e.$scopedSlots=a,e._c=function(t,n,a,r){return zt(e,t,n,a,r,!1)},e.$createElement=function(t,n,a,r){return zt(e,t,n,a,r,!0)};var i=n&&n.data;Se(e,"$attrs",i&&i.attrs||a,null,!0),Se(e,"$listeners",t._parentListeners||a,null,!0)}(t),nn(t,"beforeCreate"),function(e){var t=yt(e.$options.inject,e);t&&(Oe(!1),Object.keys(t).forEach((function(n){Se(e,n,t[n])})),Oe(!0))}(t),gn(t),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(t),nn(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(An),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=$e,e.prototype.$delete=Me,e.prototype.$watch=function(e,t,n){if(l(t))return kn(this,e,t,n);(n=n||{}).user=!0;var a=new mn(this,e,t,n);if(n.immediate){var r='callback for immediate watcher "'+a.expression+'"';ye(),qe(t,this,[a.value],this,r),me()}return function(){a.teardown()}}}(An),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var a=this;if(Array.isArray(e))for(var r=0,i=e.length;r1?$(n):n;for(var a=$(arguments,1),r='event handler for "'+e+'"',i=0,s=n.length;iparseInt(this.max)&&Rn(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Rn(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){Mn(e,(function(e){return $n(t,e)}))})),this.$watch("exclude",(function(t){Mn(e,(function(e){return!$n(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=Kt(e),n=t&&t.componentOptions;if(n){var a=Sn(n),r=this.include,i=this.exclude;if(r&&(!a||!$n(r,a))||i&&a&&$n(i,a))return t;var s=this.cache,o=this.keys,d=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;s[d]?(t.componentInstance=s[d].componentInstance,b(o,d),o.push(d)):(this.vnodeToCache=t,this.keyToCache=d),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return N}};Object.defineProperty(e,"config",t),e.util={warn:le,extend:M,mergeOptions:Fe,defineReactive:Se},e.set=$e,e.delete=Me,e.nextTick=rt,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),F.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,M(e.options.components,En),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=$(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=Fe(this.options,e),this}}(e),Cn(e),function(e){F.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&l(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(An),Object.defineProperty(An.prototype,"$isServer",{get:ie}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Vt}),An.version="2.6.13";var Dn=h("style,class"),jn=h("input,textarea,option,select,progress"),Vn=function(e,t,n){return"value"===n&&jn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Ln=h("contenteditable,draggable,spellcheck"),Fn=h("events,caret,typing,plaintext-only"),Pn=h("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Nn="http://www.w3.org/1999/xlink",Bn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Un=function(e){return Bn(e)?e.slice(6,e.length):""},zn=function(e){return null==e||!1===e};function Hn(e){for(var t=e.data,n=e,a=e;i(a.componentInstance);)(a=a.componentInstance._vnode)&&a.data&&(t=Wn(a.data,t));for(;i(n=n.parent);)n&&n.data&&(t=Wn(t,n.data));return function(e,t){if(i(e)||i(t))return qn(e,Kn(t));return""}(t.staticClass,t.class)}function Wn(e,t){return{staticClass:qn(e.staticClass,t.staticClass),class:i(e.class)?[e.class,t.class]:t.class}}function qn(e,t){return e?t?e+" "+t:e:t||""}function Kn(e){return Array.isArray(e)?function(e){for(var t,n="",a=0,r=e.length;a-1?ga(e,t,n):Pn(t)?zn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Ln(t)?e.setAttribute(t,function(e,t){return zn(t)||"false"===t?"false":"contenteditable"===e&&Fn(t)?t:"true"}(t,n)):Bn(t)?zn(n)?e.removeAttributeNS(Nn,Un(t)):e.setAttributeNS(Nn,t,n):ga(e,t,n)}function ga(e,t,n){if(zn(n))e.removeAttribute(t);else{if(Z&&!Y&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var a=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",a)};e.addEventListener("input",a),e.__ieph=!0}e.setAttribute(t,n)}}var ba={create:ha,update:ha};function Ta(e,t){var n=t.elm,a=t.data,s=e.data;if(!(r(a.staticClass)&&r(a.class)&&(r(s)||r(s.staticClass)&&r(s.class)))){var o=Hn(t),d=n._transitionClasses;i(d)&&(o=qn(o,Kn(d))),o!==n._prevClass&&(n.setAttribute("class",o),n._prevClass=o)}}var _a,wa,ka,xa,Oa,Aa,Ca={create:Ta,update:Ta},Sa=/[\w).+\-_$\]]/;function $a(e){var t,n,a,r,i,s=!1,o=!1,d=!1,u=!1,l=0,p=0,c=0,f=0;for(a=0;a=0&&" "===(m=e.charAt(y));y--);m&&Sa.test(m)||(u=!0)}}else void 0===r?(f=a+1,r=e.slice(0,a).trim()):h();function h(){(i||(i=[])).push(e.slice(f,a).trim()),f=a+1}if(void 0===r?r=e.slice(0,a).trim():0!==f&&h(),i)for(a=0;a-1?{exp:e.slice(0,xa),key:'"'+e.slice(xa+1)+'"'}:{exp:e,key:null};wa=e,xa=Oa=Aa=0;for(;!qa();)Ka(ka=Wa())?Ga(ka):91===ka&&Ja(ka);return{exp:e.slice(0,Oa),key:e.slice(Oa+1,Aa)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Wa(){return wa.charCodeAt(++xa)}function qa(){return xa>=_a}function Ka(e){return 34===e||39===e}function Ja(e){var t=1;for(Oa=xa;!qa();)if(Ka(e=Wa()))Ga(e);else if(91===e&&t++,93===e&&t--,0===t){Aa=xa;break}}function Ga(e){for(var t=e;!qa()&&(e=Wa())!==t;);}var Xa;function Za(e,t,n){var a=Xa;return function r(){var i=t.apply(null,arguments);null!==i&&er(e,r,n,a)}}var Ya=Xe&&!(te&&Number(te[1])<=53);function Qa(e,t,n,a){if(Ya){var r=ln,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=r||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}Xa.addEventListener(e,t,ae?{capture:n,passive:a}:n)}function er(e,t,n,a){(a||Xa).removeEventListener(e,t._wrapper||t,n)}function tr(e,t){if(!r(e.data.on)||!r(t.data.on)){var n=t.data.on||{},a=e.data.on||{};Xa=t.elm,function(e){if(i(e.__r)){var t=Z?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}i(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),ut(n,a,Qa,er,Za,t.context),Xa=void 0}}var nr,ar={create:tr,update:tr};function rr(e,t){if(!r(e.data.domProps)||!r(t.data.domProps)){var n,a,s=t.elm,o=e.data.domProps||{},d=t.data.domProps||{};for(n in i(d.__ob__)&&(d=t.data.domProps=M({},d)),o)n in d||(s[n]="");for(n in d){if(a=d[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),a===o[n])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if("value"===n&&"PROGRESS"!==s.tagName){s._value=a;var u=r(a)?"":String(a);ir(s,u)&&(s.value=u)}else if("innerHTML"===n&&Xn(s.tagName)&&r(s.innerHTML)){(nr=nr||document.createElement("div")).innerHTML=""+a+"";for(var l=nr.firstChild;s.firstChild;)s.removeChild(s.firstChild);for(;l.firstChild;)s.appendChild(l.firstChild)}else if(a!==o[n])try{s[n]=a}catch(e){}}}}function ir(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,a=e._vModifiers;if(i(a)){if(a.number)return m(n)!==m(t);if(a.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var sr={create:rr,update:rr},or=w((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var a=e.split(n);a.length>1&&(t[a[0].trim()]=a[1].trim())}})),t}));function dr(e){var t=ur(e.style);return e.staticStyle?M(e.staticStyle,t):t}function ur(e){return Array.isArray(e)?R(e):"string"==typeof e?or(e):e}var lr,pr=/^--/,cr=/\s*!important$/,fr=function(e,t,n){if(pr.test(t))e.style.setProperty(t,n);else if(cr.test(n))e.style.setProperty(C(t),n.replace(cr,""),"important");else{var a=mr(t);if(Array.isArray(n))for(var r=0,i=n.length;r-1?t.split(gr).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function Tr(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(gr).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",a=" "+t+" ";n.indexOf(a)>=0;)n=n.replace(a," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function _r(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&M(t,wr(e.name||"v")),M(t,e),t}return"string"==typeof e?wr(e):void 0}}var wr=w((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),kr=K&&!Y,xr="transition",Or="transitionend",Ar="animation",Cr="animationend";kr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(xr="WebkitTransition",Or="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Ar="WebkitAnimation",Cr="webkitAnimationEnd"));var Sr=K?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function $r(e){Sr((function(){Sr(e)}))}function Mr(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),br(e,t))}function Rr(e,t){e._transitionClasses&&b(e._transitionClasses,t),Tr(e,t)}function Ir(e,t,n){var a=Dr(e,t),r=a.type,i=a.timeout,s=a.propCount;if(!r)return n();var o="transition"===r?Or:Cr,d=0,u=function(){e.removeEventListener(o,l),n()},l=function(t){t.target===e&&++d>=s&&u()};setTimeout((function(){d0&&(n="transition",l=s,p=i.length):"animation"===t?u>0&&(n="animation",l=u,p=d.length):p=(n=(l=Math.max(s,u))>0?s>u?"transition":"animation":null)?"transition"===n?i.length:d.length:0,{type:n,timeout:l,propCount:p,hasTransform:"transition"===n&&Er.test(a[xr+"Property"])}}function jr(e,t){for(;e.length1}function Br(e,t){!0!==t.data.show&&Lr(t)}var Ur=function(e){var t,n,a={},d=e.modules,u=e.nodeOps;for(t=0;ty?b(e,r(n[v+1])?null:n[v+1].elm,n,f,v,a):f>v&&_(t,c,y)}(c,h,v,n,l):i(v)?(i(e.text)&&u.setTextContent(c,""),b(c,null,v,0,v.length-1,n)):i(h)?_(h,0,h.length-1):i(e.text)&&u.setTextContent(c,""):e.text!==t.text&&u.setTextContent(c,t.text),i(y)&&i(f=y.hook)&&i(f=f.postpatch)&&f(e,t)}}}function O(e,t,n){if(s(n)&&i(e.parent))e.parent.data.pendingInsert=t;else for(var a=0;a-1,s.selected!==i&&(s.selected=i);else if(j(Kr(s),a))return void(e.selectedIndex!==o&&(e.selectedIndex=o));r||(e.selectedIndex=-1)}}function qr(e,t){return t.every((function(t){return!j(t,e)}))}function Kr(e){return"_value"in e?e._value:e.value}function Jr(e){e.target.composing=!0}function Gr(e){e.target.composing&&(e.target.composing=!1,Xr(e.target,"input"))}function Xr(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Zr(e){return!e.componentInstance||e.data&&e.data.transition?e:Zr(e.componentInstance._vnode)}var Yr={model:zr,show:{bind:function(e,t,n){var a=t.value,r=(n=Zr(n)).data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;a&&r?(n.data.show=!0,Lr(n,(function(){e.style.display=i}))):e.style.display=a?i:"none"},update:function(e,t,n){var a=t.value;!a!=!t.oldValue&&((n=Zr(n)).data&&n.data.transition?(n.data.show=!0,a?Lr(n,(function(){e.style.display=e.__vOriginalDisplay})):Fr(n,(function(){e.style.display="none"}))):e.style.display=a?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,a,r){r||(e.style.display=e.__vOriginalDisplay)}}},Qr={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ei(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?ei(Kt(t.children)):e}function ti(e){var t={},n=e.$options;for(var a in n.propsData)t[a]=e[a];var r=n._parentListeners;for(var i in r)t[x(i)]=r[i];return t}function ni(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var ai=function(e){return e.tag||vt(e)},ri=function(e){return"show"===e.name},ii={name:"transition",props:Qr,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(ai)).length){0;var a=this.mode;0;var r=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return r;var i=ei(r);if(!i)return r;if(this._leaving)return ni(e,r);var s="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?s+"comment":s+i.tag:o(i.key)?0===String(i.key).indexOf(s)?i.key:s+i.key:i.key;var d=(i.data||(i.data={})).transition=ti(this),u=this._vnode,l=ei(u);if(i.data.directives&&i.data.directives.some(ri)&&(i.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(i,l)&&!vt(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var p=l.data.transition=M({},d);if("out-in"===a)return this._leaving=!0,lt(p,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),ni(e,r);if("in-out"===a){if(vt(i))return u;var c,f=function(){c()};lt(d,"afterEnter",f),lt(d,"enterCancelled",f),lt(p,"delayLeave",(function(e){c=e}))}}return r}}},si=M({tag:String,moveClass:String},Qr);function oi(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function di(e){e.data.newPos=e.elm.getBoundingClientRect()}function ui(e){var t=e.data.pos,n=e.data.newPos,a=t.left-n.left,r=t.top-n.top;if(a||r){e.data.moved=!0;var i=e.elm.style;i.transform=i.WebkitTransform="translate("+a+"px,"+r+"px)",i.transitionDuration="0s"}}delete si.mode;var li={Transition:ii,TransitionGroup:{props:si,beforeMount:function(){var e=this,t=this._update;this._update=function(n,a){var r=Qt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,r(),t.call(e,n,a)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),a=this.prevChildren=this.children,r=this.$slots.default||[],i=this.children=[],s=ti(this),o=0;o-1?Qn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Qn[e]=/HTMLUnknownElement/.test(t.toString())},M(An.options.directives,Yr),M(An.options.components,li),An.prototype.__patch__=K?Ur:I,An.prototype.$mount=function(e,t){return function(e,t,n){var a;return e.$el=t,e.$options.render||(e.$options.render=ge),nn(e,"beforeMount"),a=function(){e._update(e._render(),n)},new mn(e,a,I,{before:function(){e._isMounted&&!e._isDestroyed&&nn(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,nn(e,"mounted")),e}(this,e=e&&K?ta(e):void 0,t)},K&&setTimeout((function(){N.devtools&&se&&se.emit("init",An)}),0);var pi=/\{\{((?:.|\r?\n)+?)\}\}/g,ci=/[-.*+?^${}()|[\]\/\\]/g,fi=w((function(e){var t=e[0].replace(ci,"\\$&"),n=e[1].replace(ci,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}));var yi={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Na(e,"class");n&&(e.staticClass=JSON.stringify(n));var a=Pa(e,"class",!1);a&&(e.classBinding=a)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var mi,hi={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Na(e,"style");n&&(e.staticStyle=JSON.stringify(or(n)));var a=Pa(e,"style",!1);a&&(e.styleBinding=a)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},vi=function(e){return(mi=mi||document.createElement("div")).innerHTML=e,mi.textContent},gi=h("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),bi=h("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),Ti=h("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),_i=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,wi=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ki="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+B.source+"]*",xi="((?:"+ki+"\\:)?"+ki+")",Oi=new RegExp("^<"+xi),Ai=/^\s*(\/?)>/,Ci=new RegExp("^<\\/"+xi+"[^>]*>"),Si=/^]+>/i,$i=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Di=/&(?:lt|gt|quot|amp|#39);/g,ji=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Vi=h("pre,textarea",!0),Li=function(e,t){return e&&Vi(e)&&"\n"===t[0]};function Fi(e,t){var n=t?ji:Di;return e.replace(n,(function(e){return Ei[e]}))}var Pi,Ni,Bi,Ui,zi,Hi,Wi,qi,Ki=/^@|^v-on:/,Ji=/^v-|^@|^:|^#/,Gi=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Xi=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Zi=/^\(|\)$/g,Yi=/^\[.*\]$/,Qi=/:(.*)$/,es=/^:|^\.|^v-bind:/,ts=/\.[^.\]]+(?=[^\]]*$)/g,ns=/^v-slot(:|$)|^#/,as=/[\r\n]/,rs=/[ \f\t\r\n]+/g,is=w(vi);function ss(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:fs(t),rawAttrsMap:{},parent:n,children:[]}}function os(e,t){Pi=t.warn||Ra,Hi=t.isPreTag||E,Wi=t.mustUseProp||E,qi=t.getTagNamespace||E;var n=t.isReservedTag||E;(function(e){return!(!(e.component||e.attrsMap[":is"]||e.attrsMap["v-bind:is"])&&(e.attrsMap.is?n(e.attrsMap.is):n(e.tag)))}),Bi=Ia(t.modules,"transformNode"),Ui=Ia(t.modules,"preTransformNode"),zi=Ia(t.modules,"postTransformNode"),Ni=t.delimiters;var a,r,i=[],s=!1!==t.preserveWhitespace,o=t.whitespace,d=!1,u=!1;function l(e){if(p(e),d||e.processed||(e=ds(e,t)),i.length||e===a||a.if&&(e.elseif||e.else)&&ls(a,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)s=e,(o=function(e){for(var t=e.length;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&o.if&&ls(o,{exp:s.elseif,block:s});else{if(e.slotScope){var n=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[n]=e}r.children.push(e),e.parent=r}var s,o;e.children=e.children.filter((function(e){return!e.slotScope})),p(e),e.pre&&(d=!1),Hi(e.tag)&&(u=!1);for(var l=0;l]*>)","i")),c=e.replace(p,(function(e,n,a){return u=a.length,Ri(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),Li(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));d+=e.length-c.length,e=c,A(l,d-u,d)}else{var f=e.indexOf("<");if(0===f){if($i.test(e)){var y=e.indexOf("--\x3e");if(y>=0){t.shouldKeepComment&&t.comment(e.substring(4,y),d,d+y+3),k(y+3);continue}}if(Mi.test(e)){var m=e.indexOf("]>");if(m>=0){k(m+2);continue}}var h=e.match(Si);if(h){k(h[0].length);continue}var v=e.match(Ci);if(v){var g=d;k(v[0].length),A(v[1],g,d);continue}var b=x();if(b){O(b),Li(b.tagName,e)&&k(1);continue}}var T=void 0,_=void 0,w=void 0;if(f>=0){for(_=e.slice(f);!(Ci.test(_)||Oi.test(_)||$i.test(_)||Mi.test(_)||(w=_.indexOf("<",1))<0);)f+=w,_=e.slice(f);T=e.substring(0,f)}f<0&&(T=e),T&&k(T.length),t.chars&&T&&t.chars(T,d-T.length,d)}if(e===n){t.chars&&t.chars(e);break}}function k(t){d+=t,e=e.substring(t)}function x(){var t=e.match(Oi);if(t){var n,a,r={tagName:t[1],attrs:[],start:d};for(k(t[0].length);!(n=e.match(Ai))&&(a=e.match(wi)||e.match(_i));)a.start=d,k(a[0].length),a.end=d,r.attrs.push(a);if(n)return r.unarySlash=n[1],k(n[0].length),r.end=d,r}}function O(e){var n=e.tagName,d=e.unarySlash;i&&("p"===a&&Ti(n)&&A(a),o(n)&&a===n&&A(n));for(var u=s(n)||!!d,l=e.attrs.length,p=new Array(l),c=0;c=0&&r[s].lowerCasedTag!==o;s--);else s=0;if(s>=0){for(var u=r.length-1;u>=s;u--)t.end&&t.end(r[u].tag,n,i);r.length=s,a=s&&r[s-1].tag}else"br"===o?t.start&&t.start(e,[],!0,n,i):"p"===o&&(t.start&&t.start(e,[],!1,n,i),t.end&&t.end(e,n,i))}A()}(e,{warn:Pi,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,n,s,o,p){var c=r&&r.ns||qi(e);Z&&"svg"===c&&(n=function(e){for(var t=[],n=0;nd&&(o.push(i=e.slice(d,r)),s.push(JSON.stringify(i)));var u=$a(a[1].trim());s.push("_s("+u+")"),o.push({"@binding":u}),d=r+a[0].length}return d-1"+("true"===i?":("+t+")":":_q("+t+","+i+")")),Fa(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+i+"):("+s+");if(Array.isArray($$a)){var $$v="+(a?"_n("+r+")":r)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Ha(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Ha(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Ha(t,"$$c")+"}",null,!0)}(e,a,r);else if("input"===i&&"radio"===s)!function(e,t,n){var a=n&&n.number,r=Pa(e,"value")||"null";Ea(e,"checked","_q("+t+","+(r=a?"_n("+r+")":r)+")"),Fa(e,"change",Ha(t,r),null,!0)}(e,a,r);else if("input"===i||"textarea"===i)!function(e,t,n){var a=e.attrsMap.type;0;var r=n||{},i=r.lazy,s=r.number,o=r.trim,d=!i&&"range"!==a,u=i?"change":"range"===a?"__r":"input",l="$event.target.value";o&&(l="$event.target.value.trim()");s&&(l="_n("+l+")");var p=Ha(t,l);d&&(p="if($event.target.composing)return;"+p);Ea(e,"value","("+t+")"),Fa(e,u,p,null,!0),(o||s)&&Fa(e,"blur","$forceUpdate()")}(e,a,r);else{if(!N.isReservedTag(i))return za(e,a,r),!1}return!0},text:function(e,t){t.value&&Ea(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Ea(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:gi,mustUseProp:Vn,canBeLeftOpenTag:bi,isReservedTag:Zn,getTagNamespace:Yn,staticKeys:function(e){return e.reduce((function(e,t){return e.concat(t.staticKeys||[])}),[]).join(",")}(vs)},_s=w((function(e){return h("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))}));function ws(e,t){e&&(gs=_s(t.staticKeys||""),bs=t.isReservedTag||E,function e(t){if(t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||v(e.tag)||!bs(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(gs)))}(t),1===t.type){if(!bs(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,a=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,xs=/\([^)]*?\);*$/,Os=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,As={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Cs={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Ss=function(e){return"if("+e+")return null;"},$s={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Ss("$event.target !== $event.currentTarget"),ctrl:Ss("!$event.ctrlKey"),shift:Ss("!$event.shiftKey"),alt:Ss("!$event.altKey"),meta:Ss("!$event.metaKey"),left:Ss("'button' in $event && $event.button !== 0"),middle:Ss("'button' in $event && $event.button !== 1"),right:Ss("'button' in $event && $event.button !== 2")};function Ms(e,t){var n=t?"nativeOn:":"on:",a="",r="";for(var i in e){var s=Rs(e[i]);e[i]&&e[i].dynamic?r+=i+","+s+",":a+='"'+i+'":'+s+","}return a="{"+a.slice(0,-1)+"}",r?n+"_d("+a+",["+r.slice(0,-1)+"])":n+a}function Rs(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return Rs(e)})).join(",")+"]";var t=Os.test(e.value),n=ks.test(e.value),a=Os.test(e.value.replace(xs,""));if(e.modifiers){var r="",i="",s=[];for(var o in e.modifiers)if($s[o])i+=$s[o],As[o]&&s.push(o);else if("exact"===o){var d=e.modifiers;i+=Ss(["ctrl","shift","alt","meta"].filter((function(e){return!d[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else s.push(o);return s.length&&(r+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Is).join("&&")+")return null;"}(s)),i&&(r+=i),"function($event){"+r+(t?"return "+e.value+".apply(null, arguments)":n?"return ("+e.value+").apply(null, arguments)":a?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(a?"return "+e.value:e.value)+"}"}function Is(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=As[e],a=Cs[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(a)+")"}var Es={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:I},Ds=function(e){this.options=e,this.warn=e.warn||Ra,this.transforms=Ia(e.modules,"transformCode"),this.dataGenFns=Ia(e.modules,"genData"),this.directives=M(M({},Es),e.directives);var t=e.isReservedTag||E;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function js(e,t){var n=new Ds(t);return{render:"with(this){return "+(e?"script"===e.tag?"null":Vs(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Vs(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ls(e,t);if(e.once&&!e.onceProcessed)return Fs(e,t);if(e.for&&!e.forProcessed)return Ns(e,t);if(e.if&&!e.ifProcessed)return Ps(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',a=Hs(e,t),r="_t("+n+(a?",function(){return "+a+"}":""),i=e.attrs||e.dynamicAttrs?Ks((e.attrs||[]).concat(e.dynamicAttrs||[]).map((function(e){return{name:x(e.name),value:e.value,dynamic:e.dynamic}}))):null,s=e.attrsMap["v-bind"];!i&&!s||a||(r+=",null");i&&(r+=","+i);s&&(r+=(i?"":",null")+","+s);return r+")"}(e,t);var n;if(e.component)n=function(e,t,n){var a=t.inlineTemplate?null:Hs(t,n,!0);return"_c("+e+","+Bs(t,n)+(a?","+a:"")+")"}(e.component,e,t);else{var a;(!e.plain||e.pre&&t.maybeComponent(e))&&(a=Bs(e,t));var r=e.inlineTemplate?null:Hs(e,t,!0);n="_c('"+e.tag+"'"+(a?","+a:"")+(r?","+r:"")+")"}for(var i=0;i>>0}(s):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var i=function(e,t){var n=e.children[0];0;if(n&&1===n.type){var a=js(n,t.options);return"inlineTemplate:{render:function(){"+a.render+"},staticRenderFns:["+a.staticRenderFns.map((function(e){return"function(){"+e+"}"})).join(",")+"]}"}}(e,t);i&&(n+=i+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Ks(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Us(e){return 1===e.type&&("slot"===e.tag||e.children.some(Us))}function zs(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ps(e,t,zs,"null");if(e.for&&!e.forProcessed)return Ns(e,t,zs);var a="_empty_"===e.slotScope?"":String(e.slotScope),r="function("+a+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Hs(e,t)||"undefined")+":undefined":Hs(e,t)||"undefined":Vs(e,t))+"}",i=a?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+r+i+"}"}function Hs(e,t,n,a,r){var i=e.children;if(i.length){var s=i[0];if(1===i.length&&s.for&&"template"!==s.tag&&"slot"!==s.tag){var o=n?t.maybeComponent(s)?",1":",0":"";return""+(a||Vs)(s,t)+o}var d=n?function(e,t){for(var n=0,a=0;a':'
',Ys.innerHTML.indexOf(" ")>0}var no=!!K&&to(!1),ao=!!K&&to(!0),ro=w((function(e){var t=ta(e);return t&&t.innerHTML})),io=An.prototype.$mount;An.prototype.$mount=function(e,t){if((e=e&&ta(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var a=n.template;if(a)if("string"==typeof a)"#"===a.charAt(0)&&(a=ro(a));else{if(!a.nodeType)return this;a=a.innerHTML}else e&&(a=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(a){0;var r=eo(a,{outputSourceRange:!1,shouldDecodeNewlines:no,shouldDecodeNewlinesForHref:ao,delimiters:n.delimiters,comments:n.comments},this),i=r.render,s=r.staticRenderFns;n.render=i,n.staticRenderFns=s}}return io.call(this,e,t)},An.compile=eo,t.a=An}).call(this,n(0),n(7).setImmediate)},function(e){e.exports=JSON.parse('{"a":"hardhat-docgen","b":{"type":"git","url":"git+https://github.com/ItsNickBarry/hardhat-docgen.git"}}')},function(e,t,n){var a=n(5);a.__esModule&&(a=a.default),"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals);(0,n(11).default)("0b345cf4",a,!1,{})},function(e,t,n){"use strict";n(3)},function(e,t,n){(t=e.exports=n(6)(!1)).push([e.i,"@import url(https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600;700&display=swap);",""]),t.push([e.i,"\nhtml,\nbody {\n font-family: 'Source Code Pro', monospace;\n}\n",""])},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",a=e[3];if(!a)return n;if(t&&"function"==typeof btoa){var r=(s=a,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(s))))+" */"),i=a.sources.map((function(e){return"/*# sourceURL="+a.sourceRoot+e+" */"}));return[n].concat(i).concat([r]).join("\n")}var s;return[n].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var a={},r=0;r=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(8),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(0))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var a,r,i,s,o,d=1,u={},l=!1,p=e.document,c=Object.getPrototypeOf&&Object.getPrototypeOf(e);c=c&&c.setTimeout?c:e,"[object process]"==={}.toString.call(e.process)?a=function(){var e=f(arguments);return t.nextTick(y(m,e)),e}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){m(e.data)},a=function(){var e=f(arguments);return i.port2.postMessage(e),e}):p&&"onreadystatechange"in p.createElement("script")?(r=p.documentElement,a=function(){var e=f(arguments),t=p.createElement("script");return t.onreadystatechange=function(){m(e),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t),e}):a=function(){var e=f(arguments);return setTimeout(y(m,e),0),e}:(s="setImmediate$"+Math.random()+"$",o=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&m(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",o,!1):e.attachEvent("onmessage",o),a=function(){var t=f(arguments);return e.postMessage(s+t,"*"),t}),c.setImmediate=a,c.clearImmediate=h}function f(e){return u[d]=y.apply(void 0,e),d++}function y(e){var t=[].slice.call(arguments,1);return function(){"function"==typeof e?e.apply(void 0,t):new Function(""+e)()}}function m(e){if(l)setTimeout(y(m,e),0);else{var t=u[e];if(t){l=!0;try{t()}finally{h(e),l=!1}}}}function h(e){delete u[e]}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,n(0),n(9))},function(e,t){var n,a,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function o(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{a="function"==typeof clearTimeout?clearTimeout:s}catch(e){a=s}}();var d,u=[],l=!1,p=-1;function c(){l&&d&&(l=!1,d.length?u=d.concat(u):p=-1,u.length&&f())}function f(){if(!l){var e=o(c);l=!0;for(var t=u.length;t;){for(d=u,u=[];++p1)for(var n=1;n=0&&Math.floor(t)===t&&isFinite(e)}function f(e){return i(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function y(e){return null==e?"":Array.isArray(e)||p(e)&&e.toString===u?JSON.stringify(e,null,2):String(e)}function m(e){var t=parseFloat(e);return isNaN(t)?e:t}function h(e,t){for(var n=Object.create(null),a=e.split(","),r=0;r-1)return e.splice(n,1)}}var _=Object.prototype.hasOwnProperty;function T(e,t){return _.call(e,t)}function w(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var k=/-(\w)/g,x=w((function(e){return e.replace(k,(function(e,t){return t?t.toUpperCase():""}))})),O=w((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),A=/\B([A-Z])/g,C=w((function(e){return e.replace(A,"-$1").toLowerCase()}));var S=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var a=arguments.length;return a?a>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function M(e,t){t=t||0;for(var n=e.length-t,a=new Array(n);n--;)a[n]=e[n+t];return a}function $(e,t){for(var n in t)e[n]=t[n];return e}function R(e){for(var t={},n=0;n0,Q=X&&X.indexOf("edge/")>0,ee=(X&&X.indexOf("android"),X&&/iphone|ipad|ipod|ios/.test(X)||"ios"===G),te=(X&&/chrome\/\d+/.test(X),X&&/phantomjs/.test(X),X&&X.match(/firefox\/(\d+)/)),ne={}.watch,ae=!1;if(K)try{var re={};Object.defineProperty(re,"passive",{get:function(){ae=!0}}),window.addEventListener("test-passive",null,re)}catch(e){}var ie=function(){return void 0===W&&(W=!K&&!J&&void 0!==e&&(e.process&&"server"===e.process.env.VUE_ENV)),W},se=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function oe(e){return"function"==typeof e&&/native code/.test(e.toString())}var de,ue="undefined"!=typeof Symbol&&oe(Symbol)&&"undefined"!=typeof Reflect&&oe(Reflect.ownKeys);de="undefined"!=typeof Set&&oe(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var pe=I,ce=0,le=function(){this.id=ce++,this.subs=[]};le.prototype.addSub=function(e){this.subs.push(e)},le.prototype.removeSub=function(e){g(this.subs,e)},le.prototype.depend=function(){le.target&&le.target.addDep(this)},le.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(i&&!T(r,"default"))s=!1;else if(""===s||s===C(e)){var d=He(String,r.type);(d<0||o0&&(ft((d=e(d,(n||"")+"_"+a))[0])&&ft(p)&&(c[u]=ge(p.text+d[0].text),d.shift()),c.push.apply(c,d)):o(d)?ft(p)?c[u]=ge(p.text+d):""!==d&&c.push(ge(d)):ft(d)&&ft(p)?c[u]=ge(p.text+d.text):(s(t._isVList)&&i(d.tag)&&r(d.key)&&i(n)&&(d.key="__vlist"+n+"_"+a+"__"),c.push(d)));return c}(e):void 0}function ft(e){return i(e)&&i(e.text)&&!1===e.isComment}function yt(e,t){if(e){for(var n=Object.create(null),a=ue?Reflect.ownKeys(e):Object.keys(e),r=0;r0,s=e?!!e.$stable:!i,o=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&n&&n!==a&&o===n.$key&&!i&&!n.$hasNormal)return n;for(var d in r={},e)e[d]&&"$"!==d[0]&&(r[d]=gt(t,d,e[d]))}else r={};for(var u in t)u in r||(r[u]=_t(t,u));return e&&Object.isExtensible(e)&&(e._normalized=r),z(r,"$stable",s),z(r,"$key",o),z(r,"$hasNormal",i),r}function gt(e,t,n){var a=function(){var e=arguments.length?n.apply(null,arguments):n({}),t=(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:lt(e))&&e[0];return e&&(!t||t.isComment&&!vt(t))?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:a,enumerable:!0,configurable:!0}),a}function _t(e,t){return function(){return e[t]}}function Tt(e,t){var n,a,r,s,o;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),a=0,r=e.length;adocument.createEvent("Event").timeStamp&&(cn=function(){return ln.now()})}function fn(){var e,t;for(pn=cn(),dn=!0,an.sort((function(e,t){return e.id-t.id})),un=0;unun&&an[n].id>e.id;)n--;an.splice(n+1,0,e)}else an.push(e);on||(on=!0,rt(fn))}}(this)},mn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||d(e)||this.deep){var t=this.value;if(this.value=e,this.user){var n='callback for watcher "'+this.expression+'"';qe(this.cb,this.vm,[e,t],this.vm,n)}else this.cb.call(this.vm,e,t)}}},mn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},mn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},mn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||g(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:I,set:I};function vn(e,t,n){hn.get=function(){return this[t][n]},hn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,hn)}function bn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},a=e._props={},r=e.$options._propKeys=[];e.$parent&&Oe(!1);var i=function(i){r.push(i);var s=Ne(i,t,n,e);Se(a,i,s),i in e||vn(e,"_props",i)};for(var s in t)i(s);Oe(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?I:S(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;p(t=e._data="function"==typeof t?function(e,t){ye();try{return e.call(t,t)}catch(e){return We(e,t,"data()"),{}}finally{me()}}(t,e):t||{})||(t={});var n=Object.keys(t),a=e.$options.props,r=(e.$options.methods,n.length);for(;r--;){var i=n[r];0,a&&T(a,i)||U(i)||vn(e,"_data",i)}Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),a=ie();for(var r in t){var i=t[r],s="function"==typeof i?i:i.get;0,a||(n[r]=new mn(e,s||I,I,gn)),r in e||_n(e,r,i)}}(e,t.computed),t.watch&&t.watch!==ne&&function(e,t){for(var n in t){var a=t[n];if(Array.isArray(a))for(var r=0;r-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!c(e)&&e.test(t)}function $n(e,t){var n=e.cache,a=e.keys,r=e._vnode;for(var i in n){var s=n[i];if(s){var o=s.name;o&&!t(o)&&Rn(n,i,a,r)}}}function Rn(e,t,n,a){var r=e[t];!r||a&&r.tag===a.tag||r.componentInstance.$destroy(),e[t]=null,g(n,t)}!function(e){e.prototype._init=function(e){var t=this;t._uid=xn++,t._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),a=t._parentVnode;n.parent=t.parent,n._parentVnode=a;var r=a.componentOptions;n.propsData=r.propsData,n._parentListeners=r.listeners,n._renderChildren=r.children,n._componentTag=r.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=Fe(On(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Zt(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,r=n&&n.context;e.$slots=mt(t._renderChildren,r),e.$scopedSlots=a,e._c=function(t,n,a,r){return zt(e,t,n,a,r,!1)},e.$createElement=function(t,n,a,r){return zt(e,t,n,a,r,!0)};var i=n&&n.data;Se(e,"$attrs",i&&i.attrs||a,null,!0),Se(e,"$listeners",t._parentListeners||a,null,!0)}(t),nn(t,"beforeCreate"),function(e){var t=yt(e.$options.inject,e);t&&(Oe(!1),Object.keys(t).forEach((function(n){Se(e,n,t[n])})),Oe(!0))}(t),bn(t),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(t),nn(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(An),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=Me,e.prototype.$delete=$e,e.prototype.$watch=function(e,t,n){if(p(t))return kn(this,e,t,n);(n=n||{}).user=!0;var a=new mn(this,e,t,n);if(n.immediate){var r='callback for immediate watcher "'+a.expression+'"';ye(),qe(t,this,[a.value],this,r),me()}return function(){a.teardown()}}}(An),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var a=this;if(Array.isArray(e))for(var r=0,i=e.length;r1?M(n):n;for(var a=M(arguments,1),r='event handler for "'+e+'"',i=0,s=n.length;iparseInt(this.max)&&Rn(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Rn(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){$n(e,(function(e){return Mn(t,e)}))})),this.$watch("exclude",(function(t){$n(e,(function(e){return!Mn(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=Kt(e),n=t&&t.componentOptions;if(n){var a=Sn(n),r=this.include,i=this.exclude;if(r&&(!a||!Mn(r,a))||i&&a&&Mn(i,a))return t;var s=this.cache,o=this.keys,d=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;s[d]?(t.componentInstance=s[d].componentInstance,g(o,d),o.push(d)):(this.vnodeToCache=t,this.keyToCache=d),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return N}};Object.defineProperty(e,"config",t),e.util={warn:pe,extend:$,mergeOptions:Fe,defineReactive:Se},e.set=Me,e.delete=$e,e.nextTick=rt,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),F.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,$(e.options.components,En),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=M(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=Fe(this.options,e),this}}(e),Cn(e),function(e){F.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&p(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(An),Object.defineProperty(An.prototype,"$isServer",{get:ie}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Vt}),An.version="2.6.13";var Dn=h("style,class"),jn=h("input,textarea,option,select,progress"),Vn=function(e,t,n){return"value"===n&&jn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Ln=h("contenteditable,draggable,spellcheck"),Fn=h("events,caret,typing,plaintext-only"),Pn=h("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Nn="http://www.w3.org/1999/xlink",Bn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Un=function(e){return Bn(e)?e.slice(6,e.length):""},zn=function(e){return null==e||!1===e};function Hn(e){for(var t=e.data,n=e,a=e;i(a.componentInstance);)(a=a.componentInstance._vnode)&&a.data&&(t=Wn(a.data,t));for(;i(n=n.parent);)n&&n.data&&(t=Wn(t,n.data));return function(e,t){if(i(e)||i(t))return qn(e,Kn(t));return""}(t.staticClass,t.class)}function Wn(e,t){return{staticClass:qn(e.staticClass,t.staticClass),class:i(e.class)?[e.class,t.class]:t.class}}function qn(e,t){return e?t?e+" "+t:e:t||""}function Kn(e){return Array.isArray(e)?function(e){for(var t,n="",a=0,r=e.length;a-1?ba(e,t,n):Pn(t)?zn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Ln(t)?e.setAttribute(t,function(e,t){return zn(t)||"false"===t?"false":"contenteditable"===e&&Fn(t)?t:"true"}(t,n)):Bn(t)?zn(n)?e.removeAttributeNS(Nn,Un(t)):e.setAttributeNS(Nn,t,n):ba(e,t,n)}function ba(e,t,n){if(zn(n))e.removeAttribute(t);else{if(Z&&!Y&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var a=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",a)};e.addEventListener("input",a),e.__ieph=!0}e.setAttribute(t,n)}}var ga={create:ha,update:ha};function _a(e,t){var n=t.elm,a=t.data,s=e.data;if(!(r(a.staticClass)&&r(a.class)&&(r(s)||r(s.staticClass)&&r(s.class)))){var o=Hn(t),d=n._transitionClasses;i(d)&&(o=qn(o,Kn(d))),o!==n._prevClass&&(n.setAttribute("class",o),n._prevClass=o)}}var Ta,wa,ka,xa,Oa,Aa,Ca={create:_a,update:_a},Sa=/[\w).+\-_$\]]/;function Ma(e){var t,n,a,r,i,s=!1,o=!1,d=!1,u=!1,p=0,c=0,l=0,f=0;for(a=0;a=0&&" "===(m=e.charAt(y));y--);m&&Sa.test(m)||(u=!0)}}else void 0===r?(f=a+1,r=e.slice(0,a).trim()):h();function h(){(i||(i=[])).push(e.slice(f,a).trim()),f=a+1}if(void 0===r?r=e.slice(0,a).trim():0!==f&&h(),i)for(a=0;a-1?{exp:e.slice(0,xa),key:'"'+e.slice(xa+1)+'"'}:{exp:e,key:null};wa=e,xa=Oa=Aa=0;for(;!qa();)Ka(ka=Wa())?Ga(ka):91===ka&&Ja(ka);return{exp:e.slice(0,Oa),key:e.slice(Oa+1,Aa)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Wa(){return wa.charCodeAt(++xa)}function qa(){return xa>=Ta}function Ka(e){return 34===e||39===e}function Ja(e){var t=1;for(Oa=xa;!qa();)if(Ka(e=Wa()))Ga(e);else if(91===e&&t++,93===e&&t--,0===t){Aa=xa;break}}function Ga(e){for(var t=e;!qa()&&(e=Wa())!==t;);}var Xa;function Za(e,t,n){var a=Xa;return function r(){var i=t.apply(null,arguments);null!==i&&er(e,r,n,a)}}var Ya=Xe&&!(te&&Number(te[1])<=53);function Qa(e,t,n,a){if(Ya){var r=pn,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=r||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}Xa.addEventListener(e,t,ae?{capture:n,passive:a}:n)}function er(e,t,n,a){(a||Xa).removeEventListener(e,t._wrapper||t,n)}function tr(e,t){if(!r(e.data.on)||!r(t.data.on)){var n=t.data.on||{},a=e.data.on||{};Xa=t.elm,function(e){if(i(e.__r)){var t=Z?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}i(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),ut(n,a,Qa,er,Za,t.context),Xa=void 0}}var nr,ar={create:tr,update:tr};function rr(e,t){if(!r(e.data.domProps)||!r(t.data.domProps)){var n,a,s=t.elm,o=e.data.domProps||{},d=t.data.domProps||{};for(n in i(d.__ob__)&&(d=t.data.domProps=$({},d)),o)n in d||(s[n]="");for(n in d){if(a=d[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),a===o[n])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if("value"===n&&"PROGRESS"!==s.tagName){s._value=a;var u=r(a)?"":String(a);ir(s,u)&&(s.value=u)}else if("innerHTML"===n&&Xn(s.tagName)&&r(s.innerHTML)){(nr=nr||document.createElement("div")).innerHTML=""+a+"";for(var p=nr.firstChild;s.firstChild;)s.removeChild(s.firstChild);for(;p.firstChild;)s.appendChild(p.firstChild)}else if(a!==o[n])try{s[n]=a}catch(e){}}}}function ir(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,a=e._vModifiers;if(i(a)){if(a.number)return m(n)!==m(t);if(a.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var sr={create:rr,update:rr},or=w((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var a=e.split(n);a.length>1&&(t[a[0].trim()]=a[1].trim())}})),t}));function dr(e){var t=ur(e.style);return e.staticStyle?$(e.staticStyle,t):t}function ur(e){return Array.isArray(e)?R(e):"string"==typeof e?or(e):e}var pr,cr=/^--/,lr=/\s*!important$/,fr=function(e,t,n){if(cr.test(t))e.style.setProperty(t,n);else if(lr.test(n))e.style.setProperty(C(t),n.replace(lr,""),"important");else{var a=mr(t);if(Array.isArray(n))for(var r=0,i=n.length;r-1?t.split(br).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function _r(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(br).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",a=" "+t+" ";n.indexOf(a)>=0;)n=n.replace(a," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function Tr(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&$(t,wr(e.name||"v")),$(t,e),t}return"string"==typeof e?wr(e):void 0}}var wr=w((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),kr=K&&!Y,xr="transition",Or="transitionend",Ar="animation",Cr="animationend";kr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(xr="WebkitTransition",Or="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Ar="WebkitAnimation",Cr="webkitAnimationEnd"));var Sr=K?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Mr(e){Sr((function(){Sr(e)}))}function $r(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),gr(e,t))}function Rr(e,t){e._transitionClasses&&g(e._transitionClasses,t),_r(e,t)}function Ir(e,t,n){var a=Dr(e,t),r=a.type,i=a.timeout,s=a.propCount;if(!r)return n();var o="transition"===r?Or:Cr,d=0,u=function(){e.removeEventListener(o,p),n()},p=function(t){t.target===e&&++d>=s&&u()};setTimeout((function(){d0&&(n="transition",p=s,c=i.length):"animation"===t?u>0&&(n="animation",p=u,c=d.length):c=(n=(p=Math.max(s,u))>0?s>u?"transition":"animation":null)?"transition"===n?i.length:d.length:0,{type:n,timeout:p,propCount:c,hasTransform:"transition"===n&&Er.test(a[xr+"Property"])}}function jr(e,t){for(;e.length1}function Br(e,t){!0!==t.data.show&&Lr(t)}var Ur=function(e){var t,n,a={},d=e.modules,u=e.nodeOps;for(t=0;ty?g(e,r(n[v+1])?null:n[v+1].elm,n,f,v,a):f>v&&T(t,l,y)}(l,h,v,n,p):i(v)?(i(e.text)&&u.setTextContent(l,""),g(l,null,v,0,v.length-1,n)):i(h)?T(h,0,h.length-1):i(e.text)&&u.setTextContent(l,""):e.text!==t.text&&u.setTextContent(l,t.text),i(y)&&i(f=y.hook)&&i(f=f.postpatch)&&f(e,t)}}}function O(e,t,n){if(s(n)&&i(e.parent))e.parent.data.pendingInsert=t;else for(var a=0;a-1,s.selected!==i&&(s.selected=i);else if(j(Kr(s),a))return void(e.selectedIndex!==o&&(e.selectedIndex=o));r||(e.selectedIndex=-1)}}function qr(e,t){return t.every((function(t){return!j(t,e)}))}function Kr(e){return"_value"in e?e._value:e.value}function Jr(e){e.target.composing=!0}function Gr(e){e.target.composing&&(e.target.composing=!1,Xr(e.target,"input"))}function Xr(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Zr(e){return!e.componentInstance||e.data&&e.data.transition?e:Zr(e.componentInstance._vnode)}var Yr={model:zr,show:{bind:function(e,t,n){var a=t.value,r=(n=Zr(n)).data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;a&&r?(n.data.show=!0,Lr(n,(function(){e.style.display=i}))):e.style.display=a?i:"none"},update:function(e,t,n){var a=t.value;!a!=!t.oldValue&&((n=Zr(n)).data&&n.data.transition?(n.data.show=!0,a?Lr(n,(function(){e.style.display=e.__vOriginalDisplay})):Fr(n,(function(){e.style.display="none"}))):e.style.display=a?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,a,r){r||(e.style.display=e.__vOriginalDisplay)}}},Qr={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ei(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?ei(Kt(t.children)):e}function ti(e){var t={},n=e.$options;for(var a in n.propsData)t[a]=e[a];var r=n._parentListeners;for(var i in r)t[x(i)]=r[i];return t}function ni(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var ai=function(e){return e.tag||vt(e)},ri=function(e){return"show"===e.name},ii={name:"transition",props:Qr,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(ai)).length){0;var a=this.mode;0;var r=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return r;var i=ei(r);if(!i)return r;if(this._leaving)return ni(e,r);var s="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?s+"comment":s+i.tag:o(i.key)?0===String(i.key).indexOf(s)?i.key:s+i.key:i.key;var d=(i.data||(i.data={})).transition=ti(this),u=this._vnode,p=ei(u);if(i.data.directives&&i.data.directives.some(ri)&&(i.data.show=!0),p&&p.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(i,p)&&!vt(p)&&(!p.componentInstance||!p.componentInstance._vnode.isComment)){var c=p.data.transition=$({},d);if("out-in"===a)return this._leaving=!0,pt(c,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),ni(e,r);if("in-out"===a){if(vt(i))return u;var l,f=function(){l()};pt(d,"afterEnter",f),pt(d,"enterCancelled",f),pt(c,"delayLeave",(function(e){l=e}))}}return r}}},si=$({tag:String,moveClass:String},Qr);function oi(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function di(e){e.data.newPos=e.elm.getBoundingClientRect()}function ui(e){var t=e.data.pos,n=e.data.newPos,a=t.left-n.left,r=t.top-n.top;if(a||r){e.data.moved=!0;var i=e.elm.style;i.transform=i.WebkitTransform="translate("+a+"px,"+r+"px)",i.transitionDuration="0s"}}delete si.mode;var pi={Transition:ii,TransitionGroup:{props:si,beforeMount:function(){var e=this,t=this._update;this._update=function(n,a){var r=Qt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,r(),t.call(e,n,a)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),a=this.prevChildren=this.children,r=this.$slots.default||[],i=this.children=[],s=ti(this),o=0;o-1?Qn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Qn[e]=/HTMLUnknownElement/.test(t.toString())},$(An.options.directives,Yr),$(An.options.components,pi),An.prototype.__patch__=K?Ur:I,An.prototype.$mount=function(e,t){return function(e,t,n){var a;return e.$el=t,e.$options.render||(e.$options.render=be),nn(e,"beforeMount"),a=function(){e._update(e._render(),n)},new mn(e,a,I,{before:function(){e._isMounted&&!e._isDestroyed&&nn(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,nn(e,"mounted")),e}(this,e=e&&K?ta(e):void 0,t)},K&&setTimeout((function(){N.devtools&&se&&se.emit("init",An)}),0);var ci=/\{\{((?:.|\r?\n)+?)\}\}/g,li=/[-.*+?^${}()|[\]\/\\]/g,fi=w((function(e){var t=e[0].replace(li,"\\$&"),n=e[1].replace(li,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}));var yi={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Na(e,"class");n&&(e.staticClass=JSON.stringify(n));var a=Pa(e,"class",!1);a&&(e.classBinding=a)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var mi,hi={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Na(e,"style");n&&(e.staticStyle=JSON.stringify(or(n)));var a=Pa(e,"style",!1);a&&(e.styleBinding=a)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},vi=function(e){return(mi=mi||document.createElement("div")).innerHTML=e,mi.textContent},bi=h("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),gi=h("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),_i=h("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),Ti=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,wi=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ki="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+B.source+"]*",xi="((?:"+ki+"\\:)?"+ki+")",Oi=new RegExp("^<"+xi),Ai=/^\s*(\/?)>/,Ci=new RegExp("^<\\/"+xi+"[^>]*>"),Si=/^]+>/i,Mi=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Di=/&(?:lt|gt|quot|amp|#39);/g,ji=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Vi=h("pre,textarea",!0),Li=function(e,t){return e&&Vi(e)&&"\n"===t[0]};function Fi(e,t){var n=t?ji:Di;return e.replace(n,(function(e){return Ei[e]}))}var Pi,Ni,Bi,Ui,zi,Hi,Wi,qi,Ki=/^@|^v-on:/,Ji=/^v-|^@|^:|^#/,Gi=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Xi=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Zi=/^\(|\)$/g,Yi=/^\[.*\]$/,Qi=/:(.*)$/,es=/^:|^\.|^v-bind:/,ts=/\.[^.\]]+(?=[^\]]*$)/g,ns=/^v-slot(:|$)|^#/,as=/[\r\n]/,rs=/[ \f\t\r\n]+/g,is=w(vi);function ss(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:fs(t),rawAttrsMap:{},parent:n,children:[]}}function os(e,t){Pi=t.warn||Ra,Hi=t.isPreTag||E,Wi=t.mustUseProp||E,qi=t.getTagNamespace||E;var n=t.isReservedTag||E;(function(e){return!(!(e.component||e.attrsMap[":is"]||e.attrsMap["v-bind:is"])&&(e.attrsMap.is?n(e.attrsMap.is):n(e.tag)))}),Bi=Ia(t.modules,"transformNode"),Ui=Ia(t.modules,"preTransformNode"),zi=Ia(t.modules,"postTransformNode"),Ni=t.delimiters;var a,r,i=[],s=!1!==t.preserveWhitespace,o=t.whitespace,d=!1,u=!1;function p(e){if(c(e),d||e.processed||(e=ds(e,t)),i.length||e===a||a.if&&(e.elseif||e.else)&&ps(a,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)s=e,(o=function(e){for(var t=e.length;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&o.if&&ps(o,{exp:s.elseif,block:s});else{if(e.slotScope){var n=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[n]=e}r.children.push(e),e.parent=r}var s,o;e.children=e.children.filter((function(e){return!e.slotScope})),c(e),e.pre&&(d=!1),Hi(e.tag)&&(u=!1);for(var p=0;p]*>)","i")),l=e.replace(c,(function(e,n,a){return u=a.length,Ri(p)||"noscript"===p||(n=n.replace(//g,"$1").replace(//g,"$1")),Li(p,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));d+=e.length-l.length,e=l,A(p,d-u,d)}else{var f=e.indexOf("<");if(0===f){if(Mi.test(e)){var y=e.indexOf("--\x3e");if(y>=0){t.shouldKeepComment&&t.comment(e.substring(4,y),d,d+y+3),k(y+3);continue}}if($i.test(e)){var m=e.indexOf("]>");if(m>=0){k(m+2);continue}}var h=e.match(Si);if(h){k(h[0].length);continue}var v=e.match(Ci);if(v){var b=d;k(v[0].length),A(v[1],b,d);continue}var g=x();if(g){O(g),Li(g.tagName,e)&&k(1);continue}}var _=void 0,T=void 0,w=void 0;if(f>=0){for(T=e.slice(f);!(Ci.test(T)||Oi.test(T)||Mi.test(T)||$i.test(T)||(w=T.indexOf("<",1))<0);)f+=w,T=e.slice(f);_=e.substring(0,f)}f<0&&(_=e),_&&k(_.length),t.chars&&_&&t.chars(_,d-_.length,d)}if(e===n){t.chars&&t.chars(e);break}}function k(t){d+=t,e=e.substring(t)}function x(){var t=e.match(Oi);if(t){var n,a,r={tagName:t[1],attrs:[],start:d};for(k(t[0].length);!(n=e.match(Ai))&&(a=e.match(wi)||e.match(Ti));)a.start=d,k(a[0].length),a.end=d,r.attrs.push(a);if(n)return r.unarySlash=n[1],k(n[0].length),r.end=d,r}}function O(e){var n=e.tagName,d=e.unarySlash;i&&("p"===a&&_i(n)&&A(a),o(n)&&a===n&&A(n));for(var u=s(n)||!!d,p=e.attrs.length,c=new Array(p),l=0;l=0&&r[s].lowerCasedTag!==o;s--);else s=0;if(s>=0){for(var u=r.length-1;u>=s;u--)t.end&&t.end(r[u].tag,n,i);r.length=s,a=s&&r[s-1].tag}else"br"===o?t.start&&t.start(e,[],!0,n,i):"p"===o&&(t.start&&t.start(e,[],!1,n,i),t.end&&t.end(e,n,i))}A()}(e,{warn:Pi,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,n,s,o,c){var l=r&&r.ns||qi(e);Z&&"svg"===l&&(n=function(e){for(var t=[],n=0;nd&&(o.push(i=e.slice(d,r)),s.push(JSON.stringify(i)));var u=Ma(a[1].trim());s.push("_s("+u+")"),o.push({"@binding":u}),d=r+a[0].length}return d-1"+("true"===i?":("+t+")":":_q("+t+","+i+")")),Fa(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+i+"):("+s+");if(Array.isArray($$a)){var $$v="+(a?"_n("+r+")":r)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Ha(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Ha(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Ha(t,"$$c")+"}",null,!0)}(e,a,r);else if("input"===i&&"radio"===s)!function(e,t,n){var a=n&&n.number,r=Pa(e,"value")||"null";Ea(e,"checked","_q("+t+","+(r=a?"_n("+r+")":r)+")"),Fa(e,"change",Ha(t,r),null,!0)}(e,a,r);else if("input"===i||"textarea"===i)!function(e,t,n){var a=e.attrsMap.type;0;var r=n||{},i=r.lazy,s=r.number,o=r.trim,d=!i&&"range"!==a,u=i?"change":"range"===a?"__r":"input",p="$event.target.value";o&&(p="$event.target.value.trim()");s&&(p="_n("+p+")");var c=Ha(t,p);d&&(c="if($event.target.composing)return;"+c);Ea(e,"value","("+t+")"),Fa(e,u,c,null,!0),(o||s)&&Fa(e,"blur","$forceUpdate()")}(e,a,r);else{if(!N.isReservedTag(i))return za(e,a,r),!1}return!0},text:function(e,t){t.value&&Ea(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Ea(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:bi,mustUseProp:Vn,canBeLeftOpenTag:gi,isReservedTag:Zn,getTagNamespace:Yn,staticKeys:function(e){return e.reduce((function(e,t){return e.concat(t.staticKeys||[])}),[]).join(",")}(vs)},Ts=w((function(e){return h("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))}));function ws(e,t){e&&(bs=Ts(t.staticKeys||""),gs=t.isReservedTag||E,function e(t){if(t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||v(e.tag)||!gs(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(bs)))}(t),1===t.type){if(!gs(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,a=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,xs=/\([^)]*?\);*$/,Os=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,As={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Cs={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Ss=function(e){return"if("+e+")return null;"},Ms={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Ss("$event.target !== $event.currentTarget"),ctrl:Ss("!$event.ctrlKey"),shift:Ss("!$event.shiftKey"),alt:Ss("!$event.altKey"),meta:Ss("!$event.metaKey"),left:Ss("'button' in $event && $event.button !== 0"),middle:Ss("'button' in $event && $event.button !== 1"),right:Ss("'button' in $event && $event.button !== 2")};function $s(e,t){var n=t?"nativeOn:":"on:",a="",r="";for(var i in e){var s=Rs(e[i]);e[i]&&e[i].dynamic?r+=i+","+s+",":a+='"'+i+'":'+s+","}return a="{"+a.slice(0,-1)+"}",r?n+"_d("+a+",["+r.slice(0,-1)+"])":n+a}function Rs(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return Rs(e)})).join(",")+"]";var t=Os.test(e.value),n=ks.test(e.value),a=Os.test(e.value.replace(xs,""));if(e.modifiers){var r="",i="",s=[];for(var o in e.modifiers)if(Ms[o])i+=Ms[o],As[o]&&s.push(o);else if("exact"===o){var d=e.modifiers;i+=Ss(["ctrl","shift","alt","meta"].filter((function(e){return!d[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else s.push(o);return s.length&&(r+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Is).join("&&")+")return null;"}(s)),i&&(r+=i),"function($event){"+r+(t?"return "+e.value+".apply(null, arguments)":n?"return ("+e.value+").apply(null, arguments)":a?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(a?"return "+e.value:e.value)+"}"}function Is(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=As[e],a=Cs[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(a)+")"}var Es={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:I},Ds=function(e){this.options=e,this.warn=e.warn||Ra,this.transforms=Ia(e.modules,"transformCode"),this.dataGenFns=Ia(e.modules,"genData"),this.directives=$($({},Es),e.directives);var t=e.isReservedTag||E;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function js(e,t){var n=new Ds(t);return{render:"with(this){return "+(e?"script"===e.tag?"null":Vs(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Vs(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ls(e,t);if(e.once&&!e.onceProcessed)return Fs(e,t);if(e.for&&!e.forProcessed)return Ns(e,t);if(e.if&&!e.ifProcessed)return Ps(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',a=Hs(e,t),r="_t("+n+(a?",function(){return "+a+"}":""),i=e.attrs||e.dynamicAttrs?Ks((e.attrs||[]).concat(e.dynamicAttrs||[]).map((function(e){return{name:x(e.name),value:e.value,dynamic:e.dynamic}}))):null,s=e.attrsMap["v-bind"];!i&&!s||a||(r+=",null");i&&(r+=","+i);s&&(r+=(i?"":",null")+","+s);return r+")"}(e,t);var n;if(e.component)n=function(e,t,n){var a=t.inlineTemplate?null:Hs(t,n,!0);return"_c("+e+","+Bs(t,n)+(a?","+a:"")+")"}(e.component,e,t);else{var a;(!e.plain||e.pre&&t.maybeComponent(e))&&(a=Bs(e,t));var r=e.inlineTemplate?null:Hs(e,t,!0);n="_c('"+e.tag+"'"+(a?","+a:"")+(r?","+r:"")+")"}for(var i=0;i>>0}(s):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var i=function(e,t){var n=e.children[0];0;if(n&&1===n.type){var a=js(n,t.options);return"inlineTemplate:{render:function(){"+a.render+"},staticRenderFns:["+a.staticRenderFns.map((function(e){return"function(){"+e+"}"})).join(",")+"]}"}}(e,t);i&&(n+=i+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Ks(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Us(e){return 1===e.type&&("slot"===e.tag||e.children.some(Us))}function zs(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ps(e,t,zs,"null");if(e.for&&!e.forProcessed)return Ns(e,t,zs);var a="_empty_"===e.slotScope?"":String(e.slotScope),r="function("+a+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Hs(e,t)||"undefined")+":undefined":Hs(e,t)||"undefined":Vs(e,t))+"}",i=a?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+r+i+"}"}function Hs(e,t,n,a,r){var i=e.children;if(i.length){var s=i[0];if(1===i.length&&s.for&&"template"!==s.tag&&"slot"!==s.tag){var o=n?t.maybeComponent(s)?",1":",0":"";return""+(a||Vs)(s,t)+o}var d=n?function(e,t){for(var n=0,a=0;a':'
',Ys.innerHTML.indexOf(" ")>0}var no=!!K&&to(!1),ao=!!K&&to(!0),ro=w((function(e){var t=ta(e);return t&&t.innerHTML})),io=An.prototype.$mount;An.prototype.$mount=function(e,t){if((e=e&&ta(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var a=n.template;if(a)if("string"==typeof a)"#"===a.charAt(0)&&(a=ro(a));else{if(!a.nodeType)return this;a=a.innerHTML}else e&&(a=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(a){0;var r=eo(a,{outputSourceRange:!1,shouldDecodeNewlines:no,shouldDecodeNewlinesForHref:ao,delimiters:n.delimiters,comments:n.comments},this),i=r.render,s=r.staticRenderFns;n.render=i,n.staticRenderFns=s}}return io.call(this,e,t)},An.compile=eo,t.a=An}).call(this,n(0),n(7).setImmediate)},function(e){e.exports=JSON.parse('{"a":"hardhat-docgen","b":{"type":"git","url":"git+https://github.com/ItsNickBarry/hardhat-docgen.git"}}')},function(e,t,n){var a=n(5);a.__esModule&&(a=a.default),"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals);(0,n(11).default)("0b345cf4",a,!1,{})},function(e,t,n){"use strict";n(3)},function(e,t,n){(t=e.exports=n(6)(!1)).push([e.i,"@import url(https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600;700&display=swap);",""]),t.push([e.i,"\nhtml,\nbody {\n font-family: 'Source Code Pro', monospace;\n}\n",""])},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",a=e[3];if(!a)return n;if(t&&"function"==typeof btoa){var r=(s=a,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(s))))+" */"),i=a.sources.map((function(e){return"/*# sourceURL="+a.sourceRoot+e+" */"}));return[n].concat(i).concat([r]).join("\n")}var s;return[n].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var a={},r=0;r=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(8),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(0))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var a,r,i,s,o,d=1,u={},p=!1,c=e.document,l=Object.getPrototypeOf&&Object.getPrototypeOf(e);l=l&&l.setTimeout?l:e,"[object process]"==={}.toString.call(e.process)?a=function(){var e=f(arguments);return t.nextTick(y(m,e)),e}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){m(e.data)},a=function(){var e=f(arguments);return i.port2.postMessage(e),e}):c&&"onreadystatechange"in c.createElement("script")?(r=c.documentElement,a=function(){var e=f(arguments),t=c.createElement("script");return t.onreadystatechange=function(){m(e),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t),e}):a=function(){var e=f(arguments);return setTimeout(y(m,e),0),e}:(s="setImmediate$"+Math.random()+"$",o=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&m(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",o,!1):e.attachEvent("onmessage",o),a=function(){var t=f(arguments);return e.postMessage(s+t,"*"),t}),l.setImmediate=a,l.clearImmediate=h}function f(e){return u[d]=y.apply(void 0,e),d++}function y(e){var t=[].slice.call(arguments,1);return function(){"function"==typeof e?e.apply(void 0,t):new Function(""+e)()}}function m(e){if(p)setTimeout(y(m,e),0);else{var t=u[e];if(t){p=!0;try{t()}finally{h(e),p=!1}}}}function h(e){delete u[e]}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,n(0),n(9))},function(e,t){var n,a,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function o(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{a="function"==typeof clearTimeout?clearTimeout:s}catch(e){a=s}}();var d,u=[],p=!1,c=-1;function l(){p&&d&&(p=!1,d.length?u=d.concat(u):c=-1,u.length&&f())}function f(){if(!p){var e=o(l);p=!0;for(var t=u.length;t;){for(d=u,u=[];++c1)for(var n=1;n=0&&(t=e.slice(a),e=e.slice(0,a));var r=e.indexOf("?");return r>=0&&(n=e.slice(r+1),e=e.slice(0,r)),{path:e,query:n,hash:t}}(i.path||""),c=t&&t.path||"/",f=u.path?x(u.path,c,n||i.append):c,y=function(e,t,n){void 0===t&&(t={});var a,r=n||p;try{a=r(e||"")}catch(e){a={}}for(var i in t){var s=t[i];a[i]=Array.isArray(s)?s.map(l):l(s)}return a}(u.query,i.query,a&&a.options.parseQuery),m=i.hash||u.hash;return m&&"#"!==m.charAt(0)&&(m="#"+m),{_normalized:!0,path:f,query:y,hash:m}}var W,q=function(){},K={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,a=this.$route,i=n.resolve(this.to,a,this.append),s=i.location,o=i.route,d=i.href,u={},l=n.options.linkActiveClass,p=n.options.linkExactActiveClass,c=null==l?"router-link-active":l,m=null==p?"router-link-exact-active":p,h=null==this.activeClass?c:this.activeClass,v=null==this.exactActiveClass?m:this.exactActiveClass,g=o.redirectedFrom?y(null,H(o.redirectedFrom),null,n):o;u[v]=b(a,g,this.exactPath),u[h]=this.exact||this.exactPath?u[v]:function(e,t){return 0===e.path.replace(f,"/").indexOf(t.path.replace(f,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(a,g);var T=u[v]?this.ariaCurrentValue:null,_=function(e){J(e)&&(t.replace?n.replace(s,q):n.push(s,q))},w={click:J};Array.isArray(this.event)?this.event.forEach((function(e){w[e]=_})):w[this.event]=_;var k={class:u},x=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:d,route:o,navigate:_,isActive:u[h],isExactActive:u[v]});if(x){if(1===x.length)return x[0];if(x.length>1||!x.length)return 0===x.length?e():e("span",{},x)}if("a"===this.tag)k.on=w,k.attrs={href:d,"aria-current":T};else{var O=function e(t){var n;if(t)for(var a=0;a-1&&(o.params[c]=n.params[c]);return o.path=z(l.path,o.params),d(l,o,s)}if(o.path){o.params={};for(var f=0;f=e.length?n():e[r]?t(e[r],(function(){a(r+1)})):a(r+1)};a(0)}var Te={redirected:2,aborted:4,cancelled:8,duplicated:16};function _e(e,t){return ke(e,t,Te.redirected,'Redirected when going from "'+e.fullPath+'" to "'+function(e){if("string"==typeof e)return e;if("path"in e)return e.path;var t={};return xe.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}(t)+'" via a navigation guard.')}function we(e,t){return ke(e,t,Te.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function ke(e,t,n,a){var r=new Error(a);return r._isRouter=!0,r.from=e,r.to=t,r.type=n,r}var xe=["params","query","hash"];function Oe(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function Ae(e,t){return Oe(e)&&e._isRouter&&(null==t||e.type===t)}function Ce(e){return function(t,n,a){var r=!1,i=0,s=null;Se(e,(function(e,t,n,o){if("function"==typeof e&&void 0===e.cid){r=!0,i++;var d,u=Re((function(t){var r;((r=t).__esModule||Me&&"Module"===r[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:W.extend(t),n.components[o]=t,--i<=0&&a()})),l=Re((function(e){var t="Failed to resolve async component "+o+": "+e;s||(s=Oe(e)?e:new Error(t),a(s))}));try{d=e(u,l)}catch(e){l(e)}if(d)if("function"==typeof d.then)d.then(u,l);else{var p=d.component;p&&"function"==typeof p.then&&p.then(u,l)}}})),r||a()}}function Se(e,t){return $e(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function $e(e){return Array.prototype.concat.apply([],e)}var Me="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Re(e){var t=!1;return function(){for(var n=[],a=arguments.length;a--;)n[a]=arguments[a];if(!t)return t=!0,e.apply(this,n)}}var Ie=function(e,t){this.router=e,this.base=function(e){if(!e)if(G){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=h,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Ee(e,t,n,a){var r=Se(e,(function(e,a,r,i){var s=function(e,t){"function"!=typeof e&&(e=W.extend(e));return e.options[t]}(e,t);if(s)return Array.isArray(s)?s.map((function(e){return n(e,a,r,i)})):n(s,a,r,i)}));return $e(a?r.reverse():r)}function De(e,t){if(t)return function(){return e.apply(t,arguments)}}Ie.prototype.listen=function(e){this.cb=e},Ie.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Ie.prototype.onError=function(e){this.errorCbs.push(e)},Ie.prototype.transitionTo=function(e,t,n){var a,r=this;try{a=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var i=this.current;this.confirmTransition(a,(function(){r.updateRoute(a),t&&t(a),r.ensureURL(),r.router.afterHooks.forEach((function(e){e&&e(a,i)})),r.ready||(r.ready=!0,r.readyCbs.forEach((function(e){e(a)})))}),(function(e){n&&n(e),e&&!r.ready&&(Ae(e,Te.redirected)&&i===h||(r.ready=!0,r.readyErrorCbs.forEach((function(t){t(e)}))))}))},Ie.prototype.confirmTransition=function(e,t,n){var a=this,r=this.current;this.pending=e;var i,s,o=function(e){!Ae(e)&&Oe(e)&&(a.errorCbs.length?a.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},d=e.matched.length-1,u=r.matched.length-1;if(b(e,r)&&d===u&&e.matched[d]===r.matched[u])return this.ensureURL(),o(((s=ke(i=r,e,Te.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",s));var l=function(e,t){var n,a=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,a=he&&n;a&&this.listeners.push(se());var r=function(){var n=e.current,r=Ve(e.base);e.current===h&&r===e._startLocation||e.transitionTo(r,(function(e){a&&oe(t,e,n,!0)}))};window.addEventListener("popstate",r),this.listeners.push((function(){window.removeEventListener("popstate",r)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){ve(O(a.base+e.fullPath)),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){ge(O(a.base+e.fullPath)),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Ve(this.base)!==this.current.fullPath){var t=O(this.base+this.current.fullPath);e?ve(t):ge(t)}},t.prototype.getCurrentLocation=function(){return Ve(this.base)},t}(Ie);function Ve(e){var t=window.location.pathname;return e&&0===t.toLowerCase().indexOf(e.toLowerCase())&&(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Le=function(e){function t(t,n,a){e.call(this,t,n),a&&function(e){var t=Ve(e);if(!/^\/#/.test(t))return window.location.replace(O(e+"/#"+t)),!0}(this.base)||Fe()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=he&&t;n&&this.listeners.push(se());var a=function(){var t=e.current;Fe()&&e.transitionTo(Pe(),(function(a){n&&oe(e.router,a,t,!0),he||Ue(a.fullPath)}))},r=he?"popstate":"hashchange";window.addEventListener(r,a),this.listeners.push((function(){window.removeEventListener(r,a)}))}},t.prototype.push=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){Be(e.fullPath),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){Ue(e.fullPath),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Pe()!==t&&(e?Be(t):Ue(t))},t.prototype.getCurrentLocation=function(){return Pe()},t}(Ie);function Fe(){var e=Pe();return"/"===e.charAt(0)||(Ue("/"+e),!1)}function Pe(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Ne(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Be(e){he?ve(Ne(e)):window.location.hash=e}function Ue(e){he?ge(Ne(e)):window.location.replace(Ne(e))}var ze=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index+1).concat(e),a.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var a=this.stack[n];this.confirmTransition(a,(function(){var e=t.current;t.index=n,t.updateRoute(a),t.router.afterHooks.forEach((function(t){t&&t(a,e)}))}),(function(e){Ae(e,Te.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Ie),He=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Y(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!he&&!1!==e.fallback,this.fallback&&(t="hash"),G||(t="abstract"),this.mode=t,t){case"history":this.history=new je(this,e.base);break;case"hash":this.history=new Le(this,e.base,this.fallback);break;case"abstract":this.history=new ze(this,e.base);break;default:0}},We={currentRoute:{configurable:!0}};function qe(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}He.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},We.currentRoute.get=function(){return this.history&&this.history.current},He.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof je||n instanceof Le){var a=function(e){n.setupListeners(),function(e){var a=n.current,r=t.options.scrollBehavior;he&&r&&"fullPath"in e&&oe(t,e,a,!1)}(e)};n.transitionTo(n.getCurrentLocation(),a,a)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},He.prototype.beforeEach=function(e){return qe(this.beforeHooks,e)},He.prototype.beforeResolve=function(e){return qe(this.resolveHooks,e)},He.prototype.afterEach=function(e){return qe(this.afterHooks,e)},He.prototype.onReady=function(e,t){this.history.onReady(e,t)},He.prototype.onError=function(e){this.history.onError(e)},He.prototype.push=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.push(e,t,n)}));this.history.push(e,t,n)},He.prototype.replace=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.replace(e,t,n)}));this.history.replace(e,t,n)},He.prototype.go=function(e){this.history.go(e)},He.prototype.back=function(){this.go(-1)},He.prototype.forward=function(){this.go(1)},He.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},He.prototype.resolve=function(e,t,n){var a=H(e,t=t||this.history.current,n,this),r=this.match(a,t),i=r.redirectedFrom||r.fullPath;return{location:a,route:r,href:function(e,t,n){var a="hash"===n?"#"+t:t;return e?O(e+"/"+a):a}(this.history.base,i,this.mode),normalizedTo:a,resolved:r}},He.prototype.getRoutes=function(){return this.matcher.getRoutes()},He.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},He.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(He.prototype,We),He.install=function e(t){if(!e.installed||W!==t){e.installed=!0,W=t;var n=function(e){return void 0!==e},a=function(e,t){var a=e.$options._parentVnode;n(a)&&n(a=a.data)&&n(a=a.registerRouteInstance)&&a(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,a(this,this)},destroyed:function(){a(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",w),t.component("RouterLink",K);var r=t.config.optionMergeStrategies;r.beforeRouteEnter=r.beforeRouteLeave=r.beforeRouteUpdate=r.created}},He.version="3.5.1",He.isNavigationFailure=Ae,He.NavigationFailureType=Te,He.START_LOCATION=h,G&&window.Vue&&window.Vue.use(He);var Ke=He,Je=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"min-h-screen bg-gray-100 px-4 pt-6"},[t("router-view")],1)};Je._withStripped=!0;n(4);function Ge(e,t,n,a,r,i,s,o){var d,u="function"==typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),a&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),s?(d=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),r&&r.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(s)},u._ssrRegister=d):r&&(d=o?function(){r.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:r),d)if(u.functional){u._injectStyles=d;var l=u.render;u.render=function(e,t){return d.call(t),l(e,t)}}else{var p=u.beforeCreate;u.beforeCreate=p?[].concat(p,d):[d]}return{exports:e,options:u}}var Xe=Ge({},Je,[],!1,null,null,null);Xe.options.__file="node_modules/hardhat-docgen/src/App.vue";var Ze=Xe.exports,Ye=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("HeaderBar"),e._v(" "),n("div",{staticClass:"pb-32"},[n("div",{staticClass:"space-y-4"},[n("span",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.source)+"\n ")]),e._v(" "),n("h1",{staticClass:"text-xl"},[e._v("\n "+e._s(e.json.name)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.title)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.author)+"\n ")]),e._v(" "),n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))])]),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.hasOwnProperty("constructor")?n("Member",{attrs:{json:e.json.constructor}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.receive?n("Member",{attrs:{json:e.json.receive}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.fallback?n("Member",{attrs:{json:e.json.fallback}}):e._e()],1),e._v(" "),e.json.events?n("MemberSet",{attrs:{title:"Events",json:e.json.events}}):e._e(),e._v(" "),e.json.stateVariables?n("MemberSet",{attrs:{title:"State Variables",json:e.json.stateVariables}}):e._e(),e._v(" "),e.json.methods?n("MemberSet",{attrs:{title:"Methods",json:e.json.methods}}):e._e()],1),e._v(" "),n("FooterBar")],1)};Ye._withStripped=!0;var Qe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"bg-gray-100 fixed bottom-0 right-0 w-full border-t border-dashed border-gray-300"},[n("div",{staticClass:"w-full text-center py-2 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("button",{staticClass:"py-1 px-2 text-gray-500",on:{click:function(t){return e.openLink(e.repository)}}},[e._v("\n built with "+e._s(e.name)+"\n ")])])])};Qe._withStripped=!0;var et=n(2),tt=Ge({data:function(){return{repository:et.b,name:et.a}},methods:{openLink(e){window.open(e,"_blank")}}},Qe,[],!1,null,null,null);tt.options.__file="node_modules/hardhat-docgen/src/components/FooterBar.vue";var nt=tt.exports,at=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full border-b border-dashed py-2 border-gray-300"},[t("router-link",{staticClass:"py-2 text-gray-500",attrs:{to:"/"}},[this._v("\n <- Go back\n ")])],1)};at._withStripped=!0;var rt=Ge({},at,[],!1,null,null,null);rt.options.__file="node_modules/hardhat-docgen/src/components/HeaderBar.vue";var it=rt.exports,st=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"border-2 border-gray-400 border-dashed w-full p-2"},[n("h3",{staticClass:"text-lg pb-2 mb-2 border-b-2 border-gray-400 border-dashed"},[e._v("\n "+e._s(e.name)+" "+e._s(e.keywords)+" "+e._s(e.inputSignature)+"\n ")]),e._v(" "),n("div",{staticClass:"space-y-3"},[n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))]),e._v(" "),n("MemberSection",{attrs:{name:"Parameters",items:e.inputs}}),e._v(" "),n("MemberSection",{attrs:{name:"Return Values",items:e.outputs}})],1)])};st._withStripped=!0;var ot=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.items.length>0?n("ul",[n("h4",{staticClass:"text-lg"},[e._v("\n "+e._s(e.name)+"\n ")]),e._v(" "),e._l(e.items,(function(t,a){return n("li",{key:a},[n("span",{staticClass:"bg-gray-300"},[e._v(e._s(t.type))]),e._v(" "),n("b",[e._v(e._s(t.name||"_"+a))]),t.desc?n("span",[e._v(": "),n("i",[e._v(e._s(t.desc))])]):e._e()])}))],2):e._e()};ot._withStripped=!0;var dt=Ge({props:{name:{type:String,default:""},items:{type:Array,default:()=>new Array}}},ot,[],!1,null,null,null);dt.options.__file="node_modules/hardhat-docgen/src/components/MemberSection.vue";var ut=Ge({components:{MemberSection:dt.exports},props:{json:{type:Object,default:()=>new Object}},computed:{name:function(){return this.json.name||this.json.type},keywords:function(){let e=[];return this.json.stateMutability&&e.push(this.json.stateMutability),"true"===this.json.anonymous&&e.push("anonymous"),e.join(" ")},params:function(){return this.json.params||{}},returns:function(){return this.json.returns||{}},inputs:function(){return(this.json.inputs||[]).map(e=>({...e,desc:this.params[e.name]}))},inputSignature:function(){return`(${this.inputs.map(e=>e.type).join(",")})`},outputs:function(){return(this.json.outputs||[]).map((e,t)=>({...e,desc:this.returns[e.name||"_"+t]}))},outputSignature:function(){return`(${this.outputs.map(e=>e.type).join(",")})`}}},st,[],!1,null,null,null);ut.options.__file="node_modules/hardhat-docgen/src/components/Member.vue";var lt=ut.exports,pt=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full mt-8"},[n("h2",{staticClass:"text-lg"},[e._v(e._s(e.title))]),e._v(" "),e._l(Object.keys(e.json),(function(t){return n("Member",{key:t,staticClass:"mt-3",attrs:{json:e.json[t]}})}))],2)};pt._withStripped=!0;var ct=Ge({components:{Member:lt},props:{title:{type:String,default:""},json:{type:Object,default:()=>new Object}}},pt,[],!1,null,null,null);ct.options.__file="node_modules/hardhat-docgen/src/components/MemberSet.vue";var ft=Ge({components:{Member:lt,MemberSet:ct.exports,HeaderBar:it,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}}},Ye,[],!1,null,null,null);ft.options.__file="node_modules/hardhat-docgen/src/components/Contract.vue";var yt=ft.exports,mt=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto pb-32"},[t("Branch",{attrs:{json:this.trees,name:"Sources:"}}),this._v(" "),t("FooterBar",{staticClass:"mt-20"})],1)};mt._withStripped=!0;var ht=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._v("\n "+e._s(e.name)+"\n "),Array.isArray(e.json)?n("div",{staticClass:"pl-5"},e._l(e.json,(function(t,a){return n("div",{key:a},[n("router-link",{attrs:{to:t.source+":"+t.name}},[e._v("\n "+e._s(t.name)+"\n ")])],1)})),0):n("div",{staticClass:"pl-5"},e._l(Object.keys(e.json),(function(t){return n("div",{key:t},[n("Branch",{attrs:{json:e.json[t],name:t}})],1)})),0)])};ht._withStripped=!0;var vt=Ge({name:"Branch",props:{name:{type:String,default:null},json:{type:[Object,Array],default:()=>new Object}}},ht,[],!1,null,null,null);vt.options.__file="node_modules/hardhat-docgen/src/components/Branch.vue";var gt=Ge({components:{Branch:vt.exports,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}},computed:{trees:function(){let e={};for(let t in this.json)t.split(/(?<=\/)/).reduce(function(e,n){if(!n.includes(":"))return e[n]=e[n]||{},e[n];{let[a]=n.split(":");e[a]=e[a]||[],e[a].push(this.json[t])}}.bind(this),e);return e}}},mt,[],!1,null,null,null);gt.options.__file="node_modules/hardhat-docgen/src/components/Index.vue";var bt=gt.exports;a.a.use(Ke);const Tt={"contracts/Interfaces/IERC20.sol:IERC20":{source:"contracts/Interfaces/IERC20.sol",name:"IERC20",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"_owner",type:"address"},{internalType:"address",name:"_spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_spender",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"_who",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_from",type:"address"},{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Interfaces/ILockedFund.sol:ILockedFund":{source:"contracts/Interfaces/ILockedFund.sol",name:"ILockedFund",title:"An interface of Locked Fund Contract.",author:"Franklin Richards - powerhousefrank@protonmail.com",methods:{"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositVested(address,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point)which determines how much will be unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawAndStakeTokensFrom(address)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"}],name:"withdrawAndStakeTokensFrom",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_userAddress:"The address of user tokens will be withdrawn."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Interfaces/IOrigins.sol:IOrigins":{source:"contracts/Interfaces/IOrigins.sol",name:"IOrigins",title:"Interface of the Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com"},"contracts/Interfaces/IVestingLogic.sol:IVestingLogic":{source:"contracts/Interfaces/IVestingLogic.sol",name:"IVestingLogic",notice:"TODO",methods:{"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"stakeTokens(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"The amount of tokens to stake."},notice:"Stakes tokens according to the vesting schedule."},"withdrawTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"}],name:"withdrawTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{receiver:"The receiving address."},notice:"Withdraws unlocked tokens from the staking contract and forwards them to an address specified by the token owner."}}},"contracts/Interfaces/IVestingLogic.sol:VestingStorage":{source:"contracts/Interfaces/IVestingLogic.sol",name:"VestingStorage",title:"Vesting Storage Contract (Incomplete).",notice:"This contract is just the required storage fromm vesting for LockedFund.",methods:{"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Interfaces/IVestingRegistry.sol:IVestingRegistry":{source:"contracts/Interfaces/IVestingRegistry.sol",name:"IVestingRegistry",notice:"TODO",methods:{"createVesting(address,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"}],name:"createVesting",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount to be staked",_cliff:"the cliff in seconds",_duration:"the total duration in seconds",_tokenOwner:"the owner of the tokens"},notice:"creates Vesting contract"},"getVesting(address)":{constant:!0,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"}],name:"getVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",params:{_tokenOwner:"the owner of the tokens"},notice:"returns vesting contract address for the given token owner"},"stakeTokens(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_vesting",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount of tokens to stake",_vesting:"the address of Vesting contract"},notice:"stakes tokens according to the vesting schedule"}}},"contracts/LockedFund.sol:LockedFund":{source:"contracts/LockedFund.sol",name:"LockedFund",title:"A holding contract for Locked Fund.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"This is not the final form of this contract.",notice:"You can use this contract for timed token release from Locked Fund.",constructor:{inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"},{internalType:"address",name:"_token",type:"address"},{internalType:"address",name:"_vestingRegistry",type:"address"},{internalType:"address[]",name:"_admins",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AdminAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_newAdmin",type:"address"}],name:"AdminAdded",type:"event"},"AdminRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_removedAdmin",type:"address"}],name:"AdminRemoved",type:"event"},"TokenStaked(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"TokenStaked",type:"event"},"VestedDeposited(address,address,uint256,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_cliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_duration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"VestedDeposited",type:"event"},"VestingCreated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"}],name:"VestingCreated",type:"event"},"VestingRegistryUpdated(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vestingRegistry",type:"address"}],name:"VestingRegistryUpdated",type:"event"},"WaitedTSUpdated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"WaitedTSUpdated",type:"event"},"Withdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"Withdrawn",type:"event"}},methods:{"INTERVAL()":{constant:!0,inputs:[],name:"INTERVAL",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"_removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"_removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"Internal function to remove an admin."},"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"adminStatus(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"adminStatus",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the admin status."},return:"_status True if admin, False otherwise.",notice:"The function to check is an address is admin or not."},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"cliff(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositVested(address,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point)which determines how much will be unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"duration(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"getCliffAndDuration(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getCliffAndDuration",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address whose cliff and duration has to be found."},return:"The cliff of the user vesting/lock.The duration of the user vesting/lock.",notice:"Function to read the cliff and duration of a user."},"getLockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getLockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the locked balance."},return:"_balance The locked balance of the address `_addr`.",notice:"The function to get the locked balance of a user."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the unlocked balance."},return:"_balance The unlocked balance of the address `_addr`.",notice:"The function to get the unlocked balance of a user."},"getVestingDetails()":{constant:!0,inputs:[],name:"getVestingDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Vesting Registry.",notice:"Function to read the vesting registry."},"getWaitedTS()":{constant:!0,inputs:[],name:"getWaitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The waited timestamp.",notice:"Function to read the waited timestamp."},"getWaitedUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getWaitedUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the waited unlocked balance."},return:"_balance The waited unlocked balance of the address `_addr`.",notice:"The function to get the waited unlocked balance of a user."},"isAdmin(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"isAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"lockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"lockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"token()":{constant:!0,inputs:[],name:"token",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"unlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"unlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"vestedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the vested balance."},return:"_balance The vested balance of the address `_addr`.",notice:"The function to get the vested balance of a user."},"vestedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestingRegistry()":{constant:!0,inputs:[],name:"vestingRegistry",outputs:[{internalType:"contract IVestingRegistry",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"waitedTS()":{constant:!0,inputs:[],name:"waitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"waitedUnlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"waitedUnlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawAndStakeTokensFrom(address)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"}],name:"withdrawAndStakeTokensFrom",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_userAddress:"The address of user tokens will be withdrawn."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Openzeppelin/Address.sol:Address":{source:"contracts/Openzeppelin/Address.sol",name:"Address",details:"Collection of functions related to the address type"},"contracts/Openzeppelin/Context.sol:Context":{source:"contracts/Openzeppelin/Context.sol",name:"Context",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"}},"contracts/Openzeppelin/ERC20.sol:ERC20":{source:"contracts/Openzeppelin/ERC20.sol",name:"ERC20",details:"Implementation of the {IERC20} interface. * This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20Mintable}. * TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. * We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. * Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-allowance}."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-approve}.\t * Requirements:\t * - `spender` cannot be the zero address."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-balanceOf}."},"decreaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically decreases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically increases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-totalSupply}."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transfer}.\t * Requirements:\t * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transferFrom}.\t * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20};\t * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for `sender`'s tokens of at least `amount`."}}},"contracts/Openzeppelin/ERC20Detailed.sol:ERC20Detailed":{source:"contracts/Openzeppelin/ERC20Detailed.sol",name:"ERC20Detailed",details:"Optional functions from the ERC20 standard.",constructor:{inputs:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint8",name:"decimals",type:"uint8"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default.\t * This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Sets `amount` as the allowance of `spender` over the caller's tokens.\t * Returns a boolean value indicating whether the operation succeeded.\t * IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\t * Emits an {Approval} event."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens owned by `account`."},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\t * Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\t * NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the name of the token."},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens in existence."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from the caller's account to `recipient`.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."}}},"contracts/Openzeppelin/IERC20_.sol:IERC20_":{source:"contracts/Openzeppelin/IERC20_.sol",name:"IERC20_",details:"Interface of the ERC20 standard as defined in the EIP. Does not include the optional functions; to access them see {ERC20Detailed}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default.\t * This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Sets `amount` as the allowance of `spender` over the caller's tokens.\t * Returns a boolean value indicating whether the operation succeeded.\t * IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\t * Emits an {Approval} event."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens owned by `account`."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens in existence."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from the caller's account to `recipient`.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."}}},"contracts/Openzeppelin/Ownable.sol:Ownable":{source:"contracts/Openzeppelin/Ownable.sol",name:"Ownable",details:"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. * This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"contracts/Openzeppelin/ReentrancyGuard.sol:ReentrancyGuard":{source:"contracts/Openzeppelin/ReentrancyGuard.sol",name:"ReentrancyGuard",title:"Helps contracts guard against reentrancy attacks.",author:"Remco Bloemen , Eenae ",details:"If you mark a function `nonReentrant`, you should also mark it `external`."},"contracts/Openzeppelin/SafeMath.sol:SafeMath":{source:"contracts/Openzeppelin/SafeMath.sol",name:"SafeMath",details:"Wrappers over Solidity's arithmetic operations with added overflow checks. * Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. * Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always."},"contracts/OriginsAdmin.sol:OriginsAdmin":{source:"contracts/OriginsAdmin.sol",name:"OriginsAdmin",title:"An owner contract with granular access for multiple parties.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"To add a new role, add the corresponding array and mapping, along with add, remove and get functions.",notice:"You can use this contract for creating multiple owners with different access.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsBase.sol:OriginsBase":{source:"contracts/OriginsBase.sol",name:"OriginsBase",title:"A contract for Origins platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"You can use this contract for creating a sale in the Origins Platform.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"},{internalType:"address payable",name:"_depositAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!1,internalType:"address",name:"_depositToken",type:"address"},{indexed:!0,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"addressVerification(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"addressVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tier for which the address has to be verified."},notice:"Function to verify a single address with a single tier."},"buy(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"buy",outputs:[],payable:!0,stateMutability:"payable",type:"function",details:"If deposit type if RBTC, then _amount can be passed as zero.",params:{_amount:"The amount of token (deposit asset) which will be sent for purchasing.",_tierID:"The Tier ID from which the token has to be bought."},notice:"Function to buy tokens from sale based on tier."},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkSaleEnded(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"checkSaleEnded",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"A return of false does not necessary mean the sale is active. It can also be in inactive state.",params:{_tierID:"The Tier whose info is to be read."},return:"True is sale ended, False otherwise.",notice:"Function to check if a tier sale ended or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"createTier(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint8,uint8,uint8,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"createTier",outputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this should be decoupled.",params:{_depositRate:"Contains the rate of the token w.r.t. the depositing asset.",_depositToken:"Contains the deposit token address if the deposit type is Token.",_remainingTokens:"Contains the remaining tokens for sale.",_saleEnd:"Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens.",_saleEndDurationOrTS:"Contains whether end of sale is by Duration or Timestamp.",_saleStartTS:"Contains the timestamp for the sale to start. Before which no user will be able to buy tokens.",_transferType:"Contains the type of token transfer after a user buys to get the tokens.",_unlockedBP:"Contains the unlock amount in Basis Point for Vesting/Lock.",_unlockedTokenWithdrawTS:"Contains the timestamp for the waited unlocked tokens to be withdrawn.",_verificationType:"Contains the method by which verification happens.",_vestOrLockCliff:"Contains the cliff of the vesting/lock for distribution.",_vestOrLockDuration:"Contains the duration of the vesting/lock for distribution."},return:"_tierID The newly created tier ID.",notice:"Function to create a new tier."},"getDepositAddress()":{constant:!0,inputs:[],name:"getDepositAddress",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"If zero is returned, any of the owners can withdraw the raised funds.",return:"The address of the deposit address.",notice:"Function to read the deposit address."},"getLockDetails()":{constant:!0,inputs:[],name:"getLockDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Locked Fund Contract.",notice:"Function to read the locked fund contract address."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getParticipatingWalletCountPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getParticipatingWalletCountPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Total participation of wallets cannot be determined by this. A user can participate on one round and not on other. In the future maybe a count on that can be created.",params:{_tierID:"The tier ID for which the count has to be checked."},return:"The number of wallets who participated in that Tier.",notice:"Function to read participating wallet count per tier."},"getTierCount()":{constant:!0,inputs:[],name:"getTierCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The number of tiers present in the contract.",notice:"Function to read the tier count."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getTokensBoughtByAddressOnTier(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensBoughtByAddressOnTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"The amount of tokens bought by the address.",notice:"Function to read tokens bought by an address on a particular tier."},"getTokensSoldPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensSoldPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The tier ID for which the sold metrics has to be checked."},return:"The amount of tokens sold on that tier.",notice:"Function to read tokens sold per tier."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"isAddressApproved(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"isAddressApproved",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"True is allowed, False otherwise.",notice:"Function to read address which are approved for sale in a tier."},"multipleAddressAndTierVerification(address[],uint256[])":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"multipleAddressAndTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tiers for which the addresses has to be verified."},notice:"Function to verify multiple address with multiple tiers."},"multipleAddressSingleTierVerification(address[],uint256)":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"multipleAddressSingleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tier for which the addresses has to be verified."},notice:"Function to verify multiple address with a single tier."},"readTierPartA(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartA",outputs:[{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_minAmount The minimum amount which can be deposited._maxAmount The maximum amount which can be deposited._remainingTokens Contains the remaining tokens for sale._saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens._saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens._unlockedTokenWithdrawTS Contains the timestamp for the waited unlocked tokens to be withdrawn._unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock._vestOrLockCliff Contains the cliff of the vesting/lock for distribution._vestOrLockDuration Contains the duration of the vesting/lock for distribution._depositRate Contains the rate of the token w.r.t. the depositing asset.",notice:"Function to read a Tier parameter."},"readTierPartB(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartB",outputs:[{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_depositToken Contains the deposit token address if the deposit type is Token._depositType The type of deposit for the particular sale._verificationType Contains the method by which verification happens._saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp._transferType Contains the type of token transfer after a user buys to get the tokens.",notice:"Function to read a Tier parameter."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."},"setDepositAddress(address)":{constant:!1,inputs:[{internalType:"address payable",name:"_depositAddress",type:"address"}],name:"setDepositAddress",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party.",params:{_depositAddress:"The address of deposit address where all the raised fund will go."},notice:"Function to set the deposit address."},"setLockedFund(address)":{constant:!1,inputs:[{internalType:"address",name:"_lockedFund",type:"address"}],name:"setLockedFund",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_lockedFund:"The address of new the Vesting registry."},notice:"Function to set the Locked Fund Contract Address."},"setTierDeposit(uint256,uint256,address,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"setTierDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_depositRate:"The rate is the, asset * rate = token.",_depositToken:"The token for that particular Tier Sale.",_depositType:"The type of deposit for the particular sale.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Deposit Parameters."},"setTierTime(uint256,uint256,uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"setTierTime",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_saleEnd:"The Tier Sale End Duration or Timestamp.",_saleEndDurationOrTS:"The Tier Sale End Type for the Tier.",_saleStartTS:"The Tier Sale Start Timestamp.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Time Parameters."},"setTierTokenAmount(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"setTierTokenAmount",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_remainingTokens:"The maximum number of tokens allowed to be sold in the tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Amount Parameters."},"setTierTokenLimit(uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"setTierTokenLimit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_maxAmount:"The maximum asset amount allowed to participate in that tier.",_minAmount:"The minimum asset amount required to participate in that tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Limit Parameters."},"setTierVerification(uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"setTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_verificationType:"The type of verification for the particular sale."},notice:"Function to set the Tier Verification Method."},"setTierVestOrLock(uint256,uint256,uint256,uint256,uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"setTierVestOrLock",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_transferType:"The Tier Transfer Type for the Tier.",_unlockedBP:"The unlocked token amount in BP.",_unlockedTokenWithdrawTS:"The unlocked token withdraw timestamp.",_vestOrLockCliff:"The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff.",_vestOrLockDuration:"The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration."},notice:"Function to set the Tier Vest/Lock Parameters."},"singleAddressMultipleTierVerification(address,uint256[])":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"singleAddressMultipleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tiers for which the address has to be verified."},notice:"Function to verify a single address with multiple tiers."},"withdrawSaleDeposit()":{constant:!1,inputs:[],name:"withdrawSaleDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this could be made to be accessible only to seller, rather than owner.",notice:"The function used by the admin or deposit address to withdraw the sale proceedings."}}},"contracts/OriginsEvents.sol:OriginsEvents":{source:"contracts/OriginsEvents.sol",name:"OriginsEvents",title:"A contract containing all the events of Origins Base.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"You can use this contract for adding events into Origins Base.",events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!1,internalType:"address",name:"_depositToken",type:"address"},{indexed:!0,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsStorage.sol:OriginsStorage":{source:"contracts/OriginsStorage.sol",name:"OriginsStorage",title:"A storage contract for Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"This plays as the harddisk for the Origins Platform.",events:{"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}}},_t=new Ke({routes:[{path:"/",component:bt,props:()=>({json:Tt})},{path:"*",component:yt,props:e=>({json:Tt[e.path.slice(1)]})}]});new a.a({el:"#app",router:_t,mounted(){document.dispatchEvent(new Event("render-event"))},render:e=>e(Ze)})},function(e,t,n){"use strict";function a(e,t){for(var n=[],a={},r=0;rn.parts.length&&(a.parts.length=n.parts.length)}else{var s=[];for(r=0;r=0&&(t=e.slice(a),e=e.slice(0,a));var r=e.indexOf("?");return r>=0&&(n=e.slice(r+1),e=e.slice(0,r)),{path:e,query:n,hash:t}}(i.path||""),l=t&&t.path||"/",f=u.path?x(u.path,l,n||i.append):l,y=function(e,t,n){void 0===t&&(t={});var a,r=n||c;try{a=r(e||"")}catch(e){a={}}for(var i in t){var s=t[i];a[i]=Array.isArray(s)?s.map(p):p(s)}return a}(u.query,i.query,a&&a.options.parseQuery),m=i.hash||u.hash;return m&&"#"!==m.charAt(0)&&(m="#"+m),{_normalized:!0,path:f,query:y,hash:m}}var W,q=function(){},K={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,a=this.$route,i=n.resolve(this.to,a,this.append),s=i.location,o=i.route,d=i.href,u={},p=n.options.linkActiveClass,c=n.options.linkExactActiveClass,l=null==p?"router-link-active":p,m=null==c?"router-link-exact-active":c,h=null==this.activeClass?l:this.activeClass,v=null==this.exactActiveClass?m:this.exactActiveClass,b=o.redirectedFrom?y(null,H(o.redirectedFrom),null,n):o;u[v]=g(a,b,this.exactPath),u[h]=this.exact||this.exactPath?u[v]:function(e,t){return 0===e.path.replace(f,"/").indexOf(t.path.replace(f,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(a,b);var _=u[v]?this.ariaCurrentValue:null,T=function(e){J(e)&&(t.replace?n.replace(s,q):n.push(s,q))},w={click:J};Array.isArray(this.event)?this.event.forEach((function(e){w[e]=T})):w[this.event]=T;var k={class:u},x=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:d,route:o,navigate:T,isActive:u[h],isExactActive:u[v]});if(x){if(1===x.length)return x[0];if(x.length>1||!x.length)return 0===x.length?e():e("span",{},x)}if("a"===this.tag)k.on=w,k.attrs={href:d,"aria-current":_};else{var O=function e(t){var n;if(t)for(var a=0;a-1&&(o.params[l]=n.params[l]);return o.path=z(p.path,o.params),d(p,o,s)}if(o.path){o.params={};for(var f=0;f=e.length?n():e[r]?t(e[r],(function(){a(r+1)})):a(r+1)};a(0)}var _e={redirected:2,aborted:4,cancelled:8,duplicated:16};function Te(e,t){return ke(e,t,_e.redirected,'Redirected when going from "'+e.fullPath+'" to "'+function(e){if("string"==typeof e)return e;if("path"in e)return e.path;var t={};return xe.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}(t)+'" via a navigation guard.')}function we(e,t){return ke(e,t,_e.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function ke(e,t,n,a){var r=new Error(a);return r._isRouter=!0,r.from=e,r.to=t,r.type=n,r}var xe=["params","query","hash"];function Oe(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function Ae(e,t){return Oe(e)&&e._isRouter&&(null==t||e.type===t)}function Ce(e){return function(t,n,a){var r=!1,i=0,s=null;Se(e,(function(e,t,n,o){if("function"==typeof e&&void 0===e.cid){r=!0,i++;var d,u=Re((function(t){var r;((r=t).__esModule||$e&&"Module"===r[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:W.extend(t),n.components[o]=t,--i<=0&&a()})),p=Re((function(e){var t="Failed to resolve async component "+o+": "+e;s||(s=Oe(e)?e:new Error(t),a(s))}));try{d=e(u,p)}catch(e){p(e)}if(d)if("function"==typeof d.then)d.then(u,p);else{var c=d.component;c&&"function"==typeof c.then&&c.then(u,p)}}})),r||a()}}function Se(e,t){return Me(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Me(e){return Array.prototype.concat.apply([],e)}var $e="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Re(e){var t=!1;return function(){for(var n=[],a=arguments.length;a--;)n[a]=arguments[a];if(!t)return t=!0,e.apply(this,n)}}var Ie=function(e,t){this.router=e,this.base=function(e){if(!e)if(G){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=h,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Ee(e,t,n,a){var r=Se(e,(function(e,a,r,i){var s=function(e,t){"function"!=typeof e&&(e=W.extend(e));return e.options[t]}(e,t);if(s)return Array.isArray(s)?s.map((function(e){return n(e,a,r,i)})):n(s,a,r,i)}));return Me(a?r.reverse():r)}function De(e,t){if(t)return function(){return e.apply(t,arguments)}}Ie.prototype.listen=function(e){this.cb=e},Ie.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Ie.prototype.onError=function(e){this.errorCbs.push(e)},Ie.prototype.transitionTo=function(e,t,n){var a,r=this;try{a=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var i=this.current;this.confirmTransition(a,(function(){r.updateRoute(a),t&&t(a),r.ensureURL(),r.router.afterHooks.forEach((function(e){e&&e(a,i)})),r.ready||(r.ready=!0,r.readyCbs.forEach((function(e){e(a)})))}),(function(e){n&&n(e),e&&!r.ready&&(Ae(e,_e.redirected)&&i===h||(r.ready=!0,r.readyErrorCbs.forEach((function(t){t(e)}))))}))},Ie.prototype.confirmTransition=function(e,t,n){var a=this,r=this.current;this.pending=e;var i,s,o=function(e){!Ae(e)&&Oe(e)&&(a.errorCbs.length?a.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},d=e.matched.length-1,u=r.matched.length-1;if(g(e,r)&&d===u&&e.matched[d]===r.matched[u])return this.ensureURL(),o(((s=ke(i=r,e,_e.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",s));var p=function(e,t){var n,a=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,a=he&&n;a&&this.listeners.push(se());var r=function(){var n=e.current,r=Ve(e.base);e.current===h&&r===e._startLocation||e.transitionTo(r,(function(e){a&&oe(t,e,n,!0)}))};window.addEventListener("popstate",r),this.listeners.push((function(){window.removeEventListener("popstate",r)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){ve(O(a.base+e.fullPath)),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){be(O(a.base+e.fullPath)),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Ve(this.base)!==this.current.fullPath){var t=O(this.base+this.current.fullPath);e?ve(t):be(t)}},t.prototype.getCurrentLocation=function(){return Ve(this.base)},t}(Ie);function Ve(e){var t=window.location.pathname;return e&&0===t.toLowerCase().indexOf(e.toLowerCase())&&(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Le=function(e){function t(t,n,a){e.call(this,t,n),a&&function(e){var t=Ve(e);if(!/^\/#/.test(t))return window.location.replace(O(e+"/#"+t)),!0}(this.base)||Fe()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=he&&t;n&&this.listeners.push(se());var a=function(){var t=e.current;Fe()&&e.transitionTo(Pe(),(function(a){n&&oe(e.router,a,t,!0),he||Ue(a.fullPath)}))},r=he?"popstate":"hashchange";window.addEventListener(r,a),this.listeners.push((function(){window.removeEventListener(r,a)}))}},t.prototype.push=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){Be(e.fullPath),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){Ue(e.fullPath),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Pe()!==t&&(e?Be(t):Ue(t))},t.prototype.getCurrentLocation=function(){return Pe()},t}(Ie);function Fe(){var e=Pe();return"/"===e.charAt(0)||(Ue("/"+e),!1)}function Pe(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Ne(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Be(e){he?ve(Ne(e)):window.location.hash=e}function Ue(e){he?be(Ne(e)):window.location.replace(Ne(e))}var ze=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index+1).concat(e),a.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var a=this.stack[n];this.confirmTransition(a,(function(){var e=t.current;t.index=n,t.updateRoute(a),t.router.afterHooks.forEach((function(t){t&&t(a,e)}))}),(function(e){Ae(e,_e.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Ie),He=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Y(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!he&&!1!==e.fallback,this.fallback&&(t="hash"),G||(t="abstract"),this.mode=t,t){case"history":this.history=new je(this,e.base);break;case"hash":this.history=new Le(this,e.base,this.fallback);break;case"abstract":this.history=new ze(this,e.base);break;default:0}},We={currentRoute:{configurable:!0}};function qe(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}He.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},We.currentRoute.get=function(){return this.history&&this.history.current},He.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof je||n instanceof Le){var a=function(e){n.setupListeners(),function(e){var a=n.current,r=t.options.scrollBehavior;he&&r&&"fullPath"in e&&oe(t,e,a,!1)}(e)};n.transitionTo(n.getCurrentLocation(),a,a)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},He.prototype.beforeEach=function(e){return qe(this.beforeHooks,e)},He.prototype.beforeResolve=function(e){return qe(this.resolveHooks,e)},He.prototype.afterEach=function(e){return qe(this.afterHooks,e)},He.prototype.onReady=function(e,t){this.history.onReady(e,t)},He.prototype.onError=function(e){this.history.onError(e)},He.prototype.push=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.push(e,t,n)}));this.history.push(e,t,n)},He.prototype.replace=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.replace(e,t,n)}));this.history.replace(e,t,n)},He.prototype.go=function(e){this.history.go(e)},He.prototype.back=function(){this.go(-1)},He.prototype.forward=function(){this.go(1)},He.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},He.prototype.resolve=function(e,t,n){var a=H(e,t=t||this.history.current,n,this),r=this.match(a,t),i=r.redirectedFrom||r.fullPath;return{location:a,route:r,href:function(e,t,n){var a="hash"===n?"#"+t:t;return e?O(e+"/"+a):a}(this.history.base,i,this.mode),normalizedTo:a,resolved:r}},He.prototype.getRoutes=function(){return this.matcher.getRoutes()},He.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},He.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(He.prototype,We),He.install=function e(t){if(!e.installed||W!==t){e.installed=!0,W=t;var n=function(e){return void 0!==e},a=function(e,t){var a=e.$options._parentVnode;n(a)&&n(a=a.data)&&n(a=a.registerRouteInstance)&&a(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,a(this,this)},destroyed:function(){a(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",w),t.component("RouterLink",K);var r=t.config.optionMergeStrategies;r.beforeRouteEnter=r.beforeRouteLeave=r.beforeRouteUpdate=r.created}},He.version="3.5.1",He.isNavigationFailure=Ae,He.NavigationFailureType=_e,He.START_LOCATION=h,G&&window.Vue&&window.Vue.use(He);var Ke=He,Je=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"min-h-screen bg-gray-100 px-4 pt-6"},[t("router-view")],1)};Je._withStripped=!0;n(4);function Ge(e,t,n,a,r,i,s,o){var d,u="function"==typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),a&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),s?(d=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),r&&r.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(s)},u._ssrRegister=d):r&&(d=o?function(){r.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:r),d)if(u.functional){u._injectStyles=d;var p=u.render;u.render=function(e,t){return d.call(t),p(e,t)}}else{var c=u.beforeCreate;u.beforeCreate=c?[].concat(c,d):[d]}return{exports:e,options:u}}var Xe=Ge({},Je,[],!1,null,null,null);Xe.options.__file="node_modules/hardhat-docgen/src/App.vue";var Ze=Xe.exports,Ye=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("HeaderBar"),e._v(" "),n("div",{staticClass:"pb-32"},[n("div",{staticClass:"space-y-4"},[n("span",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.source)+"\n ")]),e._v(" "),n("h1",{staticClass:"text-xl"},[e._v("\n "+e._s(e.json.name)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.title)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.author)+"\n ")]),e._v(" "),n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))])]),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.hasOwnProperty("constructor")?n("Member",{attrs:{json:e.json.constructor}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.receive?n("Member",{attrs:{json:e.json.receive}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.fallback?n("Member",{attrs:{json:e.json.fallback}}):e._e()],1),e._v(" "),e.json.events?n("MemberSet",{attrs:{title:"Events",json:e.json.events}}):e._e(),e._v(" "),e.json.stateVariables?n("MemberSet",{attrs:{title:"State Variables",json:e.json.stateVariables}}):e._e(),e._v(" "),e.json.methods?n("MemberSet",{attrs:{title:"Methods",json:e.json.methods}}):e._e()],1),e._v(" "),n("FooterBar")],1)};Ye._withStripped=!0;var Qe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"bg-gray-100 fixed bottom-0 right-0 w-full border-t border-dashed border-gray-300"},[n("div",{staticClass:"w-full text-center py-2 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("button",{staticClass:"py-1 px-2 text-gray-500",on:{click:function(t){return e.openLink(e.repository)}}},[e._v("\n built with "+e._s(e.name)+"\n ")])])])};Qe._withStripped=!0;var et=n(2),tt=Ge({data:function(){return{repository:et.b,name:et.a}},methods:{openLink(e){window.open(e,"_blank")}}},Qe,[],!1,null,null,null);tt.options.__file="node_modules/hardhat-docgen/src/components/FooterBar.vue";var nt=tt.exports,at=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full border-b border-dashed py-2 border-gray-300"},[t("router-link",{staticClass:"py-2 text-gray-500",attrs:{to:"/"}},[this._v("\n <- Go back\n ")])],1)};at._withStripped=!0;var rt=Ge({},at,[],!1,null,null,null);rt.options.__file="node_modules/hardhat-docgen/src/components/HeaderBar.vue";var it=rt.exports,st=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"border-2 border-gray-400 border-dashed w-full p-2"},[n("h3",{staticClass:"text-lg pb-2 mb-2 border-b-2 border-gray-400 border-dashed"},[e._v("\n "+e._s(e.name)+" "+e._s(e.keywords)+" "+e._s(e.inputSignature)+"\n ")]),e._v(" "),n("div",{staticClass:"space-y-3"},[n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))]),e._v(" "),n("MemberSection",{attrs:{name:"Parameters",items:e.inputs}}),e._v(" "),n("MemberSection",{attrs:{name:"Return Values",items:e.outputs}})],1)])};st._withStripped=!0;var ot=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.items.length>0?n("ul",[n("h4",{staticClass:"text-lg"},[e._v("\n "+e._s(e.name)+"\n ")]),e._v(" "),e._l(e.items,(function(t,a){return n("li",{key:a},[n("span",{staticClass:"bg-gray-300"},[e._v(e._s(t.type))]),e._v(" "),n("b",[e._v(e._s(t.name||"_"+a))]),t.desc?n("span",[e._v(": "),n("i",[e._v(e._s(t.desc))])]):e._e()])}))],2):e._e()};ot._withStripped=!0;var dt=Ge({props:{name:{type:String,default:""},items:{type:Array,default:()=>new Array}}},ot,[],!1,null,null,null);dt.options.__file="node_modules/hardhat-docgen/src/components/MemberSection.vue";var ut=Ge({components:{MemberSection:dt.exports},props:{json:{type:Object,default:()=>new Object}},computed:{name:function(){return this.json.name||this.json.type},keywords:function(){let e=[];return this.json.stateMutability&&e.push(this.json.stateMutability),"true"===this.json.anonymous&&e.push("anonymous"),e.join(" ")},params:function(){return this.json.params||{}},returns:function(){return this.json.returns||{}},inputs:function(){return(this.json.inputs||[]).map(e=>({...e,desc:this.params[e.name]}))},inputSignature:function(){return`(${this.inputs.map(e=>e.type).join(",")})`},outputs:function(){return(this.json.outputs||[]).map((e,t)=>({...e,desc:this.returns[e.name||"_"+t]}))},outputSignature:function(){return`(${this.outputs.map(e=>e.type).join(",")})`}}},st,[],!1,null,null,null);ut.options.__file="node_modules/hardhat-docgen/src/components/Member.vue";var pt=ut.exports,ct=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full mt-8"},[n("h2",{staticClass:"text-lg"},[e._v(e._s(e.title))]),e._v(" "),e._l(Object.keys(e.json),(function(t){return n("Member",{key:t,staticClass:"mt-3",attrs:{json:e.json[t]}})}))],2)};ct._withStripped=!0;var lt=Ge({components:{Member:pt},props:{title:{type:String,default:""},json:{type:Object,default:()=>new Object}}},ct,[],!1,null,null,null);lt.options.__file="node_modules/hardhat-docgen/src/components/MemberSet.vue";var ft=Ge({components:{Member:pt,MemberSet:lt.exports,HeaderBar:it,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}}},Ye,[],!1,null,null,null);ft.options.__file="node_modules/hardhat-docgen/src/components/Contract.vue";var yt=ft.exports,mt=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto pb-32"},[t("Branch",{attrs:{json:this.trees,name:"Sources:"}}),this._v(" "),t("FooterBar",{staticClass:"mt-20"})],1)};mt._withStripped=!0;var ht=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._v("\n "+e._s(e.name)+"\n "),Array.isArray(e.json)?n("div",{staticClass:"pl-5"},e._l(e.json,(function(t,a){return n("div",{key:a},[n("router-link",{attrs:{to:t.source+":"+t.name}},[e._v("\n "+e._s(t.name)+"\n ")])],1)})),0):n("div",{staticClass:"pl-5"},e._l(Object.keys(e.json),(function(t){return n("div",{key:t},[n("Branch",{attrs:{json:e.json[t],name:t}})],1)})),0)])};ht._withStripped=!0;var vt=Ge({name:"Branch",props:{name:{type:String,default:null},json:{type:[Object,Array],default:()=>new Object}}},ht,[],!1,null,null,null);vt.options.__file="node_modules/hardhat-docgen/src/components/Branch.vue";var bt=Ge({components:{Branch:vt.exports,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}},computed:{trees:function(){let e={};for(let t in this.json)t.split(/(?<=\/)/).reduce(function(e,n){if(!n.includes(":"))return e[n]=e[n]||{},e[n];{let[a]=n.split(":");e[a]=e[a]||[],e[a].push(this.json[t])}}.bind(this),e);return e}}},mt,[],!1,null,null,null);bt.options.__file="node_modules/hardhat-docgen/src/components/Index.vue";var gt=bt.exports;a.a.use(Ke);const _t={"contracts/Interfaces/IERC20.sol:IERC20":{source:"contracts/Interfaces/IERC20.sol",name:"IERC20",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"_owner",type:"address"},{internalType:"address",name:"_spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_spender",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"_who",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"c_0x1be38b5b(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x1be38b5b",type:"bytes32"}],name:"c_0x1be38b5b",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_from",type:"address"},{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Interfaces/ILockedFund.sol:ILockedFund":{source:"contracts/Interfaces/ILockedFund.sol",name:"ILockedFund",title:"An interface of Locked Fund Contract.",author:"Franklin Richards - powerhousefrank@protonmail.com",methods:{"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"c_0x6defa1ca(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x6defa1ca",type:"bytes32"}],name:"c_0x6defa1ca",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositVested(address,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point)which determines how much will be unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawAndStakeTokensFrom(address)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"}],name:"withdrawAndStakeTokensFrom",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_userAddress:"The address of user tokens will be withdrawn."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Interfaces/IOrigins.sol:IOrigins":{source:"contracts/Interfaces/IOrigins.sol",name:"IOrigins",title:"Interface of the Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",methods:{"c_0x2b1a913c(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x2b1a913c",type:"bytes32"}],name:"c_0x2b1a913c",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/Interfaces/IVestingLogic.sol:IVestingLogic":{source:"contracts/Interfaces/IVestingLogic.sol",name:"IVestingLogic",notice:"TODO",methods:{"c_0xa1e8758b(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xa1e8758b",type:"bytes32"}],name:"c_0xa1e8758b",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0xd266dec3(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xd266dec3",type:"bytes32"}],name:"c_0xd266dec3",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"stakeTokens(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"The amount of tokens to stake."},notice:"Stakes tokens according to the vesting schedule."},"withdrawTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"}],name:"withdrawTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{receiver:"The receiving address."},notice:"Withdraws unlocked tokens from the staking contract and forwards them to an address specified by the token owner."}}},"contracts/Interfaces/IVestingLogic.sol:VestingStorage":{source:"contracts/Interfaces/IVestingLogic.sol",name:"VestingStorage",title:"Vesting Storage Contract (Incomplete).",notice:"This contract is just the required storage fromm vesting for LockedFund.",methods:{"c_0xa1e8758b(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xa1e8758b",type:"bytes32"}],name:"c_0xa1e8758b",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Interfaces/IVestingRegistry.sol:IVestingRegistry":{source:"contracts/Interfaces/IVestingRegistry.sol",name:"IVestingRegistry",notice:"TODO",methods:{"c_0x8a4aab55(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8a4aab55",type:"bytes32"}],name:"c_0x8a4aab55",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"createVesting(address,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"}],name:"createVesting",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount to be staked",_cliff:"the cliff in seconds",_duration:"the total duration in seconds",_tokenOwner:"the owner of the tokens"},notice:"creates Vesting contract"},"getVesting(address)":{constant:!0,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"}],name:"getVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",params:{_tokenOwner:"the owner of the tokens"},notice:"returns vesting contract address for the given token owner"},"stakeTokens(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_vesting",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount of tokens to stake",_vesting:"the address of Vesting contract"},notice:"stakes tokens according to the vesting schedule"}}},"contracts/LockedFund.sol:LockedFund":{source:"contracts/LockedFund.sol",name:"LockedFund",title:"A holding contract for Locked Fund.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"This is not the final form of this contract.",notice:"You can use this contract for timed token release from Locked Fund.",constructor:{inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"},{internalType:"address",name:"_token",type:"address"},{internalType:"address",name:"_vestingRegistry",type:"address"},{internalType:"address[]",name:"_admins",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AdminAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_newAdmin",type:"address"}],name:"AdminAdded",type:"event"},"AdminRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_removedAdmin",type:"address"}],name:"AdminRemoved",type:"event"},"TokenStaked(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"TokenStaked",type:"event"},"VestedDeposited(address,address,uint256,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_cliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_duration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"VestedDeposited",type:"event"},"VestingCreated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"}],name:"VestingCreated",type:"event"},"VestingRegistryUpdated(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vestingRegistry",type:"address"}],name:"VestingRegistryUpdated",type:"event"},"WaitedTSUpdated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"WaitedTSUpdated",type:"event"},"Withdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"Withdrawn",type:"event"}},methods:{"INTERVAL()":{constant:!0,inputs:[],name:"INTERVAL",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"_removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"_removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"Internal function to remove an admin."},"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"adminStatus(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"adminStatus",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the admin status."},return:"_status True if admin, False otherwise.",notice:"The function to check is an address is admin or not."},"c_0x6defa1ca(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x6defa1ca",type:"bytes32"}],name:"c_0x6defa1ca",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8dbef84a(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8dbef84a",type:"bytes32"}],name:"c_0x8dbef84a",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"cliff(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositVested(address,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point)which determines how much will be unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"duration(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"getCliffAndDuration(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getCliffAndDuration",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address whose cliff and duration has to be found."},return:"The cliff of the user vesting/lock.The duration of the user vesting/lock.",notice:"Function to read the cliff and duration of a user."},"getLockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getLockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the locked balance."},return:"_balance The locked balance of the address `_addr`.",notice:"The function to get the locked balance of a user."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the unlocked balance."},return:"_balance The unlocked balance of the address `_addr`.",notice:"The function to get the unlocked balance of a user."},"getVestingDetails()":{constant:!0,inputs:[],name:"getVestingDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Vesting Registry.",notice:"Function to read the vesting registry."},"getWaitedTS()":{constant:!0,inputs:[],name:"getWaitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The waited timestamp.",notice:"Function to read the waited timestamp."},"getWaitedUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getWaitedUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the waited unlocked balance."},return:"_balance The waited unlocked balance of the address `_addr`.",notice:"The function to get the waited unlocked balance of a user."},"isAdmin(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"isAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"lockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"lockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"token()":{constant:!0,inputs:[],name:"token",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"unlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"unlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"vestedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the vested balance."},return:"_balance The vested balance of the address `_addr`.",notice:"The function to get the vested balance of a user."},"vestedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestingRegistry()":{constant:!0,inputs:[],name:"vestingRegistry",outputs:[{internalType:"contract IVestingRegistry",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"waitedTS()":{constant:!0,inputs:[],name:"waitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"waitedUnlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"waitedUnlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawAndStakeTokensFrom(address)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"}],name:"withdrawAndStakeTokensFrom",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_userAddress:"The address of user tokens will be withdrawn."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Openzeppelin/Address.sol:Address":{source:"contracts/Openzeppelin/Address.sol",name:"Address",details:"Collection of functions related to the address type",methods:{"c_0xfd43e276(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xfd43e276",type:"bytes32"}],name:"c_0xfd43e276",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/Openzeppelin/Context.sol:Context":{source:"contracts/Openzeppelin/Context.sol",name:"Context",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},methods:{"c_0xdb7cf3fd(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xdb7cf3fd",type:"bytes32"}],name:"c_0xdb7cf3fd",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/Openzeppelin/ERC20.sol:ERC20":{source:"contracts/Openzeppelin/ERC20.sol",name:"ERC20",details:"Implementation of the {IERC20} interface. * This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20Mintable}. * TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. * We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. * Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-allowance}."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-approve}.\t * Requirements:\t * - `spender` cannot be the zero address."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-balanceOf}."},"c_0x42d820d8(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x42d820d8",type:"bytes32"}],name:"c_0x42d820d8",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0xdb7cf3fd(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xdb7cf3fd",type:"bytes32"}],name:"c_0xdb7cf3fd",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"decreaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically decreases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically increases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-totalSupply}."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transfer}.\t * Requirements:\t * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transferFrom}.\t * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20};\t * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for `sender`'s tokens of at least `amount`."}}},"contracts/Openzeppelin/ERC20Detailed.sol:ERC20Detailed":{source:"contracts/Openzeppelin/ERC20Detailed.sol",name:"ERC20Detailed",details:"Optional functions from the ERC20 standard.",constructor:{inputs:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint8",name:"decimals",type:"uint8"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default.\t * This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Sets `amount` as the allowance of `spender` over the caller's tokens.\t * Returns a boolean value indicating whether the operation succeeded.\t * IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\t * Emits an {Approval} event."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens owned by `account`."},"c_0xc9bbb881(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xc9bbb881",type:"bytes32"}],name:"c_0xc9bbb881",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\t * Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\t * NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the name of the token."},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens in existence."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from the caller's account to `recipient`.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."}}},"contracts/Openzeppelin/IERC20_.sol:IERC20_":{source:"contracts/Openzeppelin/IERC20_.sol",name:"IERC20_",details:"Interface of the ERC20 standard as defined in the EIP. Does not include the optional functions; to access them see {ERC20Detailed}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default.\t * This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Sets `amount` as the allowance of `spender` over the caller's tokens.\t * Returns a boolean value indicating whether the operation succeeded.\t * IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\t * Emits an {Approval} event."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens owned by `account`."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens in existence."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from the caller's account to `recipient`.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."}}},"contracts/Openzeppelin/Ownable.sol:Ownable":{source:"contracts/Openzeppelin/Ownable.sol",name:"Ownable",details:"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. * This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"c_0xd8e745d9(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xd8e745d9",type:"bytes32"}],name:"c_0xd8e745d9",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0xdb7cf3fd(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xdb7cf3fd",type:"bytes32"}],name:"c_0xdb7cf3fd",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"contracts/Openzeppelin/ReentrancyGuard.sol:ReentrancyGuard":{source:"contracts/Openzeppelin/ReentrancyGuard.sol",name:"ReentrancyGuard",title:"Helps contracts guard against reentrancy attacks.",author:"Remco Bloemen , Eenae ",details:"If you mark a function `nonReentrant`, you should also mark it `external`.",methods:{"c_0x43034809(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x43034809",type:"bytes32"}],name:"c_0x43034809",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/Openzeppelin/SafeMath.sol:SafeMath":{source:"contracts/Openzeppelin/SafeMath.sol",name:"SafeMath",details:"Wrappers over Solidity's arithmetic operations with added overflow checks. * Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. * Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.",methods:{"c_0x4263dba6(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x4263dba6",type:"bytes32"}],name:"c_0x4263dba6",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/OriginsAdmin.sol:OriginsAdmin":{source:"contracts/OriginsAdmin.sol",name:"OriginsAdmin",title:"An owner contract with granular access for multiple parties.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"To add a new role, add the corresponding array and mapping, along with add, remove and get functions.",notice:"You can use this contract for creating multiple owners with different access.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsBase.sol:OriginsBase":{source:"contracts/OriginsBase.sol",name:"OriginsBase",title:"A contract for Origins platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"You can use this contract for creating a sale in the Origins Platform.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"},{internalType:"address payable",name:"_depositAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!1,internalType:"address",name:"_depositToken",type:"address"},{indexed:!0,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"addressVerification(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"addressVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tier for which the address has to be verified."},notice:"Function to verify a single address with a single tier."},"buy(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"buy",outputs:[],payable:!0,stateMutability:"payable",type:"function",details:"If deposit type if RBTC, then _amount can be passed as zero.",params:{_amount:"The amount of token (deposit asset) which will be sent for purchasing.",_tierID:"The Tier ID from which the token has to be bought."},notice:"Function to buy tokens from sale based on tier."},"c_0x2b1a913c(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x2b1a913c",type:"bytes32"}],name:"c_0x2b1a913c",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x4ad0f1fc(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x4ad0f1fc",type:"bytes32"}],name:"c_0x4ad0f1fc",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x7d365384(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x7d365384",type:"bytes32"}],name:"c_0x7d365384",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkSaleEnded(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"checkSaleEnded",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"A return of false does not necessary mean the sale is active. It can also be in inactive state.",params:{_tierID:"The Tier whose info is to be read."},return:"True is sale ended, False otherwise.",notice:"Function to check if a tier sale ended or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"createTier(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint8,uint8,uint8,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"createTier",outputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this should be decoupled.",params:{_depositRate:"Contains the rate of the token w.r.t. the depositing asset.",_depositToken:"Contains the deposit token address if the deposit type is Token.",_remainingTokens:"Contains the remaining tokens for sale.",_saleEnd:"Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens.",_saleEndDurationOrTS:"Contains whether end of sale is by Duration or Timestamp.",_saleStartTS:"Contains the timestamp for the sale to start. Before which no user will be able to buy tokens.",_transferType:"Contains the type of token transfer after a user buys to get the tokens.",_unlockedBP:"Contains the unlock amount in Basis Point for Vesting/Lock.",_unlockedTokenWithdrawTS:"Contains the timestamp for the waited unlocked tokens to be withdrawn.",_verificationType:"Contains the method by which verification happens.",_vestOrLockCliff:"Contains the cliff of the vesting/lock for distribution.",_vestOrLockDuration:"Contains the duration of the vesting/lock for distribution."},return:"_tierID The newly created tier ID.",notice:"Function to create a new tier."},"getDepositAddress()":{constant:!0,inputs:[],name:"getDepositAddress",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"If zero is returned, any of the owners can withdraw the raised funds.",return:"The address of the deposit address.",notice:"Function to read the deposit address."},"getLockDetails()":{constant:!0,inputs:[],name:"getLockDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Locked Fund Contract.",notice:"Function to read the locked fund contract address."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getParticipatingWalletCountPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getParticipatingWalletCountPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Total participation of wallets cannot be determined by this. A user can participate on one round and not on other. In the future maybe a count on that can be created.",params:{_tierID:"The tier ID for which the count has to be checked."},return:"The number of wallets who participated in that Tier.",notice:"Function to read participating wallet count per tier."},"getTierCount()":{constant:!0,inputs:[],name:"getTierCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The number of tiers present in the contract.",notice:"Function to read the tier count."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getTokensBoughtByAddressOnTier(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensBoughtByAddressOnTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"The amount of tokens bought by the address.",notice:"Function to read tokens bought by an address on a particular tier."},"getTokensSoldPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensSoldPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The tier ID for which the sold metrics has to be checked."},return:"The amount of tokens sold on that tier.",notice:"Function to read tokens sold per tier."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"isAddressApproved(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"isAddressApproved",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"True is allowed, False otherwise.",notice:"Function to read address which are approved for sale in a tier."},"multipleAddressAndTierVerification(address[],uint256[])":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"multipleAddressAndTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tiers for which the addresses has to be verified."},notice:"Function to verify multiple address with multiple tiers."},"multipleAddressSingleTierVerification(address[],uint256)":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"multipleAddressSingleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tier for which the addresses has to be verified."},notice:"Function to verify multiple address with a single tier."},"readTierPartA(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartA",outputs:[{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_minAmount The minimum amount which can be deposited._maxAmount The maximum amount which can be deposited._remainingTokens Contains the remaining tokens for sale._saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens._saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens._unlockedTokenWithdrawTS Contains the timestamp for the waited unlocked tokens to be withdrawn._unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock._vestOrLockCliff Contains the cliff of the vesting/lock for distribution._vestOrLockDuration Contains the duration of the vesting/lock for distribution._depositRate Contains the rate of the token w.r.t. the depositing asset.",notice:"Function to read a Tier parameter."},"readTierPartB(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartB",outputs:[{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_depositToken Contains the deposit token address if the deposit type is Token._depositType The type of deposit for the particular sale._verificationType Contains the method by which verification happens._saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp._transferType Contains the type of token transfer after a user buys to get the tokens.",notice:"Function to read a Tier parameter."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."},"setDepositAddress(address)":{constant:!1,inputs:[{internalType:"address payable",name:"_depositAddress",type:"address"}],name:"setDepositAddress",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party.",params:{_depositAddress:"The address of deposit address where all the raised fund will go."},notice:"Function to set the deposit address."},"setLockedFund(address)":{constant:!1,inputs:[{internalType:"address",name:"_lockedFund",type:"address"}],name:"setLockedFund",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_lockedFund:"The address of new the Vesting registry."},notice:"Function to set the Locked Fund Contract Address."},"setTierDeposit(uint256,uint256,address,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"setTierDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_depositRate:"The rate is the, asset * rate = token.",_depositToken:"The token for that particular Tier Sale.",_depositType:"The type of deposit for the particular sale.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Deposit Parameters."},"setTierTime(uint256,uint256,uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"setTierTime",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_saleEnd:"The Tier Sale End Duration or Timestamp.",_saleEndDurationOrTS:"The Tier Sale End Type for the Tier.",_saleStartTS:"The Tier Sale Start Timestamp.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Time Parameters."},"setTierTokenAmount(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"setTierTokenAmount",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_remainingTokens:"The maximum number of tokens allowed to be sold in the tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Amount Parameters."},"setTierTokenLimit(uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"setTierTokenLimit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_maxAmount:"The maximum asset amount allowed to participate in that tier.",_minAmount:"The minimum asset amount required to participate in that tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Limit Parameters."},"setTierVerification(uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"setTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_verificationType:"The type of verification for the particular sale."},notice:"Function to set the Tier Verification Method."},"setTierVestOrLock(uint256,uint256,uint256,uint256,uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"setTierVestOrLock",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_transferType:"The Tier Transfer Type for the Tier.",_unlockedBP:"The unlocked token amount in BP.",_unlockedTokenWithdrawTS:"The unlocked token withdraw timestamp.",_vestOrLockCliff:"The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff.",_vestOrLockDuration:"The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration."},notice:"Function to set the Tier Vest/Lock Parameters."},"singleAddressMultipleTierVerification(address,uint256[])":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"singleAddressMultipleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tiers for which the address has to be verified."},notice:"Function to verify a single address with multiple tiers."},"withdrawSaleDeposit()":{constant:!1,inputs:[],name:"withdrawSaleDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this could be made to be accessible only to seller, rather than owner.",notice:"The function used by the admin or deposit address to withdraw the sale proceedings."}}},"contracts/OriginsEvents.sol:OriginsEvents":{source:"contracts/OriginsEvents.sol",name:"OriginsEvents",title:"A contract containing all the events of Origins Base.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"You can use this contract for adding events into Origins Base.",events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!1,internalType:"address",name:"_depositToken",type:"address"},{indexed:!0,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x7d365384(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x7d365384",type:"bytes32"}],name:"c_0x7d365384",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsStorage.sol:OriginsStorage":{source:"contracts/OriginsStorage.sol",name:"OriginsStorage",title:"A storage contract for Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"This plays as the harddisk for the Origins Platform.",events:{"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}}},Tt=new Ke({routes:[{path:"/",component:gt,props:()=>({json:_t})},{path:"*",component:yt,props:e=>({json:_t[e.path.slice(1)]})}]});new a.a({el:"#app",router:Tt,mounted(){document.dispatchEvent(new Event("render-event"))},render:e=>e(Ze)})},function(e,t,n){"use strict";function a(e,t){for(var n=[],a={},r=0;rn.parts.length&&(a.parts.length=n.parts.length)}else{var s=[];for(r=0;r Date: Tue, 15 Jun 2021 11:21:30 +0530 Subject: [PATCH 026/112] Artifacts Updated --- .../Interfaces/IERC20.sol/IERC20.json | 15 ---- .../ILockedFund.sol/ILockedFund.json | 15 ---- .../Interfaces/IOrigins.sol/IOrigins.json | 22 +----- .../IVestingLogic.sol/IVestingLogic.json | 30 ------- .../IVestingLogic.sol/VestingStorage.json | 19 +---- .../IVestingRegistry.json | 15 ---- .../contracts/LockedFund.sol/LockedFund.json | 34 +------- .../Openzeppelin/Address.sol/Address.json | 22 +----- .../Openzeppelin/Context.sol/Context.json | 15 ---- .../Openzeppelin/ERC20.sol/ERC20.json | 34 +------- .../ERC20Detailed.sol/ERC20Detailed.json | 15 ---- .../Openzeppelin/Ownable.sol/Ownable.json | 30 ------- .../ReentrancyGuard.sol/ReentrancyGuard.json | 22 +----- .../Openzeppelin/SafeMath.sol/SafeMath.json | 22 +----- .../OriginsAdmin.sol/OriginsAdmin.json | 15 ---- .../OriginsBase.sol/OriginsBase.json | 79 +------------------ .../OriginsEvents.sol/OriginsEvents.json | 45 ----------- .../OriginsStorage.sol/OriginsStorage.json | 30 ------- 18 files changed, 20 insertions(+), 459 deletions(-) diff --git a/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json b/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json index 90ac67e..5cd6953 100644 --- a/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json +++ b/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json @@ -126,21 +126,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x1be38b5b", - "type": "bytes32" - } - ], - "name": "c_0x1be38b5b", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [], diff --git a/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json b/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json index 4d3add4..001e5ce 100644 --- a/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json +++ b/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json @@ -18,21 +18,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x6defa1ca", - "type": "bytes32" - } - ], - "name": "c_0x6defa1ca", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": false, "inputs": [ diff --git a/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json b/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json index dec5199..16c17e3 100644 --- a/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json +++ b/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json @@ -2,25 +2,9 @@ "_format": "hh-sol-artifact-1", "contractName": "IOrigins", "sourceName": "contracts/Interfaces/IOrigins.sol", - "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x2b1a913c", - "type": "bytes32" - } - ], - "name": "c_0x2b1a913c", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - } - ], - "bytecode": "0x6080604052348015600f57600080fd5b5060908061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063d8c8469514602d575b600080fd5b605660048036036020811015604157600080fd5b81019080803590602001909291905050506058565b005b5056fea265627a7a7231582011070318350c618d0e8bb8a9b7791cbb95e3d0f51124e445ebe7bb07fa742f1a64736f6c63430005110032", - "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063d8c8469514602d575b600080fd5b605660048036036020811015604157600080fd5b81019080803590602001909291905050506058565b005b5056fea265627a7a7231582011070318350c618d0e8bb8a9b7791cbb95e3d0f51124e445ebe7bb07fa742f1a64736f6c63430005110032", + "abi": [], + "bytecode": "0x6080604052348015600f57600080fd5b50603e80601d6000396000f3fe6080604052600080fdfea265627a7a7231582069d28fbd1c39523d48d8e0ed954e4994f6c82194066536970e54dac7f43bbdf464736f6c63430005110032", + "deployedBytecode": "0x6080604052600080fdfea265627a7a7231582069d28fbd1c39523d48d8e0ed954e4994f6c82194066536970e54dac7f43bbdf464736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json b/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json index d880753..44bc026 100644 --- a/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json +++ b/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json @@ -3,36 +3,6 @@ "contractName": "IVestingLogic", "sourceName": "contracts/Interfaces/IVestingLogic.sol", "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0xa1e8758b", - "type": "bytes32" - } - ], - "name": "c_0xa1e8758b", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0xd266dec3", - "type": "bytes32" - } - ], - "name": "c_0xd266dec3", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [], diff --git a/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json b/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json index a534f30..1dc0ae3 100644 --- a/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json +++ b/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json @@ -3,21 +3,6 @@ "contractName": "VestingStorage", "sourceName": "contracts/Interfaces/IVestingLogic.sol", "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0xa1e8758b", - "type": "bytes32" - } - ], - "name": "c_0xa1e8758b", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [], @@ -49,8 +34,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5060e88061001f6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80630fb5a6b414604157806313d033c014605d578063cf31b46e146079575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b606360aa565b6040518082815260200191505060405180910390f35b60a260048036036020811015608d57600080fd5b810190808035906020019092919050505060b0565b005b60015481565b60005481565b5056fea265627a7a723158203012d68fe12002eb91edfeeb6dd579167417b4e35fb7fde2fcd89bb21b4f2f8d64736f6c63430005110032", - "deployedBytecode": "0x6080604052348015600f57600080fd5b5060043610603c5760003560e01c80630fb5a6b414604157806313d033c014605d578063cf31b46e146079575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b606360aa565b6040518082815260200191505060405180910390f35b60a260048036036020811015608d57600080fd5b810190808035906020019092919050505060b0565b005b60015481565b60005481565b5056fea265627a7a723158203012d68fe12002eb91edfeeb6dd579167417b4e35fb7fde2fcd89bb21b4f2f8d64736f6c63430005110032", + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630fb5a6b414603757806313d033c014604f575b600080fd5b603d6055565b60408051918252519081900360200190f35b603d605b565b60015481565b6000548156fea265627a7a723158201b2d50c8c3f492106d4b184574f602a8291079f1251415f1dc687a635ce82b7964736f6c63430005110032", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060325760003560e01c80630fb5a6b414603757806313d033c014604f575b600080fd5b603d6055565b60408051918252519081900360200190f35b603d605b565b60015481565b6000548156fea265627a7a723158201b2d50c8c3f492106d4b184574f602a8291079f1251415f1dc687a635ce82b7964736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json b/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json index e9f271e..6263d94 100644 --- a/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json +++ b/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json @@ -3,21 +3,6 @@ "contractName": "IVestingRegistry", "sourceName": "contracts/Interfaces/IVestingRegistry.sol", "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x8a4aab55", - "type": "bytes32" - } - ], - "name": "c_0x8a4aab55", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": false, "inputs": [ diff --git a/artifacts/contracts/LockedFund.sol/LockedFund.json b/artifacts/contracts/LockedFund.sol/LockedFund.json index fa19264..ab19bfc 100644 --- a/artifacts/contracts/LockedFund.sol/LockedFund.json +++ b/artifacts/contracts/LockedFund.sol/LockedFund.json @@ -290,36 +290,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x6defa1ca", - "type": "bytes32" - } - ], - "name": "c_0x6defa1ca", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x8dbef84a", - "type": "bytes32" - } - ], - "name": "c_0x8dbef84a", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": false, "inputs": [ @@ -826,8 +796,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b5060405162006c7c38038062006c7c833981810160405260808110156200003757600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805160405193929190846401000000008211156200007657600080fd5b838201915060208201858111156200008d57600080fd5b8251866020820283011164010000000082111715620000ab57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015620000e4578082015181840152602081019050620000c7565b50505050905001604052505050620001257fbe772ba151ce438198245007931cf4d28657c2c464fc936378d2f1a8eb70187860001b62000a8560201b60201c565b620001597ffa9ddb8c6f2fc34f38088f66ec09a076fe42374c6fd0d801638248d94a6fff1d60001b62000a8560201b60201c565b6200018d7f3db94983fa8d32e75391535d5e24d11560526cc625d75ee04be80d9a7eeaa86660001b62000a8560201b60201c565b620001c17f42a32338e7347349d416312ae30eea4548391a9a62c69730105e7b5e3176729560001b62000a8560201b60201c565b60008414156200021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018062006c056025913960400191505060405180910390fd5b620002517f570a927c5bc1ccfb758f2598def9b418c1b3d8b767df6fc015a74a957da6a87560001b62000a8560201b60201c565b620002857f1672c3a374d8e28edf40b592874b60d0a25d3f1566300e2dc01a4879be64463460001b62000a8560201b60201c565b620002b97f54b9b909f7a52f60c44ec32271e419fa638f2829a53698b8c4bd08958512d4b060001b62000a8560201b60201c565b620002ed7f0168e63122b684b1a2e6c79fde56d2f4020c3340a5f4392f611e9a8528e4b3bf60001b62000a8560201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018062006c2a6022913960400191505060405180910390fd5b620003a97f3f93e922db25b8139270353926d822620dae76baf5cadd08b1d86ea9584618e560001b62000a8560201b60201c565b620003dd7f3c8c82fccd0d33193a6bcbc63f3b3fb13cfb2cd580be6b16fe41a0f4b7fb9e6460001b62000a8560201b60201c565b620004117f8d3381f7f30b8a908a7c63242a423a90c85fe0f906292272255e554206ab236060001b62000a8560201b60201c565b620004457f6f96b8823eefeda86f3bff9e56ff5c53fc9d834cec91686e6a4f517c00b5a4e260001b62000a8560201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018062006c4c6030913960400191505060405180910390fd5b620005017f62f66c19fe6aad5f9184067361a08ade25e032b01a59c49aba41480e6fe38ca360001b62000a8560201b60201c565b620005357fff1273a6591d712e3811bf14f9ab817c7656e395f7c58dfb94c3824513df653a60001b62000a8560201b60201c565b620005697f4516ee5e54cc8ccfe63ed24861ccba57428a472ba459aea66e6277e3d5008e3260001b62000a8560201b60201c565b83600081905550620005a47f5c6871dc64c4a5de7266cd04f739cb86ebc6f62630c869574110fa44fd7a91e960001b62000a8560201b60201c565b620005d87f990762a6869ec40e82bc510ff327bbf2a3ecfd19c8661ff4bf128b999308fdd460001b62000a8560201b60201c565b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200064d7f50c29f360d14984614b13b28ba79dc08c74017e7ba8d3dba33de32448f91504160001b62000a8560201b60201c565b620006817fc122633e18d0e7bab07cd9c17556ada0accc14d165465e1047649abae54c882660001b62000a8560201b60201c565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620006f67fed1294aa68efde61362cdd32ed986237ed74378aada8204f2c9ac283f7b5614660001b62000a8560201b60201c565b6200072a7fc2c116e9e9380abb8800fd1c6dfcc9d0250b700ad4a997c183fe23663b5ac7ea60001b62000a8560201b60201c565b60008090505b815181101562000a7a576200076e7f9e443a806c9bdcb98eff4ae38cf4b3b1524e040e9c8b380e45f2493913057cad60001b62000a8560201b60201c565b620007a27f162573dc2f2d428388e216a5a734964f2a92b01fd311546fb530ea28ec84537360001b62000a8560201b60201c565b620007d67f7eb07445bf339cbc889ac348c55e6cc6a1c78debd6311282868818334b4b26f160001b62000a8560201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff16828281518110620007fb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156200088e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4c6f636b656446756e643a20496e76616c696420416464726573732e0000000081525060200191505060405180910390fd5b620008c27f3afe0bd2b62b0578a211f4ea0510ab860f2637ff6a44c215eceadd3300125e1160001b62000a8560201b60201c565b620008f67fcb27314f5d405be6db68875424bd4222442cb47939a1a4aeae757b9f17ccd38a60001b62000a8560201b60201c565b6200092a7f0d5665de2ccb079e4ef145950627bf7a84b66c4dad95603a48918839e3a088cf60001b62000a8560201b60201c565b6001600760008484815181106200093d57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620009ca7f6ea79692ea744c82b2072210200e1a97e3499c227e3bb337a93585ddd2feb13060001b62000a8560201b60201c565b620009fe7f6f62ec6f761ae525365464c83cd65fe572e3e0f92c04e5f45f6ba2682f34996360001b62000a8560201b60201c565b81818151811062000a0b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a3808060010191505062000730565b505050505062000a88565b50565b61616d8062000a986000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806389facb201161011a578063c227cbd8116100ad578063cdce101b1161007c578063cdce101b14610a10578063ce46643b14610a68578063e554586414610a72578063ec3ea7d414610ab6578063fc0c546a14610afa57610206565b8063c227cbd8146108cc578063c408689314610916578063cb3fdb611461096e578063cc6f0333146109c657610206565b80639114557e116100e95780639114557e14610796578063a2dcc234146107ee578063aaba2c0d1461081c578063b36760a31461087457610206565b806389facb20146106a85780638c8ba66d146106c65780638efd94f31461071e578063904c5b8f1461074c57610206565b80633e4a89d11161019d578063594092db1161016c578063594092db1461053757806361ade4261461059657806370480275146105da57806377a69b521461061e578063849a68171461063c57610206565b80633e4a89d11461046f5780634558269f146104cb5780634c2a295c146104d557806355e715cf146104f357610206565b806324276777116101d9578063242767771461034957806324d7806c146103a15780632b6df82a146103fd5780633a2cb6431461044157610206565b80630483a7f61461020b578063129de5bf146102635780631785f53c146102bb57806321df0da7146102ff575b600080fd5b61024d6004803603602081101561022157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b44565b6040518082815260200191505060405180910390f35b6102a56004803603602081101561027957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b5c565b6040518082815260200191505060405180910390f35b6102fd600480360360208110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c29565b005b610307610e80565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61038b6004803603602081101561035f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f2e565b6040518082815260200191505060405180910390f35b6103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f46565b604051808215151515815260200191505060405180910390f35b61043f6004803603602081101561041357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f66565b005b61046d6004803603602081101561045757600080fd5b8101908080359060200190929190505050611058565b005b6104b16004803603602081101561048557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061105b565b604051808215151515815260200191505060405180910390f35b6104d3611135565b005b6104dd6111c4565b6040518082815260200191505060405180910390f35b6105356004803603602081101561050957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611252565b005b6105796004803603602081101561054d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112e3565b604051808381526020018281526020019250505060405180910390f35b6105d8600480360360208110156105ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113f3565b005b61061c600480360360208110156105f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061189d565b005b610626611af4565b6040518082815260200191505060405180910390f35b6106a6600480360360a081101561065257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611afa565b005b6106b0611d59565b6040518082815260200191505060405180910390f35b610708600480360360208110156106dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d60565b6040518082815260200191505060405180910390f35b61074a6004803603602081101561073457600080fd5b8101908080359060200190929190505050611d78565b005b610754611fcf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107d8600480360360208110156107ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff5565b6040518082815260200191505060405180910390f35b61081a6004803603602081101561080457600080fd5b81019080803590602001909291905050506120c2565b005b61085e6004803603602081101561083257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120c5565b6040518082815260200191505060405180910390f35b6108b66004803603602081101561088a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612192565b6040518082815260200191505060405180910390f35b6108d46121aa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109586004803603602081101561092c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612258565b6040518082815260200191505060405180910390f35b6109b06004803603602081101561098457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612325565b6040518082815260200191505060405180910390f35b6109ce61233d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5260048036036020811015610a2657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d1565b6040518082815260200191505060405180910390f35b610a706123e9565b005b610ab460048036036020811015610a8857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612770565b005b610af860048036036020811015610acc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612862565b005b610b02612ab9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60046020528060005260406000206000915090505481565b6000610b8a7f8d30935436f9763ba510dd452958b894e82a2f2df9a715965b97948f5f6554bb60001b6120c2565b610bb67f540ab7eb13a723764abb54f31073978e1a056e582ae6a5a0462b01c9077e85c560001b6120c2565b610be27fe89437c01d8f61ffb579f3817688b3b2fbfaa05125a88b3c67261c31e48cd44b60001b6120c2565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c557f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b610c817f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b610cad7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b610cd97ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b610dc47feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b610df07f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b610e1c7f199ebc860835465e653d5f3529ded97a9d1d9022f6a04982dd25452629221ee460001b6120c2565b610e487f563873a770b8bec6c59dd33118c9e859a94e8aee7dab1c5aaa34a297fc5eaffe60001b6120c2565b610e747fe94c66a7af827134e7fe7641210fb3bc7410bb9ab0820d57284ad6983a9a039560001b6120c2565b610e7d816113f3565b50565b6000610eae7fb8636c7958b2fdcf394fbad77445c90a04f8af4b6ad54b77f1a699e3368d679b60001b6120c2565b610eda7f51780eda96ae13557d50a5b0cc4f15a32d8df830427810f7cb0ee5d4c5138f4360001b6120c2565b610f067fc0ee94f7785a9e0558c697f8caf882ae82cbbd38140f3c8b1e051698035f586e60001b6120c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60056020528060005260406000206000915090505481565b60076020528060005260406000206000915054906101000a900460ff1681565b610f927f382d93b023531f50d6d42dbf5fe8f53204083df223b210824a01ef5f7520096660001b6120c2565b610fbe7fadc7fd506dcb3e07a4df382c007ba0ff2b382bb2e6a9753d634c5f84c9a9e5ac60001b6120c2565b610fea7fca342ce8f32afa93a60e822a8b9a4f120c7ddcaff19eed0f11ef7730bde2c32160001b6120c2565b610ff48182612adf565b6110207fcd7c4dd121825dfe35bd543ed991e5b92769ac7c2cb8cc905b68dcfc05e9c89a60001b6120c2565b61104c7f7367f857ab7ad88aa02bf5a6cc895925a742b39c9cbc26299bbfeff7b8a125e060001b6120c2565b61105581613306565b50565b50565b60006110897ff0f9cf48eee00d8f448690e37784a00c3bf23ea568148c965338e354a680222660001b6120c2565b6110b57f4fdf2705d02263a6902b49c2650d9c5eb2f6e6c188bbdf3d669517f00df9d43960001b6120c2565b6110e17f206f4dcaee767055ddbe59219dac22cf00ffc5d83e188ea173839274bba3162360001b6120c2565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6111617fb91b9b727b80d64410258aaaeb2918528367562dcb351fbd1347d559bf6c4da060001b6120c2565b61118d7fdfffe4fc27319050bc90f35199a1ee2f81aae6c04c243a07f47b829a24c24c5a60001b6120c2565b6111b97ffc9a8226693a490df5afc1bc05198b488e62e2bd169913a44814015ae75976fe60001b6120c2565b6111c233613306565b565b60006111f27f51b86fedfcfb91e992427db7b7bb8e4a5c18bd400e42cfb707b09e3f87f01bd960001b6120c2565b61121e7f22c8e3a309c720a2be6d2c9e0a35f67f2e09f39b5eeb08b95383cb975d84a97760001b6120c2565b61124a7fdec4cfd3d5a2b977603d79e7e261c177504206d10b0a7d090b71c1d06b8d5b8160001b6120c2565b600054905090565b61127e7fb582cf390bc69e2bbac202e7146ab40217adff3e1a610636e74e550273a68fe160001b6120c2565b6112aa7fc5c6a2503d880fbafecb6eca6cffd4e7e6ff32d94cfd5f333af4a08dc61b61e960001b6120c2565b6112d67f5945bb6025bd4be7317bf83d7156dfe74eaed755e7761781c9158d875170175660001b6120c2565b6112e03382612adf565b50565b6000806113127f6d21d91f53e64636833842af0b1ff2bc91c7deff6136dd6e5d84ea94b3f5629b60001b6120c2565b61133e7f7801a63eb869b2941daf4dac41de65d2eefb48d8356043ef087d0b91707344a560001b6120c2565b61136a7f1824962066b83997c42ddde0df8506b198d63cf5534af2fa4e98f0da27315a0260001b6120c2565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491509150915091565b61141f7f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b61144b7f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6114777fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b6114a37ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b61158e7feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b6115ba7f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b6115e67fd44bd0a5a8e1b1cf5c40e8686ea93068735e46e04ea8f7451f1dbe4b5663cb1660001b6120c2565b6116127f413a061529df923ef1df668287e71961f34c644bda5d9e7c50a1b688bc70d0ad60001b6120c2565b61163e7fa0947243ffec2f263e5a42db60281289ab7d30cf30c815dab76aff61fbb4c8d960001b6120c2565b61166a7fae293520888da26834f1f7d0a5e180bd2fd7b38315e3b43eb9880ec9f72d398360001b6120c2565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615f6a6024913960400191505060405180910390fd5b6117387fc94e9860303bddde773e258e690fd77fa94f62f34eef08dbeeb3caa6a1084ccb60001b6120c2565b6117647f07236db6fdb4f04851861d5a02b6b19e07aa173215ba87f713c843661572e31260001b6120c2565b6117907ff0a3ed86d5bf70a045cc857c964a0dfe3697009ba02afde0539b93640dac70df60001b6120c2565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118147fec8cd4d3ba6bf27673f2a51d49743c00e0efad87c40afe43a105b4534b6f900b60001b6120c2565b6118407fbb06e7a5566421d5268a045ca7a8df7c8b9180d63cfdcaf8868c914322ae9a0660001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce60405160405180910390a350565b6118c97f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b6118f57f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6119217fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b61194d7ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611a387feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611a647f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611a907f185510b26e4533633eb9e81fb4b278833126a4775ec9f935437561596b8fbf8260001b6120c2565b611abc7fc4030fe5ed91aa493625bb81b13feeecb9e75e87930bafb8fac1198a6452865060001b6120c2565b611ae87f51d743be5efbbdc9d2345ad2165a5a694d136119509a608dc84a2dcecdaf9e9960001b6120c2565b611af18161354b565b50565b60005481565b611b267f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b611b527f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b611b7e7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b611baa7ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611c957feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611cc17f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611ced7f21a9d6adbb1fd2de9a3b4799706cfb5dc3ee5c9af765ce13c20fdb74c70d1c4260001b6120c2565b611d197f7eb8a4b485304918653e2946f4e38710f4a2ad63d00554abb94b7c96d4d87ce060001b6120c2565b611d457fee20a448205dafb1c9c05e9e3994ab8008ffb03d46d12f8b589d8986f15cc00a60001b6120c2565b611d528585858585613982565b5050505050565b6224ea0081565b60066020528060005260406000206000915090505481565b611da47f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b611dd07f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b611dfc7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b611e287ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ee7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611f137feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611f3f7f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611f6b7f72a0cb4c872172de61485421f90edfb4d8b580103d590c9815615d237091e8b360001b6120c2565b611f977fe884888a461226ffd96fa58e88cac64db1c2a8e894e4fe7ebb766267f7b26b8f60001b6120c2565b611fc37f64794ea099490c3fdef8853b08d1bb0af5a67d5476535117e5aa01a4198ebbc960001b6120c2565b611fcc816143d4565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120237faa62d4170cca1279af59222ff9a3dd683190db71504fa7808a11f923f3fa446960001b6120c2565b61204f7f8b718ba75c06aeb0de3a5aa438ed8cc94723969ef94d5068fcf00aaeb66d7e9160001b6120c2565b61207b7fbb444eb32e956dd5e2d37c58284e3bdb898d19da6cf88ec9116b6bfd6a4a2a8260001b6120c2565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b50565b60006120f37f6cca1833a7ce056afde293c960b4f2537dd26784f8a782136db017fd40c9096460001b6120c2565b61211f7fa2d8e93e3e54cdb3a4b2be05ad5da16750f117ef63999c06dbf9089b22ecda5460001b6120c2565b61214b7fb8c1c0de814152d59088b12c96fded18e84d6f6fb43281820f77bf6e9b25718660001b6120c2565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60096020528060005260406000206000915090505481565b60006121d87fd581639942bd57930cb26494ed1b3c78df4df5f646cd5f8b2b5c68f75b924d0d60001b6120c2565b6122047fa92746ef821f9af86a5a2aa242d7c500a7a4f5a6aa936e45e2fc76fc5a5823dd60001b6120c2565b6122307fab2768db8421a0c4a45b361d9891d7febb37d69838636c7e2c8fe90600589de660001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006122867f73e1231b72914553ce72612130cb14ceb3ea72283d3da549062ea7d875eee8a760001b6120c2565b6122b27fc431eaf4e43e60aadf886c5a1e82e5602b3d7842ed669f7643af99e0efe78a4f60001b6120c2565b6122de7ff4bf8ff9452e138ad4fe4f977582d11086773eb283e291a0184982fde2da3c1560001b6120c2565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60036020528060005260406000206000915090505481565b600061236b7f410111e00ef9ea45fc8fe867b2dd3eb522b31a8ac610bc223fd87a135907b5dc60001b6120c2565b6123977fe1f47c334c4e9ac1b77463fb4c86c993e198ef2af8158ee26e70a90732f4b3c660001b6120c2565b6123c37f3ed97b31d10d9a32d15072a2b0ad8c3464a76d6b4e835e77b51ebbd9c754f6a460001b6120c2565b6123cc33614612565b905090565b60086020528060005260406000206000915090505481565b6124157fc9b6161bb463010133b07b3749dab52b3b5bae2ffa5b0ff771e4fef924920d2160001b6120c2565b6124417f956b27ac437c4177acf2f585d679a7be824018549fd6a06e59ec7233953fea7960001b6120c2565b61246d7fb0735d6f0b9c25f5f6203d19e16f4b02a736026c69752d5916e6f71e83812c6460001b6120c2565b600061247833614aae565b90506124a67fe696d5a9526c91685a4614699f77b000bcc2cb035a6cfe7328a6aa299314643760001b6120c2565b6124d27fa346e4761b70576222cdc29bd041506125aa6ffb80e99f2513dc0396d2b7d75060001b6120c2565b6124fe7f1e0acd9d879f08925c14ccb1a2be1b6ff30b93bb33efe31099881695c33697d260001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b15801561254457600080fd5b505afa158015612558573d6000803e3d6000fd5b505050506040513d602081101561256e57600080fd5b8101908080519060200190929190505050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414801561268a57508073ffffffffffffffffffffffffffffffffffffffff16630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561260d57600080fd5b505afa158015612621573d6000803e3d6000fd5b505050506040513d602081101561263757600080fd5b8101908080519060200190929190505050600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b6126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806160e66023913960400191505060405180910390fd5b61270b7fedcc2b993deb24a268a31f29b0aeadd64f14cad64f21629bb4dbe26c763cfc3f60001b6120c2565b6127377f57b0e8fe5ec7cb3130f9a658584b9bd13dbdf7739a8cc97a4bc746c05581c4db60001b6120c2565b6127637fdba9e5889e452afdfe10e6b8afe1c40d17eaa101d67423b51150febcb8f4b7dd60001b6120c2565b61276d3382614c15565b50565b61279c7f8a345477d48d5c4876763e8543ab319c75e4a162841ec51453ff17080145877660001b6120c2565b6127c87f69de36af6f1868ff74eb03f10513d1a7d169a885219eccf3b49a68c322fd7b8760001b6120c2565b6127f47f8236a71187ed4b4f256819879b85f6f3d6fee1044971a09ad0ca9ca78d26a48f60001b6120c2565b6127fe3382612adf565b61282a7f9817baab47b1a224bd209595f3f433f7401137b769c7fbbeef71a519617afdf860001b6120c2565b6128567fa6e9521ce627d0abf4d9eafde16ab9e44241d35719ef6efedac81e8f88994dcc60001b6120c2565b61285f33613306565b50565b61288e7f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b6128ba7f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6128e67fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b6129127ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b6129fd7feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b612a297f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b612a557fa14fe3830a4c36831d7f5efe9e432a58097763811f509158662eadc5ae5917e560001b6120c2565b612a817f2885d693c641f52d08156618f9f73d171fae6b6660c227fa5c80213a9ef9904960001b6120c2565b612aad7fecca3a7f5f9ce183e3b4c016c435c9f543fcc3d10f0f4fdefb65062049cfcf9a60001b6120c2565b612ab681615105565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b0b7f32d1b74cc50d16562974e82f053f152d08e1bb420e63931fe9b5548a2bd8194160001b6120c2565b612b377f1abcf5dbb19ca541ee32650c8d112828f082170b302d16d5a773d5e7564d837060001b6120c2565b612b637f9758af99550fa21a43fd8f7ff032795ca121478eecb185975b1190737cfd7ab160001b6120c2565b612b8f7f0dc75cfdeeb4f9f45072e6495ac1995aa97020794bb9c8176a2ae13f5f85c1ef60001b6120c2565b600080541415612bea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806160756022913960400191505060405180910390fd5b612c167f8b2a4d4c360cc2484c70c9a9bc8c2509849e5aa23fddfd83279a144e2361182260001b6120c2565b612c427f044e09fc509c9773bb976a1b726e44622d5a2657d467b373dd5c5c7ea7db388d60001b6120c2565b612c6e7f28c85247847e3581a4d13260fd45b3d97ab1443e6bca3b40ceedb79f92f4d73e60001b6120c2565b612c9a7fd9484fd18ba5d363b2031df5a9295c2270e5ac91c89ebb88f4c819f3fd24701d60001b6120c2565b4260005410612cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615fb2602a913960400191505060405180910390fd5b612d207f59c7059dcc5c3f2b92467ad40a7ea55a33e7840fb0968e42b96a2996966b92fe60001b6120c2565b612d4c7f9a8ed0e72d8e07021da192b401b38d39f235fc59db778d6f7e8d2d46dc13afe060001b6120c2565b612d787fc1c47e132db7835f40e66c902a83846ca56226491c2239bb55744318497afd5f60001b6120c2565b6000819050612da97f12df37e7c609a9266da89a1bc569fa090c6ad938fcc150a2413e4a435fe371ae60001b6120c2565b612dd57f5fa5d1e4013ceb89c9335056ebeb83bb5f8cb76bb4d8e5bb5a9eb7284fc2fb4f60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e9657612e367fcb0a00123a753151361074c70cee2b2d91d0304f6588e422759ebe04d4c6490460001b6120c2565b612e627fa6d4da324a5de41fea5db60e4df1902776e66f7f509e95be5aef8de53016bf2760001b6120c2565b612e8e7f6aaef27a6b716a0c22d672c70b57623d539c47ec9aefa2a2e63c61d2ee04452160001b6120c2565b829050612ec3565b612ec27fceca843deb6474bc8a1191d4d0a5ab2aeb7630cc6199606ce51e50c3e81862ac60001b6120c2565b5b612eef7f3b9fa9174dc6a4df4dc32fa9ed7ac7a4ad41138b23992e0e32995f37c9356bd860001b6120c2565b612f1b7fe72fe8b7995975f8e43e041a03b116eb5b7e3ba3825986ca73b041e76677ebd260001b6120c2565b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612f8b7ffd340739b7a2c38ae28baa65c897a82da8873f8c782f7bb81650c8c8dbd3182c60001b6120c2565b612fb77f298b1cb32cce7c3c3a683636fa7fbcd793e9c765bc02f426fa2cde06a8d8802d60001b6120c2565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130287f9ab63a8a3fe7cc91de6d80ee7b9d58d61d586f2b285fd1c9843a1eb9eacdead260001b6120c2565b6130547fb013a37e78aa2d0477a3339ccc81cc15daab83c6e480f1fee57e12248cd7aba960001b6120c2565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130ff57600080fd5b505af1158015613113573d6000803e3d6000fd5b505050506040513d602081101561312957600080fd5b810190808051906020019092919050505090506131687fb52cf5bec8ea5f7740d5f106b51e9f48043e54aea5d1b44b2b7a031917eb8c0360001b6120c2565b6131947fbfbcf3b75bb4c7a828f089c50140ee2348a61442ba222d6c5db7192a019f90d360001b6120c2565b6131c07fd7dfa52a48ab69979694c9fa26d8ccf10a13b50c29e8799eb48a9e9531da2abf60001b6120c2565b80613216576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180615f246046913960600191505060405180910390fd5b6132427f9821cdb90d8dbb520d9787cf22665329f055aaaae5a0076c46e8f352cfe129d460001b6120c2565b61326e7fb46cdacb2840ef568a3c58e3e42155b9e9490c6e2380320bffb91c2cfc1f961760001b6120c2565b61329a7fdb12fa92c7609773d48220182794f03c4ce1140c7d56e73be39c86b30306a34e60001b6120c2565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6133327ff2f6aa91ba57661874aba566e7c9eb97c0ce0af60a04acd51e253bdc478fa7a160001b6120c2565b61335e7fa52ecb22b17614096a67aa7139209b6836e8905e5f4452bfb14bc03876ee0e2060001b6120c2565b61338a7fb1fd726d0379bd894395ba13777c96880bcc4203fbdcb7f5cf6b7c8d0c0c21e760001b6120c2565b600061339582614aae565b90506133c37fc21ba7f7c1927e8b6d2353cb128b2a0370fa4d5524d9a3f0f1e964630dcc300d60001b6120c2565b6133ef7f1c13d451ad86d5806bca5b1fc6edfd66aca99e858a7d15029fb4017235cd93f560001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156134b8576134507fea0eaed7eef9dfefa8a117d7f8f49b5fac08cfa69d0ffd93681e04a4a9f3f34a60001b6120c2565b61347c7fc73b7c611574449ac1805d22452156c2b6a8b610ecf792c5c492be085a8f4dc360001b6120c2565b6134a87f858b6b1b7b76300c4bc2637e7d0f837152627611e8997eba542112f6a3ec089360001b6120c2565b6134b182614612565b90506134e5565b6134e47f51b6041242fe87c23613c4ca83c0ce6cc782f984daa1175b5282198f4cbae01360001b6120c2565b5b6135117f179004e13c69c281c926ed9a60d5197d533b662af042352a71862de1d486126b60001b6120c2565b61353d7f14b43749593568faccdaf6c0f2da5fec840b3e8fe509e834b96b6fb1ae14d83960001b6120c2565b6135478282614c15565b5050565b6135777ff18828f34a77d25fd2a204d334ae8c7b2b0d98ae51df09f97d54f49563d6834c60001b6120c2565b6135a37f7e1d277935cf039dd06e2f077f2fb3e92eed84a15a655dfb01efe6784dc1802d60001b6120c2565b6135cf7fe69fb858002425942ccd46bf74bcb82d08e11a613d73dad7feaf5fe333df716c60001b6120c2565b6135fb7fbebccc5bfed7845ceddfadd20eaca584f424d9d9c7204e543499cb92efef0fca60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561369e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4c6f636b656446756e643a20496e76616c696420416464726573732e0000000081525060200191505060405180910390fd5b6136ca7f7743e52bcb6872bf1d1a937ebffe9f93c9cf6cfffb1bf3ac5c947c84e799c54b60001b6120c2565b6136f67f9f8622f8282425a9cf50dd7a52322b2ad4c903f8e62cdc6745d32739db7ef8c260001b6120c2565b6137227f3d124cacafc426f63ea78db7a3bd7621a904df790271474212172e5dda5bc24c60001b6120c2565b61374e7f11397a69873ece5b3016d5f0f65eb0f51d418c7b8e6995442a3ee8397d16504560001b6120c2565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156137f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806160976025913960400191505060405180910390fd5b61381d7f3dc3b3cf7884ec478650b70fd4882a0c18568511fd8ca387834303e35572414960001b6120c2565b6138497f3bd22af39de246e0772e4ff2b3b658497468aca05614d8772890732d3ff0d05e60001b6120c2565b6138757f5d29ca3aa4f9c24c944ebad343879784c0b979dd7bce772475ac26142fd40c7060001b6120c2565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506138f97f1b52293c92f7800ec1b7dd5149bccc729b7e1599fc3610c2808db0974f694a4960001b6120c2565b6139257f3e6b6bee3e1f8cbe9adff4eba70247b9ba8ce5db4391da18ba233600c2dca11e60001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a350565b6139ae7f5a7a4a8cd4eaed25a4abce89994aed5294195b3b0dce256f325c75c679a333f260001b6120c2565b6139da7f2ea55fa634713a02b5d6764e96fc31afa709e45e72e8b9667a85d9d5af41ab1660001b6120c2565b613a067f157208259828fd14e6db7c4c1fb519aa08d05e8f34094be9c284a326abdf031860001b6120c2565b613a327fb6bf6d447545e6a05b6d1d4e2ad50d22c22889c7f038a18a98e2fec70165337960001b6120c2565b6000821415613a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615f8e6024913960400191505060405180910390fd5b613ab87fe6c1959a4bd7642de42aa166d79e92f8c040f7a2a9b9da551d0e7dd266a8031760001b6120c2565b613ae47f72ebec2be4c64905c5190d3476d5fac853390d90e7cb030878356c4884492fea60001b6120c2565b613b107f657b203a0ab3025e05e209a75625e8e0e326abf328416dc5b0543b685cc852d660001b6120c2565b613b3c7f5ed0253e0e090a4bbe09ca14086f8bc78434ae36fa6463c54f1c3f368dec345360001b6120c2565b60258210613b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061602f6021913960400191505060405180910390fd5b613bc17f2eed951e0f6fd85710b5ddacc0c441d570d487ad3d9d6bb3ce74c287c28eae5460001b6120c2565b613bed7f06b0c5e165e6b159b79071367de627eb9406eba71179a88e94c994659997383d60001b6120c2565b613c197fa1eb142fecc059a467791ca6d6d916bc7049adc667f5660a0a95fb84d9ce610660001b6120c2565b613c457fe1c512f481e37ada1c419df8141bc3123fce9186fb456bf10442ca84afb0473960001b6120c2565b6127108110613c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615fdc6032913960400191505060405180910390fd5b613ccb7f4253d588a70c7932665c1fef05bdbce22dc7b675a4a5626a90b995294c9c396f60001b6120c2565b613cf77fc242cedfee87f54a801135683992ccbc0d0ae84ceb8ceb85f886488358947aab60001b6120c2565b613d237fea8c76a324989741e1dd0a9d1938853daefd5e77df28f1745d2c8cd622e299a960001b6120c2565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613e0257600080fd5b505af1158015613e16573d6000803e3d6000fd5b505050506040513d6020811015613e2c57600080fd5b81019080805190602001909291905050509050613e6b7f6f3212c288a091864b826af7cdfc5895d4eecd85115d69cbe24612e4cfc47d3860001b6120c2565b613e977f371fdd23407273151153089a7d8ead8dd2a23b631b156d17c55ec18a7a00ce6e60001b6120c2565b613ec37fb145cd25e93b0c3d1289d4013a60e3a92f05eb2c7ce3bb2508143547524e934760001b6120c2565b80613f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180615f246046913960600191505060405180910390fd5b613f457ffd7f9919678fa90bd5a0197e1d95f21b9fc319f0daf8fa43f83f734a25a0625560001b6120c2565b613f717f8c03b4278000ac923acdf3bb7f44bd699f67061267ac0506f5dce4662d85d22060001b6120c2565b613f9d7f25a8823d3e88d176ff318d07f8a70764545891a2c53df8172b2bbeb6f2986fe660001b6120c2565b6000613fc6612710613fb885896153b590919063ffffffff16565b6156cf90919063ffffffff16565b9050613ff47f785eb8af4bbc16ef7f37647b0a9e6042d83e3c60dbdbf8095919c3405e7a170c60001b6120c2565b6140207f97572340a11e9c9ba0709fa6c0235b126bae0f0b847f77a455566a7d93cdca3060001b6120c2565b61407281600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461579d90919063ffffffff16565b600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140e17fadd1acf0558b4df378e30ee799df9098c787a34db3c977bb6231bfbb47cbbda060001b6120c2565b61410d7f7ff04435c561f5dc27abad6c9b50bbf086c7047a5f114602c32e97730cc3ee5d60001b6120c2565b6141718161416388600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461579d90919063ffffffff16565b6159b290919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141e07f4e1ba96dc6dff93cd4b0ebdd540fb6b9492977f4c01f6b6a4cc684b63547c35060001b6120c2565b61420c7fe87f7523fe7dab0124360bae8f11fe0103d7d2ed7171cc712ff9f3b7c78124b260001b6120c2565b6224ea008502600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142817f8fa49e8ec1acb1c8f61af22aa79df5a600ca9c0589f9607be7a9d2586495405560001b6120c2565b6142ad7f5285cfdf1009da32f49963f221a40b03b4ae76728d108f047aab6e33af37be4c60001b6120c2565b6224ea008402600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506143227ffddfb9e3c8aa09f940363e40c5592c355be323a85a1d97f0b8d1c12ff534123960001b6120c2565b61434e7f45108368a3cfb977088f1abe4f46f7ddf2b4039728eaa6a8afac558c6a23262960001b6120c2565b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a888888886040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050505050565b6144007ff2de3703434f4415d392044b2002bf19052f7d34e8e414c9211f70bb9efeeea060001b6120c2565b61442c7f8eeb39b944b7e122a8ccf6531dc802ff8b07024e9a755bf85324358d8f2ea7fb60001b6120c2565b6144587fa217a7a5a481254b17960363327bc44da12c57c0446f197c2453aa637a4d6b3060001b6120c2565b6144847fb38b09ea1ce8acd0b415e30a3ae35c65793a4e1cb58ba5a849d09f738416c07660001b6120c2565b60008114156144de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806160506025913960400191505060405180910390fd5b61450a7f97d122643e292d81b5791e4c087b9666a84128e1a8190a996b942ddabcfa3d3f60001b6120c2565b6145367fbd7d4313f21bef8a2bd6e6a6a9b6b8363f25128f70b3fc6bf43cf9f919630be660001b6120c2565b6145627f778665f1c1361780f502c9c40634f21e09027025bcdd4b4559aad4fb34890e2660001b6120c2565b806000819055506145957fd281c46a21343f29aba5e462dc693ee3044c3a7196cade580f93f1e332f0a92d60001b6120c2565b6145c17ff841ddb5987747e91d4aec7afbc303ddc406ccf020e4d9447dfb4a6dcef9fcfa60001b6120c2565b3373ffffffffffffffffffffffffffffffffffffffff167f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94826040518082815260200191505060405180910390a250565b60006146407f099f0f4beeab2d0d5cfc3ed6f138c76f54d9d12d77632ac7804bed5d63ee6a8060001b6120c2565b61466c7f15cd849300d0cff158bd75207e492192e0295f70644b5f4724230661b274b44e60001b6120c2565b6146987f9a67bf8a00c89a911f932c5beb691d0440d62ef939be823ef70d442d123967d760001b6120c2565b6146c47fe63e824a9bc7f2d2070611413f079002396a3d1249045dc306fc13f7f93c755860001b6120c2565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415801561475457506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b6147a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806160bc602a913960400191505060405180910390fd5b6147d57fd36eb2707a929bdb9a82d43f125ed9f218c00f2a6349a2f8ec307708e8d101fa60001b6120c2565b6148017fa13b9cb0ded95be2ef3d610472bacb461d86efd966cc54da338d358b25c5052860001b6120c2565b61482d7fc431137e542fba43a12946ab234f1b3348051f808ecb3e400e548d6f2e5492cd60001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630665a06f836000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b15801561496557600080fd5b505af1158015614979573d6000803e3d6000fd5b505050506149a97feb84e2e98f750099f6a12a17b228af6efd14a45da9e69be26ae85d53c515c55f60001b6120c2565b6149d57fe8839bdbfa2bdbe86ab6787c83e7b71342245fde9588f805178faef4218ff64160001b6120c2565b6149de82614aae565b9050614a0c7f46c4cb90b19235ff6fc55c36f5cab4c48da6b5b8d21f3c76ae7b26c2fc3227db60001b6120c2565b614a387feb82bf1014f20ad76c1c4f125593e206ad75ae708562bc456b6f67551d5c9bce60001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6000614adc7f8e56a657ee9eeb3841541aaac5ac2331d9fe55b98ba2604ff388324c3304f94160001b6120c2565b614b087fa56f2526df98a4a70429179464d83e976b8e368014d183fa1d1c1626ddb743f960001b6120c2565b614b347fee62d1035803aaafaa50e3933f0c497ee2a20a70f029681972e31474307e125860001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cc49ede7836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614bd357600080fd5b505afa158015614be7573d6000803e3d6000fd5b505050506040513d6020811015614bfd57600080fd5b81019080805190602001909291905050509050919050565b614c417f67d7a523c6f24336e024fa1df492c977d7c45c6fabbcd04f65f6507c577b462c60001b6120c2565b614c6d7fbb54d59daf6decb198ad8eedf74bdbcd6ad7ab89808f3b18f4368677140ee28f60001b6120c2565b614c997fe1fab23ebdc2c288439ffaeaf42d881626225d35a4821134710cd5801ef61bb960001b6120c2565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050614d097f6810bbb868a8216ac25357ea1ef57233aad728bd62c242eed32ed9f39b7e111b60001b6120c2565b614d357f63d84521e884c74b1fe88b373f6febb7ba4662bf4024653f0eba75f3815c33a560001b6120c2565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614da67f36b2a7113f91194c9a121ee53ed579159bc757a407eb6587325b8cffef5a668360001b6120c2565b614dd27f83543865e5dc44996ed2a9a837377fa8ed9df96577e25fc05ed06955644d924160001b6120c2565b614dfe7fdfe401b06ceea015e072c2d169acb077d0dc07536c0f8edfe4d2f3b4ef9973c460001b6120c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614ea757600080fd5b505af1158015614ebb573d6000803e3d6000fd5b505050506040513d6020811015614ed157600080fd5b8101908080519060200190929190505050614f54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4c6f636b656446756e643a20417070726f7665206661696c65642e000000000081525060200191505060405180910390fd5b614f807f1e7d28e374b4ad17a701f458bfc23c911dccaeff672d9a612ba9dccd5e5a7b2860001b6120c2565b614fac7f4f755a415ac5cda9cd6382b525ba935b084793a9bfece614cfc557ac15751a9560001b6120c2565b614fd87f9c25cbcd62d96a993bf63d2f683525dc41f4e9afc4974a16356111a70728849560001b6120c2565b8173ffffffffffffffffffffffffffffffffffffffff16637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561502b57600080fd5b505af115801561503f573d6000803e3d6000fd5b5050505061506f7f85730c4b1ed5602564ee4ca31b9c2186db04dc3c2442acdc60cc7018657b4fb760001b6120c2565b61509b7f158adb9e1c2ba2701a3774d50f2bf0b454ca0149a9017067c1a27d97556bbdc460001b6120c2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b836040518082815260200191505060405180910390a3505050565b6151317f1c2e0ab2daa50c6af223e5a4a38cda73244e06754019097bac898d3a8d0ad72b60001b6120c2565b61515d7ff709447a43d916016620baffa27e0b612c237dfde458a4cd3158a24f95e59c5660001b6120c2565b6151897f072ca76825e34184e852e51358abb0403ef001ce51650bb3e3270104cece56c860001b6120c2565b6151b57ffbf68d9cba3602380a8dd1ea5133db55631c6cacf3ae6134922c59642f9f233c60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561523b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806161096030913960400191505060405180910390fd5b6152677f632367eae68bc60b4b3ed9477d92656f8d6385849cff8a98fb471c4ab72a6f2960001b6120c2565b6152937fe7dde9282727830d8509f7af4624b918a6f95fe48dcaf6b5360d028443839f3560001b6120c2565b6152bf7f1c6020d90b840db2fedeedf9fd0518b690cce2e8392ebe6f9455a97eb9e875a960001b6120c2565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061532c7f9d988d582446515dd8de8177f2f020288f17d4e406967c6a2f07fa08a5de473b60001b6120c2565b6153587ffcc3a502f003451fda9ba1c6236e289cf035e776d54d9424ad2e2701a513380660001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e760405160405180910390a350565b60006153e37f44698d1e9a904ed1284ff1ffbc3dd61250c83d2c71afd5df19fbf19c6190a1c260001b615a80565b61540f7fa3a4b98cb2a23eda9dbb54b77b676d94ca9d1d4bafcc15caee09e68074b0ef8d60001b615a80565b61543b7f3c0e96b55c01aeef942723329b7f27779568810ddd00a05282ffd2e3b5d233d760001b615a80565b60008314156154d1576154707ff802f4a238c6bfb87737692d90643ed6d1e91071b816804127f57dca78bfaab660001b615a80565b61549c7f9c7552f9a426f225c2850fa12a0dc5fb398b1adc4885e41fd5a32fae1dbf05d760001b615a80565b6154c87f88253dfa1829ebe573c7def7f8d624e362791a1e5da86330776d1836a357555360001b615a80565b600090506156c9565b6154fc7ec5af928e6c63fb10ff91a6c5a4e910c4f39f595f742d8e52dc11b03ad6250f60001b615a80565b6155287f5e551b5129d493f012d238e272eb615eaa6959509de842125d5c3b203db4ec2660001b615a80565b6155547f6eeef49995c967235a764d0bfc2ddf3ad4e6890ca3a3e7024c52da8393db1ce160001b615a80565b600082840290506155877fab80a6313ea3c5926e33d7cfa6c464eb729cc09a2e212bce50dc9d97fae0ed7260001b615a80565b6155b37fcf8cc8694fe56eef0897d8bf5580925daf8927e537ada7fb46a3727fe18d423260001b615a80565b6155df7ff5b30a17ff5e5b532b98d8059efeb460d05236f98b90e61b8794894cfad8502d60001b615a80565b828482816155e957fe5b0414615640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061600e6021913960400191505060405180910390fd5b61566c7f9fdef838f8fa27d2dbdb6cfecf3f275aa85c5ae07d712150d6e17c19c215bfd560001b615a80565b6156987fe9975f5879861c66ca2a2d35617f5a37951b7cf797008080c2db7371f45b3b1460001b615a80565b6156c47f1040ca89b272f25ce391ff02203288f6f7b9bee30a94da64205ca6d937da6b3460001b615a80565b809150505b92915050565b60006156fd7f996468adab2cfba5de081e00c611ca70c15d8fec7d5bf522494a62c1469ffa6a60001b615a80565b6157297f9f1ba2348d57cab76c102a92e631d7e3d939d3a1ce6cb3a01a504d1656b19f5060001b615a80565b6157557f46d4aa33cd017349564c3524038979baabbfc921b9cf218610f32f2cefa7e6de60001b615a80565b61579583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615a83565b905092915050565b60006157cb7fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b615a80565b6157f77fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b615a80565b6158237fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b615a80565b600082840190506158567fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b615a80565b6158827fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b615a80565b6158ae7fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b615a80565b83811015615924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b6159507f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b615a80565b61597c7f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b615a80565b6159a87fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b615a80565b8091505092915050565b60006159e07f692a0cfdea6cb12cdfcaa599c058fa5662531cebd540556a6d1c27ae01b4cea360001b615a80565b615a0c7f2cce8d8afd666e4919d1ece0b47a35eda094c843996926984c8b17a0d5cd2f7160001b615a80565b615a387f936781d4063de1913a3eda99a7c2145fe8a9c61ba2abe4fa4e7dd270bf8b933960001b615a80565b615a7883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615cd7565b905092915050565b50565b6000615ab17f196dd912071b7ac5c8a10b8a236898e903a5c95f5189a9aeb16dc1191096752060001b615a80565b615add7ff25ec16e9c80532b14a66f8cd16ae291eebc856235e409a39c3fbd9dc53e53fb60001b615a80565b615b097ffb609f676697fca43f3242dd637f8af44d19e0456d05ec1547a1557478b8a1ea60001b615a80565b615b357ffc25a7e532044dc446303b3445457a6ba5f30c2ec2085a7b37e4ae0e05b09ba260001b615a80565b60008314158290615be1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615ba6578082015181840152602081019050615b8b565b50505050905090810190601f168015615bd35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50615c0e7f295ce5b61523fe81f08b0e41715a55fb7cc4323fa58af5f536a59e28b507ad6660001b615a80565b615c3a7f4460e22500904e71005e8ef95355467cd96d8038ca3b358379ef52915f4cd11a60001b615a80565b615c667f898838ee4191c5d93d43aba28d5dace210f5b5fe59d06155be60fc494d99a9f060001b615a80565b6000838581615c7157fe5b049050615ca07f6d2a274d329c86c87e9d63cea7c87a6fd3d3ca9ab129144ff43f4724a38a4a5960001b615a80565b615ccc7fbb4fe2c1c37d48811af5ff17eb49f43a22d0b33ae049d66f26c63e5ac81928dc60001b615a80565b809150509392505050565b6000615d057f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b615a80565b615d317f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b615a80565b615d5d7f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b615a80565b615d897fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b615a80565b838311158290615e34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615df9578082015181840152602081019050615dde565b50505050905090810190601f168015615e265780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50615e617f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b615a80565b615e8d7f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b615a80565b615eb97f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b615a80565b60008385039050615eec7f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b615a80565b615f187f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b615a80565b80915050939250505056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a723158207f62dae5e609d06a020f3af63364576272b32cd2f9bfd3c84e0615da999df87764736f6c634300051100324c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20496e76616c696420546f6b656e20416464726573732e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642e", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806389facb201161011a578063c227cbd8116100ad578063cdce101b1161007c578063cdce101b14610a10578063ce46643b14610a68578063e554586414610a72578063ec3ea7d414610ab6578063fc0c546a14610afa57610206565b8063c227cbd8146108cc578063c408689314610916578063cb3fdb611461096e578063cc6f0333146109c657610206565b80639114557e116100e95780639114557e14610796578063a2dcc234146107ee578063aaba2c0d1461081c578063b36760a31461087457610206565b806389facb20146106a85780638c8ba66d146106c65780638efd94f31461071e578063904c5b8f1461074c57610206565b80633e4a89d11161019d578063594092db1161016c578063594092db1461053757806361ade4261461059657806370480275146105da57806377a69b521461061e578063849a68171461063c57610206565b80633e4a89d11461046f5780634558269f146104cb5780634c2a295c146104d557806355e715cf146104f357610206565b806324276777116101d9578063242767771461034957806324d7806c146103a15780632b6df82a146103fd5780633a2cb6431461044157610206565b80630483a7f61461020b578063129de5bf146102635780631785f53c146102bb57806321df0da7146102ff575b600080fd5b61024d6004803603602081101561022157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b44565b6040518082815260200191505060405180910390f35b6102a56004803603602081101561027957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b5c565b6040518082815260200191505060405180910390f35b6102fd600480360360208110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c29565b005b610307610e80565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61038b6004803603602081101561035f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f2e565b6040518082815260200191505060405180910390f35b6103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f46565b604051808215151515815260200191505060405180910390f35b61043f6004803603602081101561041357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f66565b005b61046d6004803603602081101561045757600080fd5b8101908080359060200190929190505050611058565b005b6104b16004803603602081101561048557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061105b565b604051808215151515815260200191505060405180910390f35b6104d3611135565b005b6104dd6111c4565b6040518082815260200191505060405180910390f35b6105356004803603602081101561050957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611252565b005b6105796004803603602081101561054d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112e3565b604051808381526020018281526020019250505060405180910390f35b6105d8600480360360208110156105ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113f3565b005b61061c600480360360208110156105f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061189d565b005b610626611af4565b6040518082815260200191505060405180910390f35b6106a6600480360360a081101561065257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611afa565b005b6106b0611d59565b6040518082815260200191505060405180910390f35b610708600480360360208110156106dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d60565b6040518082815260200191505060405180910390f35b61074a6004803603602081101561073457600080fd5b8101908080359060200190929190505050611d78565b005b610754611fcf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107d8600480360360208110156107ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff5565b6040518082815260200191505060405180910390f35b61081a6004803603602081101561080457600080fd5b81019080803590602001909291905050506120c2565b005b61085e6004803603602081101561083257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120c5565b6040518082815260200191505060405180910390f35b6108b66004803603602081101561088a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612192565b6040518082815260200191505060405180910390f35b6108d46121aa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109586004803603602081101561092c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612258565b6040518082815260200191505060405180910390f35b6109b06004803603602081101561098457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612325565b6040518082815260200191505060405180910390f35b6109ce61233d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5260048036036020811015610a2657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d1565b6040518082815260200191505060405180910390f35b610a706123e9565b005b610ab460048036036020811015610a8857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612770565b005b610af860048036036020811015610acc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612862565b005b610b02612ab9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60046020528060005260406000206000915090505481565b6000610b8a7f8d30935436f9763ba510dd452958b894e82a2f2df9a715965b97948f5f6554bb60001b6120c2565b610bb67f540ab7eb13a723764abb54f31073978e1a056e582ae6a5a0462b01c9077e85c560001b6120c2565b610be27fe89437c01d8f61ffb579f3817688b3b2fbfaa05125a88b3c67261c31e48cd44b60001b6120c2565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c557f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b610c817f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b610cad7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b610cd97ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b610dc47feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b610df07f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b610e1c7f199ebc860835465e653d5f3529ded97a9d1d9022f6a04982dd25452629221ee460001b6120c2565b610e487f563873a770b8bec6c59dd33118c9e859a94e8aee7dab1c5aaa34a297fc5eaffe60001b6120c2565b610e747fe94c66a7af827134e7fe7641210fb3bc7410bb9ab0820d57284ad6983a9a039560001b6120c2565b610e7d816113f3565b50565b6000610eae7fb8636c7958b2fdcf394fbad77445c90a04f8af4b6ad54b77f1a699e3368d679b60001b6120c2565b610eda7f51780eda96ae13557d50a5b0cc4f15a32d8df830427810f7cb0ee5d4c5138f4360001b6120c2565b610f067fc0ee94f7785a9e0558c697f8caf882ae82cbbd38140f3c8b1e051698035f586e60001b6120c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60056020528060005260406000206000915090505481565b60076020528060005260406000206000915054906101000a900460ff1681565b610f927f382d93b023531f50d6d42dbf5fe8f53204083df223b210824a01ef5f7520096660001b6120c2565b610fbe7fadc7fd506dcb3e07a4df382c007ba0ff2b382bb2e6a9753d634c5f84c9a9e5ac60001b6120c2565b610fea7fca342ce8f32afa93a60e822a8b9a4f120c7ddcaff19eed0f11ef7730bde2c32160001b6120c2565b610ff48182612adf565b6110207fcd7c4dd121825dfe35bd543ed991e5b92769ac7c2cb8cc905b68dcfc05e9c89a60001b6120c2565b61104c7f7367f857ab7ad88aa02bf5a6cc895925a742b39c9cbc26299bbfeff7b8a125e060001b6120c2565b61105581613306565b50565b50565b60006110897ff0f9cf48eee00d8f448690e37784a00c3bf23ea568148c965338e354a680222660001b6120c2565b6110b57f4fdf2705d02263a6902b49c2650d9c5eb2f6e6c188bbdf3d669517f00df9d43960001b6120c2565b6110e17f206f4dcaee767055ddbe59219dac22cf00ffc5d83e188ea173839274bba3162360001b6120c2565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6111617fb91b9b727b80d64410258aaaeb2918528367562dcb351fbd1347d559bf6c4da060001b6120c2565b61118d7fdfffe4fc27319050bc90f35199a1ee2f81aae6c04c243a07f47b829a24c24c5a60001b6120c2565b6111b97ffc9a8226693a490df5afc1bc05198b488e62e2bd169913a44814015ae75976fe60001b6120c2565b6111c233613306565b565b60006111f27f51b86fedfcfb91e992427db7b7bb8e4a5c18bd400e42cfb707b09e3f87f01bd960001b6120c2565b61121e7f22c8e3a309c720a2be6d2c9e0a35f67f2e09f39b5eeb08b95383cb975d84a97760001b6120c2565b61124a7fdec4cfd3d5a2b977603d79e7e261c177504206d10b0a7d090b71c1d06b8d5b8160001b6120c2565b600054905090565b61127e7fb582cf390bc69e2bbac202e7146ab40217adff3e1a610636e74e550273a68fe160001b6120c2565b6112aa7fc5c6a2503d880fbafecb6eca6cffd4e7e6ff32d94cfd5f333af4a08dc61b61e960001b6120c2565b6112d67f5945bb6025bd4be7317bf83d7156dfe74eaed755e7761781c9158d875170175660001b6120c2565b6112e03382612adf565b50565b6000806113127f6d21d91f53e64636833842af0b1ff2bc91c7deff6136dd6e5d84ea94b3f5629b60001b6120c2565b61133e7f7801a63eb869b2941daf4dac41de65d2eefb48d8356043ef087d0b91707344a560001b6120c2565b61136a7f1824962066b83997c42ddde0df8506b198d63cf5534af2fa4e98f0da27315a0260001b6120c2565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491509150915091565b61141f7f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b61144b7f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6114777fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b6114a37ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b61158e7feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b6115ba7f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b6115e67fd44bd0a5a8e1b1cf5c40e8686ea93068735e46e04ea8f7451f1dbe4b5663cb1660001b6120c2565b6116127f413a061529df923ef1df668287e71961f34c644bda5d9e7c50a1b688bc70d0ad60001b6120c2565b61163e7fa0947243ffec2f263e5a42db60281289ab7d30cf30c815dab76aff61fbb4c8d960001b6120c2565b61166a7fae293520888da26834f1f7d0a5e180bd2fd7b38315e3b43eb9880ec9f72d398360001b6120c2565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615f6a6024913960400191505060405180910390fd5b6117387fc94e9860303bddde773e258e690fd77fa94f62f34eef08dbeeb3caa6a1084ccb60001b6120c2565b6117647f07236db6fdb4f04851861d5a02b6b19e07aa173215ba87f713c843661572e31260001b6120c2565b6117907ff0a3ed86d5bf70a045cc857c964a0dfe3697009ba02afde0539b93640dac70df60001b6120c2565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118147fec8cd4d3ba6bf27673f2a51d49743c00e0efad87c40afe43a105b4534b6f900b60001b6120c2565b6118407fbb06e7a5566421d5268a045ca7a8df7c8b9180d63cfdcaf8868c914322ae9a0660001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce60405160405180910390a350565b6118c97f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b6118f57f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6119217fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b61194d7ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611a387feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611a647f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611a907f185510b26e4533633eb9e81fb4b278833126a4775ec9f935437561596b8fbf8260001b6120c2565b611abc7fc4030fe5ed91aa493625bb81b13feeecb9e75e87930bafb8fac1198a6452865060001b6120c2565b611ae87f51d743be5efbbdc9d2345ad2165a5a694d136119509a608dc84a2dcecdaf9e9960001b6120c2565b611af18161354b565b50565b60005481565b611b267f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b611b527f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b611b7e7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b611baa7ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611c957feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611cc17f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611ced7f21a9d6adbb1fd2de9a3b4799706cfb5dc3ee5c9af765ce13c20fdb74c70d1c4260001b6120c2565b611d197f7eb8a4b485304918653e2946f4e38710f4a2ad63d00554abb94b7c96d4d87ce060001b6120c2565b611d457fee20a448205dafb1c9c05e9e3994ab8008ffb03d46d12f8b589d8986f15cc00a60001b6120c2565b611d528585858585613982565b5050505050565b6224ea0081565b60066020528060005260406000206000915090505481565b611da47f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b611dd07f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b611dfc7fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b611e287ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ee7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b611f137feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b611f3f7f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b611f6b7f72a0cb4c872172de61485421f90edfb4d8b580103d590c9815615d237091e8b360001b6120c2565b611f977fe884888a461226ffd96fa58e88cac64db1c2a8e894e4fe7ebb766267f7b26b8f60001b6120c2565b611fc37f64794ea099490c3fdef8853b08d1bb0af5a67d5476535117e5aa01a4198ebbc960001b6120c2565b611fcc816143d4565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120237faa62d4170cca1279af59222ff9a3dd683190db71504fa7808a11f923f3fa446960001b6120c2565b61204f7f8b718ba75c06aeb0de3a5aa438ed8cc94723969ef94d5068fcf00aaeb66d7e9160001b6120c2565b61207b7fbb444eb32e956dd5e2d37c58284e3bdb898d19da6cf88ec9116b6bfd6a4a2a8260001b6120c2565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b50565b60006120f37f6cca1833a7ce056afde293c960b4f2537dd26784f8a782136db017fd40c9096460001b6120c2565b61211f7fa2d8e93e3e54cdb3a4b2be05ad5da16750f117ef63999c06dbf9089b22ecda5460001b6120c2565b61214b7fb8c1c0de814152d59088b12c96fded18e84d6f6fb43281820f77bf6e9b25718660001b6120c2565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60096020528060005260406000206000915090505481565b60006121d87fd581639942bd57930cb26494ed1b3c78df4df5f646cd5f8b2b5c68f75b924d0d60001b6120c2565b6122047fa92746ef821f9af86a5a2aa242d7c500a7a4f5a6aa936e45e2fc76fc5a5823dd60001b6120c2565b6122307fab2768db8421a0c4a45b361d9891d7febb37d69838636c7e2c8fe90600589de660001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006122867f73e1231b72914553ce72612130cb14ceb3ea72283d3da549062ea7d875eee8a760001b6120c2565b6122b27fc431eaf4e43e60aadf886c5a1e82e5602b3d7842ed669f7643af99e0efe78a4f60001b6120c2565b6122de7ff4bf8ff9452e138ad4fe4f977582d11086773eb283e291a0184982fde2da3c1560001b6120c2565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60036020528060005260406000206000915090505481565b600061236b7f410111e00ef9ea45fc8fe867b2dd3eb522b31a8ac610bc223fd87a135907b5dc60001b6120c2565b6123977fe1f47c334c4e9ac1b77463fb4c86c993e198ef2af8158ee26e70a90732f4b3c660001b6120c2565b6123c37f3ed97b31d10d9a32d15072a2b0ad8c3464a76d6b4e835e77b51ebbd9c754f6a460001b6120c2565b6123cc33614612565b905090565b60086020528060005260406000206000915090505481565b6124157fc9b6161bb463010133b07b3749dab52b3b5bae2ffa5b0ff771e4fef924920d2160001b6120c2565b6124417f956b27ac437c4177acf2f585d679a7be824018549fd6a06e59ec7233953fea7960001b6120c2565b61246d7fb0735d6f0b9c25f5f6203d19e16f4b02a736026c69752d5916e6f71e83812c6460001b6120c2565b600061247833614aae565b90506124a67fe696d5a9526c91685a4614699f77b000bcc2cb035a6cfe7328a6aa299314643760001b6120c2565b6124d27fa346e4761b70576222cdc29bd041506125aa6ffb80e99f2513dc0396d2b7d75060001b6120c2565b6124fe7f1e0acd9d879f08925c14ccb1a2be1b6ff30b93bb33efe31099881695c33697d260001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b15801561254457600080fd5b505afa158015612558573d6000803e3d6000fd5b505050506040513d602081101561256e57600080fd5b8101908080519060200190929190505050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414801561268a57508073ffffffffffffffffffffffffffffffffffffffff16630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561260d57600080fd5b505afa158015612621573d6000803e3d6000fd5b505050506040513d602081101561263757600080fd5b8101908080519060200190929190505050600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b6126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806160e66023913960400191505060405180910390fd5b61270b7fedcc2b993deb24a268a31f29b0aeadd64f14cad64f21629bb4dbe26c763cfc3f60001b6120c2565b6127377f57b0e8fe5ec7cb3130f9a658584b9bd13dbdf7739a8cc97a4bc746c05581c4db60001b6120c2565b6127637fdba9e5889e452afdfe10e6b8afe1c40d17eaa101d67423b51150febcb8f4b7dd60001b6120c2565b61276d3382614c15565b50565b61279c7f8a345477d48d5c4876763e8543ab319c75e4a162841ec51453ff17080145877660001b6120c2565b6127c87f69de36af6f1868ff74eb03f10513d1a7d169a885219eccf3b49a68c322fd7b8760001b6120c2565b6127f47f8236a71187ed4b4f256819879b85f6f3d6fee1044971a09ad0ca9ca78d26a48f60001b6120c2565b6127fe3382612adf565b61282a7f9817baab47b1a224bd209595f3f433f7401137b769c7fbbeef71a519617afdf860001b6120c2565b6128567fa6e9521ce627d0abf4d9eafde16ab9e44241d35719ef6efedac81e8f88994dcc60001b6120c2565b61285f33613306565b50565b61288e7f4946666976b8b9994c882a2970baef992924a6ceb9f10091be61fe6a3095b56f60001b6120c2565b6128ba7f73ec956ff383de72f7c143e2a4e60a9b3a07e1ca0c9fd8214f34bec5faa4e42a60001b6120c2565b6128e67fcfbfbaebad920d340fe4c9fb712c6b87ea511be2671adf5bd7fa3abb9fac445b60001b6120c2565b6129127ffbc3b630cb2e65d530e1d9b9a07f1257a4a1cd22dc25a8496f1491f12f6a651660001b6120c2565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c792061646d696e2063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b6129fd7feb76b3d32079e8c0e61231a7caa481c15057ed6fb41264d1b469347b2630d7c560001b6120c2565b612a297f41962bc8f84454d24965bafb3d3ad246b9bc1e9c70fb9a52fffaef19a006e05460001b6120c2565b612a557fa14fe3830a4c36831d7f5efe9e432a58097763811f509158662eadc5ae5917e560001b6120c2565b612a817f2885d693c641f52d08156618f9f73d171fae6b6660c227fa5c80213a9ef9904960001b6120c2565b612aad7fecca3a7f5f9ce183e3b4c016c435c9f543fcc3d10f0f4fdefb65062049cfcf9a60001b6120c2565b612ab681615105565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b0b7f32d1b74cc50d16562974e82f053f152d08e1bb420e63931fe9b5548a2bd8194160001b6120c2565b612b377f1abcf5dbb19ca541ee32650c8d112828f082170b302d16d5a773d5e7564d837060001b6120c2565b612b637f9758af99550fa21a43fd8f7ff032795ca121478eecb185975b1190737cfd7ab160001b6120c2565b612b8f7f0dc75cfdeeb4f9f45072e6495ac1995aa97020794bb9c8176a2ae13f5f85c1ef60001b6120c2565b600080541415612bea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806160756022913960400191505060405180910390fd5b612c167f8b2a4d4c360cc2484c70c9a9bc8c2509849e5aa23fddfd83279a144e2361182260001b6120c2565b612c427f044e09fc509c9773bb976a1b726e44622d5a2657d467b373dd5c5c7ea7db388d60001b6120c2565b612c6e7f28c85247847e3581a4d13260fd45b3d97ab1443e6bca3b40ceedb79f92f4d73e60001b6120c2565b612c9a7fd9484fd18ba5d363b2031df5a9295c2270e5ac91c89ebb88f4c819f3fd24701d60001b6120c2565b4260005410612cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615fb2602a913960400191505060405180910390fd5b612d207f59c7059dcc5c3f2b92467ad40a7ea55a33e7840fb0968e42b96a2996966b92fe60001b6120c2565b612d4c7f9a8ed0e72d8e07021da192b401b38d39f235fc59db778d6f7e8d2d46dc13afe060001b6120c2565b612d787fc1c47e132db7835f40e66c902a83846ca56226491c2239bb55744318497afd5f60001b6120c2565b6000819050612da97f12df37e7c609a9266da89a1bc569fa090c6ad938fcc150a2413e4a435fe371ae60001b6120c2565b612dd57f5fa5d1e4013ceb89c9335056ebeb83bb5f8cb76bb4d8e5bb5a9eb7284fc2fb4f60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e9657612e367fcb0a00123a753151361074c70cee2b2d91d0304f6588e422759ebe04d4c6490460001b6120c2565b612e627fa6d4da324a5de41fea5db60e4df1902776e66f7f509e95be5aef8de53016bf2760001b6120c2565b612e8e7f6aaef27a6b716a0c22d672c70b57623d539c47ec9aefa2a2e63c61d2ee04452160001b6120c2565b829050612ec3565b612ec27fceca843deb6474bc8a1191d4d0a5ab2aeb7630cc6199606ce51e50c3e81862ac60001b6120c2565b5b612eef7f3b9fa9174dc6a4df4dc32fa9ed7ac7a4ad41138b23992e0e32995f37c9356bd860001b6120c2565b612f1b7fe72fe8b7995975f8e43e041a03b116eb5b7e3ba3825986ca73b041e76677ebd260001b6120c2565b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612f8b7ffd340739b7a2c38ae28baa65c897a82da8873f8c782f7bb81650c8c8dbd3182c60001b6120c2565b612fb77f298b1cb32cce7c3c3a683636fa7fbcd793e9c765bc02f426fa2cde06a8d8802d60001b6120c2565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130287f9ab63a8a3fe7cc91de6d80ee7b9d58d61d586f2b285fd1c9843a1eb9eacdead260001b6120c2565b6130547fb013a37e78aa2d0477a3339ccc81cc15daab83c6e480f1fee57e12248cd7aba960001b6120c2565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130ff57600080fd5b505af1158015613113573d6000803e3d6000fd5b505050506040513d602081101561312957600080fd5b810190808051906020019092919050505090506131687fb52cf5bec8ea5f7740d5f106b51e9f48043e54aea5d1b44b2b7a031917eb8c0360001b6120c2565b6131947fbfbcf3b75bb4c7a828f089c50140ee2348a61442ba222d6c5db7192a019f90d360001b6120c2565b6131c07fd7dfa52a48ab69979694c9fa26d8ccf10a13b50c29e8799eb48a9e9531da2abf60001b6120c2565b80613216576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180615f246046913960600191505060405180910390fd5b6132427f9821cdb90d8dbb520d9787cf22665329f055aaaae5a0076c46e8f352cfe129d460001b6120c2565b61326e7fb46cdacb2840ef568a3c58e3e42155b9e9490c6e2380320bffb91c2cfc1f961760001b6120c2565b61329a7fdb12fa92c7609773d48220182794f03c4ce1140c7d56e73be39c86b30306a34e60001b6120c2565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6133327ff2f6aa91ba57661874aba566e7c9eb97c0ce0af60a04acd51e253bdc478fa7a160001b6120c2565b61335e7fa52ecb22b17614096a67aa7139209b6836e8905e5f4452bfb14bc03876ee0e2060001b6120c2565b61338a7fb1fd726d0379bd894395ba13777c96880bcc4203fbdcb7f5cf6b7c8d0c0c21e760001b6120c2565b600061339582614aae565b90506133c37fc21ba7f7c1927e8b6d2353cb128b2a0370fa4d5524d9a3f0f1e964630dcc300d60001b6120c2565b6133ef7f1c13d451ad86d5806bca5b1fc6edfd66aca99e858a7d15029fb4017235cd93f560001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156134b8576134507fea0eaed7eef9dfefa8a117d7f8f49b5fac08cfa69d0ffd93681e04a4a9f3f34a60001b6120c2565b61347c7fc73b7c611574449ac1805d22452156c2b6a8b610ecf792c5c492be085a8f4dc360001b6120c2565b6134a87f858b6b1b7b76300c4bc2637e7d0f837152627611e8997eba542112f6a3ec089360001b6120c2565b6134b182614612565b90506134e5565b6134e47f51b6041242fe87c23613c4ca83c0ce6cc782f984daa1175b5282198f4cbae01360001b6120c2565b5b6135117f179004e13c69c281c926ed9a60d5197d533b662af042352a71862de1d486126b60001b6120c2565b61353d7f14b43749593568faccdaf6c0f2da5fec840b3e8fe509e834b96b6fb1ae14d83960001b6120c2565b6135478282614c15565b5050565b6135777ff18828f34a77d25fd2a204d334ae8c7b2b0d98ae51df09f97d54f49563d6834c60001b6120c2565b6135a37f7e1d277935cf039dd06e2f077f2fb3e92eed84a15a655dfb01efe6784dc1802d60001b6120c2565b6135cf7fe69fb858002425942ccd46bf74bcb82d08e11a613d73dad7feaf5fe333df716c60001b6120c2565b6135fb7fbebccc5bfed7845ceddfadd20eaca584f424d9d9c7204e543499cb92efef0fca60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561369e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4c6f636b656446756e643a20496e76616c696420416464726573732e0000000081525060200191505060405180910390fd5b6136ca7f7743e52bcb6872bf1d1a937ebffe9f93c9cf6cfffb1bf3ac5c947c84e799c54b60001b6120c2565b6136f67f9f8622f8282425a9cf50dd7a52322b2ad4c903f8e62cdc6745d32739db7ef8c260001b6120c2565b6137227f3d124cacafc426f63ea78db7a3bd7621a904df790271474212172e5dda5bc24c60001b6120c2565b61374e7f11397a69873ece5b3016d5f0f65eb0f51d418c7b8e6995442a3ee8397d16504560001b6120c2565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156137f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806160976025913960400191505060405180910390fd5b61381d7f3dc3b3cf7884ec478650b70fd4882a0c18568511fd8ca387834303e35572414960001b6120c2565b6138497f3bd22af39de246e0772e4ff2b3b658497468aca05614d8772890732d3ff0d05e60001b6120c2565b6138757f5d29ca3aa4f9c24c944ebad343879784c0b979dd7bce772475ac26142fd40c7060001b6120c2565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506138f97f1b52293c92f7800ec1b7dd5149bccc729b7e1599fc3610c2808db0974f694a4960001b6120c2565b6139257f3e6b6bee3e1f8cbe9adff4eba70247b9ba8ce5db4391da18ba233600c2dca11e60001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a350565b6139ae7f5a7a4a8cd4eaed25a4abce89994aed5294195b3b0dce256f325c75c679a333f260001b6120c2565b6139da7f2ea55fa634713a02b5d6764e96fc31afa709e45e72e8b9667a85d9d5af41ab1660001b6120c2565b613a067f157208259828fd14e6db7c4c1fb519aa08d05e8f34094be9c284a326abdf031860001b6120c2565b613a327fb6bf6d447545e6a05b6d1d4e2ad50d22c22889c7f038a18a98e2fec70165337960001b6120c2565b6000821415613a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615f8e6024913960400191505060405180910390fd5b613ab87fe6c1959a4bd7642de42aa166d79e92f8c040f7a2a9b9da551d0e7dd266a8031760001b6120c2565b613ae47f72ebec2be4c64905c5190d3476d5fac853390d90e7cb030878356c4884492fea60001b6120c2565b613b107f657b203a0ab3025e05e209a75625e8e0e326abf328416dc5b0543b685cc852d660001b6120c2565b613b3c7f5ed0253e0e090a4bbe09ca14086f8bc78434ae36fa6463c54f1c3f368dec345360001b6120c2565b60258210613b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061602f6021913960400191505060405180910390fd5b613bc17f2eed951e0f6fd85710b5ddacc0c441d570d487ad3d9d6bb3ce74c287c28eae5460001b6120c2565b613bed7f06b0c5e165e6b159b79071367de627eb9406eba71179a88e94c994659997383d60001b6120c2565b613c197fa1eb142fecc059a467791ca6d6d916bc7049adc667f5660a0a95fb84d9ce610660001b6120c2565b613c457fe1c512f481e37ada1c419df8141bc3123fce9186fb456bf10442ca84afb0473960001b6120c2565b6127108110613c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615fdc6032913960400191505060405180910390fd5b613ccb7f4253d588a70c7932665c1fef05bdbce22dc7b675a4a5626a90b995294c9c396f60001b6120c2565b613cf77fc242cedfee87f54a801135683992ccbc0d0ae84ceb8ceb85f886488358947aab60001b6120c2565b613d237fea8c76a324989741e1dd0a9d1938853daefd5e77df28f1745d2c8cd622e299a960001b6120c2565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613e0257600080fd5b505af1158015613e16573d6000803e3d6000fd5b505050506040513d6020811015613e2c57600080fd5b81019080805190602001909291905050509050613e6b7f6f3212c288a091864b826af7cdfc5895d4eecd85115d69cbe24612e4cfc47d3860001b6120c2565b613e977f371fdd23407273151153089a7d8ead8dd2a23b631b156d17c55ec18a7a00ce6e60001b6120c2565b613ec37fb145cd25e93b0c3d1289d4013a60e3a92f05eb2c7ce3bb2508143547524e934760001b6120c2565b80613f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180615f246046913960600191505060405180910390fd5b613f457ffd7f9919678fa90bd5a0197e1d95f21b9fc319f0daf8fa43f83f734a25a0625560001b6120c2565b613f717f8c03b4278000ac923acdf3bb7f44bd699f67061267ac0506f5dce4662d85d22060001b6120c2565b613f9d7f25a8823d3e88d176ff318d07f8a70764545891a2c53df8172b2bbeb6f2986fe660001b6120c2565b6000613fc6612710613fb885896153b590919063ffffffff16565b6156cf90919063ffffffff16565b9050613ff47f785eb8af4bbc16ef7f37647b0a9e6042d83e3c60dbdbf8095919c3405e7a170c60001b6120c2565b6140207f97572340a11e9c9ba0709fa6c0235b126bae0f0b847f77a455566a7d93cdca3060001b6120c2565b61407281600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461579d90919063ffffffff16565b600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140e17fadd1acf0558b4df378e30ee799df9098c787a34db3c977bb6231bfbb47cbbda060001b6120c2565b61410d7f7ff04435c561f5dc27abad6c9b50bbf086c7047a5f114602c32e97730cc3ee5d60001b6120c2565b6141718161416388600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461579d90919063ffffffff16565b6159b290919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141e07f4e1ba96dc6dff93cd4b0ebdd540fb6b9492977f4c01f6b6a4cc684b63547c35060001b6120c2565b61420c7fe87f7523fe7dab0124360bae8f11fe0103d7d2ed7171cc712ff9f3b7c78124b260001b6120c2565b6224ea008502600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142817f8fa49e8ec1acb1c8f61af22aa79df5a600ca9c0589f9607be7a9d2586495405560001b6120c2565b6142ad7f5285cfdf1009da32f49963f221a40b03b4ae76728d108f047aab6e33af37be4c60001b6120c2565b6224ea008402600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506143227ffddfb9e3c8aa09f940363e40c5592c355be323a85a1d97f0b8d1c12ff534123960001b6120c2565b61434e7f45108368a3cfb977088f1abe4f46f7ddf2b4039728eaa6a8afac558c6a23262960001b6120c2565b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a888888886040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050505050565b6144007ff2de3703434f4415d392044b2002bf19052f7d34e8e414c9211f70bb9efeeea060001b6120c2565b61442c7f8eeb39b944b7e122a8ccf6531dc802ff8b07024e9a755bf85324358d8f2ea7fb60001b6120c2565b6144587fa217a7a5a481254b17960363327bc44da12c57c0446f197c2453aa637a4d6b3060001b6120c2565b6144847fb38b09ea1ce8acd0b415e30a3ae35c65793a4e1cb58ba5a849d09f738416c07660001b6120c2565b60008114156144de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806160506025913960400191505060405180910390fd5b61450a7f97d122643e292d81b5791e4c087b9666a84128e1a8190a996b942ddabcfa3d3f60001b6120c2565b6145367fbd7d4313f21bef8a2bd6e6a6a9b6b8363f25128f70b3fc6bf43cf9f919630be660001b6120c2565b6145627f778665f1c1361780f502c9c40634f21e09027025bcdd4b4559aad4fb34890e2660001b6120c2565b806000819055506145957fd281c46a21343f29aba5e462dc693ee3044c3a7196cade580f93f1e332f0a92d60001b6120c2565b6145c17ff841ddb5987747e91d4aec7afbc303ddc406ccf020e4d9447dfb4a6dcef9fcfa60001b6120c2565b3373ffffffffffffffffffffffffffffffffffffffff167f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94826040518082815260200191505060405180910390a250565b60006146407f099f0f4beeab2d0d5cfc3ed6f138c76f54d9d12d77632ac7804bed5d63ee6a8060001b6120c2565b61466c7f15cd849300d0cff158bd75207e492192e0295f70644b5f4724230661b274b44e60001b6120c2565b6146987f9a67bf8a00c89a911f932c5beb691d0440d62ef939be823ef70d442d123967d760001b6120c2565b6146c47fe63e824a9bc7f2d2070611413f079002396a3d1249045dc306fc13f7f93c755860001b6120c2565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415801561475457506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b6147a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806160bc602a913960400191505060405180910390fd5b6147d57fd36eb2707a929bdb9a82d43f125ed9f218c00f2a6349a2f8ec307708e8d101fa60001b6120c2565b6148017fa13b9cb0ded95be2ef3d610472bacb461d86efd966cc54da338d358b25c5052860001b6120c2565b61482d7fc431137e542fba43a12946ab234f1b3348051f808ecb3e400e548d6f2e5492cd60001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630665a06f836000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b15801561496557600080fd5b505af1158015614979573d6000803e3d6000fd5b505050506149a97feb84e2e98f750099f6a12a17b228af6efd14a45da9e69be26ae85d53c515c55f60001b6120c2565b6149d57fe8839bdbfa2bdbe86ab6787c83e7b71342245fde9588f805178faef4218ff64160001b6120c2565b6149de82614aae565b9050614a0c7f46c4cb90b19235ff6fc55c36f5cab4c48da6b5b8d21f3c76ae7b26c2fc3227db60001b6120c2565b614a387feb82bf1014f20ad76c1c4f125593e206ad75ae708562bc456b6f67551d5c9bce60001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6000614adc7f8e56a657ee9eeb3841541aaac5ac2331d9fe55b98ba2604ff388324c3304f94160001b6120c2565b614b087fa56f2526df98a4a70429179464d83e976b8e368014d183fa1d1c1626ddb743f960001b6120c2565b614b347fee62d1035803aaafaa50e3933f0c497ee2a20a70f029681972e31474307e125860001b6120c2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cc49ede7836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614bd357600080fd5b505afa158015614be7573d6000803e3d6000fd5b505050506040513d6020811015614bfd57600080fd5b81019080805190602001909291905050509050919050565b614c417f67d7a523c6f24336e024fa1df492c977d7c45c6fabbcd04f65f6507c577b462c60001b6120c2565b614c6d7fbb54d59daf6decb198ad8eedf74bdbcd6ad7ab89808f3b18f4368677140ee28f60001b6120c2565b614c997fe1fab23ebdc2c288439ffaeaf42d881626225d35a4821134710cd5801ef61bb960001b6120c2565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050614d097f6810bbb868a8216ac25357ea1ef57233aad728bd62c242eed32ed9f39b7e111b60001b6120c2565b614d357f63d84521e884c74b1fe88b373f6febb7ba4662bf4024653f0eba75f3815c33a560001b6120c2565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614da67f36b2a7113f91194c9a121ee53ed579159bc757a407eb6587325b8cffef5a668360001b6120c2565b614dd27f83543865e5dc44996ed2a9a837377fa8ed9df96577e25fc05ed06955644d924160001b6120c2565b614dfe7fdfe401b06ceea015e072c2d169acb077d0dc07536c0f8edfe4d2f3b4ef9973c460001b6120c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614ea757600080fd5b505af1158015614ebb573d6000803e3d6000fd5b505050506040513d6020811015614ed157600080fd5b8101908080519060200190929190505050614f54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4c6f636b656446756e643a20417070726f7665206661696c65642e000000000081525060200191505060405180910390fd5b614f807f1e7d28e374b4ad17a701f458bfc23c911dccaeff672d9a612ba9dccd5e5a7b2860001b6120c2565b614fac7f4f755a415ac5cda9cd6382b525ba935b084793a9bfece614cfc557ac15751a9560001b6120c2565b614fd87f9c25cbcd62d96a993bf63d2f683525dc41f4e9afc4974a16356111a70728849560001b6120c2565b8173ffffffffffffffffffffffffffffffffffffffff16637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561502b57600080fd5b505af115801561503f573d6000803e3d6000fd5b5050505061506f7f85730c4b1ed5602564ee4ca31b9c2186db04dc3c2442acdc60cc7018657b4fb760001b6120c2565b61509b7f158adb9e1c2ba2701a3774d50f2bf0b454ca0149a9017067c1a27d97556bbdc460001b6120c2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b836040518082815260200191505060405180910390a3505050565b6151317f1c2e0ab2daa50c6af223e5a4a38cda73244e06754019097bac898d3a8d0ad72b60001b6120c2565b61515d7ff709447a43d916016620baffa27e0b612c237dfde458a4cd3158a24f95e59c5660001b6120c2565b6151897f072ca76825e34184e852e51358abb0403ef001ce51650bb3e3270104cece56c860001b6120c2565b6151b57ffbf68d9cba3602380a8dd1ea5133db55631c6cacf3ae6134922c59642f9f233c60001b6120c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561523b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806161096030913960400191505060405180910390fd5b6152677f632367eae68bc60b4b3ed9477d92656f8d6385849cff8a98fb471c4ab72a6f2960001b6120c2565b6152937fe7dde9282727830d8509f7af4624b918a6f95fe48dcaf6b5360d028443839f3560001b6120c2565b6152bf7f1c6020d90b840db2fedeedf9fd0518b690cce2e8392ebe6f9455a97eb9e875a960001b6120c2565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061532c7f9d988d582446515dd8de8177f2f020288f17d4e406967c6a2f07fa08a5de473b60001b6120c2565b6153587ffcc3a502f003451fda9ba1c6236e289cf035e776d54d9424ad2e2701a513380660001b6120c2565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e760405160405180910390a350565b60006153e37f44698d1e9a904ed1284ff1ffbc3dd61250c83d2c71afd5df19fbf19c6190a1c260001b615a80565b61540f7fa3a4b98cb2a23eda9dbb54b77b676d94ca9d1d4bafcc15caee09e68074b0ef8d60001b615a80565b61543b7f3c0e96b55c01aeef942723329b7f27779568810ddd00a05282ffd2e3b5d233d760001b615a80565b60008314156154d1576154707ff802f4a238c6bfb87737692d90643ed6d1e91071b816804127f57dca78bfaab660001b615a80565b61549c7f9c7552f9a426f225c2850fa12a0dc5fb398b1adc4885e41fd5a32fae1dbf05d760001b615a80565b6154c87f88253dfa1829ebe573c7def7f8d624e362791a1e5da86330776d1836a357555360001b615a80565b600090506156c9565b6154fc7ec5af928e6c63fb10ff91a6c5a4e910c4f39f595f742d8e52dc11b03ad6250f60001b615a80565b6155287f5e551b5129d493f012d238e272eb615eaa6959509de842125d5c3b203db4ec2660001b615a80565b6155547f6eeef49995c967235a764d0bfc2ddf3ad4e6890ca3a3e7024c52da8393db1ce160001b615a80565b600082840290506155877fab80a6313ea3c5926e33d7cfa6c464eb729cc09a2e212bce50dc9d97fae0ed7260001b615a80565b6155b37fcf8cc8694fe56eef0897d8bf5580925daf8927e537ada7fb46a3727fe18d423260001b615a80565b6155df7ff5b30a17ff5e5b532b98d8059efeb460d05236f98b90e61b8794894cfad8502d60001b615a80565b828482816155e957fe5b0414615640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061600e6021913960400191505060405180910390fd5b61566c7f9fdef838f8fa27d2dbdb6cfecf3f275aa85c5ae07d712150d6e17c19c215bfd560001b615a80565b6156987fe9975f5879861c66ca2a2d35617f5a37951b7cf797008080c2db7371f45b3b1460001b615a80565b6156c47f1040ca89b272f25ce391ff02203288f6f7b9bee30a94da64205ca6d937da6b3460001b615a80565b809150505b92915050565b60006156fd7f996468adab2cfba5de081e00c611ca70c15d8fec7d5bf522494a62c1469ffa6a60001b615a80565b6157297f9f1ba2348d57cab76c102a92e631d7e3d939d3a1ce6cb3a01a504d1656b19f5060001b615a80565b6157557f46d4aa33cd017349564c3524038979baabbfc921b9cf218610f32f2cefa7e6de60001b615a80565b61579583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615a83565b905092915050565b60006157cb7fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b615a80565b6157f77fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b615a80565b6158237fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b615a80565b600082840190506158567fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b615a80565b6158827fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b615a80565b6158ae7fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b615a80565b83811015615924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b6159507f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b615a80565b61597c7f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b615a80565b6159a87fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b615a80565b8091505092915050565b60006159e07f692a0cfdea6cb12cdfcaa599c058fa5662531cebd540556a6d1c27ae01b4cea360001b615a80565b615a0c7f2cce8d8afd666e4919d1ece0b47a35eda094c843996926984c8b17a0d5cd2f7160001b615a80565b615a387f936781d4063de1913a3eda99a7c2145fe8a9c61ba2abe4fa4e7dd270bf8b933960001b615a80565b615a7883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615cd7565b905092915050565b50565b6000615ab17f196dd912071b7ac5c8a10b8a236898e903a5c95f5189a9aeb16dc1191096752060001b615a80565b615add7ff25ec16e9c80532b14a66f8cd16ae291eebc856235e409a39c3fbd9dc53e53fb60001b615a80565b615b097ffb609f676697fca43f3242dd637f8af44d19e0456d05ec1547a1557478b8a1ea60001b615a80565b615b357ffc25a7e532044dc446303b3445457a6ba5f30c2ec2085a7b37e4ae0e05b09ba260001b615a80565b60008314158290615be1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615ba6578082015181840152602081019050615b8b565b50505050905090810190601f168015615bd35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50615c0e7f295ce5b61523fe81f08b0e41715a55fb7cc4323fa58af5f536a59e28b507ad6660001b615a80565b615c3a7f4460e22500904e71005e8ef95355467cd96d8038ca3b358379ef52915f4cd11a60001b615a80565b615c667f898838ee4191c5d93d43aba28d5dace210f5b5fe59d06155be60fc494d99a9f060001b615a80565b6000838581615c7157fe5b049050615ca07f6d2a274d329c86c87e9d63cea7c87a6fd3d3ca9ab129144ff43f4724a38a4a5960001b615a80565b615ccc7fbb4fe2c1c37d48811af5ff17eb49f43a22d0b33ae049d66f26c63e5ac81928dc60001b615a80565b809150509392505050565b6000615d057f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b615a80565b615d317f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b615a80565b615d5d7f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b615a80565b615d897fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b615a80565b838311158290615e34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615df9578082015181840152602081019050615dde565b50505050905090810190601f168015615e265780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50615e617f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b615a80565b615e8d7f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b615a80565b615eb97f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b615a80565b60008385039050615eec7f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b615a80565b615f187f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b615a80565b80915050939250505056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a723158207f62dae5e609d06a020f3af63364576272b32cd2f9bfd3c84e0615da999df87764736f6c63430005110032", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162001e1a38038062001e1a833981810160405260808110156200003757600080fd5b8151602083015160408085015160608601805192519496939591949391820192846401000000008211156200006b57600080fd5b9083019060208201858111156200008157600080fd5b82518660208202830111640100000000821117156200009f57600080fd5b82525081516020918201928201910280838360005b83811015620000ce578181015183820152602001620000b4565b5050505090500160405250505083600014156200011d5760405162461bcd60e51b815260040180806020018281038252602581526020018062001da36025913960400191505060405180910390fd5b6001600160a01b038316620001645760405162461bcd60e51b815260040180806020018281038252602281526020018062001dc86022913960400191505060405180910390fd5b6001600160a01b038216620001ab5760405162461bcd60e51b815260040180806020018281038252603081526020018062001dea6030913960400191505060405180910390fd5b6000848155600180546001600160a01b038087166001600160a01b03199283161790925560028054928616929091169190911790555b8151811015620003175760006001600160a01b03168282815181106200020357fe5b60200260200101516001600160a01b0316141562000268576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600760008484815181106200027b57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550818181518110620002c757fe5b60200260200101516001600160a01b0316336001600160a01b03167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a3600101620001e1565b5050505050611a77806200032c6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806389facb201161010f578063c4086893116100a2578063ce46643b11610071578063ce46643b14610599578063e5545864146105a1578063ec3ea7d4146105c7578063fc0c546a146105ed576101f0565b8063c40868931461051f578063cb3fdb6114610545578063cc6f03331461056b578063cdce101b14610573576101f0565b80639114557e116100de5780639114557e146104a5578063aaba2c0d146104cb578063b36760a3146104f1578063c227cbd814610517576101f0565b806389facb20146104525780638c8ba66d1461045a5780638efd94f314610480578063904c5b8f1461049d576101f0565b80634558269f1161018757806361ade4261161015657806361ade426146103c057806370480275146103e657806377a69b521461040c578063849a681714610414576101f0565b80634558269f1461034b5780634c2a295c1461035357806355e715cf1461035b578063594092db14610381576101f0565b806324276777116101c3578063242767771461029f57806324d7806c146102c55780632b6df82a146102ff5780633e4a89d114610325576101f0565b80630483a7f6146101f5578063129de5bf1461022d5780631785f53c1461025357806321df0da71461027b575b600080fd5b61021b6004803603602081101561020b57600080fd5b50356001600160a01b03166105f5565b60408051918252519081900360200190f35b61021b6004803603602081101561024357600080fd5b50356001600160a01b0316610607565b6102796004803603602081101561026957600080fd5b50356001600160a01b0316610622565b005b610283610680565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102b557600080fd5b50356001600160a01b031661068f565b6102eb600480360360208110156102db57600080fd5b50356001600160a01b03166106a1565b604080519115158252519081900360200190f35b6102796004803603602081101561031557600080fd5b50356001600160a01b03166106b6565b6102eb6004803603602081101561033b57600080fd5b50356001600160a01b03166106c9565b6102796106e7565b61021b6106f2565b6102796004803603602081101561037157600080fd5b50356001600160a01b03166106f8565b6103a76004803603602081101561039757600080fd5b50356001600160a01b0316610702565b6040805192835260208301919091528051918290030190f35b610279600480360360208110156103d657600080fd5b50356001600160a01b031661072a565b610279600480360360208110156103fc57600080fd5b50356001600160a01b031661081d565b61021b610878565b610279600480360360a081101561042a57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013561087e565b61021b6108e4565b61021b6004803603602081101561047057600080fd5b50356001600160a01b03166108eb565b6102796004803603602081101561049657600080fd5b50356108fd565b610283610958565b61021b600480360360208110156104bb57600080fd5b50356001600160a01b0316610967565b61021b600480360360208110156104e157600080fd5b50356001600160a01b0316610982565b61021b6004803603602081101561050757600080fd5b50356001600160a01b031661099d565b6102836109af565b61021b6004803603602081101561053557600080fd5b50356001600160a01b03166109be565b61021b6004803603602081101561055b57600080fd5b50356001600160a01b03166109d9565b6102836109eb565b61021b6004803603602081101561058957600080fd5b50356001600160a01b03166109fb565b610279610a0d565b610279600480360360208110156105b757600080fd5b50356001600160a01b0316610b53565b610279600480360360208110156105dd57600080fd5b50356001600160a01b0316610b66565b610283610bc1565b60046020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b3360009081526007602052604090205460ff16610674576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161072a565b50565b6001546001600160a01b031690565b60056020526000908152604090205481565b60076020526000908152604090205460ff1681565b6106c08182610bd0565b61067d81610d84565b6001600160a01b031660009081526007602052604090205460ff1690565b6106f033610d84565b565b60005490565b61067d3382610bd0565b6001600160a01b03166000908152600860209081526040808320546009909252909120549091565b3360009081526007602052604090205460ff1661077c576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166107d35760405162461bcd60e51b81526004018080602001828103825260248152602001806118746024913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b3360009081526007602052604090205460ff1661086f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81610db9565b60005481565b3360009081526007602052604090205460ff166108d0576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6108dd8585858585610eb9565b5050505050565b6224ea0081565b60066020526000908152604090205481565b3360009081526007602052604090205460ff1661094f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161115d565b6002546001600160a01b031681565b6001600160a01b031660009081526003602052604090205490565b6001600160a01b031660009081526005602052604090205490565b60096020526000908152604090205481565b6002546001600160a01b031690565b6001600160a01b031660009081526004602052604090205490565b60036020526000908152604090205481565b60006109f6336111d7565b905090565b60086020526000908152604090205481565b6000610a183361132b565b9050806001600160a01b03166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b505133600090815260086020526040902054148015610b0e5750806001600160a01b0316630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6020811015610afa57600080fd5b505133600090815260096020526040902054145b610b495760405162461bcd60e51b81526004018080602001828103825260238152602001806119f06023913960400191505060405180910390fd5b61067d33826113ae565b610b5d3382610bd0565b61067d33610d84565b3360009081526007602052604090205460ff16610bb8576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81611540565b6001546001600160a01b031681565b600054610c0e5760405162461bcd60e51b815260040180806020018281038252602281526020018061197f6022913960400191505060405180910390fd5b4260005410610c4e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806118bc602a913960400191505060405180910390fd5b806001600160a01b038116610c605750815b6001600160a01b038084166000908152600560209081526040808320805490849055600154825163a9059cbb60e01b815287871660048201526024810183905292519195169263a9059cbb926044808201939182900301818787803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b5051905080610d325760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b826001600160a01b0316856001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6000610d8f8261132b565b90506001600160a01b038116610dab57610da8826111d7565b90505b610db582826113ae565b5050565b6001600160a01b038116610e14576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610e6c5760405162461bcd60e51b81526004018080602001828103825260258152602001806119a16025913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b81610ef55760405162461bcd60e51b81526004018080602001828103825260248152602001806118986024913960400191505060405180910390fd5b60258210610f345760405162461bcd60e51b81526004018080602001828103825260218152602001806119396021913960400191505060405180910390fd5b6127108110610f745760405162461bcd60e51b81526004018080602001828103825260328152602001806118e66032913960400191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050506040513d6020811015610ff757600080fd5b50519050806110375760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b600061105b61271061104f888663ffffffff6115d116565b9063ffffffff61163316565b6001600160a01b038816600090815260056020526040902054909150611087908263ffffffff61167516565b6001600160a01b0388166000908152600560209081526040808320939093556003905220546110ce9082906110c2908963ffffffff61167516565b9063ffffffff6116cf16565b6001600160a01b038816600081815260036020908152604080832094909455600881528382206224ea008a810290915560098252918490209188029091558251898152908101889052808301879052606081018690529151909133917fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a9181900360800190a350505050505050565b806111995760405162461bcd60e51b815260040180806020018281038252602581526020018061195a6025913960400191505060405180910390fd5b600081905560408051828152905133917f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94919081900360200190a250565b336000908152600860205260408120541580159061120357503360009081526009602052604090205415155b61123e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119c6602a913960400191505060405180910390fd5b6002546001600160a01b038381166000818152600860209081526040808320546009909252808320548151630665a06f60e01b815260048101959095526024850184905260448501929092526064840191909152519290931692630665a06f9260848084019382900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b505050506112da8261132b565b9050806001600160a01b0316826001600160a01b0316336001600160a01b03167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6002546040805163cc49ede760e01b81526001600160a01b0384811660048301529151600093929092169163cc49ede791602480820192602092909190829003018186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b505192915050565b6001600160a01b038083166000908152600460208181526040808420805490859055600154825163095ea7b360e01b8152888816958101959095526024850182905291519095919091169363095ea7b3936044808201949392918390030190829087803b15801561141e57600080fd5b505af1158015611432573d6000803e3d6000fd5b505050506040513d602081101561144857600080fd5b505161149b576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656446756e643a20417070726f7665206661696c65642e0000000000604482015290519081900360640190fd5b816001600160a01b0316637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506040805184815290516001600160a01b038087169450871692507f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b9181900360200190a3505050565b6001600160a01b0381166115855760405162461bcd60e51b8152600401808060200182810382526030815260200180611a136030913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e790600090a350565b6000826115e05750600061162d565b828202828482816115ed57fe5b041461162a5760405162461bcd60e51b81526004018080602001828103825260218152602001806119186021913960400191505060405180910390fd5b90505b92915050565b600061162a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611711565b60008282018381101561162a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061162a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b3565b6000818361179d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561176257818101518382015260200161174a565b50505050905090810190601f16801561178f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816117a957fe5b0495945050505050565b600081848411156118055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561176257818101518382015260200161174a565b50505090039056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4f6e6c792061646d696e2063616e2063616c6c20746869732e000000000000004c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a72315820458668e8d6ee8e9ea39ff268a3f1ba842cc9003ee32e59dba2d1ba7b352c0ac664736f6c634300051100324c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20496e76616c696420546f6b656e20416464726573732e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642e", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806389facb201161010f578063c4086893116100a2578063ce46643b11610071578063ce46643b14610599578063e5545864146105a1578063ec3ea7d4146105c7578063fc0c546a146105ed576101f0565b8063c40868931461051f578063cb3fdb6114610545578063cc6f03331461056b578063cdce101b14610573576101f0565b80639114557e116100de5780639114557e146104a5578063aaba2c0d146104cb578063b36760a3146104f1578063c227cbd814610517576101f0565b806389facb20146104525780638c8ba66d1461045a5780638efd94f314610480578063904c5b8f1461049d576101f0565b80634558269f1161018757806361ade4261161015657806361ade426146103c057806370480275146103e657806377a69b521461040c578063849a681714610414576101f0565b80634558269f1461034b5780634c2a295c1461035357806355e715cf1461035b578063594092db14610381576101f0565b806324276777116101c3578063242767771461029f57806324d7806c146102c55780632b6df82a146102ff5780633e4a89d114610325576101f0565b80630483a7f6146101f5578063129de5bf1461022d5780631785f53c1461025357806321df0da71461027b575b600080fd5b61021b6004803603602081101561020b57600080fd5b50356001600160a01b03166105f5565b60408051918252519081900360200190f35b61021b6004803603602081101561024357600080fd5b50356001600160a01b0316610607565b6102796004803603602081101561026957600080fd5b50356001600160a01b0316610622565b005b610283610680565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102b557600080fd5b50356001600160a01b031661068f565b6102eb600480360360208110156102db57600080fd5b50356001600160a01b03166106a1565b604080519115158252519081900360200190f35b6102796004803603602081101561031557600080fd5b50356001600160a01b03166106b6565b6102eb6004803603602081101561033b57600080fd5b50356001600160a01b03166106c9565b6102796106e7565b61021b6106f2565b6102796004803603602081101561037157600080fd5b50356001600160a01b03166106f8565b6103a76004803603602081101561039757600080fd5b50356001600160a01b0316610702565b6040805192835260208301919091528051918290030190f35b610279600480360360208110156103d657600080fd5b50356001600160a01b031661072a565b610279600480360360208110156103fc57600080fd5b50356001600160a01b031661081d565b61021b610878565b610279600480360360a081101561042a57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013561087e565b61021b6108e4565b61021b6004803603602081101561047057600080fd5b50356001600160a01b03166108eb565b6102796004803603602081101561049657600080fd5b50356108fd565b610283610958565b61021b600480360360208110156104bb57600080fd5b50356001600160a01b0316610967565b61021b600480360360208110156104e157600080fd5b50356001600160a01b0316610982565b61021b6004803603602081101561050757600080fd5b50356001600160a01b031661099d565b6102836109af565b61021b6004803603602081101561053557600080fd5b50356001600160a01b03166109be565b61021b6004803603602081101561055b57600080fd5b50356001600160a01b03166109d9565b6102836109eb565b61021b6004803603602081101561058957600080fd5b50356001600160a01b03166109fb565b610279610a0d565b610279600480360360208110156105b757600080fd5b50356001600160a01b0316610b53565b610279600480360360208110156105dd57600080fd5b50356001600160a01b0316610b66565b610283610bc1565b60046020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b3360009081526007602052604090205460ff16610674576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161072a565b50565b6001546001600160a01b031690565b60056020526000908152604090205481565b60076020526000908152604090205460ff1681565b6106c08182610bd0565b61067d81610d84565b6001600160a01b031660009081526007602052604090205460ff1690565b6106f033610d84565b565b60005490565b61067d3382610bd0565b6001600160a01b03166000908152600860209081526040808320546009909252909120549091565b3360009081526007602052604090205460ff1661077c576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166107d35760405162461bcd60e51b81526004018080602001828103825260248152602001806118746024913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b3360009081526007602052604090205460ff1661086f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81610db9565b60005481565b3360009081526007602052604090205460ff166108d0576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6108dd8585858585610eb9565b5050505050565b6224ea0081565b60066020526000908152604090205481565b3360009081526007602052604090205460ff1661094f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161115d565b6002546001600160a01b031681565b6001600160a01b031660009081526003602052604090205490565b6001600160a01b031660009081526005602052604090205490565b60096020526000908152604090205481565b6002546001600160a01b031690565b6001600160a01b031660009081526004602052604090205490565b60036020526000908152604090205481565b60006109f6336111d7565b905090565b60086020526000908152604090205481565b6000610a183361132b565b9050806001600160a01b03166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b505133600090815260086020526040902054148015610b0e5750806001600160a01b0316630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6020811015610afa57600080fd5b505133600090815260096020526040902054145b610b495760405162461bcd60e51b81526004018080602001828103825260238152602001806119f06023913960400191505060405180910390fd5b61067d33826113ae565b610b5d3382610bd0565b61067d33610d84565b3360009081526007602052604090205460ff16610bb8576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81611540565b6001546001600160a01b031681565b600054610c0e5760405162461bcd60e51b815260040180806020018281038252602281526020018061197f6022913960400191505060405180910390fd5b4260005410610c4e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806118bc602a913960400191505060405180910390fd5b806001600160a01b038116610c605750815b6001600160a01b038084166000908152600560209081526040808320805490849055600154825163a9059cbb60e01b815287871660048201526024810183905292519195169263a9059cbb926044808201939182900301818787803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b5051905080610d325760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b826001600160a01b0316856001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6000610d8f8261132b565b90506001600160a01b038116610dab57610da8826111d7565b90505b610db582826113ae565b5050565b6001600160a01b038116610e14576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610e6c5760405162461bcd60e51b81526004018080602001828103825260258152602001806119a16025913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b81610ef55760405162461bcd60e51b81526004018080602001828103825260248152602001806118986024913960400191505060405180910390fd5b60258210610f345760405162461bcd60e51b81526004018080602001828103825260218152602001806119396021913960400191505060405180910390fd5b6127108110610f745760405162461bcd60e51b81526004018080602001828103825260328152602001806118e66032913960400191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050506040513d6020811015610ff757600080fd5b50519050806110375760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b600061105b61271061104f888663ffffffff6115d116565b9063ffffffff61163316565b6001600160a01b038816600090815260056020526040902054909150611087908263ffffffff61167516565b6001600160a01b0388166000908152600560209081526040808320939093556003905220546110ce9082906110c2908963ffffffff61167516565b9063ffffffff6116cf16565b6001600160a01b038816600081815260036020908152604080832094909455600881528382206224ea008a810290915560098252918490209188029091558251898152908101889052808301879052606081018690529151909133917fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a9181900360800190a350505050505050565b806111995760405162461bcd60e51b815260040180806020018281038252602581526020018061195a6025913960400191505060405180910390fd5b600081905560408051828152905133917f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94919081900360200190a250565b336000908152600860205260408120541580159061120357503360009081526009602052604090205415155b61123e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119c6602a913960400191505060405180910390fd5b6002546001600160a01b038381166000818152600860209081526040808320546009909252808320548151630665a06f60e01b815260048101959095526024850184905260448501929092526064840191909152519290931692630665a06f9260848084019382900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b505050506112da8261132b565b9050806001600160a01b0316826001600160a01b0316336001600160a01b03167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6002546040805163cc49ede760e01b81526001600160a01b0384811660048301529151600093929092169163cc49ede791602480820192602092909190829003018186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b505192915050565b6001600160a01b038083166000908152600460208181526040808420805490859055600154825163095ea7b360e01b8152888816958101959095526024850182905291519095919091169363095ea7b3936044808201949392918390030190829087803b15801561141e57600080fd5b505af1158015611432573d6000803e3d6000fd5b505050506040513d602081101561144857600080fd5b505161149b576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656446756e643a20417070726f7665206661696c65642e0000000000604482015290519081900360640190fd5b816001600160a01b0316637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506040805184815290516001600160a01b038087169450871692507f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b9181900360200190a3505050565b6001600160a01b0381166115855760405162461bcd60e51b8152600401808060200182810382526030815260200180611a136030913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e790600090a350565b6000826115e05750600061162d565b828202828482816115ed57fe5b041461162a5760405162461bcd60e51b81526004018080602001828103825260218152602001806119186021913960400191505060405180910390fd5b90505b92915050565b600061162a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611711565b60008282018381101561162a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061162a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b3565b6000818361179d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561176257818101518382015260200161174a565b50505050905090810190601f16801561178f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816117a957fe5b0495945050505050565b600081848411156118055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561176257818101518382015260200161174a565b50505090039056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4f6e6c792061646d696e2063616e2063616c6c20746869732e000000000000004c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a72315820458668e8d6ee8e9ea39ff268a3f1ba842cc9003ee32e59dba2d1ba7b352c0ac664736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Openzeppelin/Address.sol/Address.json b/artifacts/contracts/Openzeppelin/Address.sol/Address.json index 63df167..306abec 100644 --- a/artifacts/contracts/Openzeppelin/Address.sol/Address.json +++ b/artifacts/contracts/Openzeppelin/Address.sol/Address.json @@ -2,25 +2,9 @@ "_format": "hh-sol-artifact-1", "contractName": "Address", "sourceName": "contracts/Openzeppelin/Address.sol", - "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0xfd43e276", - "type": "bytes32" - } - ], - "name": "c_0xfd43e276", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - } - ], - "bytecode": "0x609b610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80639e7bfcfe146038575b600080fd5b606160048036036020811015604c57600080fd5b81019080803590602001909291905050506063565b005b5056fea265627a7a72315820f4e82dc9108eb66f5414c22e23950d7f61f154528904f77d0fad1661e2c5182f64736f6c63430005110032", - "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80639e7bfcfe146038575b600080fd5b606160048036036020811015604c57600080fd5b81019080803590602001909291905050506063565b005b5056fea265627a7a72315820f4e82dc9108eb66f5414c22e23950d7f61f154528904f77d0fad1661e2c5182f64736f6c63430005110032", + "abi": [], + "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723158205937740270c64775b05a5ffa30d0311e2674bb6aa0227c96dadead14f1cd0de364736f6c63430005110032", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723158205937740270c64775b05a5ffa30d0311e2674bb6aa0227c96dadead14f1cd0de364736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Openzeppelin/Context.sol/Context.json b/artifacts/contracts/Openzeppelin/Context.sol/Context.json index 566ee4d..b861471 100644 --- a/artifacts/contracts/Openzeppelin/Context.sol/Context.json +++ b/artifacts/contracts/Openzeppelin/Context.sol/Context.json @@ -8,21 +8,6 @@ "payable": false, "stateMutability": "nonpayable", "type": "constructor" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0xdb7cf3fd", - "type": "bytes32" - } - ], - "name": "c_0xdb7cf3fd", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" } ], "bytecode": "0x", diff --git a/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json b/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json index 9abcc2a..ed43432 100644 --- a/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json +++ b/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json @@ -126,36 +126,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x42d820d8", - "type": "bytes32" - } - ], - "name": "c_0x42d820d8", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0xdb7cf3fd", - "type": "bytes32" - } - ], - "name": "c_0xdb7cf3fd", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": false, "inputs": [ @@ -281,8 +251,8 @@ "type": "function" } ], - "bytecode": "0x60806040526100367f1648ed9a3a549f0d89d1da17e5d55a7f910027e202bf03f77ecab104844d19fb60001b61003b60201b60201c565b61003e565b50565b611d518061004d6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a2d69fe116100665780639a2d69fe1461026b578063a457c2d714610299578063a9059cbb146102ff578063dd62ed3e14610365578063de786db2146103dd5761009e565b8063095ea7b3146100a357806318160ddd1461010957806323b872dd1461012757806339509351146101ad57806370a0823114610213575b600080fd5b6100ef600480360360408110156100b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061040b565b604051808215151515815260200191505060405180910390f35b610111610505565b6040518082815260200191505060405180910390f35b6101936004803603606081101561013d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610593565b604051808215151515815260200191505060405180910390f35b6101f9600480360360408110156101c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107a0565b604051808215151515815260200191505060405180910390f35b6102556004803603602081101561022957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061092f565b6040518082815260200191505060405180910390f35b6102976004803603602081101561028157600080fd5b81019080803590602001909291905050506109fb565b005b6102e5600480360360408110156102af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109fe565b604051808215151515815260200191505060405180910390f35b61034b6004803603604081101561031557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ba7565b604051808215151515815260200191505060405180910390f35b6103c76004803603604081101561037b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ca1565b6040518082815260200191505060405180910390f35b610409600480360360208110156103f357600080fd5b8101908080359060200190929190505050610dac565b005b60006104397f0d42ccaca515977830f39e5becdbabcee85221bd96d2dbe4f5c4fd1c85faa4f260001b6109fb565b6104657f754bf2ca5c77b407378982e552328835db434ca83ce9a717a1653fe5711d1fae60001b6109fb565b6104917f29963cee0945aee92c2445dde7b8b4f3a6cdcfaf73de48985b894b146fc0e32b60001b6109fb565b6104a361049c610daf565b8484610e3b565b6104cf7fd3d5e5509e5cf6e120dccb4bdb71e3ac08a9e249b3c368b228f693ebe00d3a0c60001b6109fb565b6104fb7f3c8e72bb3eb97920d5ce54b49094b721dd40891cd173090f708ac710354a271f60001b6109fb565b6001905092915050565b60006105337f5ab4b2827b7adc7d1615b3fff4b96378a946b2c2d915dc989b69a1cfcfba8cc660001b6109fb565b61055f7fb8c09fff4908341d91dd69c3e87ca7844a6698b0819fb96dc538c250ed62eca460001b6109fb565b61058b7f9d0a15e22e847c149e2b58fc2aedb22922b840474f89eb4d312b3c5b78cd5b2c60001b6109fb565b600254905090565b60006105c17ffaf709f346fe3db8ae0124b295421b4e2b2c9b1cd0cadcc780c22f8a4384d59760001b6109fb565b6105ed7f7ad44ef5d3f1e0e833b1e92fd1e3f2c7e5a53bd5e7a5d3dce9beff11464374ef60001b6109fb565b6106197fd6c24c3dfc7552619edd906094e7f17001e775b65b5ccebefca8043e02757a4360001b6109fb565b61062484848461126e565b6106507f5b96f9469c516dbe56cd327c0f8f634d794798325c948710798a5a94c2789d2d60001b6109fb565b61067c7fd2eb81ff83f28d13475a9de327d36049bc434c4548fcd2a76c3780941f5e48cf60001b6109fb565b61073d84610688610daf565b61073885604051806060016040528060288152602001611c8760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106ee610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b610e3b565b6107697f57a15dd9623caa237d7a7077577ded38892410b0a25de72d4b5adfe6113396ac60001b6109fb565b6107957f8e9ad68ec491eabdf1812f7053db0a03a049f6d15f2f69fa88fc20490192df2a60001b6109fb565b600190509392505050565b60006107ce7f608255447736a1e05dd20beee2382814ccf870fa753087ba4a4b1a310552ff6460001b6109fb565b6107fa7f492dc0c5b05a7ffc5af47ee5ef898af0284d44aee2414161ab3e4261c102d68660001b6109fb565b6108267f2e5597593e4b1d6a198285b1b266864576ee1af09905ea75857aca096ce2701f60001b6109fb565b6108cd610831610daf565b846108c88560016000610842610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0390919063ffffffff16565b610e3b565b6108f97f39abdd95fe79d7662434a95e5d54b0c5e184cb933c1d0897b06a0562bc18393560001b6109fb565b6109257fc91754ec9db384f5fea245dc2da3a47b5f0264482ea0037319b98e8c0eab928560001b6109fb565b6001905092915050565b600061095d7fbf11abd02ab3bb802d2e5f99795b3e2f0029c94a76dd17c98892daea64bc72d060001b6109fb565b6109897ffef5ad299e7a3e9ab91375c4e51e155903c0d60b3c990446a6d5ada35300700360001b6109fb565b6109b57f968ebb724aec6bce5faeca202a01f8fd8e5da1bfac5b100527b14d2da30e8fd560001b6109fb565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b50565b6000610a2c7f5f443dd38a143da0f9225497f53288bf2c714176cdbfb41d31674d74dd4ccba660001b6109fb565b610a587f1e28cf5cf881aaf56d724265c30c1e508a3efc1746b5abd59aa73f92949aa54160001b6109fb565b610a847f5d481fd5d46258a2f5daaa0cc18e1ec9f00090010bc8914548e7db894864093e60001b6109fb565b610b45610a8f610daf565b84610b4085604051806060016040528060258152602001611cf86025913960016000610ab9610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b610e3b565b610b717f76d6074abc30f881ff6d416b956be4b2a4d50495113e3ca703a2344d7a87e3f760001b6109fb565b610b9d7faef4d09f98e81fa40d6d23e067fb3d1945292b6116de91c5123cc4d87829085760001b6109fb565b6001905092915050565b6000610bd57fd1f99140089561020c26495e4bff4faf43bf4723034291712a0fe085c62ca0e360001b6109fb565b610c017ff026da482222cc112cbda53a49693b193e42fc7e6df13d27c671ea172127d27a60001b6109fb565b610c2d7fa39db9fb95f48df90321e4f29a2e109b146bcd3b09c341f7996f1a0d4d4693f460001b6109fb565b610c3f610c38610daf565b848461126e565b610c6b7f61cbed024b9eb9b0e7f025bcdc6d8a53b1b9afaacd0490efcf41be17bbc2cd5060001b6109fb565b610c977fa6cc3c9fa193e9f2deca62efcdddb5b1be98dd9414c484d713df4a3f8f84ebe760001b6109fb565b6001905092915050565b6000610ccf7f5fbe00c778dfdb68f544193be7026e7d9e1f3d155e039c4441c5ce99487ab58760001b6109fb565b610cfb7f0b66eb1b4ba67f8a2debbfa264bcc88a0c5a5585942322e8da2048b536ca688760001b6109fb565b610d277fc1dc7f6e3323267ffbfbc407dff8089abe4733ce9c57ed5a38364df62e27a54a60001b6109fb565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b50565b6000610ddd7ff34b2a8b2e9e739c67260af773ba5665e40bdf8d965ecab3b00bcae74560b64260001b610dac565b610e097f2ba39a87f17acfb11161f566e253783aebea98ccbb9bbfbb6309a7334892b2da60001b610dac565b610e357fc9dcf20a261df4fd57144851da3a3c427cb24d07d5a6f61638c5df6df65791d660001b610dac565b33905090565b610e677fc4d20d5bea6a9f16ba818d7e36ebcc778b72081a85c2980911b37f77473fcfe560001b6109fb565b610e937f53a971d56012e06d193c95146c05704674d6e63fc426486c8fc2adbde49f84fd60001b6109fb565b610ebf7f2d4547104a0d1e6b7a26118aab4f1ac602ed4719bf6108961548c4ee7a73459d60001b6109fb565b610eeb7f6686b2cbcfa8e7d83a64eeaefc2795ddf534e4ce251cc44ba22e831f2437bf1160001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611cd46024913960400191505060405180910390fd5b610f9d7f0621319e4b9b2a4be42926b4f3681e8c61351af22cc728be4fb560dcf026149460001b6109fb565b610fc97facce556ea82a7bc65b74b437598ffa3c91a2151624ad0fdafcb5c57a1dbdc83260001b6109fb565b610ff57f030def8372bf273c3d4812a3ccd9d503df582007a5422ab807966de1b113eb7260001b6109fb565b6110217f503fb5eac9225f9e9280e8eba5d49bfb7bf68adec8dd52e1565488204947c14360001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611c3f6022913960400191505060405180910390fd5b6110d37f9ed4ed8864b8acef5391f32c30a28b0d033373f6188e5cc79ef27beac4148c6a60001b6109fb565b6110ff7f46fa9573d78386238685625e980e0f7f0a52dca1988af56fff3bdb10409d086e60001b6109fb565b61112b7f43b10bb899642d0a27f99a76700962d8963f86d8639183df04123c90c177a30d60001b6109fb565b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111d87f10d4eadbc4bbaab320133533ceba51208f926314315c162ec2c6dd7acead3fb360001b6109fb565b6112047f7194093eb53c4d1b4220bea3da2922947134cf794a518c973b6a580217ed3c5b60001b6109fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b61129a7ffde53eb1b51a405de289b72e6ae4f964bc2970a7117d1c47c687807402d255b660001b6109fb565b6112c57efbda40eef188545a791f6a7136ca520097a9320e8f312112f68b8bad2c16b860001b6109fb565b6112f17f6d4de5512cca78b838932b1f8d3cb7c612645bb722a0d6bfcf532069b72224bb60001b6109fb565b61131d7f5d44d165dd8d78b755d21a81cb1a4d992ad809c5e757138c6fed7ff50fc6d36860001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113a3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611caf6025913960400191505060405180910390fd5b6113cf7f59fbff3d39bb2f794bbfd9b9596a8bf931739db75955ab8eba2240faabdefbd660001b6109fb565b6113fb7f6a7fac40ea7c0f2b86fd31cf5d040ec026b12e03e3012a4207463f5cb0b6401760001b6109fb565b6114277f404bae8f46c77c858095a0384310c85d4e3c2c4af808377e00b6ea36dfd2455c60001b6109fb565b6114537f4d0a9f54abc8d4274701fba20e505fab043d19e4155bd38b00dcf61ca94b656260001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611c1c6023913960400191505060405180910390fd5b6115057f3b15337a07af433b0102767f6d3f9f3f02078cce7caf7b0c8348218f676f4fc260001b6109fb565b6115317f5ee77e5f423175b79dbc44db8005605cb46b5c106510cab1dcc8f63cf0a23af560001b6109fb565b61155d7ff0304b05d1bc1dcbaa53187232eb51ca84f6e8b18d1e9b6bacf309e0a65bc66660001b6109fb565b6115c881604051806060016040528060268152602001611c61602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506116367f31f6a3ec25469db3ba150cd99148071cf2ef11e59f546101d0eda2ba11ab7c9e60001b6109fb565b6116627fac00036bf582646016737d71ca4d2fcae576e4c6c2623398c132780429fc2d2660001b6109fb565b6116b3816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117217f403b0476122d0361189c31d4006929f7a7fbe9b62788d2a27ec1c0da0907738060001b6109fb565b61174d7f55cec332cefddbc58eb87639930830627e390ed0ba7604e23446e43a57b355a160001b6109fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60006117e57f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b611c18565b6118117f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b611c18565b61183d7f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b611c18565b6118697fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b611c18565b838311158290611914576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156118d95780820151818401526020810190506118be565b50505050905090810190601f1680156119065780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506119417f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b611c18565b61196d7f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b611c18565b6119997f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b611c18565b600083850390506119cc7f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b611c18565b6119f87f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b611c18565b809150509392505050565b6000611a317fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b611c18565b611a5d7fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b611c18565b611a897fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b611c18565b60008284019050611abc7fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b611c18565b611ae87fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b611c18565b611b147fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b611c18565b83811015611b8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b611bb67f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b611c18565b611be27f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b611c18565b611c0e7fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b611c18565b8091505092915050565b5056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582098e1fd6168f47b4e8ee3726611e0bbdd70d6bbe9449cc68668bfb1591f1ba3df64736f6c63430005110032", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a2d69fe116100665780639a2d69fe1461026b578063a457c2d714610299578063a9059cbb146102ff578063dd62ed3e14610365578063de786db2146103dd5761009e565b8063095ea7b3146100a357806318160ddd1461010957806323b872dd1461012757806339509351146101ad57806370a0823114610213575b600080fd5b6100ef600480360360408110156100b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061040b565b604051808215151515815260200191505060405180910390f35b610111610505565b6040518082815260200191505060405180910390f35b6101936004803603606081101561013d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610593565b604051808215151515815260200191505060405180910390f35b6101f9600480360360408110156101c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107a0565b604051808215151515815260200191505060405180910390f35b6102556004803603602081101561022957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061092f565b6040518082815260200191505060405180910390f35b6102976004803603602081101561028157600080fd5b81019080803590602001909291905050506109fb565b005b6102e5600480360360408110156102af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109fe565b604051808215151515815260200191505060405180910390f35b61034b6004803603604081101561031557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ba7565b604051808215151515815260200191505060405180910390f35b6103c76004803603604081101561037b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ca1565b6040518082815260200191505060405180910390f35b610409600480360360208110156103f357600080fd5b8101908080359060200190929190505050610dac565b005b60006104397f0d42ccaca515977830f39e5becdbabcee85221bd96d2dbe4f5c4fd1c85faa4f260001b6109fb565b6104657f754bf2ca5c77b407378982e552328835db434ca83ce9a717a1653fe5711d1fae60001b6109fb565b6104917f29963cee0945aee92c2445dde7b8b4f3a6cdcfaf73de48985b894b146fc0e32b60001b6109fb565b6104a361049c610daf565b8484610e3b565b6104cf7fd3d5e5509e5cf6e120dccb4bdb71e3ac08a9e249b3c368b228f693ebe00d3a0c60001b6109fb565b6104fb7f3c8e72bb3eb97920d5ce54b49094b721dd40891cd173090f708ac710354a271f60001b6109fb565b6001905092915050565b60006105337f5ab4b2827b7adc7d1615b3fff4b96378a946b2c2d915dc989b69a1cfcfba8cc660001b6109fb565b61055f7fb8c09fff4908341d91dd69c3e87ca7844a6698b0819fb96dc538c250ed62eca460001b6109fb565b61058b7f9d0a15e22e847c149e2b58fc2aedb22922b840474f89eb4d312b3c5b78cd5b2c60001b6109fb565b600254905090565b60006105c17ffaf709f346fe3db8ae0124b295421b4e2b2c9b1cd0cadcc780c22f8a4384d59760001b6109fb565b6105ed7f7ad44ef5d3f1e0e833b1e92fd1e3f2c7e5a53bd5e7a5d3dce9beff11464374ef60001b6109fb565b6106197fd6c24c3dfc7552619edd906094e7f17001e775b65b5ccebefca8043e02757a4360001b6109fb565b61062484848461126e565b6106507f5b96f9469c516dbe56cd327c0f8f634d794798325c948710798a5a94c2789d2d60001b6109fb565b61067c7fd2eb81ff83f28d13475a9de327d36049bc434c4548fcd2a76c3780941f5e48cf60001b6109fb565b61073d84610688610daf565b61073885604051806060016040528060288152602001611c8760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106ee610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b610e3b565b6107697f57a15dd9623caa237d7a7077577ded38892410b0a25de72d4b5adfe6113396ac60001b6109fb565b6107957f8e9ad68ec491eabdf1812f7053db0a03a049f6d15f2f69fa88fc20490192df2a60001b6109fb565b600190509392505050565b60006107ce7f608255447736a1e05dd20beee2382814ccf870fa753087ba4a4b1a310552ff6460001b6109fb565b6107fa7f492dc0c5b05a7ffc5af47ee5ef898af0284d44aee2414161ab3e4261c102d68660001b6109fb565b6108267f2e5597593e4b1d6a198285b1b266864576ee1af09905ea75857aca096ce2701f60001b6109fb565b6108cd610831610daf565b846108c88560016000610842610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0390919063ffffffff16565b610e3b565b6108f97f39abdd95fe79d7662434a95e5d54b0c5e184cb933c1d0897b06a0562bc18393560001b6109fb565b6109257fc91754ec9db384f5fea245dc2da3a47b5f0264482ea0037319b98e8c0eab928560001b6109fb565b6001905092915050565b600061095d7fbf11abd02ab3bb802d2e5f99795b3e2f0029c94a76dd17c98892daea64bc72d060001b6109fb565b6109897ffef5ad299e7a3e9ab91375c4e51e155903c0d60b3c990446a6d5ada35300700360001b6109fb565b6109b57f968ebb724aec6bce5faeca202a01f8fd8e5da1bfac5b100527b14d2da30e8fd560001b6109fb565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b50565b6000610a2c7f5f443dd38a143da0f9225497f53288bf2c714176cdbfb41d31674d74dd4ccba660001b6109fb565b610a587f1e28cf5cf881aaf56d724265c30c1e508a3efc1746b5abd59aa73f92949aa54160001b6109fb565b610a847f5d481fd5d46258a2f5daaa0cc18e1ec9f00090010bc8914548e7db894864093e60001b6109fb565b610b45610a8f610daf565b84610b4085604051806060016040528060258152602001611cf86025913960016000610ab9610daf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b610e3b565b610b717f76d6074abc30f881ff6d416b956be4b2a4d50495113e3ca703a2344d7a87e3f760001b6109fb565b610b9d7faef4d09f98e81fa40d6d23e067fb3d1945292b6116de91c5123cc4d87829085760001b6109fb565b6001905092915050565b6000610bd57fd1f99140089561020c26495e4bff4faf43bf4723034291712a0fe085c62ca0e360001b6109fb565b610c017ff026da482222cc112cbda53a49693b193e42fc7e6df13d27c671ea172127d27a60001b6109fb565b610c2d7fa39db9fb95f48df90321e4f29a2e109b146bcd3b09c341f7996f1a0d4d4693f460001b6109fb565b610c3f610c38610daf565b848461126e565b610c6b7f61cbed024b9eb9b0e7f025bcdc6d8a53b1b9afaacd0490efcf41be17bbc2cd5060001b6109fb565b610c977fa6cc3c9fa193e9f2deca62efcdddb5b1be98dd9414c484d713df4a3f8f84ebe760001b6109fb565b6001905092915050565b6000610ccf7f5fbe00c778dfdb68f544193be7026e7d9e1f3d155e039c4441c5ce99487ab58760001b6109fb565b610cfb7f0b66eb1b4ba67f8a2debbfa264bcc88a0c5a5585942322e8da2048b536ca688760001b6109fb565b610d277fc1dc7f6e3323267ffbfbc407dff8089abe4733ce9c57ed5a38364df62e27a54a60001b6109fb565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b50565b6000610ddd7ff34b2a8b2e9e739c67260af773ba5665e40bdf8d965ecab3b00bcae74560b64260001b610dac565b610e097f2ba39a87f17acfb11161f566e253783aebea98ccbb9bbfbb6309a7334892b2da60001b610dac565b610e357fc9dcf20a261df4fd57144851da3a3c427cb24d07d5a6f61638c5df6df65791d660001b610dac565b33905090565b610e677fc4d20d5bea6a9f16ba818d7e36ebcc778b72081a85c2980911b37f77473fcfe560001b6109fb565b610e937f53a971d56012e06d193c95146c05704674d6e63fc426486c8fc2adbde49f84fd60001b6109fb565b610ebf7f2d4547104a0d1e6b7a26118aab4f1ac602ed4719bf6108961548c4ee7a73459d60001b6109fb565b610eeb7f6686b2cbcfa8e7d83a64eeaefc2795ddf534e4ce251cc44ba22e831f2437bf1160001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611cd46024913960400191505060405180910390fd5b610f9d7f0621319e4b9b2a4be42926b4f3681e8c61351af22cc728be4fb560dcf026149460001b6109fb565b610fc97facce556ea82a7bc65b74b437598ffa3c91a2151624ad0fdafcb5c57a1dbdc83260001b6109fb565b610ff57f030def8372bf273c3d4812a3ccd9d503df582007a5422ab807966de1b113eb7260001b6109fb565b6110217f503fb5eac9225f9e9280e8eba5d49bfb7bf68adec8dd52e1565488204947c14360001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611c3f6022913960400191505060405180910390fd5b6110d37f9ed4ed8864b8acef5391f32c30a28b0d033373f6188e5cc79ef27beac4148c6a60001b6109fb565b6110ff7f46fa9573d78386238685625e980e0f7f0a52dca1988af56fff3bdb10409d086e60001b6109fb565b61112b7f43b10bb899642d0a27f99a76700962d8963f86d8639183df04123c90c177a30d60001b6109fb565b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111d87f10d4eadbc4bbaab320133533ceba51208f926314315c162ec2c6dd7acead3fb360001b6109fb565b6112047f7194093eb53c4d1b4220bea3da2922947134cf794a518c973b6a580217ed3c5b60001b6109fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b61129a7ffde53eb1b51a405de289b72e6ae4f964bc2970a7117d1c47c687807402d255b660001b6109fb565b6112c57efbda40eef188545a791f6a7136ca520097a9320e8f312112f68b8bad2c16b860001b6109fb565b6112f17f6d4de5512cca78b838932b1f8d3cb7c612645bb722a0d6bfcf532069b72224bb60001b6109fb565b61131d7f5d44d165dd8d78b755d21a81cb1a4d992ad809c5e757138c6fed7ff50fc6d36860001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113a3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611caf6025913960400191505060405180910390fd5b6113cf7f59fbff3d39bb2f794bbfd9b9596a8bf931739db75955ab8eba2240faabdefbd660001b6109fb565b6113fb7f6a7fac40ea7c0f2b86fd31cf5d040ec026b12e03e3012a4207463f5cb0b6401760001b6109fb565b6114277f404bae8f46c77c858095a0384310c85d4e3c2c4af808377e00b6ea36dfd2455c60001b6109fb565b6114537f4d0a9f54abc8d4274701fba20e505fab043d19e4155bd38b00dcf61ca94b656260001b6109fb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611c1c6023913960400191505060405180910390fd5b6115057f3b15337a07af433b0102767f6d3f9f3f02078cce7caf7b0c8348218f676f4fc260001b6109fb565b6115317f5ee77e5f423175b79dbc44db8005605cb46b5c106510cab1dcc8f63cf0a23af560001b6109fb565b61155d7ff0304b05d1bc1dcbaa53187232eb51ca84f6e8b18d1e9b6bacf309e0a65bc66660001b6109fb565b6115c881604051806060016040528060268152602001611c61602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b79092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506116367f31f6a3ec25469db3ba150cd99148071cf2ef11e59f546101d0eda2ba11ab7c9e60001b6109fb565b6116627fac00036bf582646016737d71ca4d2fcae576e4c6c2623398c132780429fc2d2660001b6109fb565b6116b3816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117217f403b0476122d0361189c31d4006929f7a7fbe9b62788d2a27ec1c0da0907738060001b6109fb565b61174d7f55cec332cefddbc58eb87639930830627e390ed0ba7604e23446e43a57b355a160001b6109fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60006117e57f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b611c18565b6118117f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b611c18565b61183d7f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b611c18565b6118697fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b611c18565b838311158290611914576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156118d95780820151818401526020810190506118be565b50505050905090810190601f1680156119065780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506119417f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b611c18565b61196d7f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b611c18565b6119997f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b611c18565b600083850390506119cc7f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b611c18565b6119f87f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b611c18565b809150509392505050565b6000611a317fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b611c18565b611a5d7fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b611c18565b611a897fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b611c18565b60008284019050611abc7fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b611c18565b611ae87fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b611c18565b611b147fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b611c18565b83811015611b8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b611bb67f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b611c18565b611be27f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b611c18565b611c0e7fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b611c18565b8091505092915050565b5056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582098e1fd6168f47b4e8ee3726611e0bbdd70d6bbe9449cc68668bfb1591f1ba3df64736f6c63430005110032", + "bytecode": "0x608060405261083b806100136000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a0823114610149578063a457c2d71461016f578063a9059cbb1461019b578063dd62ed3e146101c757610088565b8063095ea7b31461008d57806318160ddd146100cd57806323b872dd146100e7578063395093511461011d575b600080fd5b6100b9600480360360408110156100a357600080fd5b506001600160a01b0381351690602001356101f5565b604080519115158252519081900360200190f35b6100d5610212565b60408051918252519081900360200190f35b6100b9600480360360608110156100fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610218565b6100b96004803603604081101561013357600080fd5b506001600160a01b0381351690602001356102a5565b6100d56004803603602081101561015f57600080fd5b50356001600160a01b03166102f9565b6100b96004803603604081101561018557600080fd5b506001600160a01b038135169060200135610314565b6100b9600480360360408110156101b157600080fd5b506001600160a01b038135169060200135610382565b6100d5600480360360408110156101dd57600080fd5b506001600160a01b0381358116916020013516610396565b60006102096102026103c1565b84846103c5565b50600192915050565b60025490565b60006102258484846104b1565b61029b846102316103c1565b61029685604051806060016040528060288152602001610771602891396001600160a01b038a1660009081526001602052604081209061026f6103c1565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61060d16565b6103c5565b5060019392505050565b60006102096102b26103c1565b8461029685600160006102c36103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6106a416565b6001600160a01b031660009081526020819052604090205490565b60006102096103216103c1565b84610296856040518060600160405280602581526020016107e2602591396001600061034b6103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61060d16565b600061020961038f6103c1565b84846104b1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661040a5760405162461bcd60e51b81526004018080602001828103825260248152602001806107be6024913960400191505060405180910390fd5b6001600160a01b03821661044f5760405162461bcd60e51b81526004018080602001828103825260228152602001806107296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166104f65760405162461bcd60e51b81526004018080602001828103825260258152602001806107996025913960400191505060405180910390fd5b6001600160a01b03821661053b5760405162461bcd60e51b81526004018080602001828103825260238152602001806107066023913960400191505060405180910390fd5b61057e8160405180606001604052806026815260200161074b602691396001600160a01b038616600090815260208190526040902054919063ffffffff61060d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105b3908263ffffffff6106a416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561069c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610661578181015183820152602001610649565b50505050905090810190601f16801561068e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156106fe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202b065b6405111e5e88a2151ff2c365680198043a1a70f31cdde369fba031945a64736f6c63430005110032", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a0823114610149578063a457c2d71461016f578063a9059cbb1461019b578063dd62ed3e146101c757610088565b8063095ea7b31461008d57806318160ddd146100cd57806323b872dd146100e7578063395093511461011d575b600080fd5b6100b9600480360360408110156100a357600080fd5b506001600160a01b0381351690602001356101f5565b604080519115158252519081900360200190f35b6100d5610212565b60408051918252519081900360200190f35b6100b9600480360360608110156100fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610218565b6100b96004803603604081101561013357600080fd5b506001600160a01b0381351690602001356102a5565b6100d56004803603602081101561015f57600080fd5b50356001600160a01b03166102f9565b6100b96004803603604081101561018557600080fd5b506001600160a01b038135169060200135610314565b6100b9600480360360408110156101b157600080fd5b506001600160a01b038135169060200135610382565b6100d5600480360360408110156101dd57600080fd5b506001600160a01b0381358116916020013516610396565b60006102096102026103c1565b84846103c5565b50600192915050565b60025490565b60006102258484846104b1565b61029b846102316103c1565b61029685604051806060016040528060288152602001610771602891396001600160a01b038a1660009081526001602052604081209061026f6103c1565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61060d16565b6103c5565b5060019392505050565b60006102096102b26103c1565b8461029685600160006102c36103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6106a416565b6001600160a01b031660009081526020819052604090205490565b60006102096103216103c1565b84610296856040518060600160405280602581526020016107e2602591396001600061034b6103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61060d16565b600061020961038f6103c1565b84846104b1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661040a5760405162461bcd60e51b81526004018080602001828103825260248152602001806107be6024913960400191505060405180910390fd5b6001600160a01b03821661044f5760405162461bcd60e51b81526004018080602001828103825260228152602001806107296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166104f65760405162461bcd60e51b81526004018080602001828103825260258152602001806107996025913960400191505060405180910390fd5b6001600160a01b03821661053b5760405162461bcd60e51b81526004018080602001828103825260238152602001806107066023913960400191505060405180910390fd5b61057e8160405180606001604052806026815260200161074b602691396001600160a01b038616600090815260208190526040902054919063ffffffff61060d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105b3908263ffffffff6106a416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561069c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610661578181015183820152602001610649565b50505050905090810190601f16801561068e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156106fe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202b065b6405111e5e88a2151ff2c365680198043a1a70f31cdde369fba031945a64736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json b/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json index d4ac0cb..9019a60 100644 --- a/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json +++ b/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json @@ -148,21 +148,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0xc9bbb881", - "type": "bytes32" - } - ], - "name": "c_0xc9bbb881", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [], diff --git a/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json b/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json index fc3121f..494672e 100644 --- a/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json +++ b/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json @@ -28,36 +28,6 @@ "name": "OwnershipTransferred", "type": "event" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0xd8e745d9", - "type": "bytes32" - } - ], - "name": "c_0xd8e745d9", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0xdb7cf3fd", - "type": "bytes32" - } - ], - "name": "c_0xdb7cf3fd", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [], diff --git a/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json b/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json index c2af3fd..4ab44f7 100644 --- a/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json +++ b/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json @@ -2,25 +2,9 @@ "_format": "hh-sol-artifact-1", "contractName": "ReentrancyGuard", "sourceName": "contracts/Openzeppelin/ReentrancyGuard.sol", - "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x43034809", - "type": "bytes32" - } - ], - "name": "c_0x43034809", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - } - ], - "bytecode": "0x60806040526001600055348015601457600080fd5b506090806100236000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80638101299c14602d575b600080fd5b605660048036036020811015604157600080fd5b81019080803590602001909291905050506058565b005b5056fea265627a7a72315820de575c51a031385798978fe01d10462c4f0c8b6c620c7b85dfc5d4d4d6af7d4264736f6c63430005110032", - "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c80638101299c14602d575b600080fd5b605660048036036020811015604157600080fd5b81019080803590602001909291905050506058565b005b5056fea265627a7a72315820de575c51a031385798978fe01d10462c4f0c8b6c620c7b85dfc5d4d4d6af7d4264736f6c63430005110032", + "abi": [], + "bytecode": "0x60806040526001600055348015601457600080fd5b50603e8060226000396000f3fe6080604052600080fdfea265627a7a723158203788d8b2241852354e8f19939d533dabc145e0bae35eca067031c2bfa406146064736f6c63430005110032", + "deployedBytecode": "0x6080604052600080fdfea265627a7a723158203788d8b2241852354e8f19939d533dabc145e0bae35eca067031c2bfa406146064736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json b/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json index 1c2e5f7..31bcc6c 100644 --- a/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json +++ b/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json @@ -2,25 +2,9 @@ "_format": "hh-sol-artifact-1", "contractName": "SafeMath", "sourceName": "contracts/Openzeppelin/SafeMath.sol", - "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x4263dba6", - "type": "bytes32" - } - ], - "name": "c_0x4263dba6", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - } - ], - "bytecode": "0x609b610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80637e6ddb90146038575b600080fd5b606160048036036020811015604c57600080fd5b81019080803590602001909291905050506063565b005b5056fea265627a7a72315820e3476cdf88e896cec8997a9311dd5b3773beee775ccb18f45d3f85021f8e06b664736f6c63430005110032", - "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80637e6ddb90146038575b600080fd5b606160048036036020811015604c57600080fd5b81019080803590602001909291905050506063565b005b5056fea265627a7a72315820e3476cdf88e896cec8997a9311dd5b3773beee775ccb18f45d3f85021f8e06b664736f6c63430005110032", + "abi": [], + "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72315820afbfb598f394b83d986407677d26d9a954705283684f0c5d4d9de47c9f54693864736f6c63430005110032", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72315820afbfb598f394b83d986407677d26d9a954705283684f0c5d4d9de47c9f54693864736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json b/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json index 402c5ef..7ced857 100644 --- a/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json +++ b/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json @@ -121,21 +121,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x55aecb26", - "type": "bytes32" - } - ], - "name": "c_0x55aecb26", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [ diff --git a/artifacts/contracts/OriginsBase.sol/OriginsBase.json b/artifacts/contracts/OriginsBase.sol/OriginsBase.json index e1cb229..c8fc307 100644 --- a/artifacts/contracts/OriginsBase.sol/OriginsBase.json +++ b/artifacts/contracts/OriginsBase.sol/OriginsBase.json @@ -589,81 +589,6 @@ "stateMutability": "payable", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x2b1a913c", - "type": "bytes32" - } - ], - "name": "c_0x2b1a913c", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x4ad0f1fc", - "type": "bytes32" - } - ], - "name": "c_0x4ad0f1fc", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x55aecb26", - "type": "bytes32" - } - ], - "name": "c_0x55aecb26", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x7d365384", - "type": "bytes32" - } - ], - "name": "c_0x7d365384", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x8209a966", - "type": "bytes32" - } - ], - "name": "c_0x8209a966", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [ @@ -1394,8 +1319,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b506040516200efdf3803806200efdf833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b838201915060208201858111156200006f57600080fd5b82518660208202830111640100000000821117156200008d57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015620000c6578082015181840152602081019050620000a9565b505050509050016040526020018051906020019092919050505081620001157f6606e9315b5cd322e9e75d0bf66cecde08990782c06ea2b8381c7e80cf52dcbd60001b620008f760201b60201c565b620001497f4d0fe5155d4ddd75c573bf7655c384fa4cc874df6ad11778e96ac71bfe337e6e60001b620008f760201b60201c565b6200017d7f8611bc546acb8292ec57a1e4304b2973826be5e3afc714ae1b44ab062b4bb7e660001b620008f760201b60201c565b600081519050620001b77fddb410b0ccdbea8a2918cb919132015345ccc5d2f515a947c235a5ddd1c01c9360001b620008f760201b60201c565b620001eb7fdd0d46d161926a6c5bd5e1553156c92f44bf76c8b65370f320e301ebd482286b60001b620008f760201b60201c565b60008090505b8181101562000629576200022e7f364139ab54e6661d78b8c726d6103e9d9f3f44056aa0fc51408678e6187f4a7360001b620008f760201b60201c565b620002627f76bc192982e7e255c90ad98bdfb39125f05cc2930e1b4ce525f70d4754c08ede60001b620008f760201b60201c565b620002967f1d71322f4af999fc9d23f397b4979d138f9a8dfc1694197ad817514a3ac0885660001b620008f760201b60201c565b60026000848381518110620002a757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156200034f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806200efaf6030913960400191505060405180910390fd5b620003837fe28209ea2edc51b80092bbe3ca5c30f941b2c912c2b8234043ee901ad0355ceb60001b620008f760201b60201c565b620003b77f6d489369ea5090099ca5b857f55429b828c1d919a61895a1705f7bcf23eab97460001b620008f760201b60201c565b620003eb7f436049d09d81151a7f85bb1760cc9b5e905dc10d08ec83ec023022d7eb93721f60001b620008f760201b60201c565b600160026000858481518110620003fe57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200048b7fb44440019d8b4869c1418dab281e3d340d42465a30e9f77c20d40b3fe436feb860001b620008f760201b60201c565b620004bf7ff20bbb7fcf0915c88e7db8586316903bdcd995db9788a11669c8050e9398a5e060001b620008f760201b60201c565b6000838281518110620004ce57fe5b602002602001015190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200056d7f5096bf0eae835f3e3db50123c33fc6f8ba650bbae2aad89c37815cf8e24afb1760001b620008f760201b60201c565b620005a17fd2cf87d0fb4a1f07db9387a495f8f681dd5016859db5ce8343951ed2c95c4bef60001b620008f760201b60201c565b3373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28080600101915050620001f1565b505050620006607f64375e5cd7423843b1137d84dc5ee15643b0752aa7d7eddd705d266ba393102360001b620008fa60201b60201c565b620006947faf689f34ac246f17fcd59063b1cf929be9f060280f1b820c6890f0bb02e7fbba60001b620008fa60201b60201c565b620006c87fcb3f889ee7ee76e77de6db2fd3cba68ca6cc567c9cefe90fda5afb8f011f978f60001b620008fa60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620008ba57620007317f0415a31c30f22b314fe48917d409dc240521176a492ca71ceeee7b5bb077a3e960001b620008fa60201b60201c565b620007657fc47efb7ab218fc981d3fa74d6410d5841948d001cdfd341fc5954ba8e2adecc560001b620008fa60201b60201c565b620007997fce85838b6e544feb4b5a48f19715a918f24a67344b5f8e76a20355d706ee120660001b620008fa60201b60201c565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200080e7f0781ea1b0e35ee57bb8cc3dca471f35d519a1dd9d25a70094af0030e0c2e5b5460001b620008fa60201b60201c565b620008427f6fdadf503239be04a657b22e41c6f94475044d8d60e8d354756af84ff12597bb60001b620008fa60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5060405160405180910390a4620008ef565b620008ee7f316a48b4f36146a60f85ebbb639e0241b27d5284462cc6de8634938f9ce1331c60001b620008fa60201b60201c565b5b5050620008fd565b50565b50565b61e6a2806200090d6000396000f3fe6080604052600436106102305760003560e01c80638acb0e6b1161012e578063d1a494f4116100ab578063e0e3671c1161006f578063e0e3671c14610f61578063e87471a514610fca578063ea4ba2fa1461101b578063ee5679751461108b578063fdc704d7146110a257610230565b8063d1a494f414610da9578063d6febde814610de4578063d8c8469514610e1c578063d96e9de314610e57578063dca21bfc14610f2657610230565b8063a935e766116100f2578063a935e76614610b9a578063ab18af2714610c06578063af7cea7d14610c57578063b3ce74c714610ce5578063ca2dfd0a14610d5857610230565b80638acb0e6b1461096c5780638e1ba96214610a125780639000b3d614610aa25780639fa1832514610af3578063a0e67e2b14610b2e57610230565b80632d46d9d9116101bc5780637065cb48116101805780637065cb48146107d957806376d73a761461082a5780637baec6ae146108795780638259ab11146108d4578063836e386d1461091957610230565b80632d46d9d91461066257806343a40e3f1461069d57806365e168d3146106e557806367184e28146107575780636e1b400b1461078257610230565b806315cccf8e1161020357806315cccf8e146104c057806316a628891461051c578063173825d91461056b578063194e1362146105bc57806321df0da71461060b57610230565b80630487e0b21461023557806309d5ff14146102a45780631291e84f1461038e57806312b0d40014610469575b600080fd5b34801561024157600080fd5b5061028e6004803603604081101561025857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110b565b6040518082815260200191505060405180910390f35b3480156102b057600080fd5b5061037860048036036101a08110156102c857600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff1690602001909291905050506111ea565b6040518082815260200191505060405180910390f35b34801561039a57600080fd5b50610467600480360360408110156103b157600080fd5b81019080803590602001906401000000008111156103ce57600080fd5b8201836020820111156103e057600080fd5b8035906020019184602083028401116401000000008311171561040257600080fd5b90919293919293908035906020019064010000000081111561042357600080fd5b82018360208201111561043557600080fd5b8035906020019184602083028401116401000000008311171561045757600080fd5b9091929391929390505050611705565b005b34801561047557600080fd5b5061047e611b02565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104cc57600080fd5b5061051a600480360360808110156104e357600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050611bb0565b005b34801561052857600080fd5b506105556004803603602081101561053f57600080fd5b8101908080359060200190929190505050611df0565b6040518082815260200191505060405180910390f35b34801561057757600080fd5b506105ba6004803603602081101561058e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e90565b005b3480156105c857600080fd5b506105f5600480360360208110156105df57600080fd5b81019080803590602001909291905050506120ca565b6040518082815260200191505060405180910390f35b34801561061757600080fd5b5061062061216b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561066e57600080fd5b5061069b6004803603602081101561068557600080fd5b8101908080359060200190929190505050612219565b005b3480156106a957600080fd5b506106e3600480360360408110156106c057600080fd5b8101908080359060200190929190803560ff16906020019092919050505061221c565b005b3480156106f157600080fd5b506107556004803603608081101561070857600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612458565b005b34801561076357600080fd5b5061076c612698565b6040518082815260200191505060405180910390f35b34801561078e57600080fd5b50610797612726565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107e557600080fd5b50610828600480360360208110156107fc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d4565b005b34801561083657600080fd5b506108776004803603606081101561084d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612a0e565b005b34801561088557600080fd5b506108d26004803603604081101561089c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c4c565b005b3480156108e057600080fd5b50610917600480360360408110156108f757600080fd5b810190808035906020019092919080359060200190929190505050612e88565b005b34801561092557600080fd5b506109526004803603602081101561093c57600080fd5b81019080803590602001909291905050506130c4565b604051808215151515815260200191505060405180910390f35b34801561097857600080fd5b50610a106004803603604081101561098f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109cc57600080fd5b8201836020820111156109de57600080fd5b80359060200191846020830284011164010000000083111715610a0057600080fd5b9091929391929390505050613172565b005b348015610a1e57600080fd5b50610aa060048036036040811015610a3557600080fd5b8101908080359060200190640100000000811115610a5257600080fd5b820183602082011115610a6457600080fd5b80359060200191846020830284011164010000000083111715610a8657600080fd5b909192939192939080359060200190929190505050613438565b005b348015610aae57600080fd5b50610af160048036036020811015610ac557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613714565b005b348015610aff57600080fd5b50610b2c60048036036020811015610b1657600080fd5b810190808035906020019092919050505061394e565b005b348015610b3a57600080fd5b50610b43613951565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b86578082015181840152602081019050610b6b565b505050509050019250505060405180910390f35b348015610ba657600080fd5b50610baf613a63565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c5560048036036020811015610c2957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b75565b005b348015610c6357600080fd5b50610c9060048036036020811015610c7a57600080fd5b8101908080359060200190929190505050613daf565b604051808b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b348015610cf157600080fd5b50610d3e60048036036040811015610d0857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614087565b604051808215151515815260200191505060405180910390f35b348015610d6457600080fd5b50610da760048036036020811015610d7b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614173565b005b348015610db557600080fd5b50610de260048036036020811015610dcc57600080fd5b81019080803590602001909291905050506143ad565b005b610e1a60048036036040811015610dfa57600080fd5b8101908080359060200190929190803590602001909291905050506143b0565b005b348015610e2857600080fd5b50610e5560048036036020811015610e3f57600080fd5b8101908080359060200190929190505050614442565b005b348015610e6357600080fd5b50610e9060048036036020811015610e7a57600080fd5b8101908080359060200190929190505050614445565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001856001811115610ed257fe5b60ff168152602001846002811115610ee657fe5b60ff168152602001836003811115610efa57fe5b60ff168152602001826004811115610f0e57fe5b60ff1681526020019550505050505060405180910390f35b348015610f3257600080fd5b50610f5f60048036036020811015610f4957600080fd5b81019080803590602001909291905050506146f2565b005b348015610f6d57600080fd5b50610fb060048036036020811015610f8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506146f5565b604051808215151515815260200191505060405180910390f35b348015610fd657600080fd5b5061101960048036036020811015610fed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147cf565b005b34801561102757600080fd5b50611089600480360360c081101561103e57600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050614a09565b005b34801561109757600080fd5b506110a0614c4d565b005b3480156110ae57600080fd5b506110f1600480360360208110156110c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614cdb565b604051808215151515815260200191505060405180910390f35b60006111397ff95f356390113da9949697b1940b741282a41047ee6a524da66bd2bc3991d55f60001b6143ad565b6111657fceed6f495f3fb222935bf7886330fa5b8d40ad62923cf45af2aaab31e6a7a7ee60001b6143ad565b6111917fa5fe6a08e078c68865f2ae79ddf706b1461305921fa9b614fa811291fd1c49ff60001b6143ad565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006112187fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6112447f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6112707f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b61129c7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61136a7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6113967f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6113c27f6b9661cfe4145666108c08d49cc095e7899fd2f8d10f710df531efe4c0b8a1c460001b6143ad565b6113ee7f8833b00d2b4a2590902b94be3ecdac6017e64abc6b60f4827d186ff2cd45db3d60001b6143ad565b60046000815480929190600101919050555061142c7f0113759a83325f9f6e2abe5c989dc175e945e80a027cf4446563aae0c19d851d60001b6143ad565b6114587fef395f4334ecf7add11195b1503869c4df8eff95bb6219e5fd66f468388859dd60001b6143ad565b60045490506114897f1ce98346381735d51548def916e3db2c12830bac6a2df4c2e38cdd35030ba5f160001b6143ad565b6114b57f91d3dea52c36d1824b758fe672088b3c90677d94d0406558fc26cf9f639a483e60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b826040518082815260200191505060405180910390a261152e7f1372d95eebf4faf6ae9550551603fbe9fb5abcf4a42e8c205c3d2b91f5709aeb60001b6143ad565b61155a7fbe6de7377e6087a49f8f0ceea5ee2d40fcc7c5d3543f7fa9a96d18055dde5abd60001b6143ad565b6115648185614db5565b6115907fd684e9c1acb35d1b8de7b798bb3767c147dc77b5ee2a0db37d9788833679ca9f60001b6143ad565b6115bc7fcc149f0fe2d8389adfcb5b7964821744229b0db7d8425cb1dd0696d9f15db0f960001b6143ad565b6115c881888888614f30565b6115f47f189adf1f8a59761cc16870f8e1b847c421f7009489cdd079b980f939770d9d6b60001b6143ad565b6116207fdfb28cd97c0643bfb263431cb26e73d4e56bfec868e004718fcb7422b86647eb60001b6143ad565b61162a818f615512565b6116567f9543a9ce4649c688e8a082a2f30f77969f0ba852362e57f935a9ae33f5edfdb360001b6143ad565b6116827f7f7c55df46f61ca1d10e36c6360b2ce91fb724c51a6c998099e037fd15f9da2160001b6143ad565b611690818a8a8e8e8761602d565b6116bc7fb6268ebad9bf0b802db63db9ef5a03ef762e7fe2191d28fd6710f18790bd1b2060001b6143ad565b6116e87f4e0f28087d320fc4990c2527c4d02d503913c3677c0ea014f6932bab3a1bfddc60001b6143ad565b6116f4818e8e866165a2565b9d9c50505050505050505050505050565b6117317f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b61175d7fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6117897f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6117b57f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6118837f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b6118af7f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b6118db7f9efa1c4f33094678dc6d5b61854b0266669a8ea26c73edb5e33ab6a625ba39ed60001b6143ad565b6119077f37469080bbed0cfa814adf66d6eb5f4dd5173f2d07e478ed0d78c69c02c6800060001b6143ad565b6119337f9d3f2b442aae3fd690acaf46f5a667e12e3e7c72370dda73873057b875df4ad360001b6143ad565b61195f7f0ed42e055d2ecc5194ea63d758605de3ba4c4655e8beaaed60f15d7278fc134060001b6143ad565b8181905084849050146119bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061e10f6034913960400191505060405180910390fd5b6119e97fe28ba615be5bffa4c8e5d38edcabe6403ec916ceaf7eb84911ed5bf329d2515e60001b6143ad565b611a157fbcd3c4b1719dd0c0c2ae6b918474dc81368ab5ea1a7324041c5d9e55e08cca9160001b6143ad565b611a417f0b859bb4e1959553ef5fdbe7c9b227a5e7b2f362b92cb1e07a028435f3edff7560001b6143ad565b60008090505b84849050811015611afb57611a7e7fefc6b00e5c1efadc711df8957de1b2700bfe81b3275405d12c3658780b93c32a60001b6143ad565b611aaa7ffaf3aeaf9076815c7373c25637920a67cb7d988a20c967f9613e5432235b172560001b6143ad565b611aee858583818110611ab957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16848484818110611ae257fe5b90506020020135616ce5565b8080600101915050611a47565b5050505050565b6000611b307ff250fb4106da45b8066bde94a6a4fa918a58684a978275e7004029740a01ffce60001b6143ad565b611b5c7fddfeb7fb167b56ea073db84579fbafabad5de8c5b537e360aeb5a80ee5c4d2da60001b6143ad565b611b887f065d6cf404fabcb70aabc8a0be82d8cb5ac9dde9f7dd2112e2b8eb58a60e8fbe60001b6143ad565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bdc7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b611c087f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b611c347f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b611c607f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b611d2e7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b611d5a7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b611d867f0149f83e5c09fe41d5baa192d327cce8e8df54e53304215949b8f33cfd90f57460001b6143ad565b611db27ff72e40643ec7ec6eb31930d5a594c46b7d23cc85856fa6b836eea572c08ab7c160001b6143ad565b611dde7f9529e2b00685ea59961613bd638efc3c7baed24e703e76b6055041481231799960001b6143ad565b611dea848484846165a2565b50505050565b6000611e1e7fd761c6f2cac214b7917e00d69a47127c9f92589762dfb407d0d378723fb22a9d60001b6143ad565b611e4a7f4eedb79c36a42e58ee94547fef467a4e6a7c520b3405838e3ffb28cf04a5e4dd60001b6143ad565b611e757e9a29a22ba445229ba2f451327edbc2ee256f686363bbd15278a5219e85118d60001b6143ad565b600b6000838152602001908152602001600020549050919050565b611ebc7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b611ee87f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b611f147f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b611f407f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61200e7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61203a7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6120667f0e44747b587cb0ce7592cff3df77f645755c5f10eeb3a3aa0ddac17f65b5b18b60001b6146f2565b6120927f538d135c9cc4037a61d553c365a022ce1d01b218c9b4e6687864161a8994013b60001b6146f2565b6120be7fad6e2327c3430532e2391fc71d4270553fb8d051f4b664d870acb608d3e0a81260001b6146f2565b6120c781616fc9565b50565b60006120f87f73f8d38ee2d03f10c8338074464e3dc2118ae9334c851ac34fcf7b60b5221bcd60001b6143ad565b6121247ff8b0c898982141b996348d1498840d79c5958f12f9cdd9cb7461dab14668bfc260001b6143ad565b6121507fb731ff315b4591651a849c4d7c291305e26db10765ed4144ca9b9aa64228e82260001b6143ad565b600a6000838152602001908152602001600020549050919050565b60006121997f3ae3ac9b140e1ca340ab44d2f76b19bec7eee3c6788c7d92befd85b5806aa13a60001b6143ad565b6121c57f2d5182a7e367116b083e493062ad4003212e7c0091095fbb8235bc218f2744dc60001b6143ad565b6121f17f23c7ba278f6ca83f66a22789ff962bfb742f06b3724c6e353fdc89063e146a2960001b6143ad565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b50565b6122487fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6122747f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6122a07f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6122cc7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61239a7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6123c67f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6123f27f03874e6ffa5fe98a062d13b8ea744f5aaa681ff2f5197c3bbad57580417b8b7160001b6143ad565b61241e7f5b26afb9ffeb55e6b5522f6aeac1c61e1c7c077a5aeb107b42adfad3ddab58ac60001b6143ad565b61244a7f4bac114fbc8385f334d62bc98815ccecb4a83a66673f028c15b66f0c6cab144260001b6143ad565b6124548282614db5565b5050565b6124847fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6124b07f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6124dc7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6125087f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6125d67f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6126027f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b61262e7fe3dfcc5b5189e5abfa73d307ddea55fb7cfef0f15f2679d14e6c6ec352f921fe60001b6143ad565b61265a7f2a5cc306f40e1f0873c0a1e6fef2e52da9500bd790ef95e0125a286f71b3e02c60001b6143ad565b6126867f04e043a0896a57e6c6f1575cb62916ef540a5b4316ae5a062583b03f313935c260001b6143ad565b61269284848484614f30565b50505050565b60006126c67ff84b99b34260ab143ba1a2002db4556e56878320e9645dc009e5d5e51973aba060001b6143ad565b6126f27f62eceebeb156885d0e295ffe9505ba53988ce1eed8b34cb09667f5758a28d7e560001b6143ad565b61271e7ff358e692aa91d2ba30e2ca2c0469f56f94c71e3f2f36d8522a64d93ece77959960001b6143ad565b600454905090565b60006127547f590b35ea19199ac618d9c7feb5571ca76b4217683165bab79135f56ca5bed80360001b6143ad565b6127807f1366e9b6711f13dc255671dd1b4c9f515a3573f0c730f8241c85556c4209486a60001b6143ad565b6127ac7f83abadf0b52662c6e4bc22e41089d19321a5cc14e680cbb978c16f84d5c5fe6c60001b6143ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6128007fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b61282c7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6128587f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6128847f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6129527f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61297e7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6129aa7fafcb0b4f682c50a9679687cd57fb195565d3b3594cec41e61652d70bb7a9797360001b6146f2565b6129d67f1044e613c1c3d7cc5b42b22374c3d222c8151549a65f809328dc5e6291659a2a60001b6146f2565b612a027ffc4b144d7908223b9fd317ce3643b657d8063803df44b93493003820111a195a60001b6146f2565b612a0b8161766e565b50565b612a3a7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b612a667f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b612a927f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b612abe7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b612b8c7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b612bb87f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b612be47f058b7cc1e32d92b658f81d197d0fa3a6315ff52fa3766fc235cdd6184aeaf6bb60001b6143ad565b612c107f4bbc365d77f708c101238713d1389549b9fca1c939a50fbd26688686651536d060001b6143ad565b612c3c7f156c58f60604d237776fdd592b3a5d5106d7264c6b1df17fdc1cafe6fd436e7660001b6143ad565b612c47838383617b83565b505050565b612c787f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b612ca47fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b612cd07f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b612cfc7f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b612dca7f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b612df67f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b612e227f365ddb943024ef7fbffec94f1ec31ca43322aaa115f40bff1879e034ae5d399d60001b6143ad565b612e4e7fd5a18db95fb4d6eb8e6f7df8fd781832bf8d93cad15393f48207ca45d27e095e60001b6143ad565b612e7a7fdf3532a1113d5a3b2e6cd389aef8b24c97a5016a6f46ecf36aee0e60017958aa60001b6143ad565b612e848282616ce5565b5050565b612eb47fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b612ee07f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b612f0c7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b612f387f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612fda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6130067f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6130327f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b61305e7ffa544545449131d5912ef311088e3d688f1f81c5aca54dca7bd178d77c7c736660001b6143ad565b61308a7f6ba150ce46fe01575d927263b4c4bac99de30926f52d71fd618239c7014a6e8860001b6143ad565b6130b67f0424dba2aa9324f4a4b86f4b373bcb5abc521061fe9c7cc37664970751cd0fdc60001b6143ad565b6130c08282615512565b5050565b60006130f27f7603f4cc7eed5aea26c8363aae808228050de4a1df7313c6e816cbdd5cb707be60001b6143ad565b61311e7f581f876caee8a1d16cfb1d2b0eeb4066d220ad66d031ace5d7fb1a6986cc168a60001b6143ad565b61314a7f70ebfddc39a6e980574278522e377c07bf10df50e1dfb83090fd786dfe5be09760001b6143ad565b600c600083815260200190815260200160002060009054906101000a900460ff169050919050565b61319e7f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b6131ca7fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6131f67f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6132227f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6132f07f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b61331c7f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b6133487ff0165474b2d676fea0b8023064cf7421d1272f4919b87d871eda274681c4ed5c60001b6143ad565b6133747f15b42621139ada08336951eba2f041f2cc3ebcaa539d2a13f87329a8d7d6b45960001b6143ad565b6133a07f0894d12fe48c69e5bd5ecb1dd45590a9e1e97f03743be95a97f9a1a6ac3aaa5160001b6143ad565b60008090505b82829050811015613432576133dd7f86f852a70d408d4a2f186f3c923eaa78cc9d6cbd42657492ed1a9e6edfabb16960001b6143ad565b6134097f664a28c3c931dfc99c22d2ca503fc214685e19f7a6f4eef328f35d06b432ad6260001b6143ad565b6134258484848481811061341957fe5b90506020020135616ce5565b80806001019150506133a6565b50505050565b6134647f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b6134907fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6134bc7f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6134e87f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661358a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6135b67f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b6135e27f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b61360e7ff9afe9483ad45314c1f9334d19579a96e2ced1bfaa29927b11048af7c43f747460001b6143ad565b61363a7f56f19aeb9abc0578ab8355d3bf3c2995ffbc732cf2888b835db28c76406a378960001b6143ad565b6136667f587bf7ffa332928533e0732161cd434483e7c1232a30656d658364c71310c93260001b6143ad565b60008090505b8383905081101561370e576136a37f43404884baef5c6f58bf4186141b647b0f7643199b28bc515a5cf75127f2592660001b6143ad565b6136cf7f8733fd543eed7949dc81ceb8e7f3cc4d9ebef97e59999d0e6181f70672b219de60001b6143ad565b6137018484838181106136de57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1683616ce5565b808060010191505061366c565b50505050565b6137407fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b61376c7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6137987f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6137c47f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6138927f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6138be7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6138ea7f5fceccf80f991d1a72d8282836518ae01c2f8c5f7b370385d7f1f56e93e49e6d60001b6146f2565b6139167ffc15d1b5d4b2aa6b36a36f4aa2415983c696e5f2faf3aa4fa7bfd6790e00635f60001b6146f2565b6139427fe1f2ad91109a6da48347f79de13c9e0b5c9146ac5743cf02594a0b249d88013360001b6146f2565b61394b81617e59565b50565b50565b606061397f7fdee10534b67278fca285b5798f07e3aee921e04ea89b6427272f1c6d6bd2f07260001b6146f2565b6139ab7f3322398ce67959ada7f766b6e33744c7138512194c5f473b04cdef087872bd8560001b6146f2565b6139d77ffcf826e84f2f086c38453fef179ab177aeb6adabb1238ea14a8a0037d3a7bef560001b6146f2565b6000805480602002602001604051908101604052809291908181526020018280548015613a5957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613a0f575b5050505050905090565b6060613a917f1968df1ae1af4ccf2947ce153fb93b718eaf164c8d31064c2ab9fe17f7ab787f60001b6146f2565b613abd7ff6485d61a14d2ce81eda90d0faf17bfe09fa1f03b3b9d25da0c56e10d29b358a60001b6146f2565b613ae97fce84cd58e76472fb9aafbae1c6be70596e5c3c548848cff1bcf4ae4c5a8d463060001b6146f2565b6001805480602002602001604051908101604052809291908181526020018280548015613b6b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613b21575b5050505050905090565b613ba17fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b613bcd7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b613bf97f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b613c257f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b613cf37f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b613d1f7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b613d4b7f84e280d8ef73d617ad191175570656211211680af5d3af1916b8c3b74eb87d2660001b6143ad565b613d777fa9fce485d82159126ba460fccbeb5fe1d1bc03805210cc687e57a255b73b2add60001b6143ad565b613da37f6eca83d9083e75e2a3f7b8114af75f8eb6b8bf2d085643556ef15c64f15917fc60001b6143ad565b613dac8161836d565b50565b600080600080600080600080600080613dea7fc01bbac0be84aa1b4c0c25b6337e23c4de47459c73aefa21948938538902b61160001b6143ad565b613e167fb7dba9c95b85da3742679e5a15c844fdcec126e421b9bcc04dd5c3b6b883400b60001b6143ad565b613e427f5c949520df6e4d45be0a34078ee2b75af4f840f65a2bf029394ac650d583964760001b6143ad565b613e4a61df32565b600860008d8152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff166001811115613f4157fe5b6001811115613f4c57fe5b8152602001600a820160159054906101000a900460ff166002811115613f6e57fe5b6002811115613f7957fe5b8152602001600a820160169054906101000a900460ff166003811115613f9b57fe5b6003811115613fa657fe5b8152602001600a820160179054906101000a900460ff166004811115613fc857fe5b6004811115613fd357fe5b8152505090506140057f5641371c260632485a2c7951a3426b4c6a09489acdf2b75b5ba946bc273652a460001b6143ad565b6140317f21b357d9716b44f55edbadcf761d797b3ff4ae625af2d0036ebd00efe356313f60001b6143ad565b806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b60006140b57f2f044751597a5a8448dd0fec10b4a9ecf1cca91ec39a079f3c61189918a3c9f060001b6143ad565b6140e17f4d65a25251c4d8d187eb2dc7e740fba5892d2f0e718119819bc1fea1a96f520760001b6143ad565b61410d7ffd4ec04f3a327bdc8303ec93b58ba2293ee7c5d05d4f7bfa667a037eec01d37a60001b6143ad565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b61419f7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6141cb7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6141f77f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6142237f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166142c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6142f17f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61431d7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6143497fd72986c3c44c1d5ac88f2d9a620526767054d36ed01780fd7c5bd0abd034856660001b6146f2565b6143757f40f644c9aeac123922ec2c6c0c1e9c9d0674d611148b2dfa40b21d14dc9ef47a60001b6146f2565b6143a17f2af20acfe5b44ee8182e2b6cf4952a0c410c0f34bc2d107cd97898a913719ad360001b6146f2565b6143aa81618656565b50565b50565b6143dc7f9b67cb87edbf1b285a4456858f5ea43f9e90c6789ee561a38eec036e8c96a0e160001b6143ad565b6144087fa6f73ea1122a2d55f48cc65aab356fa301c628597d16685bda7145fdc83c755e60001b6143ad565b6144347fcad0c443ceabd51e9e352e7a9e23a1cb40f79b7e4ebf8ac36451e630661d1bf060001b6143ad565b61443e8282618cfb565b5050565b50565b60008060008060006144797fd80e4b0e704aaee7c2cd219cbaaee88c199983cfe317dd565857686bd95f29e360001b6143ad565b6144a57f6089b93f6e3be32640c6d4a4770dad763dcefc1aafb87a192de84fdd8e58731060001b6143ad565b6144d17f30c7ea5e12414c1160c3fe174172fe7df1c6c09cac2ebdb3b7acf1eac62d522e60001b6143ad565b6144d961df32565b60086000888152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff1660018111156145d057fe5b60018111156145db57fe5b8152602001600a820160159054906101000a900460ff1660028111156145fd57fe5b600281111561460857fe5b8152602001600a820160169054906101000a900460ff16600381111561462a57fe5b600381111561463557fe5b8152602001600a820160179054906101000a900460ff16600481111561465757fe5b600481111561466257fe5b8152505090506146947f6742e5a3c901e3f7ef457c846a4d3051aaf0a89b197c4df74ba31329f8e3dd7460001b6143ad565b6146c07f19db536cb0b2f2a9d64756c54dca130ce01b38d4288670ab3a84c4eaa2cb38e460001b6143ad565b806101400151816101600151826101800151836101a00151846101c00151955095509550955095505091939590929450565b50565b60006147237f577effea934a13eb763bd5030eabed77904faf301d881602f42a6ebcbc7a604e60001b6146f2565b61474f7fbb81baaea4c4b28bbc1d13dff27dbf9353fd16a0e3e36f65902214241e42cba160001b6146f2565b61477b7fe9518f1e53d0e620902d55c987d198a69cd18409929e43b6e296336ef0d6cd2b60001b6146f2565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6147fb7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6148277f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6148537f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b61487f7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16614921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61494d7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6149797f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6149a57f280f52310c9e33d58dd6e79b5c5912f6ca3c1a6010de72db583c6e062ac6ab1e60001b6143ad565b6149d17fe7d5b593d9ac6c31bc17718c4b09566aa6a5af305ad74a2caabab76be5277c9960001b6143ad565b6149fd7fc188440d869dff5854f9333235a3985cec8135ac8ca9318939e51297ac26cf6d60001b6143ad565b614a068161a604565b50565b614a357fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b614a617f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b614a8d7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b614ab97f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16614b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b614b877f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b614bb37f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b614bdf7fd7f3982298842262d0d3835371f6fcdc4721cf1cd25fca10020262f34be4575f60001b6143ad565b614c0b7fa4e3936f8772243a55f290a79ac7ed71d75f7591187eeb1847d6894e4b4490d660001b6143ad565b614c377f9dcd50b588f14a22d2a0b7c2fff5fa644b92b6aaeecccd0cc5758dc03d7cec3a60001b6143ad565b614c4586868686868661602d565b505050505050565b614c797f644bc30d71a91056913103fb286c5d6e6878e22b12367a33e25983338dcb38c860001b6143ad565b614ca57f2aad60e99f98d7f7f01fc23e07d033d9cc942df38e24a572840b7a0b6106275060001b6143ad565b614cd17f5fdd58e066d9996a13b91c1a64ac7eb4856857717dfd8a7f86dc4f178e25d98460001b6143ad565b614cd961a8ed565b565b6000614d097fa6c21053ff12ef2ea63fc3b7fceffb89314837d2895efacb436d990ee35a401f60001b6146f2565b614d357fdcd08d0c75c64b5d345be711b358e160e369fc901a89d7273809705290673d3b60001b6146f2565b614d617fcaa3ecc68ee1fee4e69069f97e1ae9751fa89bd0701e64f90f31339b236e31bc60001b6146f2565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b614de17f122ea7a04be238890d39ee4c39f677a9666b21467340f1e07775d72cb6a07bb060001b6143ad565b614e0d7ff100e2a0ec6c680fb31ea22c3a4d3629e3f3e6aed96113545d1ea6bb3e51ea6960001b6143ad565b614e397fb764663b6d601a47c295bb8a5c3b6b2d1daeccc53154317063356b7ff119d0fa60001b6143ad565b8060086000848152602001908152602001600020600a0160156101000a81548160ff02191690836002811115614e6b57fe5b0217905550614e9c7f38249e063d3fcbe5a090acd69e3a382cc22138be031696cba2ee8c2ba9952c5b60001b6143ad565b614ec87fc28fcabc3e7c13c11dd1172edbd0946cf5e2adf9af6e80a317bed0ecb3244f0260001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a48237838360405180838152602001826002811115614f1857fe5b60ff1681526020019250505060405180910390a25050565b614f5c7fed825f7b8c3c3e45d4dc2a5e87727343bacea9b0dc423bf3e4933bc55d4c37fd60001b6143ad565b614f887f957384c62aadad73377cc12f84f2ee8c89109c3e3b9a54c1ce0165ec0a6fd8d360001b6143ad565b614fb47f7205092310434b6fa9e4421b4bc973d467cd548a3892d32957db2355a0d1861960001b6143ad565b614fe07f1d48333a6d44118dba2f520bbc90b7e02f5ea59ac1880892ebac8d0bede1950860001b6143ad565b60008311615039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061e5376029913960400191505060405180910390fd5b6150657f6965ad8b98a3980648e61404cf417a35be7c22e98813e4ab90bba22d2ea0e88660001b6143ad565b6150917f20626e8269ed4379993d00982ad0c119605bb3fce32dc3d16b7764a05e491c9c60001b6143ad565b6150bd7f9c2a4d1fbc32ce38423e051cd0f7bbe7537e93e14c41ad89bff97eee1ca2d8c260001b6143ad565b6001808111156150c957fe5b8160018111156150d557fe5b1415615242576151077f9d9461bf08bf1860ec22910d1379c0eb90197d02012729d80948f236697023ce60001b6143ad565b6151337febaeaee198eecbc5805ed14a9b78445bce0ccb6a0e6a35531f22485f4fc6789c60001b6143ad565b61515f7f475276f08bca14e4c443497a6ffbfe9173163e863f6243a805a5f647c72ac9a260001b6143ad565b61518b7fdf51ae266c48f787523a341ff3998b7f0b0574e36ef3dd9d8c29a889b31b00fc60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415615211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061e3816032913960400191505060405180910390fd5b61523d7f913541607e5e91b55cb4f16c76f9709825a60bf8462d8157441f05c4ca683a7a60001b6143ad565b61526f565b61526e7fda7ec91a637265ac8ad552d49b46c26151ef524b53f3ff6142fa491b021475ea60001b6143ad565b5b61529b7f37ddc9d8edfb9dc8d127301bfaa8f8a7b92a2b2bf7ca3c91b3a2ff98b6f2576b60001b6143ad565b6152c77f5ff071b7ffb5f7b797d0727331ae2ac7fafb2a1d5a825dcefaccff8dbfe3b55760001b6143ad565b82600860008681526020019081526020016000206009018190555061530e7f820749fd9dfc5d609160a592b32465f604d5db316d7563f0fec45bd708ccbd6160001b6143ad565b61533a7fba1497d331880b69f12f955cf4ce7fc0789133a27d38f60a44466b15ae9bd86c60001b6143ad565b8160086000868152602001908152602001600020600a0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506153bb7f314c295ffccf2302820d9eb9445dec802a5236dd4bbb455979e07beaf34b02f260001b6143ad565b6153e77f34b4f7591745b98e34e0e3b956487264be036d70bd839ca7f338348e2304812760001b6143ad565b8060086000868152602001908152602001600020600a0160146101000a81548160ff0219169083600181111561541957fe5b021790555061544a7f671d523b8e46684621413dd52501073b7e8ce6f2d98e834aa3773ab9d09c787d60001b6143ad565b6154767f0da0b1dc0de98497f9b9e2bf8aa3dd60c8f0ed970bc5762ddc6d64bfdafd7e5060001b6143ad565b80600181111561548257fe5b3373ffffffffffffffffffffffffffffffffffffffff167f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7868686604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a350505050565b61553e7fecf230a40b2be638a67a3e016d54ca00407285c0b7f8a3ba088fa1db26cac54860001b6143ad565b61556a7f5418af54dea59d6595ce4cb67334ab548f2d9c5ded7361b9d0d52645a8847f0f60001b6143ad565b6155967f7ae85ccb8188cfddd17704600cb3a6f9b3c16d2ef9147611cbd5a567481aacd660001b6143ad565b6155c27f81d10b8cab60a2eb1a0fbe2e22b59ffacbdac6176edb45ea268f108c1693a5bc60001b6143ad565b6000811161561b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061e143603c913960400191505060405180910390fd5b6156477f09126acdc05e46c873e67eef6d04e822d425716cd48f9c404f42eb1f3d46510060001b6143ad565b6156737f4aeeacf647acd63f3619510bfe4618937a93c9ed97792af8f06ad0b42f6a228060001b6143ad565b61569f7f3e11dbac7f5898421cc76adf88343ef3e8cfe89aefe8947c11abb5a55feffc2560001b6143ad565b6156cb7f011ff70e219f3659e8233d7fd1a43d2aa313097d6bb53f3584df5d74c9bd73cf60001b6143ad565b8061570b6008600085815260200190815260200160002060090154600860008681526020019081526020016000206001015461b2f390919063ffffffff16565b1115615762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061e59a604c913960600191505060405180910390fd5b61578e7f95721c738e1ac2429459c3c29d52119c26359a27b9973efa3ff7930b2a49986f60001b6143ad565b6157ba7f8b90a97ee96e24819c66f2609d987c5644d2aeb79aca2c428846d0b4b3379edf60001b6143ad565b6157e67f4be3435a0df75f0492865b6be1ebceade299cef1c224f3d5ca03b0de4c5338b860001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561588757600080fd5b505afa15801561589b573d6000803e3d6000fd5b505050506040513d60208110156158b157600080fd5b810190808051906020019092919050505090506158f07f2fdfc0ab65d3e49424cb0ba1e5d7b87c617e2544d18897855394a0352cb0a24a60001b6143ad565b61591c7fa1cc7ddd437aaeb2d9ab7f1526fb9fb6cd85b09030d4027e7604bf44613020b060001b6143ad565b600061596060086000868152602001908152602001600020600201546159528561594461b60d565b61b73790919063ffffffff16565b61b94c90919063ffffffff16565b905061598e7f8d50cbf28544cf39cc844dd688cb3ee8a801da805bdce48122e54d0365bda69260001b6143ad565b6159ba7fbec77acf36c91924b383de6ad43efaa98b5ec2e149d1e7abe452423935f3727c60001b6143ad565b81811115615c80576159ee7f43098ae67737f822e3ff2097838dadbabfc78bf04daa19250c54455f4c80f14760001b6143ad565b615a1a7f5b70d4b1a6e3125d12424a3cd5e793eb5d5bfd589b11bd09103c665fbf1b042d60001b6143ad565b615a467f858832c8c82758b27429eb7c4b26243cf10f9e8bd4b3317916c95d99fecfbaef60001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330615a9b878761b94c90919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015615b3757600080fd5b505af1158015615b4b573d6000803e3d6000fd5b505050506040513d6020811015615b6157600080fd5b81019080805190602001909291905050509050615ba07f91fc860a964c6213fc4f1a4be3ddbadcf45adac66d00c53077a7e4d6fd6cd64b60001b6143ad565b615bcc7f765c30bf565f66100e936d9e8f622ee2526b54965d482d8781350987129bb54160001b6143ad565b615bf87fc925a81951de4e60ba28c6bc408df4c8e39e48977c8cd4cc7bd8eb96b451f37860001b6143ad565b80615c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061e4c3603e913960400191505060405180910390fd5b615c7a7f85399c177e2dfe42fface10a4b9dd887d91200128550500fd48f4973a0ec990e60001b6143ad565b50615f06565b615cac7f81305073e6fbc263fb363c8bcd9e5bd98e23bdca49670c06b371a126471719a360001b6143ad565b615cd87fc37098fe5e0736b102340771d005a9b0ed3e851c0fe6a6f0e39f2a38bbc35b4060001b6143ad565b615d047f3a16f78a716f60e999043b54b2f93aa83330e7bc6b1c890b623421e5a6177f2b60001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33615d58858761b94c90919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015615dc157600080fd5b505af1158015615dd5573d6000803e3d6000fd5b505050506040513d6020811015615deb57600080fd5b81019080805190602001909291905050509050615e2a7f5e09912529725adbcb8cfee6ef6b1bdee2a5bf2fc7941874ceb9a0d5bc47671860001b6143ad565b615e567f7f950e57126ffdd0aa5f3d2e56f6c84183444dd734931fd1e68111b3e959a04260001b6143ad565b615e827f877b92785ac8e374663c20b1c57e17ddf013325fb34add1aea55f4af57fa326b60001b6143ad565b80615ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061e2b86038913960400191505060405180910390fd5b615f047f64c9424e19f736d6ecac4c08e8794f56d05a8a1340d9a35aaa2d07d19426ff0c60001b6143ad565b505b615f327ffa6383d11c7791a723aebf4a83b3bb1b46dc513024fe1d74398efaedac8d1bf960001b6143ad565b615f5e7f6c929d80831ced67a0ead1e6cbbd82997c3a55794d0d5e93673c67435f024cb160001b6143ad565b826008600086815260200190815260200160002060020181905550615fa57f912fa0859998254482042fe8743a62f4eb07370c0ad2419a3eed850e0a9aecfb60001b6143ad565b615fd17f46e8938c5c0f15bf571ed91ad58dc77e96f76aa2c2d796352200428584e711ca60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca958585604051808381526020018281526020019250505060405180910390a250505050565b6160597f1b3353359c8de12e2f480c20a042fb6d8937d999189cc7b2f61e0a47bd7d857360001b6143ad565b6160857ff5db568c4ae8844d8e9362b8cc6d5e50a18b8d7a4481f4dcce12267f4be6d9ad60001b6143ad565b6160b17f3a7b5cb256681b80b220f767705e745ce69d13a4e7f0c04cd470ea34a65900ac60001b6143ad565b6160dd7f865ca80e7e548bc580e7ede6adc7ecf72d9a382873ec4a9c9f76dbf6943681b460001b6143ad565b83851115616136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061e28f6029913960400191505060405180910390fd5b6161627ff8f80fd3cefa7a7cc203254aee1419486d68368befc721db13b067d7442ff38f60001b6143ad565b61618e7f7f13d3d7a6608bd7ee12c1e71c074310d2bfc1cdbffddab2898d147e6a0a30ef60001b6143ad565b6161ba7fdba95786a11cbd4c989d9125ab10dcfa581cc921f71a064055a738c60f89f59460001b6143ad565b6161e67f1d79365cf401d3df0c1ecfee8eab687a0aa20b5effa0d1585742bbe7cab61c2a60001b6143ad565b612710821115616241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061e3116037913960400191505060405180910390fd5b61626d7f1282bf62a8d8b4afb769fab242d328d1202d75f4e4b37b6f7c2fd17ad47ffd5760001b6143ad565b6162997f33a32c6c91c3ac51f1d618d14226b8591b18861ce18bdee41369aa1b993d491560001b6143ad565b6162c57f7fcf6fb208806dc071efd4b33deeb209018fc175bae6797c179b4df934f3a74960001b6143ad565b84600860008881526020019081526020016000206007018190555061630c7f88d64ba1ad776fff48b5ebd0a4f2ad2efc4e4e43c79c49f81e1cfe47a82b0a5260001b6143ad565b6163387f54c14671f268dd2a3f41e308094782072daa25a9ddddd1dcfa4efeef86a9b14960001b6143ad565b83600860008881526020019081526020016000206008018190555061637f7fd568db0eb806b88be822ed5545aa2e0c57ddcbf50dd4f3c869d58de248b52b3a60001b6143ad565b6163ab7f43c7146c7c378a823a47d11f26549eb0ee98ab65168926039be111add8571f0e60001b6143ad565b8260086000888152602001908152602001600020600501819055506163f27f3b5c0ad8a3c0eff656e65aa62e911afb4f7f721979bd0386fb693bc4a75930b460001b6143ad565b61641e7f59edc21c65c13b50ebb7bd66d1efc067cba78144c9c67c772a7d7deb718c85de60001b6143ad565b8160086000888152602001908152602001600020600601819055506164657f077faa548dc765f5f5126d8189236fe72521d790ad6ca430b7631a36f0b02f4560001b6143ad565b6164917f53dc4f5d23e95949364e9f548a82cde38bdc8be788ba4b067df45b0cc8f1980760001b6143ad565b8060086000888152602001908152602001600020600a0160176101000a81548160ff021916908360048111156164c357fe5b02179055506164f47fc80fb2e0558d8bc614a52b814972c1c8d9512a48fe54d245e45147b425b1189660001b6143ad565b6165207f10cb77838e53a0c21258c3537289082b923aa705f94d8c3b32ea4914adb8791b60001b6143ad565b80600481111561652c57fe5b3373ffffffffffffffffffffffffffffffffffffffff167f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e38888888888604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a3505050505050565b6165ce7f5d08d12e6dd58531e82f3cd0441090cb975e67ebb0eb9360ec90e791e6955f5b60001b6143ad565b6165fa7fde9869e900a43dd34ea9c86000d6b8a8508fb2bdacdcff9904ab31c3ef4cb77e60001b6143ad565b6166267fd343801d572415df84fcad7e215541b4020f5fec0feacb5af1863171571966b360001b6143ad565b60008314158015616638575060008214155b801561665a57506002600381111561664c57fe5b81600381111561665857fe5b145b156167aa5761668b7f6bae2d03b455a7a9b10328c8b405745d1696c8444fa62695982191f8d16cbeba60001b6143ad565b6166b77f52a7817d5839a5e06041cb14e3cf71048eb6ae71ef01fe8fd74a9d4f72c5cbf360001b6143ad565b6166e37f03c4f103acca8588bba857f891e80364e6aa4a67c8f059dfdfff58fe09611fec60001b6143ad565b61670f7f70568dadfc090b2d0b5acbb650fa2b84f622ae2e374e265fa49fc2845ba09d3f60001b6143ad565b42616723838561b73790919063ffffffff16565b11616779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061e560603a913960400191505060405180910390fd5b6167a57f04a1dfcec1da39984189a74a8273fa1686b02fe776955d9d84e1bd58b701047060001b6143ad565b616aa8565b6167d67fa907e52c8d495c805089afc2a74e419dce3573d269d8f36e859ef273f5754b0160001b6143ad565b6168027f287a8c97a1c083f381274edb5a2da7edbcf5a6bdc676640ec7d3168a74d7cad060001b6143ad565b600083141580616813575060008214155b8015616834575060038081111561682657fe5b81600381111561683257fe5b145b15616a7a576168657f43dbeec0e23e52c489715a7499e1b6da79916f82520979fed4fd7cbca4d8d25a60001b6143ad565b6168917f61d08bd9a2cd49bc78012b5217d080fec17170bb38f5bda30b076ffdd4afcc9960001b6143ad565b6168bd7f45a7dda59938ef4cc0af25d4415c9454ebf8bc4eb5943af56401fd0b74acca6560001b6143ad565b6168e97f19899c754a2f9d2c54d71f8bc9e4c0f283456a24abe06ef0e2a5a0c78248427e60001b6143ad565b818310616941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b81526020018061e0a8603b913960400191505060405180910390fd5b61696d7f6a9487a8fd087760a80a890f016a406c68ba84fbe545f48ff691b844d7a06fcd60001b6143ad565b6169997ffa51f45e1a79e0271124be98b6b21239c0a493403876f7ba9d7ad07f2b8ec60260001b6143ad565b6169c57fdced9495e1cb7a042ce1b1debb1c80dbdddef2f5dd17f141e31b4088963710fe60001b6143ad565b6169f17f22f89d6a4cb17a8430462ec90917b43c6f1cabe39443e1006f938f40925a13fc60001b6143ad565b428211616a49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061e5016036913960400191505060405180910390fd5b616a757f3603a554f5a38eef1c480ae7465e68d7d9d92595dca7ad21a8460f4b7749f77c60001b6143ad565b616aa7565b616aa67f7769d73f20c312808c44bcf4c095bb33de44f37e126a68445ed9e6a9d1e0237760001b6143ad565b5b5b616ad47f181defdc185e813bc1cfee1da797ea7e51e9352b60a59eed6ce6b72ba4604bff60001b6143ad565b616b007ff0ca6a6619605c711367d043591fd86589f3949a7139d19bac086bc66d026bc460001b6143ad565b826008600086815260200190815260200160002060030181905550616b477f33b0a5ec2fe0e48eedd105050f1b54cb262d09a58e7a6dabdeb35f6d791a402060001b6143ad565b616b737f55f9b29385bb9d38f80f9e2743a72e413f4434f7ddc9af3a2f199183504018b460001b6143ad565b816008600086815260200190815260200160002060040181905550616bba7fc5060a6d532bd70c701784212380c5170718749ffb1d51f2548a74d7cdfa588460001b6143ad565b616be67f15698c1b3cb52400e2802364df0351e3d1aa7d292c1d8c62cf2c1f435617b52060001b6143ad565b8060086000868152602001908152602001600020600a0160166101000a81548160ff02191690836003811115616c1857fe5b0217905550616c497faabbc9d9ff60abcfa85df20e2069d7b0a924890b05b56fd1c2d5eb6e38097fbe60001b6143ad565b616c757fefefd74c076ed596d3469a4f07a18c069e3dfdd68c0284e3a902d7fc9829f6a360001b6143ad565b806003811115616c8157fe5b3373ffffffffffffffffffffffffffffffffffffffff167f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f58265086868660405180848152602001838152602001828152602001935050505060405180910390a350505050565b616d117fa20e9072ca5bccb0956d7b70673b62df0e8f854aaca548bf2a87333e81ccb22b60001b6143ad565b616d3d7fbaa046c6a8d17aa4b6f1810990f1054514bf088bb5bc1e81d5732bd6f6a235cb60001b6143ad565b616d697f88b63b099711ee3d3e1af10a3bba9f3d9301e0adb99126d0374b159a96921a5d60001b6143ad565b616d957f8320f66fb4260736c088321a124394194d69169e7af5e342b2a20f851eac7cdc60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415616e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e17f6033913960400191505060405180910390fd5b616e477f977978066d0e142e1696050762c76390e97fbd2e9b6ba1f423063ee89460851860001b6143ad565b616e737fa80e110af0c2c6fd0bbe09007ca8e400824f910616eebb194fbbc5a0e13af44d60001b6143ad565b616e9f7f387c72f65effbc0ff45f52c28451e2d253ad566da18c81fd819d90fc6a7f076260001b6143ad565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550616f347f438a8bbfeffe60243e14fbeda7e4da070c1fb87331572bfc9ff67707b881ab3d60001b6143ad565b616f607f43bf98f8bca5675df904cebf4ff4d8e6c5f93a3dc1a7769ea1e39878b37399f560001b6143ad565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f4836040518082815260200191505060405180910390a35050565b616ff57f700a658c4da4d353a417b77c970de433d453c8f2699839dae49ad56bc95247a360001b6146f2565b6170217f0442258b08cc70eb8e8ec53ae49bd385424a7b28fb72a01d5f07863cd8ef7bbb60001b6146f2565b61704d7f73beb8663fb3696cb086686c524e4708b28c4ea65f280dff39d4827e7ca4872d60001b6146f2565b6170797fe6766aa48ddfcd976772424bbfb446c43bd564638adb3eae442483ef3d47d2d860001b6146f2565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661711b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061e5e66026913960400191505060405180910390fd5b6171477fe3eeb77f132279c29353bda0a45a6b8069b3d81ae1d35ff6ce332bf4f2f1498c60001b6146f2565b6171737f826c811e8f0f23125d7835fae7fd9617b4c6646b1b180244448e1abc0a49cae760001b6146f2565b61719f7ff604418593dc16a35b826d8368fc2d80c0cbe277b3875ea2501693e6c787629e60001b6146f2565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506172237fdfd972c9e0ed23e7b9b39cc0eb70745f9edf91cea7d1f5ef8cbf934ab71a383360001b6146f2565b61724f7fb812f9acc0ad6954fb47c6f67e2ec9e576031902c70f7d19cf34ebd4c99a83b460001b6146f2565b6000808054905090506172847f4f3d52591d32856fceaa0875b19a1a6971c5907ca132a5d94cb043c091ae335b60001b6146f2565b6172b07f4248074121f47fe89626ab2bd1ddcdd17b3244ad291d57f5f2dc8d7bc0ffe37260001b6146f2565b60008090505b818110156174ff576172ea7fb1dcfab9fb921132d8f94a37743105cde00a71eac40f219501ac2186954f9d4560001b6146f2565b6173167fa7b3c5f14af4838df8ff89a66ce529ae4fe4e2b9b809d49ff43144b6f0b4329b60001b6146f2565b6000818154811061732357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156174c6576173ad7f5d85e0c498670283c294314ea52bb35d04f5b20382ead62f26a5637ba330e26560001b6146f2565b6173d97f1e61341ff4265c16c11520f2bcaa2c67455ac8a5a44789639a1f3953467185b560001b6146f2565b6174057f69cb5f1d8d86470f85ba42b186f442cf39602df325e0be82fd2638d49b8fcf9c60001b6146f2565b6000600183038154811061741557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000828154811061744d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506174c17fba71d897b1e65b8d75cc479d698f33254ca674ae100465305a4d3cd901887edf60001b6146f2565b6174ff565b6174f27f38f3b15268ac0d983bee23492eb7af2d86e2b2ac5f404db8797ba0870dfbb7a260001b6146f2565b80806001019150506172b6565b5061752c7f623fa6edfa9ede1ec69f5c6f0990a64e40c5a746c07a3dee242d3098a062bf6960001b6146f2565b6175587f29c2e5f8e4b3b2b601f7c3f6ad17144c78e76415ff9a7c26b5c5211d3e6528ec60001b6146f2565b600080548061756357fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556175c47f4c7711e3c15de7bc64756f0ad4342539a47405097c1b755ace49d174dd92c3e260001b6146f2565b6175f07f5ca3edf5634600b786f6eed93e841b0073d00b1d590ad098af78f5186c06fa7660001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367983604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b61769a7f0fba0ac44bebc1d19c1e2598d2143f4e40b91a1a479424b23cdc51a111f61a6260001b6146f2565b6176c67f5ac0587170cfc2ba6bca9c191a377f7088efdcd9232cc7a7b59fc66f09eed57d60001b6146f2565b6176f27fd54f82f5ebc658384e7f4f6b81e3425d2f6de6e397fc9febc0aab1c766fc2b1160001b6146f2565b61771e7f66b0600d033d88be9320a9667148c885b2d7b11a2276b7b191d0b7989194188660001b6146f2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156177c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e7341646d696e3a20496e76616c696420416464726573732e000081525060200191505060405180910390fd5b6177ed7f458dc0e526126de1c7a7d155bfd97e0e38ce74f4f30e24edbd3e337037df892060001b6146f2565b6178197f0ec391908240ca8cbf3d254c56a7a359eca3012f94f3eecd5cc663259fce8eab60001b6146f2565b6178457f52c66d7b17c6b65853f94500e1a91fd6b9c552cbbde0cfa175c5615cb3ef5ff760001b6146f2565b6178717f09fb6f28ec832827cf8fe8440c8432e239ca50ca47ceadfdea1d94df42d988bf60001b6146f2565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615617914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061e07e602a913960400191505060405180910390fd5b6179407f75beac7cc6466e3d793f5efc9a7ed5f6c7864caa408c6e40adc7cb53b1f61df160001b6146f2565b61796c7f1bee40b5901ac349124754918e7e26cbe2858df5ecb1e94400402e260b6eacea60001b6146f2565b6179987f410a93128c50bbb38e509b51ade3c351cda1871ea9459114a6e83965661089a760001b6146f2565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550617a1c7fbc537b56eb8ce420f84eb8f690214bb5de06021c78fed4ceb0d761a7e511757e60001b6146f2565b617a487f8163b1d3ff7133aebf587ffdcb3605813a526f23621691ead884c8cd67cfd1ad60001b6146f2565b60008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050617ada7f595f5761b1bd17a702d9ab83f65b7b6418be9c4566ab772c2b4058530a29151760001b6146f2565b617b067f329571cfb247df28874d5a0cf2727b30c25d584b478323281c9165c3293ca4ee60001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250565b617baf7f41b1c8dd8d5910327e36a8bb359ff178cb1ded39297acb346e950db929c576dd60001b6143ad565b617bdb7fc23662d16f17d6ecca993f94dd9551e348982183b566a73f7a40d619af6fdf1360001b6143ad565b617c077f879ec18b3d166ffa5960af417819dff7ee0d07413638c758e33ec0dccb3d930260001b6143ad565b617c337f44978c5c4629b2a7ab5043bebc39e8d85967adf244fe0b68b72e7a50635eff7d60001b6143ad565b80821115617c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603981526020018061e3486039913960400191505060405180910390fd5b617cb87faa08a2064548d9b97d5846eb088eceb4e1c090b8783ce22baba19f9da920386260001b6143ad565b617ce47f399eac91c298367f416eedc509a56bd2476a549a931edb555a81f8fe60cf557560001b6143ad565b617d107f9c36bf7fbee120301da8f080504949f5fea67c26c08e91aa980acffcec93315360001b6143ad565b816008600085815260200190815260200160002060000181905550617d577f8dc1ec87cb4139cd9cdc5d2b6e4be1d82cc50c63a0d4ef574b7e240e4606412760001b6143ad565b617d837f916d4403cb99a72d9a3762d9de0cdba327dba7a3921902662d86c2ad4130362060001b6143ad565b806008600085815260200190815260200160002060010181905550617dca7f8cd4bbf71b3526b04e357b05fcb732a62bbdcbc8e40448894cdfabf67621f7e060001b6143ad565b617df67f51022f8a36dd964c45e4d3a6492a638f7dfb12f1a0e3441b7cd6c3319f36862760001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c84848460405180848152602001838152602001828152602001935050505060405180910390a2505050565b617e857f0cda559503cba2917545521066a16a465405f3bbd1b9a568831628dd598bf73f60001b6146f2565b617eb17f6b222ddf38757b30ad5587a0535d9026e827452508a0d467684c66d3c1a6e1a760001b6146f2565b617edd7fb3aec005e80804c1f7f09812f4651fa1987bd48659bb0cec15eab29527043ed960001b6146f2565b617f097fe2143ab519096b44a68bcf2dfa76788884d93aba95b22f702333728f6047eb6f60001b6146f2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415617fac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e7341646d696e3a20496e76616c696420416464726573732e000081525060200191505060405180910390fd5b617fd87f0af5dc5d575f70ea5f62d1f6520cd98e700cf178485f32277cceadbd1e71e57160001b6146f2565b6180047fa295903c4a81047b622dc3979b142baeb453eb062d4af1e70c3b168d54ff4db460001b6146f2565b6180307f057aaa7ce8c5bb2593674b3c4e9a379586088e150b4e9328ea1f7230b5b575c360001b6146f2565b61805c7f19ab008ed7da7f2961714050ce173a4cbb5e258f90574a237eccac673b998b8b60001b6146f2565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156180ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e1b2602c913960400191505060405180910390fd5b61812b7f1eb2f8712484e5abd0a0092e69ce0a0fdbfa077b87ce2bed2e1e2d441795d8be60001b6146f2565b6181577f39376fae5bf4169c93cba7dd7d2db4ff9a588c360bad5ce5f74cb23f8f62d0b660001b6146f2565b6181827efbdfc6de6200e1a108d4723d0ca109493d1be7d9be54dc015b2fb1c3de109460001b6146f2565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506182067f8d877c7bc5a5dbc94317477967e48e0985065b67fab01a1e53c0ded7d800873b60001b6146f2565b6182327f303e14c184af88d06ec969b6d5b59bc876c93916a2567d399297edd11603cdea60001b6146f2565b60018190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506182c47fdee67bc05f6f2a2ade56b3cd51a23a19307ba012452f287806627fc0885e7fe660001b6146f2565b6182f07f97391ea682f435686bd9306ab387f34a2948a811c2b43c07d281efbfc35c85ed60001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250565b6183997f5e14273f5c91e0a425e5ff20d66fac314255425ea45439ee5a8393add92130bc60001b6143ad565b6183c57f48f46a01af4ce3a539166ff52f8d4401b418b4f8775fee2b2ae5c23a23719dd960001b6143ad565b6183f17f4fe4b9e48544e4e272516831ae8ddf0ab27b542463238f44eb8c0d71a0612e2b60001b6143ad565b61841d7f119db01a8b1080f48a3f7378f9ca67e2646897f170396476efa321693d4ff00560001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156184a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e0e3602c913960400191505060405180910390fd5b6184cf7f8fa921b0f7a0d3a8574cdeb502e15747d35f8b09998b794d530c052c4576836f60001b6143ad565b6184fb7f3d7f019fdf59c5a7bfb4c68e66b965313f01dad1d486d7ecc93d8ed59ea2462160001b6143ad565b6185277f0df6f2ff2bee7f68bcb81d874d46e0e6195f311deeeaa45c8af0cc1a6e61c00960001b6143ad565b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5060405160405180910390a46185e67f40dbcbc5a1d19ec229f1911b629cd90d135184611e4c9e3bb124567fc12c785760001b6143ad565b6186127fba04dfa1aac058af28bacc3d9d16235f5f6b951a31ed8287aff297eb13883da860001b6143ad565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6186827f2d2b17008c81c729a76e9b31f1d60af1e815996dcf2ed234a6f5817f40d52edf60001b6146f2565b6186ae7ff2935ae4ff1369b36a1c9f8bbbc07d39433b3a0fe3721f87f0fed6c1b1637b6660001b6146f2565b6186da7f1110a884fa927bc46ef946125d7a67d5467c8bad7f7ee2e2ba61a7098176705260001b6146f2565b6187067f8fc70272bce9244fe3660ca50a4662d8732531a39a60c46470dd2c5d9f48323b60001b6146f2565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166187a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e4706028913960400191505060405180910390fd5b6187d47f7521ea7e11981e10530712e844a34703b2c3b7c8eeeeb0931806d36889a547b660001b6146f2565b6188007f3b1c6f84d325922bb0bc5c0679dc3d0f32d479d5d5566538162a0fcf525e8e8260001b6146f2565b61882c7f7c050e1b8d81590aabc562aae5f958dd9c5687079ec3df0524a2d348ac819cdc60001b6146f2565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506188b07f134639f4262b32365893cb88bac2370c1c291e206b3ece0f4730e376462cfbd460001b6146f2565b6188dc7fa815fd6ced88aac874c0da0fa0b813c59c7aeb91751e67bd0f4423cda199b8d160001b6146f2565b600060018054905090506189127fa6913cd67d5f0d909416aee3f9cf2377e5c612ae34580c3177a5a770e408c22260001b6146f2565b61893e7fe943dc5f4e6a6cefcc2516b51415c1ead670c42e9493440627cd57477b67fb9360001b6146f2565b60008090505b81811015618b8c576189787fa6bc8e73465d3c28d34d39dfaeb150a7220b50bca4cb3d8a8f0d183c7ab8fdc560001b6146f2565b6189a47f47fd655f1c87712d6c2fcde17ba3980d7a61f61d50ebdb03ce8bf91aab23e4af60001b6146f2565b600181815481106189b157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415618b5357618a3b7f402f5cbf01c18812984ffdfdd5c6e7c94e407c478e6eaace4366cdf0c4265d4160001b6146f2565b618a677fd948e5cfc2af9f31c734b9c1c0b843eeff749be6afd8209e3e8438c5f564072660001b6146f2565b618a937f02c3308c524bb2acb655bb78998e62a581922af54056dd9491629eca52ec310e60001b6146f2565b600180830381548110618aa257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018281548110618ada57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550618b4e7f596f90392997038f3189a37b4d309212bd69538bd8410712475516f2451aebab60001b6146f2565b618b8c565b618b7f7f2673001b1f599afb4c3b709b761aa53d6a8c3b9e764ebdf31bd8c0f85078072460001b6146f2565b8080600101915050618944565b50618bb97f2ee0d065b1399cafa57e27594b8338d1a48e7bf3ccdea71ca9ad58d142ee85a360001b6146f2565b618be57f2f345d77625ed83c6efee45dad4557514fb8be7e15977ed2da588e5c0763744d60001b6146f2565b6001805480618bf057fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055618c517fecec104046e3f1916b39682fad4322ade6c412b59aaed7c2812d0a74b2115c5660001b6146f2565b618c7d7f1f9cab3bd3f01a3c928ca45ee19f88cc1f6a7aa38a7160be8c2acd2784476a1460001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed683604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b618d277f1258a28ec2752da0da5b922195692f92154f9af007061c0031dfae38f41042d460001b6143ad565b618d537fddeac64170ad0cfab7d37ad18ff38299b858230b1c1d6fcf2f5162165025f8f160001b6143ad565b618d7f7fc779b5ce7d4e7f68b735dbef130f39b7b18140a48b900af4608e8f33cc7fdab760001b6143ad565b618dab7fc401c8ebbf36b2904cf2aa800439e0006d933e6a0c6bc7ca0caa037e25f9e46a60001b6143ad565b618db48261ba1a565b618e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e000081525060200191505060405180910390fd5b618e527f29f0beb74a22943da13a889c0309ce9b7bcba9e0b859609cb709d3b7f48a612560001b6143ad565b618e7e7f5da3dd6d41bb3fa4553d2275da31ebfb28d2cb93fc8795a40fbc74b933afc4a260001b6143ad565b618eaa7f3b3a5721379bb182ea96103d2c22146d68f7c77ed0b1b39197e69d84a84ad6b160001b6143ad565b618eb261df32565b60086000848152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff166001811115618fa957fe5b6001811115618fb457fe5b8152602001600a820160159054906101000a900460ff166002811115618fd657fe5b6002811115618fe157fe5b8152602001600a820160169054906101000a900460ff16600381111561900357fe5b600381111561900e57fe5b8152602001600a820160179054906101000a900460ff16600481111561903057fe5b600481111561903b57fe5b81525050905061906d7f15737ba16ddbdaf5979fcda90e7bd0afd6c3d9e5c31633b1a2c14c7a5aa8ad5d60001b6143ad565b6190997f3f6caf161f7ed8380ad6cbf612075d07de3ec83c9aadfe08d65846fd0c3b303860001b6143ad565b600060028111156190a657fe5b81610180015160028111156190b757fe5b1415619192576190e97fd11f70b7df494c275c522313109d065894a77213e72b4c790ee9662a34b4492060001b6143ad565b6191157f82667fc40443f50677083ec8ea3822102a0855b04b9f4998f4969b76aa12ab8c60001b6143ad565b6191417f52cb36432d95f0bf1f875532fbafa21140eafd816b8fd434b76542d22cfb30f560001b6143ad565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e6466028913960400191505060405180910390fd5b6191be7fc3840ef3457c4fd7aca311ee3a2af97df56cae48002f1e4ea0092844f370846b60001b6143ad565b6191ea7f2ac1026d2ac6c5f93c27f427ca6d8de1bd5d9fc3be04ba59d23c01380eabd61e60001b6143ad565b6002808111156191f657fe5b816101800151600281111561920757fe5b14156193a1576192397f35ca1646c9d9b334a5bcfb8ffce7bbca02d12e14dbfb5e1cfeb69f06f410879b60001b6143ad565b6192657f3469385da5907e86f9649c10713f56bb94b9f4b51c39bfd0e9e599f3e619f6b460001b6143ad565b6192917f2354e318a94d00cd4efa5780954f2329c444d8d31a97fbc36ccf7c2887150fbd60001b6143ad565b6192bd7fcdf790e12d7bb8faadcfdb21ef2737b02fa9234f5dae5a12b4d1276a35708c6a60001b6143ad565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16619370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e2416028913960400191505060405180910390fd5b61939c7f69cb708d22dcd13a128b9b64bde4c4b5e385ea75ac5f187f931caa425971e77460001b6143ad565b6193ce565b6193cd7ff6ad38514dd03862364ac35fc06de1049dbdd7ac394780bf86732dfeabbe38d560001b6143ad565b5b6193fa7fedd422ab79c33b72062546e74c932928579dee65755eb022c09d3a6c8c736f8060001b6143ad565b6194267f3a179772423b910911a51b8c3244b938316058d70f0198d842876c5faf1a5b0660001b6143ad565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205490506194a77fae6d9864bd3217c36f5a35cff1d0dc35b89cec47100dc3104fd6b06d9f4246be60001b6143ad565b6194d37f87259a496a95529266f8ec006291a81718473d8a03fe89348004ad8bdb68fcc260001b6143ad565b6194ff7ffad4e2aac2db0affd87e8b5c6d525efa79c2a40803aab367e5e0b97825813da260001b6143ad565b8160200151811061955b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061e1de6031913960400191505060405180910390fd5b6195877fbf320ddede2786d819111ad52aa3356dc915413f4761bee74f5e044b0f2cbb7260001b6143ad565b6195b37f438fb6dc27845e10e217be78aa727ac3708c408bad0eee20cb71242068c5e7dc60001b6143ad565b6195df7f35a879d5c51a4691e775600ee0be7925c36ae8bed698285c680e2b947d695fdd60001b6143ad565b600061960d7f0a7df4e4eac2ffc32eec0d3649039ebd3e16bd42819ea94384a58addc970120060001b6143ad565b6196397fc46b65538395c0a40dcacdea0190842053f78072bf15628ffb7f55c5f833af6160001b6143ad565b6000600181111561964657fe5b836101600151600181111561965757fe5b14156196e9576196897f14332d445b62c44fb5b7bbb9ffd16168952e8000d39bdc6b3b0a719d52d3e59260001b6143ad565b6196b57fd1c788de06a3290f7d716e94e2697a347aae0c15cfc85ccbb0132751df57e6c360001b6143ad565b6196e17f28260e6d36c9d45b949b3e3680dae0db0c059432fb64191d1295c677027f23e560001b6143ad565b349050619c14565b6197157f02f74aa8364872739c5e859f2fe47061d952d965ecdb14b2fdd88cae3a3f8ed060001b6143ad565b6197417f18c9b05cebc9984e5ff788895ceff933a7fcf425b2fc51324686ffa357fdc30e60001b6143ad565b61976d7fe5fe355b75925c098a1a7a2d43219daa7dc998f19244a6b2a66b79959dc135b460001b6143ad565b6197997fbfa3469fd27f859021f4e9801e12b194f32082bd7e555218f3c648f514624b1960001b6143ad565b60008414156197f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061e4216023913960400191505060405180910390fd5b61981f7fb855a542a405cab7b781bfdcef99c439f86be5ffabc0e0f0eab43aeb676c1dbc60001b6143ad565b61984b7fdb6e6cc1b4d84a4d50611137baa461eadc963963cef9491c0f80ad45fe6b218260001b6143ad565b6198777f0eb26e92e7452c913728874ca9e2ee657b30f7cb71d07719586b00a4bdd4353f60001b6143ad565b6198a37fa879878c8ee82050fede45179d4ddb3d4f957a17453e0b13244910d7d21c5c9760001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff1683610140015173ffffffffffffffffffffffffffffffffffffffff16141561992e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e444602c913960400191505060405180910390fd5b61995a7f2e3dc7cce37d23feb1ac9722a7ffbb1ba457d0697b2c4409623652b90bd60ae660001b6143ad565b6199867ff7f4250817492223a9e3ae1c9a793b77986b35c6c1d35449bc864b444e6db26c60001b6143ad565b6199b27f5da45ea63a160dd06ba6a43e526b63aa786b1a6ff4800caa416c30a399ffac6c60001b6143ad565b600083610140015173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015619a7457600080fd5b505af1158015619a88573d6000803e3d6000fd5b505050506040513d6020811015619a9e57600080fd5b81019080805190602001909291905050509050619add7fdb3a48f1931805e6b76e814837db0a8060ea54950041474bb48ebcc1acd9a84b60001b6143ad565b619b097f715774f3e46f4846ba248e25cf89b1518fa20c4f8981e4f5bf25445ed7d5746460001b6143ad565b619b357f12b185d84750e06dadc28ca5afa26a01791cb68a10436a62d586a46f7f61087460001b6143ad565b80619b8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061e60c603a913960400191505060405180910390fd5b619bb77f4dea6bdf1555e9f9ff79432d61c11b733f40a193c889d33ff045614d03186e1360001b6143ad565b619be37f4af8fc6941598eb1ff7882852e49a5a50a8cd9f8b611aca905d859d25185f7cd60001b6143ad565b619c0f7f268d5c820b55f3ee2e01733de4a71d59f977ab9b51666e5cd66786183bc65b3760001b6143ad565b849150505b619c407f22fc79eb8c07045526084769af97e3fd12ce7e530414b7bdb9164cd37dead24660001b6143ad565b619c6c7f41ff2f4f5eb8b953587115ebe393897702323585340ad81482673ecc1646341c60001b6143ad565b6000619c9a7fbdcb60ef26bac120bd2a12589d35f652a81452fff0f088f524188d9e1749217360001b6143ad565b619cc67fe5fdd48b4d65b3d8ecf154886cda5936cde965c0d67aa82902895c315c8b811a60001b6143ad565b619cf27f94118ce43c1caa71cd400b60b4fbf222bab2e4d10a6a0b2bbd406e8527091dc860001b6143ad565b8360000151821015619d4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061e20f6032913960400191505060405180910390fd5b619d7b7f060959094a8435b0731bc6aacf7a2181a403678c56a23af36609844395e1657a60001b6143ad565b619da77fbc5eb22848b26ca8b383487d48b3f875b710d6a3a039676e5f4dc8c5a2e51e9560001b6143ad565b619dd37f245343befc94d5861f352fc505db1a41760bc4d5eeb3fa52c56ef19c5c9f6d7d60001b6143ad565b81619deb84866020015161b94c90919063ffffffff16565b11619f1557619e1c7fcb4835a354754a3aefb7a645b76b3c8bd9de549baead3d813031647c4309a0f760001b6143ad565b619e487fc1cad96269dacc8cc05d8deb9d4757af3d97ee65c4774ce5684a2d2ccd13812060001b6143ad565b619e747f43e12f4fbe464a6989660a3769978a442d6f7401e9bfbf3d027b1f570928d43060001b6143ad565b619e9d8460200151619e8f858561b73790919063ffffffff16565b61b94c90919063ffffffff16565b9050619ecb7fa3a10396e3827dd8312c751f436a7d3b85d92d8efc27da40eed10d541369f67460001b6143ad565b619ef77fa17eeab935b0d2d26f5dc67cd3c51c44ec599998c1fd6b67701a875be0a0b2bd60001b6143ad565b619f0e83856020015161b94c90919063ffffffff16565b9150619f42565b619f417fb14125e75dc7e4bac8c8de914081aa5df53f65d7a89b96d386f4318b0859e7cf60001b6143ad565b5b619f6e7f0213bb603a5d2df16016de8956610f8d8cc84636937297faf34422b5738cbcb860001b6143ad565b619f9a7f8174c7a27ae29d870a99a2ec0392f2118d60c96259df3457c05db358c0c3a88060001b6143ad565b6000619fb48561012001518461b2f390919063ffffffff16565b9050619fe27fb89290c05bbfeb36574611a6d71c190d7aaaef99becb7ad25e43cdb75b2e0a5560001b6143ad565b61a00e7f031b1ac2c2858eb8088e177b84c3acce229050e18f5bda27fb7104282d348b8060001b6143ad565b61a02581866040015161b94c90919063ffffffff16565b85604001818152505061a05a7f91da45c4841333e728e3c00acf7cd3f489ab80dababd72a7e1509d4c6b191ef160001b6143ad565b61a0867f28740585bd2ea60e0382082f2fa7d973034fd70b770cfe93b5162a7a45765d6760001b6143ad565b61a0e981600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000205461b73790919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000208190555061a1697fec2f3253ba1e944ec9c28171fade64664209f5748718535925f66cd33fa2e27e60001b6143ad565b61a1957fe4dd45286e94de0fdd22deaca4af48374806881f99c81b9e3b84dd4bf77ba46c60001b6143ad565b61a19f878261c3ed565b61a1cb7f034592d0b9623a55e32c47ee9dfc560a536d0a3a7bce93b8610441f9c31f7ac760001b6143ad565b61a1f77fde423aac9e758f41f80ed74e6ade2674e350c4ea50322763492937bd4ffc044f60001b6143ad565b61a2008761cf52565b61a22c7f8640db2afcaf537ecffa727847ad75bd703d4852d25b1c7af5be0b0c5e31a29660001b6143ad565b61a2587ff8290a9d6a058bc7a6c13f5c147c8b949a58ad770b333aa3a4d79b13d2a6cc3160001b6143ad565b61a2648784868461d72d565b61a2907f143914d68f5fc7c320d157e36b3554cdc8c5e177532eef24eb6e602e69b9dc9c60001b6143ad565b61a2bc7f8143e64078e3a57a9b83fb5a248209688ffb9d0b4ea807fdcd32a2c9ce74c99b60001b6143ad565b600082111561a5205761a2f17f1737d0e182b71646dca77932cb19ba5935c7ab24b49798d9fc2dc561a8a7180c60001b6143ad565b61a31d7f2ff0fa203b13a8a0753e0c4a98955d9e3bfd0d0718d1e76ea2afda3185fb067d60001b6143ad565b61a3497f3a76b33099114723596b34f4808854bf0d31c403c90e9215d73e9af7211281ac60001b6143ad565b600085610140015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561a3d757600080fd5b505af115801561a3eb573d6000803e3d6000fd5b505050506040513d602081101561a40157600080fd5b8101908080519060200190929190505050905061a4407f7a45cece3f1a5b9eb94ed8d55a4ac1032c771c3ed7763440dffd58a07f47e8b460001b6143ad565b61a46c7f84da53a161eb34959bee64ef2d056ada10d1417da934a724d01acd431cfcb3b060001b6143ad565b61a4987f82e77a5fb53cfad710080846366998b48370af6e15b1b0342f28c2278b76ce7260001b6143ad565b8061a4ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603981526020018061e3e86039913960400191505060405180910390fd5b61a51a7f5a89ad8ab5452a75c918bf5e84f60666d4067aaf8ab5d74028d20672d1e29f1960001b6143ad565b5061a54d565b61a54c7f33d0fd640530abb15087447dc7bced848fe1259c47d0817f8ad1e7506f1b975960001b6143ad565b5b61a5797f43eb29afcdcef52f4105ce66d594152fbf8cf9a345f38166f980511e40b2645b60001b6143ad565b61a5a57fc55b5598b3cddbcb5a546dc90cd117aded4d1bd7a665069ee4f92e8fea63abff60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba08883604051808381526020018281526020019250505060405180910390a250505050505050565b61a6307fcd966935353bda444816eec693f810b1bcd54d4d073398cf308bf2fbe3b263e360001b6143ad565b61a65c7f0b74fe531ffaab939a53b7189096ede82dbb739ff99eb19a85bc9e815a4bf99460001b6143ad565b61a6887fa87e72442e527d7532bf613592e6383a135437fed068fc3d9fef77090a63ee9760001b6143ad565b61a6b47f8a8f02a5a4fef27b28cf23e0bd5c5283abcc790a81549bee87f7096940de35b060001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561a73a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061e04e6030913960400191505060405180910390fd5b61a7667f4abb75ba6e20ad9a8eaad46ec10eabfbf8b8185420bd7c2ceedecee8764e84b360001b6143ad565b61a7927ff904c5fd956edcd18ded43fadb89d3e5311a88bc1fdc4242774ab45fa666462b60001b6143ad565b61a7be7f63e0f6b55c5a25766a8ee5960e284924cd6cb69f392d660b7c2e69454731fe5f60001b6143ad565b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce160405160405180910390a461a87d7fa89b56f9cbff042ddbd40975d849a6c306c28b9c7a9f59679a46cffebfa481c360001b6143ad565b61a8a97f8baa7b1fdb6eb7b3f361bbf4c808c060c7478ebdbeacb7009b0093519eef4e5360001b6143ad565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61a9197f5dba51d03ea8e4fa7fcf50453a95d2d0be10d32a3fb8e98eb04a03a8c924dc0b60001b6143ad565b61a9457f256e203c5516bed84ff857fae390e709522aed56b5cf4fb0b8b1aa605787009c60001b6143ad565b61a9717f9dd2ce83121fc9a27c44702515c7e5bad4f1b0fc189aef59bd8db773f23fcd2660001b6143ad565b61a99d7fcb7235a5ded29d8c765b01592980bc36ab36482f6fb9a6d64ccdbf6154c9515c60001b6143ad565b61a9a6336146f5565b8061a9fe57503373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61aa53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603581526020018061e3b36035913960400191505060405180910390fd5b61aa7f7f9462da58c4b4f9c2fefd8ef2f7c3a4909f4f2533a97706783988aa71bc49918e60001b6143ad565b61aaab7f764d97a34b52dc1cf73063621efe7ec2d1c55ef109c70bbe0a50b56d1b89fcbc60001b6143ad565b61aad77fb37b9345fd1da1ede1d452a366df2b72de7d60ce79d6e6d5991ad6814b5f0c3460001b6143ad565b600033905061ab087f07ff9d09acb29e01f82a65be19be798992a7e4fafb16b900a9bcf9ca77ac3f5a60001b6143ad565b61ab347f988e3c68c7acd53b40e77dd1ea4241338cd10182889550fdd80e29696f860bbf60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461ac385761abb67f54780788f9bf8584d54bf4cc4943ba8bc83ac804011e89520b6005be9177230f60001b6143ad565b61abe27fc5ed745f2e70dd07837a392031fde8061823885b1b011e514c52439e76b9af8560001b6143ad565b61ac0e7f5f9a3bd40716d7d9e7574395891f7f0aa323c6e4bd5273dbc66d5ba7879b64e960001b6143ad565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061ac65565b61ac647fa4d6b933fdd56f426de28e539a047494a257eef4f7dbaf320da04f3e054de5a960001b6143ad565b5b61ac917ff04c20c949e6b72c0681623026083ad51672b7d73cdaf61c3802dc3d142b33e460001b6143ad565b61acbd7f6ce14dfe14fe605ba57ca5162006ee712d87bc3428fa047328131ce4c95e237460001b6143ad565b6000600190505b600454811161b2ef5761acf97f53bee2e90458706d235e231a96c5b79963ea992231858c035a0de1541745fc7560001b6143ad565b61ad257fcc9e461887b8ef6bb19351d4694ae99d8113429af1662c5ee29171cf4a9c38c260001b6143ad565b600c600082815260200190815260200160002060009054906101000a900460ff161561b2b55761ad777fa100bfa14d290e8c70ebe5cbdf9ef24dfb02756548d260e9b50d8ecf964f0cb460001b6143ad565b61ada37f1b202c8dae0740c20a2ff89c1968d1637a7ab161c581b7a08e7f0711ba57c66560001b6143ad565b61adcf7f9ed0b892a0766e12e16b26d2363ae060b1b211302a9031481f6b889c68cb2cc760001b6143ad565b600061ae0d6008600084815260200190815260200160002060090154600b60008581526020019081526020016000205461d9c190919063ffffffff16565b905061ae3b7f4bcbecea127467b89a4a8dda4664bc821f8bacbeaa0ab35a76ade67f2ae1eb3c60001b6143ad565b61ae677ffabf93cdb41ad7545395829064c555d40a030b1472b4f3ae285035f2e60bc1df60001b6143ad565b6000600181111561ae7457fe5b60086000848152602001908152602001600020600a0160149054906101000a900460ff16600181111561aea357fe5b141561b0555761aed57f3aff474ad01699d604d96308d7b9d46bc34cfeb1ee9b00283139d53f41f6bf2f60001b6143ad565b61af017fe347bbb2c2c2f2b613338725c02b85846a5984878a308afbcde227470dba130b60001b6143ad565b61af2d7f7bc1d58153fe8fefbe3fb33440a1f638f9314904835fb95b41348628b942c23a60001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561af73573d6000803e3d6000fd5b5061afa07f42bcb0901f7bd1072a3a83ef19776668acd8109066a530bf2a3e38906ae5066360001b6143ad565b61afcc7f33cab331a764e35fc37ff2c2cdf63a57170dfe29a679ae421ba932d29d3fb47460001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c846000856040518084815260200183600181111561b03557fe5b60ff168152602001828152602001935050505060405180910390a361b2af565b61b0817fda7bd1ac43e85971a4b38d5c812fd5315e71e18533fcfcbab9b10ea11e84b13260001b6143ad565b61b0ad7f01bcca6890dfae3a0d9483b2efb1e73c2ed75fddb2055013fc255921fcffd0af60001b6143ad565b61b0d97f1a9ddb01a03292ce9c72f562c4d9a2dcba1a7baa5bd2021078a57342416e71a760001b6143ad565b60086000838152602001908152602001600020600a0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561b19657600080fd5b505af115801561b1aa573d6000803e3d6000fd5b505050506040513d602081101561b1c057600080fd5b81019080805190602001909291905050505061b1fe7fd31bfc3837838ab3e8e5e344901b69827ee0a1b43710efeb2eb6e48bb2bf377360001b6143ad565b61b22a7f0e313dc839520594387bfc146ea64cf13546e043ce6cca7dbf207acc326f335e60001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c846001856040518084815260200183600181111561b29357fe5b60ff168152602001828152602001935050505060405180910390a35b5061b2e2565b61b2e17f1044dc8eca2327d29135df74b3a1c5a71ea389acec3722b97c86e029cd3cb01360001b6143ad565b5b808060010191505061acc4565b5050565b600061b3217f44698d1e9a904ed1284ff1ffbc3dd61250c83d2c71afd5df19fbf19c6190a1c260001b61da8f565b61b34d7fa3a4b98cb2a23eda9dbb54b77b676d94ca9d1d4bafcc15caee09e68074b0ef8d60001b61da8f565b61b3797f3c0e96b55c01aeef942723329b7f27779568810ddd00a05282ffd2e3b5d233d760001b61da8f565b600083141561b40f5761b3ae7ff802f4a238c6bfb87737692d90643ed6d1e91071b816804127f57dca78bfaab660001b61da8f565b61b3da7f9c7552f9a426f225c2850fa12a0dc5fb398b1adc4885e41fd5a32fae1dbf05d760001b61da8f565b61b4067f88253dfa1829ebe573c7def7f8d624e362791a1e5da86330776d1836a357555360001b61da8f565b6000905061b607565b61b43a7ec5af928e6c63fb10ff91a6c5a4e910c4f39f595f742d8e52dc11b03ad6250f60001b61da8f565b61b4667f5e551b5129d493f012d238e272eb615eaa6959509de842125d5c3b203db4ec2660001b61da8f565b61b4927f6eeef49995c967235a764d0bfc2ddf3ad4e6890ca3a3e7024c52da8393db1ce160001b61da8f565b6000828402905061b4c57fab80a6313ea3c5926e33d7cfa6c464eb729cc09a2e212bce50dc9d97fae0ed7260001b61da8f565b61b4f17fcf8cc8694fe56eef0897d8bf5580925daf8927e537ada7fb46a3727fe18d423260001b61da8f565b61b51d7ff5b30a17ff5e5b532b98d8059efeb460d05236f98b90e61b8794894cfad8502d60001b61da8f565b8284828161b52757fe5b041461b57e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061e2f06021913960400191505060405180910390fd5b61b5aa7f9fdef838f8fa27d2dbdb6cfecf3f275aa85c5ae07d712150d6e17c19c215bfd560001b61da8f565b61b5d67fe9975f5879861c66ca2a2d35617f5a37951b7cf797008080c2db7371f45b3b1460001b61da8f565b61b6027f1040ca89b272f25ce391ff02203288f6f7b9bee30a94da64205ca6d937da6b3460001b61da8f565b809150505b92915050565b600061b63b7fa4b53dcce60c93e2c60fa6b35fc2caf97736f23642ea2c793c86b5d9cefcd35860001b6143ad565b61b6677f44ec31de0477863a6a67fb31990250562be4f59a3de73987c9b17df05712c84760001b6143ad565b61b6937f4ba13b49aac54e2bb0a57da2ad46f0e1c87f0187ebfe5380cfad544e45408a2960001b6143ad565b6000600190505b600454811161b7335761b6cf7f012e5bf791c6ab6bcd46b6def5c735bf330edcd8b5d954d843712c31d88f54a860001b6143ad565b61b6fb7f488aedc98a520bd06ef1e1f00a48c0beaf7cfb84d17cf76a58f0472a0e87535460001b6143ad565b61b72460086000838152602001908152602001600020600201548361b73790919063ffffffff16565b9150808060010191505061b69a565b5090565b600061b7657fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b61da8f565b61b7917fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b61da8f565b61b7bd7fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b61da8f565b6000828401905061b7f07fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b61da8f565b61b81c7fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b61da8f565b61b8487fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b61da8f565b8381101561b8be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b61b8ea7f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b61da8f565b61b9167f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b61da8f565b61b9427fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b61da8f565b8091505092915050565b600061b97a7f692a0cfdea6cb12cdfcaa599c058fa5662531cebd540556a6d1c27ae01b4cea360001b61da8f565b61b9a67f2cce8d8afd666e4919d1ece0b47a35eda094c843996926984c8b17a0d5cd2f7160001b61da8f565b61b9d27f936781d4063de1913a3eda99a7c2145fe8a9c61ba2abe4fa4e7dd270bf8b933960001b61da8f565b61ba1283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061da92565b905092915050565b600061ba487f91e9553b8f91db975c749d5c94abbce1e296644e5342b3f6db822e21c132911d60001b6143ad565b61ba747f2b0e88aaa0157cb7c3170221a6f349f6c3fcc28be6325238a0caeff455bfecc860001b6143ad565b61baa07f1d7d2b6b4d5f5d125a5de72a1a2749ffb2cc381a603a980b27bf0cd3f8942e2f60001b6143ad565b61bacc7f42f0e56580982a6b9555e748d4a68e977f7ca06549add8b930c033de27969dc660001b6143ad565b60006008600084815260200190815260200160002060030154141561bb3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061e2696026913960400191505060405180910390fd5b61bb687f05c1468418341081ac7af113c7504e8a76d43f3f721fffdba85f56bd3a3fd44860001b6143ad565b61bb947fc5666b5dd4c45e66a17e768e0d794b9c8e8301e98fd8b84da8112d5fa58867da60001b6143ad565b61bbc07f81a4305675c0b8c084beeb0305b97d9991983301d80bc035b0011f8f2e379bfb60001b6143ad565b61bbec7fbdce033008dfa407030bb5743bf2d2b929c1bf01137a44eb27b043b471b374cf60001b6143ad565b600c600083815260200190815260200160002060009054906101000a900460ff161561bc80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4f726967696e73426173653a2053616c6520656e6465642e000000000000000081525060200191505060405180910390fd5b61bcac7f653a3ae263eaf8831f43619f01c20299737aa4d8f81cda08ccf8b9db7440c63460001b6143ad565b61bcd87f60489549f00dabf3d8324064990191794c79718e9053e38ab4b836b51fd5e46260001b6143ad565b61bd047f381a648954f161b51106d4756e1291f86490cea3294456d842807618ef7a6cad60001b6143ad565b6000600381111561bd1157fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561bd4057fe5b141561bdd35761bd727f826ea340f58bb5144a38b450ef6a727af6ac000785087f32e40388aa0d28bc0060001b6143ad565b61bd9e7fe82ce36dc34b7add076f895646759c91899df7907fb34448e5e235136e3aef0f60001b6143ad565b61bdca7ff0c51105c5ae5ed1776e253721e6e6f6e31dbaded74414dea4624c571a6bde0860001b6143ad565b6000905061c3e8565b61bdff7f101852a9113711b402240923b0d1e629ae7d7ca5becbb76d66a05b64cc60980860001b6143ad565b61be2b7fe590d18255fe7891cffc828b79baeb6523a8568fd69b61e086a6f0fcbc243dfc60001b6143ad565b6001600381111561be3857fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561be6757fe5b14801561be8a575060006008600084815260200190815260200160002060020154145b1561bfa05761bebb7fbb458ef8a39e3e067daebcb5d53d3fb5c54e8616f13b9f0ddabd3e74845ff6d760001b6143ad565b61bee77ff4ed907481f89ff0c1bc33110ba6502e011bd9385bbef7dca729ef2e1cdc561a60001b6143ad565b61bf137ffc0bd6854809a04915e21229932f4d6892de984da37d8e1517e037b93ef734fe60001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061bf6b7f254a8656b5fcf06b0083312b35c2328e28b344405392342d659d4602c150e85560001b6143ad565b61bf977faa9b6b98fd178e750fd3baad7d056b4bffc4ef09a87fb998236bbaf1b9fb35cb60001b6143ad565b6000905061c3e8565b61bfcc7fd68bec896d7bd84e20354a179d9a4ddc80288c801366b87ce9f21b6da33f71f560001b6143ad565b61bff87f9652e4144468065a760c5139b65fc3a9a9e73e4dca62146ddc7134b9b8a759d060001b6143ad565b60038081111561c00457fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561c03357fe5b14801561c0555750426008600084815260200190815260200160002060040154105b1561c16b5761c0867f5bd9787c3c7e9cc75eb59e9dffbf4bee43e3821e4d31038dbd7d10c58feb689360001b6143ad565b61c0b27fa37d83cc6b868a73454d58877d9ac7dda9eefbe6334346696914e9232bb1745360001b6143ad565b61c0de7f8158d57ef96ba67047c30800db4577dfe0ca4104153b7eb1d2fc218ff883236460001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061c1367f9c5c553679000555d9cf4875be4fc3479b69a32c9a03bd9c66e8a3341a31089260001b6143ad565b61c1627ff8976ff97af1198bada7dd45ed38eab3545a835a672714f9b76d56ff8b6cd8e360001b6143ad565b6000905061c3e8565b61c1977f0301057208a5a94ac013849972790f73743de9034b62f377fe9f5c237e9d66e960001b6143ad565b61c1c37f9590711820a2098d2a92e95d5f7212b561679efdc9c4db663cb9bdb355249b3560001b6143ad565b6002600381111561c1d057fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561c1ff57fe5b14801561c24957504261c2476008600085815260200190815260200160002060040154600860008681526020019081526020016000206003015461b73790919063ffffffff16565b105b1561c35f5761c27a7feefd72a8f312758bc56ea318d6313df2c3ce2363d6554f604f72a1900b38440d60001b6143ad565b61c2a67f5dd6f7d37fb6b95e7a85674a2788b3aac501bb21ead7dad51bbfe508b19b47bb60001b6143ad565b61c2d27fa9d499257f48a23cb752e3464ba0e74cf95379dacb39e2c44001f700cceb512560001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061c32a7f06e6f52020f1acba7fa1f013fb60c488b63064153300fd0970afa15aa44e12ba60001b6143ad565b61c3567fad082986a549b72bb2ef917d00601e76577fd7381a00a89b3a9c5fc65681f1c660001b6143ad565b6000905061c3e8565b61c38b7f20641234ff965e95be45927e2d84e19418ef9e5028b6410f9913bede8882bbff60001b6143ad565b61c3b77f18fdd12d7afd7d16cb2175687f3cf4e83bf565af96ba931b780cafc804c964b960001b6143ad565b61c3e37f35102aa52645102ead5ee786c00236873bc202acc71a26ad08b7cf01985d5ae560001b6143ad565b600190505b919050565b61c4197ff9fc9ac43adb81975cb7ac1a0522b5a6e3b89bc5266550411e6aa9bc3086e27760001b6143ad565b61c4457ff2b20dcbb930dc8499f5be0056f5d8a86d9471b468b1182d64d7a71c0091c22a60001b6143ad565b61c4717f19e92a1895816eb2ff4889583b6b387302e2956541120ceb6338e149ec62e7f560001b6143ad565b61c47961df32565b60086000848152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff16600181111561c57057fe5b600181111561c57b57fe5b8152602001600a820160159054906101000a900460ff16600281111561c59d57fe5b600281111561c5a857fe5b8152602001600a820160169054906101000a900460ff16600381111561c5ca57fe5b600381111561c5d557fe5b8152602001600a820160179054906101000a900460ff16600481111561c5f757fe5b600481111561c60257fe5b81525050905061c6347f3b054abf37860a2714d0a9ad1b783fcd0e6fa94498355b7754c156895bb146ce60001b6143ad565b61c6607fb9926ce079f4125ae597e1f719cab9c393336bf1750e2b071ac199d4debd923760001b6143ad565b61c68c7fcddfccff0f8bf32503b213e9063756621cb8fdd325eda0caccd4d497f74eed8060001b6143ad565b6000600481111561c69957fe5b816101c00151600481111561c6aa57fe5b141561c701576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061e498602b913960400191505060405180910390fd5b61c72d7f4416945b53319e4ec9deb47af2e8fd52893733890f4c86c3681566b771f5b9b960001b6143ad565b61c7597fc52ba53c69ee645c69c2585d01f189150442bdb44c254d65df22aa68034332b260001b6143ad565b61c7857f0253630e1c054ff74ded9a339dbd79e70ff306a663f3338ba5f46834a9db5df960001b6143ad565b6001600481111561c79257fe5b816101c00151600481111561c7a357fe5b141561c8fa5761c7d57f3646fd7f09fd85b09a73c6c602668804954450315ab76a6390e37f6c20db361360001b6143ad565b61c8017f8f62bd1130d507a580f5087fce789459ec9fc6521daa2a25afb672feae556e3c60001b6143ad565b61c82d7f11c02fd97e6999549fec07fd06f0149b10f5a46178cdaf5f01568690f7ac7ed960001b6143ad565b80610140015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561c8b957600080fd5b505af115801561c8cd573d6000803e3d6000fd5b505050506040513d602081101561c8e357600080fd5b81019080805190602001909291905050505061cf4d565b61c9267f83fa75b60aa16ae1534b5f2fd98463374e1d6cce3f80626b98e69819250be0f960001b6143ad565b61c9527f536f130e6c202974e8b57bcbfaff295ec0d3a76da482c0116a104957fe491aa460001b6143ad565b6002600481111561c95f57fe5b816101c00151600481111561c97057fe5b141561ca685761c9a27f3f32af1864c7fca16884088dd7358f997f88a1dd36e82b3002006e98d16a4bd860001b6143ad565b61c9ce7f37d067185cf0ed8d38419803410f1716088ceb2af32ec97fdf4e2d331149b92960001b6143ad565b61c9fa7f311e27a538d4f9b27d119434d744ab7ca0157cf414ff70f500cf1c0382b6acb060001b6143ad565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f7420696d706c656d656e746564207965742e00000000000000000000000081525060200191505060405180910390fd5b61ca947f831edd8210081558c15f72013015cf79e66f53d988b1b4ce035db416a390af4960001b6143ad565b61cac07f69ab85ec1959dae9399396c29c979dc439babcd144afb503f45f7df1715d8d6560001b6143ad565b6003600481111561cacd57fe5b816101c00151600481111561cade57fe5b141561cdb25761cb107f89e3055aa3d91f79a08f927d0783eaec5f061d5d18142239b36fc869cecce8d160001b6143ad565b61cb3c7f8648e6d12fba90b4a76b0937cd0bd474d9bc3629ffb893cd4dfc16efc6fcf0ca60001b6143ad565b61cb687fc5900c41f695300e3626c31031248b7a646c5771ea4758814d32cd34f76175ee60001b6143ad565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561cc3357600080fd5b505af115801561cc47573d6000803e3d6000fd5b505050506040513d602081101561cc5d57600080fd5b81019080805190602001909291905050505061cc9b7f5453e20c79af3f5ab1b0bfb522abccf809e6639a18ecfa1ba10d11966d76dce160001b6143ad565b61ccc77f7ad0f6dfc11c66b408b60669b07af67ea76aca820ad0c3b5e055132cbc1ec49a60001b6143ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663849a681733848460e001518561010001518660c001516040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200182815260200195505050505050600060405180830381600087803b15801561cd9557600080fd5b505af115801561cda9573d6000803e3d6000fd5b5050505061cf4c565b61cdde7ffefa5cec4fa9064e36404a692aad2a4db3f00a8438648b79ac58c8efda8e9a6f60001b6143ad565b61ce0a7fca3dc0d5614ae19551e6f058c959c337c5c22c82754df388da3734d2a0a4ab7f60001b6143ad565b60048081111561ce1657fe5b816101c00151600481111561ce2757fe5b141561cf1f5761ce597f60f55a1f103c9a1119f2497ee621a398ee03b5d78d344f124836bbcf3c1df60860001b6143ad565b61ce857f3e656205ddf82be935d887b89005da8de1b8f0e9fb6eafd4f983417c1b4f3f1160001b6143ad565b61ceb17fcc79ab918c227816062423fa2b69e1d6e910682193d3fad9f566c9765af7345760001b6143ad565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f7420696d706c656d656e746564207965742e00000000000000000000000081525060200191505060405180910390fd5b61cf4b7f06dbd710029f7ef5b7e4d709a390227aa1309e1157bd871634c025f139dec06060001b6143ad565b5b5b505050565b61cf7e7faf3334b7c8f6d3571478be0fc8dedeb7d18379480990f62375c3e54d4e07291060001b6143ad565b61cfaa7fbce63d97d8517956c409d8ba2f4af181e55e9272dd33c2559555d7561886a81c60001b6143ad565b61cfd67f5573ca7618e5e970e32cfff13dc92fae4d07074f0a60674bd0323856b82dc4a860001b6143ad565b61cfde61df32565b60086000838152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff16600181111561d0d557fe5b600181111561d0e057fe5b8152602001600a820160159054906101000a900460ff16600281111561d10257fe5b600281111561d10d57fe5b8152602001600a820160169054906101000a900460ff16600381111561d12f57fe5b600381111561d13a57fe5b8152602001600a820160179054906101000a900460ff16600481111561d15c57fe5b600481111561d16757fe5b81525050905061d1997f0edbd8684422fb9a817dfb39ad51a6a1e2ed8648c97fc8a7fd0eaa2148d416cd60001b6143ad565b61d1c57f4bbdbd7e92b7036b97cfc18306e32bafa852ed102613433655646047a3ee832060001b6143ad565b80602001518160400151101561d6fc5761d2017f7658ecdfd8d8732b312cb32404eb8d2c51fdf1272693c3e65e4d69eaf05e1b7160001b6143ad565b61d22d7f0bc72c8210072183a51df76e29add60aecd74d1ac04eab9ab49463c9ae8c79fd60001b6143ad565b61d2597f3362701b0fca282af2a6c7370630e708ad0e557aae21b3fe9f3c91bf8f75de5160001b6143ad565b80600001518160400151101561d5a15761d2957fedcb6f6f1db5453ea62f665a6f8190343173138fee00abcc2d3f4807541a1bbf60001b6143ad565b61d2c17f6ac1fab115fffec528b63d7e86dba3e43cc0486724b6bc5e52d26d99168bc32060001b6143ad565b61d2ed7f8c482dd675875ec477f98d4b91ac0d816c7763012a250fab27dae22204553d4e60001b6143ad565b60008160400151141561d4555761d3267f10687479cf4574c2105c199a52cac67e2019daf1c8ef301b5ff4ad14564a221a60001b6143ad565b61d3527f36f3a9227aebacea9bfb503b14bf9c36f8f9aa7f1c073bfdf619f5df0e50914e60001b6143ad565b61d37e7f01460a329248328cb216d4b91efbd57f5db308662bd43304c76d362bf5419c6c60001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061d3d67f9adabe64395d42bffe49041aff12f726a4a0a44a732c5c0f5ed69da48c88809260001b6143ad565b61d4027f20e0bffb0ca556643787e529f37d5a80a10aca3b39b848da077554d802ba120260001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c4836040518082815260200191505060405180910390a261d482565b61d4817f7694c969c62f9945319c007faa03014817bc8474475e9c963d15f911e6ddf8ce60001b6143ad565b5b61d4ae7f16b4a42193624e455f269dbec524a47b6715975e1d67daa1dc528f28b28c564160001b6143ad565b61d4da7f6a2e55800ed2e29e8b25b0e69ccd2c3842e1f527bcc4f182a81bb709626c4ec260001b6143ad565b6000600860008481526020019081526020016000206000018190555061d5227ffa6894585a102862dae64ff945e57671f07556d1a9b4d6be4e1f4dc80ff1e0e160001b6143ad565b61d54e7f69608a2dcae66b886b77f166bc9161003095e9d8533e0085acb033e467c6035060001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a78836040518082815260200191505060405180910390a261d5ce565b61d5cd7f56602399bae5070426a7fa62c091b4571e081a365a0572bc6ea7c655c7e707a960001b6143ad565b5b61d5fa7ff8b907cd3ac179fc67d3c7aacc1abaf591c3d2525c2360fdc4560fa55586f1c760001b6143ad565b61d6267f8f6f28520c12dc533734858bf8c6deb833cab0ee52a95989c9b8cd94bcc671d960001b6143ad565b8060400151600860008481526020019081526020016000206001018190555061d6717f4c4d4990333d7eed3525c1319acf2143a7564db66bd55ab8e353d9129ecaadca60001b6143ad565b61d69d7fb9509c3e46ba4d92ae4139a29ec9ef2edcc63696d6d01ad73f000d286a6cdd7e60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445838360400151604051808381526020018281526020019250505060405180910390a261d729565b61d7287faab15ab76b90c26265bd5f07e0d3d0c779296891961aa0ea3e0803d9416027f660001b6143ad565b5b5050565b61d7597f82a5e4398186d30836ca01d3cd79052da3dfe0fc6e6f5e95d9bd4fd201d9d3a660001b6143ad565b61d7857ffbdb91767839145a3acf8d28f55e70eb505cebf298ad36c4574f8cc847e8957a60001b6143ad565b61d7b17f9cac980eb64a1c6e5488bdf9379084f165f4a5e81de9f309ba6b440cf521f91060001b6143ad565b600083111561d98e5761d7e67f8c875204c918e371346e600056c894e469f9f20bc9547d475c7c67298f54e5bc60001b6143ad565b61d8127f2a2f652ea5aad0bccc9a596ab07c1cedab273df7b97111fbf2ffa761c6a28fc960001b6143ad565b61d83e7fa74c5c3487b6db5f33bf5df8b0e8257d1485f02835ef86bb78c8ed5b9534c9cf60001b6143ad565b600082141561d8c75761d8737ff1ceaf83779cc9c0312cc98b8c4b4e2b2ce710ebb082e56df01af4300f30601060001b6143ad565b61d89f7f87bdef1c9e2c992f5ab8653535516a2f27b1f437def6d03005e86d206d50faaf60001b6143ad565b600a60008581526020019081526020016000206000815480929190600101919050555061d8f4565b61d8f37fd63c5e3214fae63baeab271f67717051a18c05e03c45ceec5535c23419d9569760001b6143ad565b5b61d9207f99fb4d88d545ba183efc65749f0818469151bf1246ce9a8e33ccf072787875b060001b6143ad565b61d94c7f70a5c4b8a4b90ec8fd3d111a6f07737186dcb95fb911e1f48e962ff7dd292de560001b6143ad565b61d97281600b60008781526020019081526020016000205461b73790919063ffffffff16565b600b60008681526020019081526020016000208190555061d9bb565b61d9ba7fcd54273b660ce6cffd80afefdec59b42d4679a3bf27ad2452ca7dd7ebf9064a060001b6143ad565b5b50505050565b600061d9ef7f996468adab2cfba5de081e00c611ca70c15d8fec7d5bf522494a62c1469ffa6a60001b61da8f565b61da1b7f9f1ba2348d57cab76c102a92e631d7e3d939d3a1ce6cb3a01a504d1656b19f5060001b61da8f565b61da477f46d4aa33cd017349564c3524038979baabbfc921b9cf218610f32f2cefa7e6de60001b61da8f565b61da8783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061dcde565b905092915050565b50565b600061dac07f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b61da8f565b61daec7f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b61da8f565b61db187f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b61da8f565b61db447fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b61da8f565b83831115829061dbef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561dbb457808201518184015260208101905061db99565b50505050905090810190601f16801561dbe15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061dc1c7f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b61da8f565b61dc487f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b61da8f565b61dc747f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b61da8f565b6000838503905061dca77f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b61da8f565b61dcd37f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b61da8f565b809150509392505050565b600061dd0c7f196dd912071b7ac5c8a10b8a236898e903a5c95f5189a9aeb16dc1191096752060001b61da8f565b61dd387ff25ec16e9c80532b14a66f8cd16ae291eebc856235e409a39c3fbd9dc53e53fb60001b61da8f565b61dd647ffb609f676697fca43f3242dd637f8af44d19e0456d05ec1547a1557478b8a1ea60001b61da8f565b61dd907ffc25a7e532044dc446303b3445457a6ba5f30c2ec2085a7b37e4ae0e05b09ba260001b61da8f565b6000831415829061de3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561de0157808201518184015260208101905061dde6565b50505050905090810190601f16801561de2e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061de697f295ce5b61523fe81f08b0e41715a55fb7cc4323fa58af5f536a59e28b507ad6660001b61da8f565b61de957f4460e22500904e71005e8ef95355467cd96d8038ca3b358379ef52915f4cd11a60001b61da8f565b61dec17f898838ee4191c5d93d43aba28d5dace210f5b5fe59d06155be60fc494d99a9f060001b61da8f565b600083858161decc57fe5b04905061defb7f6d2a274d329c86c87e9d63cea7c87a6fd3d3ca9ab129144ff43f4724a38a4a5960001b61da8f565b61df277fbb4fe2c1c37d48811af5ff17eb49f43a22d0b33ae049d66f26c63e5ac81928dc60001b61da8f565b809150509392505050565b604051806101e0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000600181111561dfae57fe5b81526020016000600281111561dfc057fe5b81526020016000600381111561dfd257fe5b81526020016000600481111561dfe457fe5b8152509056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158204455e84ba3cbafc26c52c9ae32267af0c9cfb94d4e062e3afa07cf8e81f0521664736f6c634300051100324f726967696e7341646d696e3a2045616368206f776e65722063616e206265206164646564206f6e6c79206f6e63652e", - "deployedBytecode": "0x6080604052600436106102305760003560e01c80638acb0e6b1161012e578063d1a494f4116100ab578063e0e3671c1161006f578063e0e3671c14610f61578063e87471a514610fca578063ea4ba2fa1461101b578063ee5679751461108b578063fdc704d7146110a257610230565b8063d1a494f414610da9578063d6febde814610de4578063d8c8469514610e1c578063d96e9de314610e57578063dca21bfc14610f2657610230565b8063a935e766116100f2578063a935e76614610b9a578063ab18af2714610c06578063af7cea7d14610c57578063b3ce74c714610ce5578063ca2dfd0a14610d5857610230565b80638acb0e6b1461096c5780638e1ba96214610a125780639000b3d614610aa25780639fa1832514610af3578063a0e67e2b14610b2e57610230565b80632d46d9d9116101bc5780637065cb48116101805780637065cb48146107d957806376d73a761461082a5780637baec6ae146108795780638259ab11146108d4578063836e386d1461091957610230565b80632d46d9d91461066257806343a40e3f1461069d57806365e168d3146106e557806367184e28146107575780636e1b400b1461078257610230565b806315cccf8e1161020357806315cccf8e146104c057806316a628891461051c578063173825d91461056b578063194e1362146105bc57806321df0da71461060b57610230565b80630487e0b21461023557806309d5ff14146102a45780631291e84f1461038e57806312b0d40014610469575b600080fd5b34801561024157600080fd5b5061028e6004803603604081101561025857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110b565b6040518082815260200191505060405180910390f35b3480156102b057600080fd5b5061037860048036036101a08110156102c857600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff1690602001909291905050506111ea565b6040518082815260200191505060405180910390f35b34801561039a57600080fd5b50610467600480360360408110156103b157600080fd5b81019080803590602001906401000000008111156103ce57600080fd5b8201836020820111156103e057600080fd5b8035906020019184602083028401116401000000008311171561040257600080fd5b90919293919293908035906020019064010000000081111561042357600080fd5b82018360208201111561043557600080fd5b8035906020019184602083028401116401000000008311171561045757600080fd5b9091929391929390505050611705565b005b34801561047557600080fd5b5061047e611b02565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104cc57600080fd5b5061051a600480360360808110156104e357600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050611bb0565b005b34801561052857600080fd5b506105556004803603602081101561053f57600080fd5b8101908080359060200190929190505050611df0565b6040518082815260200191505060405180910390f35b34801561057757600080fd5b506105ba6004803603602081101561058e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e90565b005b3480156105c857600080fd5b506105f5600480360360208110156105df57600080fd5b81019080803590602001909291905050506120ca565b6040518082815260200191505060405180910390f35b34801561061757600080fd5b5061062061216b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561066e57600080fd5b5061069b6004803603602081101561068557600080fd5b8101908080359060200190929190505050612219565b005b3480156106a957600080fd5b506106e3600480360360408110156106c057600080fd5b8101908080359060200190929190803560ff16906020019092919050505061221c565b005b3480156106f157600080fd5b506107556004803603608081101561070857600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612458565b005b34801561076357600080fd5b5061076c612698565b6040518082815260200191505060405180910390f35b34801561078e57600080fd5b50610797612726565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107e557600080fd5b50610828600480360360208110156107fc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d4565b005b34801561083657600080fd5b506108776004803603606081101561084d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612a0e565b005b34801561088557600080fd5b506108d26004803603604081101561089c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c4c565b005b3480156108e057600080fd5b50610917600480360360408110156108f757600080fd5b810190808035906020019092919080359060200190929190505050612e88565b005b34801561092557600080fd5b506109526004803603602081101561093c57600080fd5b81019080803590602001909291905050506130c4565b604051808215151515815260200191505060405180910390f35b34801561097857600080fd5b50610a106004803603604081101561098f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109cc57600080fd5b8201836020820111156109de57600080fd5b80359060200191846020830284011164010000000083111715610a0057600080fd5b9091929391929390505050613172565b005b348015610a1e57600080fd5b50610aa060048036036040811015610a3557600080fd5b8101908080359060200190640100000000811115610a5257600080fd5b820183602082011115610a6457600080fd5b80359060200191846020830284011164010000000083111715610a8657600080fd5b909192939192939080359060200190929190505050613438565b005b348015610aae57600080fd5b50610af160048036036020811015610ac557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613714565b005b348015610aff57600080fd5b50610b2c60048036036020811015610b1657600080fd5b810190808035906020019092919050505061394e565b005b348015610b3a57600080fd5b50610b43613951565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b86578082015181840152602081019050610b6b565b505050509050019250505060405180910390f35b348015610ba657600080fd5b50610baf613a63565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c5560048036036020811015610c2957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b75565b005b348015610c6357600080fd5b50610c9060048036036020811015610c7a57600080fd5b8101908080359060200190929190505050613daf565b604051808b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b348015610cf157600080fd5b50610d3e60048036036040811015610d0857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614087565b604051808215151515815260200191505060405180910390f35b348015610d6457600080fd5b50610da760048036036020811015610d7b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614173565b005b348015610db557600080fd5b50610de260048036036020811015610dcc57600080fd5b81019080803590602001909291905050506143ad565b005b610e1a60048036036040811015610dfa57600080fd5b8101908080359060200190929190803590602001909291905050506143b0565b005b348015610e2857600080fd5b50610e5560048036036020811015610e3f57600080fd5b8101908080359060200190929190505050614442565b005b348015610e6357600080fd5b50610e9060048036036020811015610e7a57600080fd5b8101908080359060200190929190505050614445565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001856001811115610ed257fe5b60ff168152602001846002811115610ee657fe5b60ff168152602001836003811115610efa57fe5b60ff168152602001826004811115610f0e57fe5b60ff1681526020019550505050505060405180910390f35b348015610f3257600080fd5b50610f5f60048036036020811015610f4957600080fd5b81019080803590602001909291905050506146f2565b005b348015610f6d57600080fd5b50610fb060048036036020811015610f8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506146f5565b604051808215151515815260200191505060405180910390f35b348015610fd657600080fd5b5061101960048036036020811015610fed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147cf565b005b34801561102757600080fd5b50611089600480360360c081101561103e57600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff169060200190929190505050614a09565b005b34801561109757600080fd5b506110a0614c4d565b005b3480156110ae57600080fd5b506110f1600480360360208110156110c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614cdb565b604051808215151515815260200191505060405180910390f35b60006111397ff95f356390113da9949697b1940b741282a41047ee6a524da66bd2bc3991d55f60001b6143ad565b6111657fceed6f495f3fb222935bf7886330fa5b8d40ad62923cf45af2aaab31e6a7a7ee60001b6143ad565b6111917fa5fe6a08e078c68865f2ae79ddf706b1461305921fa9b614fa811291fd1c49ff60001b6143ad565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006112187fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6112447f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6112707f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b61129c7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61136a7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6113967f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6113c27f6b9661cfe4145666108c08d49cc095e7899fd2f8d10f710df531efe4c0b8a1c460001b6143ad565b6113ee7f8833b00d2b4a2590902b94be3ecdac6017e64abc6b60f4827d186ff2cd45db3d60001b6143ad565b60046000815480929190600101919050555061142c7f0113759a83325f9f6e2abe5c989dc175e945e80a027cf4446563aae0c19d851d60001b6143ad565b6114587fef395f4334ecf7add11195b1503869c4df8eff95bb6219e5fd66f468388859dd60001b6143ad565b60045490506114897f1ce98346381735d51548def916e3db2c12830bac6a2df4c2e38cdd35030ba5f160001b6143ad565b6114b57f91d3dea52c36d1824b758fe672088b3c90677d94d0406558fc26cf9f639a483e60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b826040518082815260200191505060405180910390a261152e7f1372d95eebf4faf6ae9550551603fbe9fb5abcf4a42e8c205c3d2b91f5709aeb60001b6143ad565b61155a7fbe6de7377e6087a49f8f0ceea5ee2d40fcc7c5d3543f7fa9a96d18055dde5abd60001b6143ad565b6115648185614db5565b6115907fd684e9c1acb35d1b8de7b798bb3767c147dc77b5ee2a0db37d9788833679ca9f60001b6143ad565b6115bc7fcc149f0fe2d8389adfcb5b7964821744229b0db7d8425cb1dd0696d9f15db0f960001b6143ad565b6115c881888888614f30565b6115f47f189adf1f8a59761cc16870f8e1b847c421f7009489cdd079b980f939770d9d6b60001b6143ad565b6116207fdfb28cd97c0643bfb263431cb26e73d4e56bfec868e004718fcb7422b86647eb60001b6143ad565b61162a818f615512565b6116567f9543a9ce4649c688e8a082a2f30f77969f0ba852362e57f935a9ae33f5edfdb360001b6143ad565b6116827f7f7c55df46f61ca1d10e36c6360b2ce91fb724c51a6c998099e037fd15f9da2160001b6143ad565b611690818a8a8e8e8761602d565b6116bc7fb6268ebad9bf0b802db63db9ef5a03ef762e7fe2191d28fd6710f18790bd1b2060001b6143ad565b6116e87f4e0f28087d320fc4990c2527c4d02d503913c3677c0ea014f6932bab3a1bfddc60001b6143ad565b6116f4818e8e866165a2565b9d9c50505050505050505050505050565b6117317f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b61175d7fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6117897f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6117b57f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6118837f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b6118af7f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b6118db7f9efa1c4f33094678dc6d5b61854b0266669a8ea26c73edb5e33ab6a625ba39ed60001b6143ad565b6119077f37469080bbed0cfa814adf66d6eb5f4dd5173f2d07e478ed0d78c69c02c6800060001b6143ad565b6119337f9d3f2b442aae3fd690acaf46f5a667e12e3e7c72370dda73873057b875df4ad360001b6143ad565b61195f7f0ed42e055d2ecc5194ea63d758605de3ba4c4655e8beaaed60f15d7278fc134060001b6143ad565b8181905084849050146119bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061e10f6034913960400191505060405180910390fd5b6119e97fe28ba615be5bffa4c8e5d38edcabe6403ec916ceaf7eb84911ed5bf329d2515e60001b6143ad565b611a157fbcd3c4b1719dd0c0c2ae6b918474dc81368ab5ea1a7324041c5d9e55e08cca9160001b6143ad565b611a417f0b859bb4e1959553ef5fdbe7c9b227a5e7b2f362b92cb1e07a028435f3edff7560001b6143ad565b60008090505b84849050811015611afb57611a7e7fefc6b00e5c1efadc711df8957de1b2700bfe81b3275405d12c3658780b93c32a60001b6143ad565b611aaa7ffaf3aeaf9076815c7373c25637920a67cb7d988a20c967f9613e5432235b172560001b6143ad565b611aee858583818110611ab957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16848484818110611ae257fe5b90506020020135616ce5565b8080600101915050611a47565b5050505050565b6000611b307ff250fb4106da45b8066bde94a6a4fa918a58684a978275e7004029740a01ffce60001b6143ad565b611b5c7fddfeb7fb167b56ea073db84579fbafabad5de8c5b537e360aeb5a80ee5c4d2da60001b6143ad565b611b887f065d6cf404fabcb70aabc8a0be82d8cb5ac9dde9f7dd2112e2b8eb58a60e8fbe60001b6143ad565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bdc7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b611c087f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b611c347f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b611c607f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b611d2e7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b611d5a7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b611d867f0149f83e5c09fe41d5baa192d327cce8e8df54e53304215949b8f33cfd90f57460001b6143ad565b611db27ff72e40643ec7ec6eb31930d5a594c46b7d23cc85856fa6b836eea572c08ab7c160001b6143ad565b611dde7f9529e2b00685ea59961613bd638efc3c7baed24e703e76b6055041481231799960001b6143ad565b611dea848484846165a2565b50505050565b6000611e1e7fd761c6f2cac214b7917e00d69a47127c9f92589762dfb407d0d378723fb22a9d60001b6143ad565b611e4a7f4eedb79c36a42e58ee94547fef467a4e6a7c520b3405838e3ffb28cf04a5e4dd60001b6143ad565b611e757e9a29a22ba445229ba2f451327edbc2ee256f686363bbd15278a5219e85118d60001b6143ad565b600b6000838152602001908152602001600020549050919050565b611ebc7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b611ee87f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b611f147f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b611f407f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61200e7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61203a7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6120667f0e44747b587cb0ce7592cff3df77f645755c5f10eeb3a3aa0ddac17f65b5b18b60001b6146f2565b6120927f538d135c9cc4037a61d553c365a022ce1d01b218c9b4e6687864161a8994013b60001b6146f2565b6120be7fad6e2327c3430532e2391fc71d4270553fb8d051f4b664d870acb608d3e0a81260001b6146f2565b6120c781616fc9565b50565b60006120f87f73f8d38ee2d03f10c8338074464e3dc2118ae9334c851ac34fcf7b60b5221bcd60001b6143ad565b6121247ff8b0c898982141b996348d1498840d79c5958f12f9cdd9cb7461dab14668bfc260001b6143ad565b6121507fb731ff315b4591651a849c4d7c291305e26db10765ed4144ca9b9aa64228e82260001b6143ad565b600a6000838152602001908152602001600020549050919050565b60006121997f3ae3ac9b140e1ca340ab44d2f76b19bec7eee3c6788c7d92befd85b5806aa13a60001b6143ad565b6121c57f2d5182a7e367116b083e493062ad4003212e7c0091095fbb8235bc218f2744dc60001b6143ad565b6121f17f23c7ba278f6ca83f66a22789ff962bfb742f06b3724c6e353fdc89063e146a2960001b6143ad565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b50565b6122487fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6122747f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6122a07f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6122cc7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61239a7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6123c67f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6123f27f03874e6ffa5fe98a062d13b8ea744f5aaa681ff2f5197c3bbad57580417b8b7160001b6143ad565b61241e7f5b26afb9ffeb55e6b5522f6aeac1c61e1c7c077a5aeb107b42adfad3ddab58ac60001b6143ad565b61244a7f4bac114fbc8385f334d62bc98815ccecb4a83a66673f028c15b66f0c6cab144260001b6143ad565b6124548282614db5565b5050565b6124847fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6124b07f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6124dc7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6125087f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6125d67f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6126027f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b61262e7fe3dfcc5b5189e5abfa73d307ddea55fb7cfef0f15f2679d14e6c6ec352f921fe60001b6143ad565b61265a7f2a5cc306f40e1f0873c0a1e6fef2e52da9500bd790ef95e0125a286f71b3e02c60001b6143ad565b6126867f04e043a0896a57e6c6f1575cb62916ef540a5b4316ae5a062583b03f313935c260001b6143ad565b61269284848484614f30565b50505050565b60006126c67ff84b99b34260ab143ba1a2002db4556e56878320e9645dc009e5d5e51973aba060001b6143ad565b6126f27f62eceebeb156885d0e295ffe9505ba53988ce1eed8b34cb09667f5758a28d7e560001b6143ad565b61271e7ff358e692aa91d2ba30e2ca2c0469f56f94c71e3f2f36d8522a64d93ece77959960001b6143ad565b600454905090565b60006127547f590b35ea19199ac618d9c7feb5571ca76b4217683165bab79135f56ca5bed80360001b6143ad565b6127807f1366e9b6711f13dc255671dd1b4c9f515a3573f0c730f8241c85556c4209486a60001b6143ad565b6127ac7f83abadf0b52662c6e4bc22e41089d19321a5cc14e680cbb978c16f84d5c5fe6c60001b6143ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6128007fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b61282c7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6128587f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6128847f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6129527f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61297e7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6129aa7fafcb0b4f682c50a9679687cd57fb195565d3b3594cec41e61652d70bb7a9797360001b6146f2565b6129d67f1044e613c1c3d7cc5b42b22374c3d222c8151549a65f809328dc5e6291659a2a60001b6146f2565b612a027ffc4b144d7908223b9fd317ce3643b657d8063803df44b93493003820111a195a60001b6146f2565b612a0b8161766e565b50565b612a3a7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b612a667f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b612a927f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b612abe7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b612b8c7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b612bb87f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b612be47f058b7cc1e32d92b658f81d197d0fa3a6315ff52fa3766fc235cdd6184aeaf6bb60001b6143ad565b612c107f4bbc365d77f708c101238713d1389549b9fca1c939a50fbd26688686651536d060001b6143ad565b612c3c7f156c58f60604d237776fdd592b3a5d5106d7264c6b1df17fdc1cafe6fd436e7660001b6143ad565b612c47838383617b83565b505050565b612c787f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b612ca47fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b612cd07f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b612cfc7f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b612dca7f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b612df67f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b612e227f365ddb943024ef7fbffec94f1ec31ca43322aaa115f40bff1879e034ae5d399d60001b6143ad565b612e4e7fd5a18db95fb4d6eb8e6f7df8fd781832bf8d93cad15393f48207ca45d27e095e60001b6143ad565b612e7a7fdf3532a1113d5a3b2e6cd389aef8b24c97a5016a6f46ecf36aee0e60017958aa60001b6143ad565b612e848282616ce5565b5050565b612eb47fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b612ee07f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b612f0c7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b612f387f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612fda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6130067f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6130327f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b61305e7ffa544545449131d5912ef311088e3d688f1f81c5aca54dca7bd178d77c7c736660001b6143ad565b61308a7f6ba150ce46fe01575d927263b4c4bac99de30926f52d71fd618239c7014a6e8860001b6143ad565b6130b67f0424dba2aa9324f4a4b86f4b373bcb5abc521061fe9c7cc37664970751cd0fdc60001b6143ad565b6130c08282615512565b5050565b60006130f27f7603f4cc7eed5aea26c8363aae808228050de4a1df7313c6e816cbdd5cb707be60001b6143ad565b61311e7f581f876caee8a1d16cfb1d2b0eeb4066d220ad66d031ace5d7fb1a6986cc168a60001b6143ad565b61314a7f70ebfddc39a6e980574278522e377c07bf10df50e1dfb83090fd786dfe5be09760001b6143ad565b600c600083815260200190815260200160002060009054906101000a900460ff169050919050565b61319e7f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b6131ca7fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6131f67f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6132227f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6132f07f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b61331c7f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b6133487ff0165474b2d676fea0b8023064cf7421d1272f4919b87d871eda274681c4ed5c60001b6143ad565b6133747f15b42621139ada08336951eba2f041f2cc3ebcaa539d2a13f87329a8d7d6b45960001b6143ad565b6133a07f0894d12fe48c69e5bd5ecb1dd45590a9e1e97f03743be95a97f9a1a6ac3aaa5160001b6143ad565b60008090505b82829050811015613432576133dd7f86f852a70d408d4a2f186f3c923eaa78cc9d6cbd42657492ed1a9e6edfabb16960001b6143ad565b6134097f664a28c3c931dfc99c22d2ca503fc214685e19f7a6f4eef328f35d06b432ad6260001b6143ad565b6134258484848481811061341957fe5b90506020020135616ce5565b80806001019150506133a6565b50505050565b6134647f6f72468830371c67cedcd2cecd9abb190bc2af3eb41ed3a8dffb95bb8787594860001b6146f2565b6134907fbbc8bf5d1591aeb0047cba43a8fefb9c072455b9f1c71afae6c466f8542b6a0060001b6146f2565b6134bc7f78c7cb04337109b56e7e72941ffa444e38771aa16670e467a5cd8bc6d5850b9460001b6146f2565b6134e87f391c6e97177711bca998eefb5c7ece216de192fb4290eb66cc57c5f036927f1b60001b6146f2565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661358a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e01b6033913960400191505060405180910390fd5b6135b67f6d624626aa6f991c52632fd51b72eb3faeb29abb636f8cda197d6c12d33bdd1f60001b6146f2565b6135e27f1dcb3180854ce0312b89c3029244d5eb83825ad3d9f5e1b3f76ad5e424dfcd7360001b6146f2565b61360e7ff9afe9483ad45314c1f9334d19579a96e2ced1bfaa29927b11048af7c43f747460001b6143ad565b61363a7f56f19aeb9abc0578ab8355d3bf3c2995ffbc732cf2888b835db28c76406a378960001b6143ad565b6136667f587bf7ffa332928533e0732161cd434483e7c1232a30656d658364c71310c93260001b6143ad565b60008090505b8383905081101561370e576136a37f43404884baef5c6f58bf4186141b647b0f7643199b28bc515a5cf75127f2592660001b6143ad565b6136cf7f8733fd543eed7949dc81ceb8e7f3cc4d9ebef97e59999d0e6181f70672b219de60001b6143ad565b6137018484838181106136de57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1683616ce5565b808060010191505061366c565b50505050565b6137407fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b61376c7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6137987f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6137c47f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6138927f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6138be7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6138ea7f5fceccf80f991d1a72d8282836518ae01c2f8c5f7b370385d7f1f56e93e49e6d60001b6146f2565b6139167ffc15d1b5d4b2aa6b36a36f4aa2415983c696e5f2faf3aa4fa7bfd6790e00635f60001b6146f2565b6139427fe1f2ad91109a6da48347f79de13c9e0b5c9146ac5743cf02594a0b249d88013360001b6146f2565b61394b81617e59565b50565b50565b606061397f7fdee10534b67278fca285b5798f07e3aee921e04ea89b6427272f1c6d6bd2f07260001b6146f2565b6139ab7f3322398ce67959ada7f766b6e33744c7138512194c5f473b04cdef087872bd8560001b6146f2565b6139d77ffcf826e84f2f086c38453fef179ab177aeb6adabb1238ea14a8a0037d3a7bef560001b6146f2565b6000805480602002602001604051908101604052809291908181526020018280548015613a5957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613a0f575b5050505050905090565b6060613a917f1968df1ae1af4ccf2947ce153fb93b718eaf164c8d31064c2ab9fe17f7ab787f60001b6146f2565b613abd7ff6485d61a14d2ce81eda90d0faf17bfe09fa1f03b3b9d25da0c56e10d29b358a60001b6146f2565b613ae97fce84cd58e76472fb9aafbae1c6be70596e5c3c548848cff1bcf4ae4c5a8d463060001b6146f2565b6001805480602002602001604051908101604052809291908181526020018280548015613b6b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613b21575b5050505050905090565b613ba17fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b613bcd7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b613bf97f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b613c257f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b613cf37f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b613d1f7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b613d4b7f84e280d8ef73d617ad191175570656211211680af5d3af1916b8c3b74eb87d2660001b6143ad565b613d777fa9fce485d82159126ba460fccbeb5fe1d1bc03805210cc687e57a255b73b2add60001b6143ad565b613da37f6eca83d9083e75e2a3f7b8114af75f8eb6b8bf2d085643556ef15c64f15917fc60001b6143ad565b613dac8161836d565b50565b600080600080600080600080600080613dea7fc01bbac0be84aa1b4c0c25b6337e23c4de47459c73aefa21948938538902b61160001b6143ad565b613e167fb7dba9c95b85da3742679e5a15c844fdcec126e421b9bcc04dd5c3b6b883400b60001b6143ad565b613e427f5c949520df6e4d45be0a34078ee2b75af4f840f65a2bf029394ac650d583964760001b6143ad565b613e4a61df32565b600860008d8152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff166001811115613f4157fe5b6001811115613f4c57fe5b8152602001600a820160159054906101000a900460ff166002811115613f6e57fe5b6002811115613f7957fe5b8152602001600a820160169054906101000a900460ff166003811115613f9b57fe5b6003811115613fa657fe5b8152602001600a820160179054906101000a900460ff166004811115613fc857fe5b6004811115613fd357fe5b8152505090506140057f5641371c260632485a2c7951a3426b4c6a09489acdf2b75b5ba946bc273652a460001b6143ad565b6140317f21b357d9716b44f55edbadcf761d797b3ff4ae625af2d0036ebd00efe356313f60001b6143ad565b806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b60006140b57f2f044751597a5a8448dd0fec10b4a9ecf1cca91ec39a079f3c61189918a3c9f060001b6143ad565b6140e17f4d65a25251c4d8d187eb2dc7e740fba5892d2f0e718119819bc1fea1a96f520760001b6143ad565b61410d7ffd4ec04f3a327bdc8303ec93b58ba2293ee7c5d05d4f7bfa667a037eec01d37a60001b6143ad565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b61419f7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6141cb7f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6141f77f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b6142237f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166142c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b6142f17f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b61431d7f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6143497fd72986c3c44c1d5ac88f2d9a620526767054d36ed01780fd7c5bd0abd034856660001b6146f2565b6143757f40f644c9aeac123922ec2c6c0c1e9c9d0674d611148b2dfa40b21d14dc9ef47a60001b6146f2565b6143a17f2af20acfe5b44ee8182e2b6cf4952a0c410c0f34bc2d107cd97898a913719ad360001b6146f2565b6143aa81618656565b50565b50565b6143dc7f9b67cb87edbf1b285a4456858f5ea43f9e90c6789ee561a38eec036e8c96a0e160001b6143ad565b6144087fa6f73ea1122a2d55f48cc65aab356fa301c628597d16685bda7145fdc83c755e60001b6143ad565b6144347fcad0c443ceabd51e9e352e7a9e23a1cb40f79b7e4ebf8ac36451e630661d1bf060001b6143ad565b61443e8282618cfb565b5050565b50565b60008060008060006144797fd80e4b0e704aaee7c2cd219cbaaee88c199983cfe317dd565857686bd95f29e360001b6143ad565b6144a57f6089b93f6e3be32640c6d4a4770dad763dcefc1aafb87a192de84fdd8e58731060001b6143ad565b6144d17f30c7ea5e12414c1160c3fe174172fe7df1c6c09cac2ebdb3b7acf1eac62d522e60001b6143ad565b6144d961df32565b60086000888152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff1660018111156145d057fe5b60018111156145db57fe5b8152602001600a820160159054906101000a900460ff1660028111156145fd57fe5b600281111561460857fe5b8152602001600a820160169054906101000a900460ff16600381111561462a57fe5b600381111561463557fe5b8152602001600a820160179054906101000a900460ff16600481111561465757fe5b600481111561466257fe5b8152505090506146947f6742e5a3c901e3f7ef457c846a4d3051aaf0a89b197c4df74ba31329f8e3dd7460001b6143ad565b6146c07f19db536cb0b2f2a9d64756c54dca130ce01b38d4288670ab3a84c4eaa2cb38e460001b6143ad565b806101400151816101600151826101800151836101a00151846101c00151955095509550955095505091939590929450565b50565b60006147237f577effea934a13eb763bd5030eabed77904faf301d881602f42a6ebcbc7a604e60001b6146f2565b61474f7fbb81baaea4c4b28bbc1d13dff27dbf9353fd16a0e3e36f65902214241e42cba160001b6146f2565b61477b7fe9518f1e53d0e620902d55c987d198a69cd18409929e43b6e296336ef0d6cd2b60001b6146f2565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6147fb7fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b6148277f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b6148537f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b61487f7f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16614921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b61494d7f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b6149797f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b6149a57f280f52310c9e33d58dd6e79b5c5912f6ca3c1a6010de72db583c6e062ac6ab1e60001b6143ad565b6149d17fe7d5b593d9ac6c31bc17718c4b09566aa6a5af305ad74a2caabab76be5277c9960001b6143ad565b6149fd7fc188440d869dff5854f9333235a3985cec8135ac8ca9318939e51297ac26cf6d60001b6143ad565b614a068161a604565b50565b614a357fdb70c184521cd75c9e7417d5596406c08a2d62925fab72db06294988c46def3260001b6146f2565b614a617f2ded3944ae6d10cdbe9520b16f1348f3eec02a59061f39b47f4fe5bdcbdfa12060001b6146f2565b614a8d7f69169c6cb637ab27b93740d7a170639a2afe7d6eb90e0b21753f38b3fe1efc9560001b6146f2565b614ab97f6139d42d161240198a22d68d4459aa6ec9f81bdf48f1b818c98c44193631008f60001b6146f2565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16614b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061dfeb6030913960400191505060405180910390fd5b614b877f2a5e6cbadecac53cb81d4bce0865c4b1f3c577b6725487f4ed023f98975f81e160001b6146f2565b614bb37f278d357d53ac6aaa2faecb4fabd3478bbfdb8d74970ed8c408a350ad0799d39060001b6146f2565b614bdf7fd7f3982298842262d0d3835371f6fcdc4721cf1cd25fca10020262f34be4575f60001b6143ad565b614c0b7fa4e3936f8772243a55f290a79ac7ed71d75f7591187eeb1847d6894e4b4490d660001b6143ad565b614c377f9dcd50b588f14a22d2a0b7c2fff5fa644b92b6aaeecccd0cc5758dc03d7cec3a60001b6143ad565b614c4586868686868661602d565b505050505050565b614c797f644bc30d71a91056913103fb286c5d6e6878e22b12367a33e25983338dcb38c860001b6143ad565b614ca57f2aad60e99f98d7f7f01fc23e07d033d9cc942df38e24a572840b7a0b6106275060001b6143ad565b614cd17f5fdd58e066d9996a13b91c1a64ac7eb4856857717dfd8a7f86dc4f178e25d98460001b6143ad565b614cd961a8ed565b565b6000614d097fa6c21053ff12ef2ea63fc3b7fceffb89314837d2895efacb436d990ee35a401f60001b6146f2565b614d357fdcd08d0c75c64b5d345be711b358e160e369fc901a89d7273809705290673d3b60001b6146f2565b614d617fcaa3ecc68ee1fee4e69069f97e1ae9751fa89bd0701e64f90f31339b236e31bc60001b6146f2565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b614de17f122ea7a04be238890d39ee4c39f677a9666b21467340f1e07775d72cb6a07bb060001b6143ad565b614e0d7ff100e2a0ec6c680fb31ea22c3a4d3629e3f3e6aed96113545d1ea6bb3e51ea6960001b6143ad565b614e397fb764663b6d601a47c295bb8a5c3b6b2d1daeccc53154317063356b7ff119d0fa60001b6143ad565b8060086000848152602001908152602001600020600a0160156101000a81548160ff02191690836002811115614e6b57fe5b0217905550614e9c7f38249e063d3fcbe5a090acd69e3a382cc22138be031696cba2ee8c2ba9952c5b60001b6143ad565b614ec87fc28fcabc3e7c13c11dd1172edbd0946cf5e2adf9af6e80a317bed0ecb3244f0260001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a48237838360405180838152602001826002811115614f1857fe5b60ff1681526020019250505060405180910390a25050565b614f5c7fed825f7b8c3c3e45d4dc2a5e87727343bacea9b0dc423bf3e4933bc55d4c37fd60001b6143ad565b614f887f957384c62aadad73377cc12f84f2ee8c89109c3e3b9a54c1ce0165ec0a6fd8d360001b6143ad565b614fb47f7205092310434b6fa9e4421b4bc973d467cd548a3892d32957db2355a0d1861960001b6143ad565b614fe07f1d48333a6d44118dba2f520bbc90b7e02f5ea59ac1880892ebac8d0bede1950860001b6143ad565b60008311615039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061e5376029913960400191505060405180910390fd5b6150657f6965ad8b98a3980648e61404cf417a35be7c22e98813e4ab90bba22d2ea0e88660001b6143ad565b6150917f20626e8269ed4379993d00982ad0c119605bb3fce32dc3d16b7764a05e491c9c60001b6143ad565b6150bd7f9c2a4d1fbc32ce38423e051cd0f7bbe7537e93e14c41ad89bff97eee1ca2d8c260001b6143ad565b6001808111156150c957fe5b8160018111156150d557fe5b1415615242576151077f9d9461bf08bf1860ec22910d1379c0eb90197d02012729d80948f236697023ce60001b6143ad565b6151337febaeaee198eecbc5805ed14a9b78445bce0ccb6a0e6a35531f22485f4fc6789c60001b6143ad565b61515f7f475276f08bca14e4c443497a6ffbfe9173163e863f6243a805a5f647c72ac9a260001b6143ad565b61518b7fdf51ae266c48f787523a341ff3998b7f0b0574e36ef3dd9d8c29a889b31b00fc60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415615211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061e3816032913960400191505060405180910390fd5b61523d7f913541607e5e91b55cb4f16c76f9709825a60bf8462d8157441f05c4ca683a7a60001b6143ad565b61526f565b61526e7fda7ec91a637265ac8ad552d49b46c26151ef524b53f3ff6142fa491b021475ea60001b6143ad565b5b61529b7f37ddc9d8edfb9dc8d127301bfaa8f8a7b92a2b2bf7ca3c91b3a2ff98b6f2576b60001b6143ad565b6152c77f5ff071b7ffb5f7b797d0727331ae2ac7fafb2a1d5a825dcefaccff8dbfe3b55760001b6143ad565b82600860008681526020019081526020016000206009018190555061530e7f820749fd9dfc5d609160a592b32465f604d5db316d7563f0fec45bd708ccbd6160001b6143ad565b61533a7fba1497d331880b69f12f955cf4ce7fc0789133a27d38f60a44466b15ae9bd86c60001b6143ad565b8160086000868152602001908152602001600020600a0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506153bb7f314c295ffccf2302820d9eb9445dec802a5236dd4bbb455979e07beaf34b02f260001b6143ad565b6153e77f34b4f7591745b98e34e0e3b956487264be036d70bd839ca7f338348e2304812760001b6143ad565b8060086000868152602001908152602001600020600a0160146101000a81548160ff0219169083600181111561541957fe5b021790555061544a7f671d523b8e46684621413dd52501073b7e8ce6f2d98e834aa3773ab9d09c787d60001b6143ad565b6154767f0da0b1dc0de98497f9b9e2bf8aa3dd60c8f0ed970bc5762ddc6d64bfdafd7e5060001b6143ad565b80600181111561548257fe5b3373ffffffffffffffffffffffffffffffffffffffff167f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7868686604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a350505050565b61553e7fecf230a40b2be638a67a3e016d54ca00407285c0b7f8a3ba088fa1db26cac54860001b6143ad565b61556a7f5418af54dea59d6595ce4cb67334ab548f2d9c5ded7361b9d0d52645a8847f0f60001b6143ad565b6155967f7ae85ccb8188cfddd17704600cb3a6f9b3c16d2ef9147611cbd5a567481aacd660001b6143ad565b6155c27f81d10b8cab60a2eb1a0fbe2e22b59ffacbdac6176edb45ea268f108c1693a5bc60001b6143ad565b6000811161561b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061e143603c913960400191505060405180910390fd5b6156477f09126acdc05e46c873e67eef6d04e822d425716cd48f9c404f42eb1f3d46510060001b6143ad565b6156737f4aeeacf647acd63f3619510bfe4618937a93c9ed97792af8f06ad0b42f6a228060001b6143ad565b61569f7f3e11dbac7f5898421cc76adf88343ef3e8cfe89aefe8947c11abb5a55feffc2560001b6143ad565b6156cb7f011ff70e219f3659e8233d7fd1a43d2aa313097d6bb53f3584df5d74c9bd73cf60001b6143ad565b8061570b6008600085815260200190815260200160002060090154600860008681526020019081526020016000206001015461b2f390919063ffffffff16565b1115615762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061e59a604c913960600191505060405180910390fd5b61578e7f95721c738e1ac2429459c3c29d52119c26359a27b9973efa3ff7930b2a49986f60001b6143ad565b6157ba7f8b90a97ee96e24819c66f2609d987c5644d2aeb79aca2c428846d0b4b3379edf60001b6143ad565b6157e67f4be3435a0df75f0492865b6be1ebceade299cef1c224f3d5ca03b0de4c5338b860001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561588757600080fd5b505afa15801561589b573d6000803e3d6000fd5b505050506040513d60208110156158b157600080fd5b810190808051906020019092919050505090506158f07f2fdfc0ab65d3e49424cb0ba1e5d7b87c617e2544d18897855394a0352cb0a24a60001b6143ad565b61591c7fa1cc7ddd437aaeb2d9ab7f1526fb9fb6cd85b09030d4027e7604bf44613020b060001b6143ad565b600061596060086000868152602001908152602001600020600201546159528561594461b60d565b61b73790919063ffffffff16565b61b94c90919063ffffffff16565b905061598e7f8d50cbf28544cf39cc844dd688cb3ee8a801da805bdce48122e54d0365bda69260001b6143ad565b6159ba7fbec77acf36c91924b383de6ad43efaa98b5ec2e149d1e7abe452423935f3727c60001b6143ad565b81811115615c80576159ee7f43098ae67737f822e3ff2097838dadbabfc78bf04daa19250c54455f4c80f14760001b6143ad565b615a1a7f5b70d4b1a6e3125d12424a3cd5e793eb5d5bfd589b11bd09103c665fbf1b042d60001b6143ad565b615a467f858832c8c82758b27429eb7c4b26243cf10f9e8bd4b3317916c95d99fecfbaef60001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330615a9b878761b94c90919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015615b3757600080fd5b505af1158015615b4b573d6000803e3d6000fd5b505050506040513d6020811015615b6157600080fd5b81019080805190602001909291905050509050615ba07f91fc860a964c6213fc4f1a4be3ddbadcf45adac66d00c53077a7e4d6fd6cd64b60001b6143ad565b615bcc7f765c30bf565f66100e936d9e8f622ee2526b54965d482d8781350987129bb54160001b6143ad565b615bf87fc925a81951de4e60ba28c6bc408df4c8e39e48977c8cd4cc7bd8eb96b451f37860001b6143ad565b80615c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061e4c3603e913960400191505060405180910390fd5b615c7a7f85399c177e2dfe42fface10a4b9dd887d91200128550500fd48f4973a0ec990e60001b6143ad565b50615f06565b615cac7f81305073e6fbc263fb363c8bcd9e5bd98e23bdca49670c06b371a126471719a360001b6143ad565b615cd87fc37098fe5e0736b102340771d005a9b0ed3e851c0fe6a6f0e39f2a38bbc35b4060001b6143ad565b615d047f3a16f78a716f60e999043b54b2f93aa83330e7bc6b1c890b623421e5a6177f2b60001b6143ad565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33615d58858761b94c90919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015615dc157600080fd5b505af1158015615dd5573d6000803e3d6000fd5b505050506040513d6020811015615deb57600080fd5b81019080805190602001909291905050509050615e2a7f5e09912529725adbcb8cfee6ef6b1bdee2a5bf2fc7941874ceb9a0d5bc47671860001b6143ad565b615e567f7f950e57126ffdd0aa5f3d2e56f6c84183444dd734931fd1e68111b3e959a04260001b6143ad565b615e827f877b92785ac8e374663c20b1c57e17ddf013325fb34add1aea55f4af57fa326b60001b6143ad565b80615ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061e2b86038913960400191505060405180910390fd5b615f047f64c9424e19f736d6ecac4c08e8794f56d05a8a1340d9a35aaa2d07d19426ff0c60001b6143ad565b505b615f327ffa6383d11c7791a723aebf4a83b3bb1b46dc513024fe1d74398efaedac8d1bf960001b6143ad565b615f5e7f6c929d80831ced67a0ead1e6cbbd82997c3a55794d0d5e93673c67435f024cb160001b6143ad565b826008600086815260200190815260200160002060020181905550615fa57f912fa0859998254482042fe8743a62f4eb07370c0ad2419a3eed850e0a9aecfb60001b6143ad565b615fd17f46e8938c5c0f15bf571ed91ad58dc77e96f76aa2c2d796352200428584e711ca60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca958585604051808381526020018281526020019250505060405180910390a250505050565b6160597f1b3353359c8de12e2f480c20a042fb6d8937d999189cc7b2f61e0a47bd7d857360001b6143ad565b6160857ff5db568c4ae8844d8e9362b8cc6d5e50a18b8d7a4481f4dcce12267f4be6d9ad60001b6143ad565b6160b17f3a7b5cb256681b80b220f767705e745ce69d13a4e7f0c04cd470ea34a65900ac60001b6143ad565b6160dd7f865ca80e7e548bc580e7ede6adc7ecf72d9a382873ec4a9c9f76dbf6943681b460001b6143ad565b83851115616136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061e28f6029913960400191505060405180910390fd5b6161627ff8f80fd3cefa7a7cc203254aee1419486d68368befc721db13b067d7442ff38f60001b6143ad565b61618e7f7f13d3d7a6608bd7ee12c1e71c074310d2bfc1cdbffddab2898d147e6a0a30ef60001b6143ad565b6161ba7fdba95786a11cbd4c989d9125ab10dcfa581cc921f71a064055a738c60f89f59460001b6143ad565b6161e67f1d79365cf401d3df0c1ecfee8eab687a0aa20b5effa0d1585742bbe7cab61c2a60001b6143ad565b612710821115616241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061e3116037913960400191505060405180910390fd5b61626d7f1282bf62a8d8b4afb769fab242d328d1202d75f4e4b37b6f7c2fd17ad47ffd5760001b6143ad565b6162997f33a32c6c91c3ac51f1d618d14226b8591b18861ce18bdee41369aa1b993d491560001b6143ad565b6162c57f7fcf6fb208806dc071efd4b33deeb209018fc175bae6797c179b4df934f3a74960001b6143ad565b84600860008881526020019081526020016000206007018190555061630c7f88d64ba1ad776fff48b5ebd0a4f2ad2efc4e4e43c79c49f81e1cfe47a82b0a5260001b6143ad565b6163387f54c14671f268dd2a3f41e308094782072daa25a9ddddd1dcfa4efeef86a9b14960001b6143ad565b83600860008881526020019081526020016000206008018190555061637f7fd568db0eb806b88be822ed5545aa2e0c57ddcbf50dd4f3c869d58de248b52b3a60001b6143ad565b6163ab7f43c7146c7c378a823a47d11f26549eb0ee98ab65168926039be111add8571f0e60001b6143ad565b8260086000888152602001908152602001600020600501819055506163f27f3b5c0ad8a3c0eff656e65aa62e911afb4f7f721979bd0386fb693bc4a75930b460001b6143ad565b61641e7f59edc21c65c13b50ebb7bd66d1efc067cba78144c9c67c772a7d7deb718c85de60001b6143ad565b8160086000888152602001908152602001600020600601819055506164657f077faa548dc765f5f5126d8189236fe72521d790ad6ca430b7631a36f0b02f4560001b6143ad565b6164917f53dc4f5d23e95949364e9f548a82cde38bdc8be788ba4b067df45b0cc8f1980760001b6143ad565b8060086000888152602001908152602001600020600a0160176101000a81548160ff021916908360048111156164c357fe5b02179055506164f47fc80fb2e0558d8bc614a52b814972c1c8d9512a48fe54d245e45147b425b1189660001b6143ad565b6165207f10cb77838e53a0c21258c3537289082b923aa705f94d8c3b32ea4914adb8791b60001b6143ad565b80600481111561652c57fe5b3373ffffffffffffffffffffffffffffffffffffffff167f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e38888888888604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a3505050505050565b6165ce7f5d08d12e6dd58531e82f3cd0441090cb975e67ebb0eb9360ec90e791e6955f5b60001b6143ad565b6165fa7fde9869e900a43dd34ea9c86000d6b8a8508fb2bdacdcff9904ab31c3ef4cb77e60001b6143ad565b6166267fd343801d572415df84fcad7e215541b4020f5fec0feacb5af1863171571966b360001b6143ad565b60008314158015616638575060008214155b801561665a57506002600381111561664c57fe5b81600381111561665857fe5b145b156167aa5761668b7f6bae2d03b455a7a9b10328c8b405745d1696c8444fa62695982191f8d16cbeba60001b6143ad565b6166b77f52a7817d5839a5e06041cb14e3cf71048eb6ae71ef01fe8fd74a9d4f72c5cbf360001b6143ad565b6166e37f03c4f103acca8588bba857f891e80364e6aa4a67c8f059dfdfff58fe09611fec60001b6143ad565b61670f7f70568dadfc090b2d0b5acbb650fa2b84f622ae2e374e265fa49fc2845ba09d3f60001b6143ad565b42616723838561b73790919063ffffffff16565b11616779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061e560603a913960400191505060405180910390fd5b6167a57f04a1dfcec1da39984189a74a8273fa1686b02fe776955d9d84e1bd58b701047060001b6143ad565b616aa8565b6167d67fa907e52c8d495c805089afc2a74e419dce3573d269d8f36e859ef273f5754b0160001b6143ad565b6168027f287a8c97a1c083f381274edb5a2da7edbcf5a6bdc676640ec7d3168a74d7cad060001b6143ad565b600083141580616813575060008214155b8015616834575060038081111561682657fe5b81600381111561683257fe5b145b15616a7a576168657f43dbeec0e23e52c489715a7499e1b6da79916f82520979fed4fd7cbca4d8d25a60001b6143ad565b6168917f61d08bd9a2cd49bc78012b5217d080fec17170bb38f5bda30b076ffdd4afcc9960001b6143ad565b6168bd7f45a7dda59938ef4cc0af25d4415c9454ebf8bc4eb5943af56401fd0b74acca6560001b6143ad565b6168e97f19899c754a2f9d2c54d71f8bc9e4c0f283456a24abe06ef0e2a5a0c78248427e60001b6143ad565b818310616941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b81526020018061e0a8603b913960400191505060405180910390fd5b61696d7f6a9487a8fd087760a80a890f016a406c68ba84fbe545f48ff691b844d7a06fcd60001b6143ad565b6169997ffa51f45e1a79e0271124be98b6b21239c0a493403876f7ba9d7ad07f2b8ec60260001b6143ad565b6169c57fdced9495e1cb7a042ce1b1debb1c80dbdddef2f5dd17f141e31b4088963710fe60001b6143ad565b6169f17f22f89d6a4cb17a8430462ec90917b43c6f1cabe39443e1006f938f40925a13fc60001b6143ad565b428211616a49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061e5016036913960400191505060405180910390fd5b616a757f3603a554f5a38eef1c480ae7465e68d7d9d92595dca7ad21a8460f4b7749f77c60001b6143ad565b616aa7565b616aa67f7769d73f20c312808c44bcf4c095bb33de44f37e126a68445ed9e6a9d1e0237760001b6143ad565b5b5b616ad47f181defdc185e813bc1cfee1da797ea7e51e9352b60a59eed6ce6b72ba4604bff60001b6143ad565b616b007ff0ca6a6619605c711367d043591fd86589f3949a7139d19bac086bc66d026bc460001b6143ad565b826008600086815260200190815260200160002060030181905550616b477f33b0a5ec2fe0e48eedd105050f1b54cb262d09a58e7a6dabdeb35f6d791a402060001b6143ad565b616b737f55f9b29385bb9d38f80f9e2743a72e413f4434f7ddc9af3a2f199183504018b460001b6143ad565b816008600086815260200190815260200160002060040181905550616bba7fc5060a6d532bd70c701784212380c5170718749ffb1d51f2548a74d7cdfa588460001b6143ad565b616be67f15698c1b3cb52400e2802364df0351e3d1aa7d292c1d8c62cf2c1f435617b52060001b6143ad565b8060086000868152602001908152602001600020600a0160166101000a81548160ff02191690836003811115616c1857fe5b0217905550616c497faabbc9d9ff60abcfa85df20e2069d7b0a924890b05b56fd1c2d5eb6e38097fbe60001b6143ad565b616c757fefefd74c076ed596d3469a4f07a18c069e3dfdd68c0284e3a902d7fc9829f6a360001b6143ad565b806003811115616c8157fe5b3373ffffffffffffffffffffffffffffffffffffffff167f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f58265086868660405180848152602001838152602001828152602001935050505060405180910390a350505050565b616d117fa20e9072ca5bccb0956d7b70673b62df0e8f854aaca548bf2a87333e81ccb22b60001b6143ad565b616d3d7fbaa046c6a8d17aa4b6f1810990f1054514bf088bb5bc1e81d5732bd6f6a235cb60001b6143ad565b616d697f88b63b099711ee3d3e1af10a3bba9f3d9301e0adb99126d0374b159a96921a5d60001b6143ad565b616d957f8320f66fb4260736c088321a124394194d69169e7af5e342b2a20f851eac7cdc60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415616e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061e17f6033913960400191505060405180910390fd5b616e477f977978066d0e142e1696050762c76390e97fbd2e9b6ba1f423063ee89460851860001b6143ad565b616e737fa80e110af0c2c6fd0bbe09007ca8e400824f910616eebb194fbbc5a0e13af44d60001b6143ad565b616e9f7f387c72f65effbc0ff45f52c28451e2d253ad566da18c81fd819d90fc6a7f076260001b6143ad565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550616f347f438a8bbfeffe60243e14fbeda7e4da070c1fb87331572bfc9ff67707b881ab3d60001b6143ad565b616f607f43bf98f8bca5675df904cebf4ff4d8e6c5f93a3dc1a7769ea1e39878b37399f560001b6143ad565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f4836040518082815260200191505060405180910390a35050565b616ff57f700a658c4da4d353a417b77c970de433d453c8f2699839dae49ad56bc95247a360001b6146f2565b6170217f0442258b08cc70eb8e8ec53ae49bd385424a7b28fb72a01d5f07863cd8ef7bbb60001b6146f2565b61704d7f73beb8663fb3696cb086686c524e4708b28c4ea65f280dff39d4827e7ca4872d60001b6146f2565b6170797fe6766aa48ddfcd976772424bbfb446c43bd564638adb3eae442483ef3d47d2d860001b6146f2565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661711b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061e5e66026913960400191505060405180910390fd5b6171477fe3eeb77f132279c29353bda0a45a6b8069b3d81ae1d35ff6ce332bf4f2f1498c60001b6146f2565b6171737f826c811e8f0f23125d7835fae7fd9617b4c6646b1b180244448e1abc0a49cae760001b6146f2565b61719f7ff604418593dc16a35b826d8368fc2d80c0cbe277b3875ea2501693e6c787629e60001b6146f2565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506172237fdfd972c9e0ed23e7b9b39cc0eb70745f9edf91cea7d1f5ef8cbf934ab71a383360001b6146f2565b61724f7fb812f9acc0ad6954fb47c6f67e2ec9e576031902c70f7d19cf34ebd4c99a83b460001b6146f2565b6000808054905090506172847f4f3d52591d32856fceaa0875b19a1a6971c5907ca132a5d94cb043c091ae335b60001b6146f2565b6172b07f4248074121f47fe89626ab2bd1ddcdd17b3244ad291d57f5f2dc8d7bc0ffe37260001b6146f2565b60008090505b818110156174ff576172ea7fb1dcfab9fb921132d8f94a37743105cde00a71eac40f219501ac2186954f9d4560001b6146f2565b6173167fa7b3c5f14af4838df8ff89a66ce529ae4fe4e2b9b809d49ff43144b6f0b4329b60001b6146f2565b6000818154811061732357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156174c6576173ad7f5d85e0c498670283c294314ea52bb35d04f5b20382ead62f26a5637ba330e26560001b6146f2565b6173d97f1e61341ff4265c16c11520f2bcaa2c67455ac8a5a44789639a1f3953467185b560001b6146f2565b6174057f69cb5f1d8d86470f85ba42b186f442cf39602df325e0be82fd2638d49b8fcf9c60001b6146f2565b6000600183038154811061741557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000828154811061744d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506174c17fba71d897b1e65b8d75cc479d698f33254ca674ae100465305a4d3cd901887edf60001b6146f2565b6174ff565b6174f27f38f3b15268ac0d983bee23492eb7af2d86e2b2ac5f404db8797ba0870dfbb7a260001b6146f2565b80806001019150506172b6565b5061752c7f623fa6edfa9ede1ec69f5c6f0990a64e40c5a746c07a3dee242d3098a062bf6960001b6146f2565b6175587f29c2e5f8e4b3b2b601f7c3f6ad17144c78e76415ff9a7c26b5c5211d3e6528ec60001b6146f2565b600080548061756357fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556175c47f4c7711e3c15de7bc64756f0ad4342539a47405097c1b755ace49d174dd92c3e260001b6146f2565b6175f07f5ca3edf5634600b786f6eed93e841b0073d00b1d590ad098af78f5186c06fa7660001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367983604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b61769a7f0fba0ac44bebc1d19c1e2598d2143f4e40b91a1a479424b23cdc51a111f61a6260001b6146f2565b6176c67f5ac0587170cfc2ba6bca9c191a377f7088efdcd9232cc7a7b59fc66f09eed57d60001b6146f2565b6176f27fd54f82f5ebc658384e7f4f6b81e3425d2f6de6e397fc9febc0aab1c766fc2b1160001b6146f2565b61771e7f66b0600d033d88be9320a9667148c885b2d7b11a2276b7b191d0b7989194188660001b6146f2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156177c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e7341646d696e3a20496e76616c696420416464726573732e000081525060200191505060405180910390fd5b6177ed7f458dc0e526126de1c7a7d155bfd97e0e38ce74f4f30e24edbd3e337037df892060001b6146f2565b6178197f0ec391908240ca8cbf3d254c56a7a359eca3012f94f3eecd5cc663259fce8eab60001b6146f2565b6178457f52c66d7b17c6b65853f94500e1a91fd6b9c552cbbde0cfa175c5615cb3ef5ff760001b6146f2565b6178717f09fb6f28ec832827cf8fe8440c8432e239ca50ca47ceadfdea1d94df42d988bf60001b6146f2565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615617914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061e07e602a913960400191505060405180910390fd5b6179407f75beac7cc6466e3d793f5efc9a7ed5f6c7864caa408c6e40adc7cb53b1f61df160001b6146f2565b61796c7f1bee40b5901ac349124754918e7e26cbe2858df5ecb1e94400402e260b6eacea60001b6146f2565b6179987f410a93128c50bbb38e509b51ade3c351cda1871ea9459114a6e83965661089a760001b6146f2565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550617a1c7fbc537b56eb8ce420f84eb8f690214bb5de06021c78fed4ceb0d761a7e511757e60001b6146f2565b617a487f8163b1d3ff7133aebf587ffdcb3605813a526f23621691ead884c8cd67cfd1ad60001b6146f2565b60008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050617ada7f595f5761b1bd17a702d9ab83f65b7b6418be9c4566ab772c2b4058530a29151760001b6146f2565b617b067f329571cfb247df28874d5a0cf2727b30c25d584b478323281c9165c3293ca4ee60001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250565b617baf7f41b1c8dd8d5910327e36a8bb359ff178cb1ded39297acb346e950db929c576dd60001b6143ad565b617bdb7fc23662d16f17d6ecca993f94dd9551e348982183b566a73f7a40d619af6fdf1360001b6143ad565b617c077f879ec18b3d166ffa5960af417819dff7ee0d07413638c758e33ec0dccb3d930260001b6143ad565b617c337f44978c5c4629b2a7ab5043bebc39e8d85967adf244fe0b68b72e7a50635eff7d60001b6143ad565b80821115617c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603981526020018061e3486039913960400191505060405180910390fd5b617cb87faa08a2064548d9b97d5846eb088eceb4e1c090b8783ce22baba19f9da920386260001b6143ad565b617ce47f399eac91c298367f416eedc509a56bd2476a549a931edb555a81f8fe60cf557560001b6143ad565b617d107f9c36bf7fbee120301da8f080504949f5fea67c26c08e91aa980acffcec93315360001b6143ad565b816008600085815260200190815260200160002060000181905550617d577f8dc1ec87cb4139cd9cdc5d2b6e4be1d82cc50c63a0d4ef574b7e240e4606412760001b6143ad565b617d837f916d4403cb99a72d9a3762d9de0cdba327dba7a3921902662d86c2ad4130362060001b6143ad565b806008600085815260200190815260200160002060010181905550617dca7f8cd4bbf71b3526b04e357b05fcb732a62bbdcbc8e40448894cdfabf67621f7e060001b6143ad565b617df67f51022f8a36dd964c45e4d3a6492a638f7dfb12f1a0e3441b7cd6c3319f36862760001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c84848460405180848152602001838152602001828152602001935050505060405180910390a2505050565b617e857f0cda559503cba2917545521066a16a465405f3bbd1b9a568831628dd598bf73f60001b6146f2565b617eb17f6b222ddf38757b30ad5587a0535d9026e827452508a0d467684c66d3c1a6e1a760001b6146f2565b617edd7fb3aec005e80804c1f7f09812f4651fa1987bd48659bb0cec15eab29527043ed960001b6146f2565b617f097fe2143ab519096b44a68bcf2dfa76788884d93aba95b22f702333728f6047eb6f60001b6146f2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415617fac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e7341646d696e3a20496e76616c696420416464726573732e000081525060200191505060405180910390fd5b617fd87f0af5dc5d575f70ea5f62d1f6520cd98e700cf178485f32277cceadbd1e71e57160001b6146f2565b6180047fa295903c4a81047b622dc3979b142baeb453eb062d4af1e70c3b168d54ff4db460001b6146f2565b6180307f057aaa7ce8c5bb2593674b3c4e9a379586088e150b4e9328ea1f7230b5b575c360001b6146f2565b61805c7f19ab008ed7da7f2961714050ce173a4cbb5e258f90574a237eccac673b998b8b60001b6146f2565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156180ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e1b2602c913960400191505060405180910390fd5b61812b7f1eb2f8712484e5abd0a0092e69ce0a0fdbfa077b87ce2bed2e1e2d441795d8be60001b6146f2565b6181577f39376fae5bf4169c93cba7dd7d2db4ff9a588c360bad5ce5f74cb23f8f62d0b660001b6146f2565b6181827efbdfc6de6200e1a108d4723d0ca109493d1be7d9be54dc015b2fb1c3de109460001b6146f2565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506182067f8d877c7bc5a5dbc94317477967e48e0985065b67fab01a1e53c0ded7d800873b60001b6146f2565b6182327f303e14c184af88d06ec969b6d5b59bc876c93916a2567d399297edd11603cdea60001b6146f2565b60018190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506182c47fdee67bc05f6f2a2ade56b3cd51a23a19307ba012452f287806627fc0885e7fe660001b6146f2565b6182f07f97391ea682f435686bd9306ab387f34a2948a811c2b43c07d281efbfc35c85ed60001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250565b6183997f5e14273f5c91e0a425e5ff20d66fac314255425ea45439ee5a8393add92130bc60001b6143ad565b6183c57f48f46a01af4ce3a539166ff52f8d4401b418b4f8775fee2b2ae5c23a23719dd960001b6143ad565b6183f17f4fe4b9e48544e4e272516831ae8ddf0ab27b542463238f44eb8c0d71a0612e2b60001b6143ad565b61841d7f119db01a8b1080f48a3f7378f9ca67e2646897f170396476efa321693d4ff00560001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156184a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e0e3602c913960400191505060405180910390fd5b6184cf7f8fa921b0f7a0d3a8574cdeb502e15747d35f8b09998b794d530c052c4576836f60001b6143ad565b6184fb7f3d7f019fdf59c5a7bfb4c68e66b965313f01dad1d486d7ecc93d8ed59ea2462160001b6143ad565b6185277f0df6f2ff2bee7f68bcb81d874d46e0e6195f311deeeaa45c8af0cc1a6e61c00960001b6143ad565b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5060405160405180910390a46185e67f40dbcbc5a1d19ec229f1911b629cd90d135184611e4c9e3bb124567fc12c785760001b6143ad565b6186127fba04dfa1aac058af28bacc3d9d16235f5f6b951a31ed8287aff297eb13883da860001b6143ad565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6186827f2d2b17008c81c729a76e9b31f1d60af1e815996dcf2ed234a6f5817f40d52edf60001b6146f2565b6186ae7ff2935ae4ff1369b36a1c9f8bbbc07d39433b3a0fe3721f87f0fed6c1b1637b6660001b6146f2565b6186da7f1110a884fa927bc46ef946125d7a67d5467c8bad7f7ee2e2ba61a7098176705260001b6146f2565b6187067f8fc70272bce9244fe3660ca50a4662d8732531a39a60c46470dd2c5d9f48323b60001b6146f2565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166187a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e4706028913960400191505060405180910390fd5b6187d47f7521ea7e11981e10530712e844a34703b2c3b7c8eeeeb0931806d36889a547b660001b6146f2565b6188007f3b1c6f84d325922bb0bc5c0679dc3d0f32d479d5d5566538162a0fcf525e8e8260001b6146f2565b61882c7f7c050e1b8d81590aabc562aae5f958dd9c5687079ec3df0524a2d348ac819cdc60001b6146f2565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506188b07f134639f4262b32365893cb88bac2370c1c291e206b3ece0f4730e376462cfbd460001b6146f2565b6188dc7fa815fd6ced88aac874c0da0fa0b813c59c7aeb91751e67bd0f4423cda199b8d160001b6146f2565b600060018054905090506189127fa6913cd67d5f0d909416aee3f9cf2377e5c612ae34580c3177a5a770e408c22260001b6146f2565b61893e7fe943dc5f4e6a6cefcc2516b51415c1ead670c42e9493440627cd57477b67fb9360001b6146f2565b60008090505b81811015618b8c576189787fa6bc8e73465d3c28d34d39dfaeb150a7220b50bca4cb3d8a8f0d183c7ab8fdc560001b6146f2565b6189a47f47fd655f1c87712d6c2fcde17ba3980d7a61f61d50ebdb03ce8bf91aab23e4af60001b6146f2565b600181815481106189b157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415618b5357618a3b7f402f5cbf01c18812984ffdfdd5c6e7c94e407c478e6eaace4366cdf0c4265d4160001b6146f2565b618a677fd948e5cfc2af9f31c734b9c1c0b843eeff749be6afd8209e3e8438c5f564072660001b6146f2565b618a937f02c3308c524bb2acb655bb78998e62a581922af54056dd9491629eca52ec310e60001b6146f2565b600180830381548110618aa257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018281548110618ada57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550618b4e7f596f90392997038f3189a37b4d309212bd69538bd8410712475516f2451aebab60001b6146f2565b618b8c565b618b7f7f2673001b1f599afb4c3b709b761aa53d6a8c3b9e764ebdf31bd8c0f85078072460001b6146f2565b8080600101915050618944565b50618bb97f2ee0d065b1399cafa57e27594b8338d1a48e7bf3ccdea71ca9ad58d142ee85a360001b6146f2565b618be57f2f345d77625ed83c6efee45dad4557514fb8be7e15977ed2da588e5c0763744d60001b6146f2565b6001805480618bf057fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055618c517fecec104046e3f1916b39682fad4322ade6c412b59aaed7c2812d0a74b2115c5660001b6146f2565b618c7d7f1f9cab3bd3f01a3c928ca45ee19f88cc1f6a7aa38a7160be8c2acd2784476a1460001b6146f2565b3373ffffffffffffffffffffffffffffffffffffffff167f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed683604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b618d277f1258a28ec2752da0da5b922195692f92154f9af007061c0031dfae38f41042d460001b6143ad565b618d537fddeac64170ad0cfab7d37ad18ff38299b858230b1c1d6fcf2f5162165025f8f160001b6143ad565b618d7f7fc779b5ce7d4e7f68b735dbef130f39b7b18140a48b900af4608e8f33cc7fdab760001b6143ad565b618dab7fc401c8ebbf36b2904cf2aa800439e0006d933e6a0c6bc7ca0caa037e25f9e46a60001b6143ad565b618db48261ba1a565b618e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e000081525060200191505060405180910390fd5b618e527f29f0beb74a22943da13a889c0309ce9b7bcba9e0b859609cb709d3b7f48a612560001b6143ad565b618e7e7f5da3dd6d41bb3fa4553d2275da31ebfb28d2cb93fc8795a40fbc74b933afc4a260001b6143ad565b618eaa7f3b3a5721379bb182ea96103d2c22146d68f7c77ed0b1b39197e69d84a84ad6b160001b6143ad565b618eb261df32565b60086000848152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff166001811115618fa957fe5b6001811115618fb457fe5b8152602001600a820160159054906101000a900460ff166002811115618fd657fe5b6002811115618fe157fe5b8152602001600a820160169054906101000a900460ff16600381111561900357fe5b600381111561900e57fe5b8152602001600a820160179054906101000a900460ff16600481111561903057fe5b600481111561903b57fe5b81525050905061906d7f15737ba16ddbdaf5979fcda90e7bd0afd6c3d9e5c31633b1a2c14c7a5aa8ad5d60001b6143ad565b6190997f3f6caf161f7ed8380ad6cbf612075d07de3ec83c9aadfe08d65846fd0c3b303860001b6143ad565b600060028111156190a657fe5b81610180015160028111156190b757fe5b1415619192576190e97fd11f70b7df494c275c522313109d065894a77213e72b4c790ee9662a34b4492060001b6143ad565b6191157f82667fc40443f50677083ec8ea3822102a0855b04b9f4998f4969b76aa12ab8c60001b6143ad565b6191417f52cb36432d95f0bf1f875532fbafa21140eafd816b8fd434b76542d22cfb30f560001b6143ad565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e6466028913960400191505060405180910390fd5b6191be7fc3840ef3457c4fd7aca311ee3a2af97df56cae48002f1e4ea0092844f370846b60001b6143ad565b6191ea7f2ac1026d2ac6c5f93c27f427ca6d8de1bd5d9fc3be04ba59d23c01380eabd61e60001b6143ad565b6002808111156191f657fe5b816101800151600281111561920757fe5b14156193a1576192397f35ca1646c9d9b334a5bcfb8ffce7bbca02d12e14dbfb5e1cfeb69f06f410879b60001b6143ad565b6192657f3469385da5907e86f9649c10713f56bb94b9f4b51c39bfd0e9e599f3e619f6b460001b6143ad565b6192917f2354e318a94d00cd4efa5780954f2329c444d8d31a97fbc36ccf7c2887150fbd60001b6143ad565b6192bd7fcdf790e12d7bb8faadcfdb21ef2737b02fa9234f5dae5a12b4d1276a35708c6a60001b6143ad565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16619370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061e2416028913960400191505060405180910390fd5b61939c7f69cb708d22dcd13a128b9b64bde4c4b5e385ea75ac5f187f931caa425971e77460001b6143ad565b6193ce565b6193cd7ff6ad38514dd03862364ac35fc06de1049dbdd7ac394780bf86732dfeabbe38d560001b6143ad565b5b6193fa7fedd422ab79c33b72062546e74c932928579dee65755eb022c09d3a6c8c736f8060001b6143ad565b6194267f3a179772423b910911a51b8c3244b938316058d70f0198d842876c5faf1a5b0660001b6143ad565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205490506194a77fae6d9864bd3217c36f5a35cff1d0dc35b89cec47100dc3104fd6b06d9f4246be60001b6143ad565b6194d37f87259a496a95529266f8ec006291a81718473d8a03fe89348004ad8bdb68fcc260001b6143ad565b6194ff7ffad4e2aac2db0affd87e8b5c6d525efa79c2a40803aab367e5e0b97825813da260001b6143ad565b8160200151811061955b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061e1de6031913960400191505060405180910390fd5b6195877fbf320ddede2786d819111ad52aa3356dc915413f4761bee74f5e044b0f2cbb7260001b6143ad565b6195b37f438fb6dc27845e10e217be78aa727ac3708c408bad0eee20cb71242068c5e7dc60001b6143ad565b6195df7f35a879d5c51a4691e775600ee0be7925c36ae8bed698285c680e2b947d695fdd60001b6143ad565b600061960d7f0a7df4e4eac2ffc32eec0d3649039ebd3e16bd42819ea94384a58addc970120060001b6143ad565b6196397fc46b65538395c0a40dcacdea0190842053f78072bf15628ffb7f55c5f833af6160001b6143ad565b6000600181111561964657fe5b836101600151600181111561965757fe5b14156196e9576196897f14332d445b62c44fb5b7bbb9ffd16168952e8000d39bdc6b3b0a719d52d3e59260001b6143ad565b6196b57fd1c788de06a3290f7d716e94e2697a347aae0c15cfc85ccbb0132751df57e6c360001b6143ad565b6196e17f28260e6d36c9d45b949b3e3680dae0db0c059432fb64191d1295c677027f23e560001b6143ad565b349050619c14565b6197157f02f74aa8364872739c5e859f2fe47061d952d965ecdb14b2fdd88cae3a3f8ed060001b6143ad565b6197417f18c9b05cebc9984e5ff788895ceff933a7fcf425b2fc51324686ffa357fdc30e60001b6143ad565b61976d7fe5fe355b75925c098a1a7a2d43219daa7dc998f19244a6b2a66b79959dc135b460001b6143ad565b6197997fbfa3469fd27f859021f4e9801e12b194f32082bd7e555218f3c648f514624b1960001b6143ad565b60008414156197f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061e4216023913960400191505060405180910390fd5b61981f7fb855a542a405cab7b781bfdcef99c439f86be5ffabc0e0f0eab43aeb676c1dbc60001b6143ad565b61984b7fdb6e6cc1b4d84a4d50611137baa461eadc963963cef9491c0f80ad45fe6b218260001b6143ad565b6198777f0eb26e92e7452c913728874ca9e2ee657b30f7cb71d07719586b00a4bdd4353f60001b6143ad565b6198a37fa879878c8ee82050fede45179d4ddb3d4f957a17453e0b13244910d7d21c5c9760001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff1683610140015173ffffffffffffffffffffffffffffffffffffffff16141561992e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061e444602c913960400191505060405180910390fd5b61995a7f2e3dc7cce37d23feb1ac9722a7ffbb1ba457d0697b2c4409623652b90bd60ae660001b6143ad565b6199867ff7f4250817492223a9e3ae1c9a793b77986b35c6c1d35449bc864b444e6db26c60001b6143ad565b6199b27f5da45ea63a160dd06ba6a43e526b63aa786b1a6ff4800caa416c30a399ffac6c60001b6143ad565b600083610140015173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015619a7457600080fd5b505af1158015619a88573d6000803e3d6000fd5b505050506040513d6020811015619a9e57600080fd5b81019080805190602001909291905050509050619add7fdb3a48f1931805e6b76e814837db0a8060ea54950041474bb48ebcc1acd9a84b60001b6143ad565b619b097f715774f3e46f4846ba248e25cf89b1518fa20c4f8981e4f5bf25445ed7d5746460001b6143ad565b619b357f12b185d84750e06dadc28ca5afa26a01791cb68a10436a62d586a46f7f61087460001b6143ad565b80619b8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061e60c603a913960400191505060405180910390fd5b619bb77f4dea6bdf1555e9f9ff79432d61c11b733f40a193c889d33ff045614d03186e1360001b6143ad565b619be37f4af8fc6941598eb1ff7882852e49a5a50a8cd9f8b611aca905d859d25185f7cd60001b6143ad565b619c0f7f268d5c820b55f3ee2e01733de4a71d59f977ab9b51666e5cd66786183bc65b3760001b6143ad565b849150505b619c407f22fc79eb8c07045526084769af97e3fd12ce7e530414b7bdb9164cd37dead24660001b6143ad565b619c6c7f41ff2f4f5eb8b953587115ebe393897702323585340ad81482673ecc1646341c60001b6143ad565b6000619c9a7fbdcb60ef26bac120bd2a12589d35f652a81452fff0f088f524188d9e1749217360001b6143ad565b619cc67fe5fdd48b4d65b3d8ecf154886cda5936cde965c0d67aa82902895c315c8b811a60001b6143ad565b619cf27f94118ce43c1caa71cd400b60b4fbf222bab2e4d10a6a0b2bbd406e8527091dc860001b6143ad565b8360000151821015619d4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061e20f6032913960400191505060405180910390fd5b619d7b7f060959094a8435b0731bc6aacf7a2181a403678c56a23af36609844395e1657a60001b6143ad565b619da77fbc5eb22848b26ca8b383487d48b3f875b710d6a3a039676e5f4dc8c5a2e51e9560001b6143ad565b619dd37f245343befc94d5861f352fc505db1a41760bc4d5eeb3fa52c56ef19c5c9f6d7d60001b6143ad565b81619deb84866020015161b94c90919063ffffffff16565b11619f1557619e1c7fcb4835a354754a3aefb7a645b76b3c8bd9de549baead3d813031647c4309a0f760001b6143ad565b619e487fc1cad96269dacc8cc05d8deb9d4757af3d97ee65c4774ce5684a2d2ccd13812060001b6143ad565b619e747f43e12f4fbe464a6989660a3769978a442d6f7401e9bfbf3d027b1f570928d43060001b6143ad565b619e9d8460200151619e8f858561b73790919063ffffffff16565b61b94c90919063ffffffff16565b9050619ecb7fa3a10396e3827dd8312c751f436a7d3b85d92d8efc27da40eed10d541369f67460001b6143ad565b619ef77fa17eeab935b0d2d26f5dc67cd3c51c44ec599998c1fd6b67701a875be0a0b2bd60001b6143ad565b619f0e83856020015161b94c90919063ffffffff16565b9150619f42565b619f417fb14125e75dc7e4bac8c8de914081aa5df53f65d7a89b96d386f4318b0859e7cf60001b6143ad565b5b619f6e7f0213bb603a5d2df16016de8956610f8d8cc84636937297faf34422b5738cbcb860001b6143ad565b619f9a7f8174c7a27ae29d870a99a2ec0392f2118d60c96259df3457c05db358c0c3a88060001b6143ad565b6000619fb48561012001518461b2f390919063ffffffff16565b9050619fe27fb89290c05bbfeb36574611a6d71c190d7aaaef99becb7ad25e43cdb75b2e0a5560001b6143ad565b61a00e7f031b1ac2c2858eb8088e177b84c3acce229050e18f5bda27fb7104282d348b8060001b6143ad565b61a02581866040015161b94c90919063ffffffff16565b85604001818152505061a05a7f91da45c4841333e728e3c00acf7cd3f489ab80dababd72a7e1509d4c6b191ef160001b6143ad565b61a0867f28740585bd2ea60e0382082f2fa7d973034fd70b770cfe93b5162a7a45765d6760001b6143ad565b61a0e981600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000205461b73790919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000208190555061a1697fec2f3253ba1e944ec9c28171fade64664209f5748718535925f66cd33fa2e27e60001b6143ad565b61a1957fe4dd45286e94de0fdd22deaca4af48374806881f99c81b9e3b84dd4bf77ba46c60001b6143ad565b61a19f878261c3ed565b61a1cb7f034592d0b9623a55e32c47ee9dfc560a536d0a3a7bce93b8610441f9c31f7ac760001b6143ad565b61a1f77fde423aac9e758f41f80ed74e6ade2674e350c4ea50322763492937bd4ffc044f60001b6143ad565b61a2008761cf52565b61a22c7f8640db2afcaf537ecffa727847ad75bd703d4852d25b1c7af5be0b0c5e31a29660001b6143ad565b61a2587ff8290a9d6a058bc7a6c13f5c147c8b949a58ad770b333aa3a4d79b13d2a6cc3160001b6143ad565b61a2648784868461d72d565b61a2907f143914d68f5fc7c320d157e36b3554cdc8c5e177532eef24eb6e602e69b9dc9c60001b6143ad565b61a2bc7f8143e64078e3a57a9b83fb5a248209688ffb9d0b4ea807fdcd32a2c9ce74c99b60001b6143ad565b600082111561a5205761a2f17f1737d0e182b71646dca77932cb19ba5935c7ab24b49798d9fc2dc561a8a7180c60001b6143ad565b61a31d7f2ff0fa203b13a8a0753e0c4a98955d9e3bfd0d0718d1e76ea2afda3185fb067d60001b6143ad565b61a3497f3a76b33099114723596b34f4808854bf0d31c403c90e9215d73e9af7211281ac60001b6143ad565b600085610140015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561a3d757600080fd5b505af115801561a3eb573d6000803e3d6000fd5b505050506040513d602081101561a40157600080fd5b8101908080519060200190929190505050905061a4407f7a45cece3f1a5b9eb94ed8d55a4ac1032c771c3ed7763440dffd58a07f47e8b460001b6143ad565b61a46c7f84da53a161eb34959bee64ef2d056ada10d1417da934a724d01acd431cfcb3b060001b6143ad565b61a4987f82e77a5fb53cfad710080846366998b48370af6e15b1b0342f28c2278b76ce7260001b6143ad565b8061a4ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603981526020018061e3e86039913960400191505060405180910390fd5b61a51a7f5a89ad8ab5452a75c918bf5e84f60666d4067aaf8ab5d74028d20672d1e29f1960001b6143ad565b5061a54d565b61a54c7f33d0fd640530abb15087447dc7bced848fe1259c47d0817f8ad1e7506f1b975960001b6143ad565b5b61a5797f43eb29afcdcef52f4105ce66d594152fbf8cf9a345f38166f980511e40b2645b60001b6143ad565b61a5a57fc55b5598b3cddbcb5a546dc90cd117aded4d1bd7a665069ee4f92e8fea63abff60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba08883604051808381526020018281526020019250505060405180910390a250505050505050565b61a6307fcd966935353bda444816eec693f810b1bcd54d4d073398cf308bf2fbe3b263e360001b6143ad565b61a65c7f0b74fe531ffaab939a53b7189096ede82dbb739ff99eb19a85bc9e815a4bf99460001b6143ad565b61a6887fa87e72442e527d7532bf613592e6383a135437fed068fc3d9fef77090a63ee9760001b6143ad565b61a6b47f8a8f02a5a4fef27b28cf23e0bd5c5283abcc790a81549bee87f7096940de35b060001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561a73a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061e04e6030913960400191505060405180910390fd5b61a7667f4abb75ba6e20ad9a8eaad46ec10eabfbf8b8185420bd7c2ceedecee8764e84b360001b6143ad565b61a7927ff904c5fd956edcd18ded43fadb89d3e5311a88bc1fdc4242774ab45fa666462b60001b6143ad565b61a7be7f63e0f6b55c5a25766a8ee5960e284924cd6cb69f392d660b7c2e69454731fe5f60001b6143ad565b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce160405160405180910390a461a87d7fa89b56f9cbff042ddbd40975d849a6c306c28b9c7a9f59679a46cffebfa481c360001b6143ad565b61a8a97f8baa7b1fdb6eb7b3f361bbf4c808c060c7478ebdbeacb7009b0093519eef4e5360001b6143ad565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61a9197f5dba51d03ea8e4fa7fcf50453a95d2d0be10d32a3fb8e98eb04a03a8c924dc0b60001b6143ad565b61a9457f256e203c5516bed84ff857fae390e709522aed56b5cf4fb0b8b1aa605787009c60001b6143ad565b61a9717f9dd2ce83121fc9a27c44702515c7e5bad4f1b0fc189aef59bd8db773f23fcd2660001b6143ad565b61a99d7fcb7235a5ded29d8c765b01592980bc36ab36482f6fb9a6d64ccdbf6154c9515c60001b6143ad565b61a9a6336146f5565b8061a9fe57503373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61aa53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603581526020018061e3b36035913960400191505060405180910390fd5b61aa7f7f9462da58c4b4f9c2fefd8ef2f7c3a4909f4f2533a97706783988aa71bc49918e60001b6143ad565b61aaab7f764d97a34b52dc1cf73063621efe7ec2d1c55ef109c70bbe0a50b56d1b89fcbc60001b6143ad565b61aad77fb37b9345fd1da1ede1d452a366df2b72de7d60ce79d6e6d5991ad6814b5f0c3460001b6143ad565b600033905061ab087f07ff9d09acb29e01f82a65be19be798992a7e4fafb16b900a9bcf9ca77ac3f5a60001b6143ad565b61ab347f988e3c68c7acd53b40e77dd1ea4241338cd10182889550fdd80e29696f860bbf60001b6143ad565b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461ac385761abb67f54780788f9bf8584d54bf4cc4943ba8bc83ac804011e89520b6005be9177230f60001b6143ad565b61abe27fc5ed745f2e70dd07837a392031fde8061823885b1b011e514c52439e76b9af8560001b6143ad565b61ac0e7f5f9a3bd40716d7d9e7574395891f7f0aa323c6e4bd5273dbc66d5ba7879b64e960001b6143ad565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061ac65565b61ac647fa4d6b933fdd56f426de28e539a047494a257eef4f7dbaf320da04f3e054de5a960001b6143ad565b5b61ac917ff04c20c949e6b72c0681623026083ad51672b7d73cdaf61c3802dc3d142b33e460001b6143ad565b61acbd7f6ce14dfe14fe605ba57ca5162006ee712d87bc3428fa047328131ce4c95e237460001b6143ad565b6000600190505b600454811161b2ef5761acf97f53bee2e90458706d235e231a96c5b79963ea992231858c035a0de1541745fc7560001b6143ad565b61ad257fcc9e461887b8ef6bb19351d4694ae99d8113429af1662c5ee29171cf4a9c38c260001b6143ad565b600c600082815260200190815260200160002060009054906101000a900460ff161561b2b55761ad777fa100bfa14d290e8c70ebe5cbdf9ef24dfb02756548d260e9b50d8ecf964f0cb460001b6143ad565b61ada37f1b202c8dae0740c20a2ff89c1968d1637a7ab161c581b7a08e7f0711ba57c66560001b6143ad565b61adcf7f9ed0b892a0766e12e16b26d2363ae060b1b211302a9031481f6b889c68cb2cc760001b6143ad565b600061ae0d6008600084815260200190815260200160002060090154600b60008581526020019081526020016000205461d9c190919063ffffffff16565b905061ae3b7f4bcbecea127467b89a4a8dda4664bc821f8bacbeaa0ab35a76ade67f2ae1eb3c60001b6143ad565b61ae677ffabf93cdb41ad7545395829064c555d40a030b1472b4f3ae285035f2e60bc1df60001b6143ad565b6000600181111561ae7457fe5b60086000848152602001908152602001600020600a0160149054906101000a900460ff16600181111561aea357fe5b141561b0555761aed57f3aff474ad01699d604d96308d7b9d46bc34cfeb1ee9b00283139d53f41f6bf2f60001b6143ad565b61af017fe347bbb2c2c2f2b613338725c02b85846a5984878a308afbcde227470dba130b60001b6143ad565b61af2d7f7bc1d58153fe8fefbe3fb33440a1f638f9314904835fb95b41348628b942c23a60001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561af73573d6000803e3d6000fd5b5061afa07f42bcb0901f7bd1072a3a83ef19776668acd8109066a530bf2a3e38906ae5066360001b6143ad565b61afcc7f33cab331a764e35fc37ff2c2cdf63a57170dfe29a679ae421ba932d29d3fb47460001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c846000856040518084815260200183600181111561b03557fe5b60ff168152602001828152602001935050505060405180910390a361b2af565b61b0817fda7bd1ac43e85971a4b38d5c812fd5315e71e18533fcfcbab9b10ea11e84b13260001b6143ad565b61b0ad7f01bcca6890dfae3a0d9483b2efb1e73c2ed75fddb2055013fc255921fcffd0af60001b6143ad565b61b0d97f1a9ddb01a03292ce9c72f562c4d9a2dcba1a7baa5bd2021078a57342416e71a760001b6143ad565b60086000838152602001908152602001600020600a0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561b19657600080fd5b505af115801561b1aa573d6000803e3d6000fd5b505050506040513d602081101561b1c057600080fd5b81019080805190602001909291905050505061b1fe7fd31bfc3837838ab3e8e5e344901b69827ee0a1b43710efeb2eb6e48bb2bf377360001b6143ad565b61b22a7f0e313dc839520594387bfc146ea64cf13546e043ce6cca7dbf207acc326f335e60001b6143ad565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c846001856040518084815260200183600181111561b29357fe5b60ff168152602001828152602001935050505060405180910390a35b5061b2e2565b61b2e17f1044dc8eca2327d29135df74b3a1c5a71ea389acec3722b97c86e029cd3cb01360001b6143ad565b5b808060010191505061acc4565b5050565b600061b3217f44698d1e9a904ed1284ff1ffbc3dd61250c83d2c71afd5df19fbf19c6190a1c260001b61da8f565b61b34d7fa3a4b98cb2a23eda9dbb54b77b676d94ca9d1d4bafcc15caee09e68074b0ef8d60001b61da8f565b61b3797f3c0e96b55c01aeef942723329b7f27779568810ddd00a05282ffd2e3b5d233d760001b61da8f565b600083141561b40f5761b3ae7ff802f4a238c6bfb87737692d90643ed6d1e91071b816804127f57dca78bfaab660001b61da8f565b61b3da7f9c7552f9a426f225c2850fa12a0dc5fb398b1adc4885e41fd5a32fae1dbf05d760001b61da8f565b61b4067f88253dfa1829ebe573c7def7f8d624e362791a1e5da86330776d1836a357555360001b61da8f565b6000905061b607565b61b43a7ec5af928e6c63fb10ff91a6c5a4e910c4f39f595f742d8e52dc11b03ad6250f60001b61da8f565b61b4667f5e551b5129d493f012d238e272eb615eaa6959509de842125d5c3b203db4ec2660001b61da8f565b61b4927f6eeef49995c967235a764d0bfc2ddf3ad4e6890ca3a3e7024c52da8393db1ce160001b61da8f565b6000828402905061b4c57fab80a6313ea3c5926e33d7cfa6c464eb729cc09a2e212bce50dc9d97fae0ed7260001b61da8f565b61b4f17fcf8cc8694fe56eef0897d8bf5580925daf8927e537ada7fb46a3727fe18d423260001b61da8f565b61b51d7ff5b30a17ff5e5b532b98d8059efeb460d05236f98b90e61b8794894cfad8502d60001b61da8f565b8284828161b52757fe5b041461b57e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061e2f06021913960400191505060405180910390fd5b61b5aa7f9fdef838f8fa27d2dbdb6cfecf3f275aa85c5ae07d712150d6e17c19c215bfd560001b61da8f565b61b5d67fe9975f5879861c66ca2a2d35617f5a37951b7cf797008080c2db7371f45b3b1460001b61da8f565b61b6027f1040ca89b272f25ce391ff02203288f6f7b9bee30a94da64205ca6d937da6b3460001b61da8f565b809150505b92915050565b600061b63b7fa4b53dcce60c93e2c60fa6b35fc2caf97736f23642ea2c793c86b5d9cefcd35860001b6143ad565b61b6677f44ec31de0477863a6a67fb31990250562be4f59a3de73987c9b17df05712c84760001b6143ad565b61b6937f4ba13b49aac54e2bb0a57da2ad46f0e1c87f0187ebfe5380cfad544e45408a2960001b6143ad565b6000600190505b600454811161b7335761b6cf7f012e5bf791c6ab6bcd46b6def5c735bf330edcd8b5d954d843712c31d88f54a860001b6143ad565b61b6fb7f488aedc98a520bd06ef1e1f00a48c0beaf7cfb84d17cf76a58f0472a0e87535460001b6143ad565b61b72460086000838152602001908152602001600020600201548361b73790919063ffffffff16565b9150808060010191505061b69a565b5090565b600061b7657fbaf9c024e95ded51de10de581f7e9a5f9278d7d44c88913bedce3e2dd10f64ba60001b61da8f565b61b7917fc54665a8398e9a7e108333c05bd60b786b5c6620add6f03718489066cdf4fa8f60001b61da8f565b61b7bd7fbf6db928e163d9f59e0f205ed6023acfccceb125f3a96bdeeea0a0b33746dbd760001b61da8f565b6000828401905061b7f07fda1f611a7ae523006cfa4e37c35a2ad88d939645e316417be5c71c6d1012fee060001b61da8f565b61b81c7fba19c50fb18fc1ea6c6cf800b5518af3902a832de775b543b58d5495a00bf67360001b61da8f565b61b8487fffc23a720492c3b2a8e1cffab47c814debe3e6b6e15d8bdab0719a42758eea0760001b61da8f565b8381101561b8be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b61b8ea7f832790f69709d076ed0dfcd48e5589a4d45bfc4f71042ad4dde2bc7eb90e539560001b61da8f565b61b9167f8840e735ebdf3bcd2d42eb9c3081a59867a5d7290d1ac576e7491bc1920b28c660001b61da8f565b61b9427fed0d950aaaaa99bb131a51c630fe967814c6a8eca5750c5f5d395ed7e6fc4df560001b61da8f565b8091505092915050565b600061b97a7f692a0cfdea6cb12cdfcaa599c058fa5662531cebd540556a6d1c27ae01b4cea360001b61da8f565b61b9a67f2cce8d8afd666e4919d1ece0b47a35eda094c843996926984c8b17a0d5cd2f7160001b61da8f565b61b9d27f936781d4063de1913a3eda99a7c2145fe8a9c61ba2abe4fa4e7dd270bf8b933960001b61da8f565b61ba1283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061da92565b905092915050565b600061ba487f91e9553b8f91db975c749d5c94abbce1e296644e5342b3f6db822e21c132911d60001b6143ad565b61ba747f2b0e88aaa0157cb7c3170221a6f349f6c3fcc28be6325238a0caeff455bfecc860001b6143ad565b61baa07f1d7d2b6b4d5f5d125a5de72a1a2749ffb2cc381a603a980b27bf0cd3f8942e2f60001b6143ad565b61bacc7f42f0e56580982a6b9555e748d4a68e977f7ca06549add8b930c033de27969dc660001b6143ad565b60006008600084815260200190815260200160002060030154141561bb3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061e2696026913960400191505060405180910390fd5b61bb687f05c1468418341081ac7af113c7504e8a76d43f3f721fffdba85f56bd3a3fd44860001b6143ad565b61bb947fc5666b5dd4c45e66a17e768e0d794b9c8e8301e98fd8b84da8112d5fa58867da60001b6143ad565b61bbc07f81a4305675c0b8c084beeb0305b97d9991983301d80bc035b0011f8f2e379bfb60001b6143ad565b61bbec7fbdce033008dfa407030bb5743bf2d2b929c1bf01137a44eb27b043b471b374cf60001b6143ad565b600c600083815260200190815260200160002060009054906101000a900460ff161561bc80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4f726967696e73426173653a2053616c6520656e6465642e000000000000000081525060200191505060405180910390fd5b61bcac7f653a3ae263eaf8831f43619f01c20299737aa4d8f81cda08ccf8b9db7440c63460001b6143ad565b61bcd87f60489549f00dabf3d8324064990191794c79718e9053e38ab4b836b51fd5e46260001b6143ad565b61bd047f381a648954f161b51106d4756e1291f86490cea3294456d842807618ef7a6cad60001b6143ad565b6000600381111561bd1157fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561bd4057fe5b141561bdd35761bd727f826ea340f58bb5144a38b450ef6a727af6ac000785087f32e40388aa0d28bc0060001b6143ad565b61bd9e7fe82ce36dc34b7add076f895646759c91899df7907fb34448e5e235136e3aef0f60001b6143ad565b61bdca7ff0c51105c5ae5ed1776e253721e6e6f6e31dbaded74414dea4624c571a6bde0860001b6143ad565b6000905061c3e8565b61bdff7f101852a9113711b402240923b0d1e629ae7d7ca5becbb76d66a05b64cc60980860001b6143ad565b61be2b7fe590d18255fe7891cffc828b79baeb6523a8568fd69b61e086a6f0fcbc243dfc60001b6143ad565b6001600381111561be3857fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561be6757fe5b14801561be8a575060006008600084815260200190815260200160002060020154145b1561bfa05761bebb7fbb458ef8a39e3e067daebcb5d53d3fb5c54e8616f13b9f0ddabd3e74845ff6d760001b6143ad565b61bee77ff4ed907481f89ff0c1bc33110ba6502e011bd9385bbef7dca729ef2e1cdc561a60001b6143ad565b61bf137ffc0bd6854809a04915e21229932f4d6892de984da37d8e1517e037b93ef734fe60001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061bf6b7f254a8656b5fcf06b0083312b35c2328e28b344405392342d659d4602c150e85560001b6143ad565b61bf977faa9b6b98fd178e750fd3baad7d056b4bffc4ef09a87fb998236bbaf1b9fb35cb60001b6143ad565b6000905061c3e8565b61bfcc7fd68bec896d7bd84e20354a179d9a4ddc80288c801366b87ce9f21b6da33f71f560001b6143ad565b61bff87f9652e4144468065a760c5139b65fc3a9a9e73e4dca62146ddc7134b9b8a759d060001b6143ad565b60038081111561c00457fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561c03357fe5b14801561c0555750426008600084815260200190815260200160002060040154105b1561c16b5761c0867f5bd9787c3c7e9cc75eb59e9dffbf4bee43e3821e4d31038dbd7d10c58feb689360001b6143ad565b61c0b27fa37d83cc6b868a73454d58877d9ac7dda9eefbe6334346696914e9232bb1745360001b6143ad565b61c0de7f8158d57ef96ba67047c30800db4577dfe0ca4104153b7eb1d2fc218ff883236460001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061c1367f9c5c553679000555d9cf4875be4fc3479b69a32c9a03bd9c66e8a3341a31089260001b6143ad565b61c1627ff8976ff97af1198bada7dd45ed38eab3545a835a672714f9b76d56ff8b6cd8e360001b6143ad565b6000905061c3e8565b61c1977f0301057208a5a94ac013849972790f73743de9034b62f377fe9f5c237e9d66e960001b6143ad565b61c1c37f9590711820a2098d2a92e95d5f7212b561679efdc9c4db663cb9bdb355249b3560001b6143ad565b6002600381111561c1d057fe5b60086000848152602001908152602001600020600a0160169054906101000a900460ff16600381111561c1ff57fe5b14801561c24957504261c2476008600085815260200190815260200160002060040154600860008681526020019081526020016000206003015461b73790919063ffffffff16565b105b1561c35f5761c27a7feefd72a8f312758bc56ea318d6313df2c3ce2363d6554f604f72a1900b38440d60001b6143ad565b61c2a67f5dd6f7d37fb6b95e7a85674a2788b3aac501bb21ead7dad51bbfe508b19b47bb60001b6143ad565b61c2d27fa9d499257f48a23cb752e3464ba0e74cf95379dacb39e2c44001f700cceb512560001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061c32a7f06e6f52020f1acba7fa1f013fb60c488b63064153300fd0970afa15aa44e12ba60001b6143ad565b61c3567fad082986a549b72bb2ef917d00601e76577fd7381a00a89b3a9c5fc65681f1c660001b6143ad565b6000905061c3e8565b61c38b7f20641234ff965e95be45927e2d84e19418ef9e5028b6410f9913bede8882bbff60001b6143ad565b61c3b77f18fdd12d7afd7d16cb2175687f3cf4e83bf565af96ba931b780cafc804c964b960001b6143ad565b61c3e37f35102aa52645102ead5ee786c00236873bc202acc71a26ad08b7cf01985d5ae560001b6143ad565b600190505b919050565b61c4197ff9fc9ac43adb81975cb7ac1a0522b5a6e3b89bc5266550411e6aa9bc3086e27760001b6143ad565b61c4457ff2b20dcbb930dc8499f5be0056f5d8a86d9471b468b1182d64d7a71c0091c22a60001b6143ad565b61c4717f19e92a1895816eb2ff4889583b6b387302e2956541120ceb6338e149ec62e7f560001b6143ad565b61c47961df32565b60086000848152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff16600181111561c57057fe5b600181111561c57b57fe5b8152602001600a820160159054906101000a900460ff16600281111561c59d57fe5b600281111561c5a857fe5b8152602001600a820160169054906101000a900460ff16600381111561c5ca57fe5b600381111561c5d557fe5b8152602001600a820160179054906101000a900460ff16600481111561c5f757fe5b600481111561c60257fe5b81525050905061c6347f3b054abf37860a2714d0a9ad1b783fcd0e6fa94498355b7754c156895bb146ce60001b6143ad565b61c6607fb9926ce079f4125ae597e1f719cab9c393336bf1750e2b071ac199d4debd923760001b6143ad565b61c68c7fcddfccff0f8bf32503b213e9063756621cb8fdd325eda0caccd4d497f74eed8060001b6143ad565b6000600481111561c69957fe5b816101c00151600481111561c6aa57fe5b141561c701576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061e498602b913960400191505060405180910390fd5b61c72d7f4416945b53319e4ec9deb47af2e8fd52893733890f4c86c3681566b771f5b9b960001b6143ad565b61c7597fc52ba53c69ee645c69c2585d01f189150442bdb44c254d65df22aa68034332b260001b6143ad565b61c7857f0253630e1c054ff74ded9a339dbd79e70ff306a663f3338ba5f46834a9db5df960001b6143ad565b6001600481111561c79257fe5b816101c00151600481111561c7a357fe5b141561c8fa5761c7d57f3646fd7f09fd85b09a73c6c602668804954450315ab76a6390e37f6c20db361360001b6143ad565b61c8017f8f62bd1130d507a580f5087fce789459ec9fc6521daa2a25afb672feae556e3c60001b6143ad565b61c82d7f11c02fd97e6999549fec07fd06f0149b10f5a46178cdaf5f01568690f7ac7ed960001b6143ad565b80610140015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561c8b957600080fd5b505af115801561c8cd573d6000803e3d6000fd5b505050506040513d602081101561c8e357600080fd5b81019080805190602001909291905050505061cf4d565b61c9267f83fa75b60aa16ae1534b5f2fd98463374e1d6cce3f80626b98e69819250be0f960001b6143ad565b61c9527f536f130e6c202974e8b57bcbfaff295ec0d3a76da482c0116a104957fe491aa460001b6143ad565b6002600481111561c95f57fe5b816101c00151600481111561c97057fe5b141561ca685761c9a27f3f32af1864c7fca16884088dd7358f997f88a1dd36e82b3002006e98d16a4bd860001b6143ad565b61c9ce7f37d067185cf0ed8d38419803410f1716088ceb2af32ec97fdf4e2d331149b92960001b6143ad565b61c9fa7f311e27a538d4f9b27d119434d744ab7ca0157cf414ff70f500cf1c0382b6acb060001b6143ad565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f7420696d706c656d656e746564207965742e00000000000000000000000081525060200191505060405180910390fd5b61ca947f831edd8210081558c15f72013015cf79e66f53d988b1b4ce035db416a390af4960001b6143ad565b61cac07f69ab85ec1959dae9399396c29c979dc439babcd144afb503f45f7df1715d8d6560001b6143ad565b6003600481111561cacd57fe5b816101c00151600481111561cade57fe5b141561cdb25761cb107f89e3055aa3d91f79a08f927d0783eaec5f061d5d18142239b36fc869cecce8d160001b6143ad565b61cb3c7f8648e6d12fba90b4a76b0937cd0bd474d9bc3629ffb893cd4dfc16efc6fcf0ca60001b6143ad565b61cb687fc5900c41f695300e3626c31031248b7a646c5771ea4758814d32cd34f76175ee60001b6143ad565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561cc3357600080fd5b505af115801561cc47573d6000803e3d6000fd5b505050506040513d602081101561cc5d57600080fd5b81019080805190602001909291905050505061cc9b7f5453e20c79af3f5ab1b0bfb522abccf809e6639a18ecfa1ba10d11966d76dce160001b6143ad565b61ccc77f7ad0f6dfc11c66b408b60669b07af67ea76aca820ad0c3b5e055132cbc1ec49a60001b6143ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663849a681733848460e001518561010001518660c001516040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200182815260200195505050505050600060405180830381600087803b15801561cd9557600080fd5b505af115801561cda9573d6000803e3d6000fd5b5050505061cf4c565b61cdde7ffefa5cec4fa9064e36404a692aad2a4db3f00a8438648b79ac58c8efda8e9a6f60001b6143ad565b61ce0a7fca3dc0d5614ae19551e6f058c959c337c5c22c82754df388da3734d2a0a4ab7f60001b6143ad565b60048081111561ce1657fe5b816101c00151600481111561ce2757fe5b141561cf1f5761ce597f60f55a1f103c9a1119f2497ee621a398ee03b5d78d344f124836bbcf3c1df60860001b6143ad565b61ce857f3e656205ddf82be935d887b89005da8de1b8f0e9fb6eafd4f983417c1b4f3f1160001b6143ad565b61ceb17fcc79ab918c227816062423fa2b69e1d6e910682193d3fad9f566c9765af7345760001b6143ad565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f7420696d706c656d656e746564207965742e00000000000000000000000081525060200191505060405180910390fd5b61cf4b7f06dbd710029f7ef5b7e4d709a390227aa1309e1157bd871634c025f139dec06060001b6143ad565b5b5b505050565b61cf7e7faf3334b7c8f6d3571478be0fc8dedeb7d18379480990f62375c3e54d4e07291060001b6143ad565b61cfaa7fbce63d97d8517956c409d8ba2f4af181e55e9272dd33c2559555d7561886a81c60001b6143ad565b61cfd67f5573ca7618e5e970e32cfff13dc92fae4d07074f0a60674bd0323856b82dc4a860001b6143ad565b61cfde61df32565b60086000838152602001908152602001600020604051806101e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a820160149054906101000a900460ff16600181111561d0d557fe5b600181111561d0e057fe5b8152602001600a820160159054906101000a900460ff16600281111561d10257fe5b600281111561d10d57fe5b8152602001600a820160169054906101000a900460ff16600381111561d12f57fe5b600381111561d13a57fe5b8152602001600a820160179054906101000a900460ff16600481111561d15c57fe5b600481111561d16757fe5b81525050905061d1997f0edbd8684422fb9a817dfb39ad51a6a1e2ed8648c97fc8a7fd0eaa2148d416cd60001b6143ad565b61d1c57f4bbdbd7e92b7036b97cfc18306e32bafa852ed102613433655646047a3ee832060001b6143ad565b80602001518160400151101561d6fc5761d2017f7658ecdfd8d8732b312cb32404eb8d2c51fdf1272693c3e65e4d69eaf05e1b7160001b6143ad565b61d22d7f0bc72c8210072183a51df76e29add60aecd74d1ac04eab9ab49463c9ae8c79fd60001b6143ad565b61d2597f3362701b0fca282af2a6c7370630e708ad0e557aae21b3fe9f3c91bf8f75de5160001b6143ad565b80600001518160400151101561d5a15761d2957fedcb6f6f1db5453ea62f665a6f8190343173138fee00abcc2d3f4807541a1bbf60001b6143ad565b61d2c17f6ac1fab115fffec528b63d7e86dba3e43cc0486724b6bc5e52d26d99168bc32060001b6143ad565b61d2ed7f8c482dd675875ec477f98d4b91ac0d816c7763012a250fab27dae22204553d4e60001b6143ad565b60008160400151141561d4555761d3267f10687479cf4574c2105c199a52cac67e2019daf1c8ef301b5ff4ad14564a221a60001b6143ad565b61d3527f36f3a9227aebacea9bfb503b14bf9c36f8f9aa7f1c073bfdf619f5df0e50914e60001b6143ad565b61d37e7f01460a329248328cb216d4b91efbd57f5db308662bd43304c76d362bf5419c6c60001b6143ad565b6001600c600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061d3d67f9adabe64395d42bffe49041aff12f726a4a0a44a732c5c0f5ed69da48c88809260001b6143ad565b61d4027f20e0bffb0ca556643787e529f37d5a80a10aca3b39b848da077554d802ba120260001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c4836040518082815260200191505060405180910390a261d482565b61d4817f7694c969c62f9945319c007faa03014817bc8474475e9c963d15f911e6ddf8ce60001b6143ad565b5b61d4ae7f16b4a42193624e455f269dbec524a47b6715975e1d67daa1dc528f28b28c564160001b6143ad565b61d4da7f6a2e55800ed2e29e8b25b0e69ccd2c3842e1f527bcc4f182a81bb709626c4ec260001b6143ad565b6000600860008481526020019081526020016000206000018190555061d5227ffa6894585a102862dae64ff945e57671f07556d1a9b4d6be4e1f4dc80ff1e0e160001b6143ad565b61d54e7f69608a2dcae66b886b77f166bc9161003095e9d8533e0085acb033e467c6035060001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a78836040518082815260200191505060405180910390a261d5ce565b61d5cd7f56602399bae5070426a7fa62c091b4571e081a365a0572bc6ea7c655c7e707a960001b6143ad565b5b61d5fa7ff8b907cd3ac179fc67d3c7aacc1abaf591c3d2525c2360fdc4560fa55586f1c760001b6143ad565b61d6267f8f6f28520c12dc533734858bf8c6deb833cab0ee52a95989c9b8cd94bcc671d960001b6143ad565b8060400151600860008481526020019081526020016000206001018190555061d6717f4c4d4990333d7eed3525c1319acf2143a7564db66bd55ab8e353d9129ecaadca60001b6143ad565b61d69d7fb9509c3e46ba4d92ae4139a29ec9ef2edcc63696d6d01ad73f000d286a6cdd7e60001b6143ad565b3373ffffffffffffffffffffffffffffffffffffffff167f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445838360400151604051808381526020018281526020019250505060405180910390a261d729565b61d7287faab15ab76b90c26265bd5f07e0d3d0c779296891961aa0ea3e0803d9416027f660001b6143ad565b5b5050565b61d7597f82a5e4398186d30836ca01d3cd79052da3dfe0fc6e6f5e95d9bd4fd201d9d3a660001b6143ad565b61d7857ffbdb91767839145a3acf8d28f55e70eb505cebf298ad36c4574f8cc847e8957a60001b6143ad565b61d7b17f9cac980eb64a1c6e5488bdf9379084f165f4a5e81de9f309ba6b440cf521f91060001b6143ad565b600083111561d98e5761d7e67f8c875204c918e371346e600056c894e469f9f20bc9547d475c7c67298f54e5bc60001b6143ad565b61d8127f2a2f652ea5aad0bccc9a596ab07c1cedab273df7b97111fbf2ffa761c6a28fc960001b6143ad565b61d83e7fa74c5c3487b6db5f33bf5df8b0e8257d1485f02835ef86bb78c8ed5b9534c9cf60001b6143ad565b600082141561d8c75761d8737ff1ceaf83779cc9c0312cc98b8c4b4e2b2ce710ebb082e56df01af4300f30601060001b6143ad565b61d89f7f87bdef1c9e2c992f5ab8653535516a2f27b1f437def6d03005e86d206d50faaf60001b6143ad565b600a60008581526020019081526020016000206000815480929190600101919050555061d8f4565b61d8f37fd63c5e3214fae63baeab271f67717051a18c05e03c45ceec5535c23419d9569760001b6143ad565b5b61d9207f99fb4d88d545ba183efc65749f0818469151bf1246ce9a8e33ccf072787875b060001b6143ad565b61d94c7f70a5c4b8a4b90ec8fd3d111a6f07737186dcb95fb911e1f48e962ff7dd292de560001b6143ad565b61d97281600b60008781526020019081526020016000205461b73790919063ffffffff16565b600b60008681526020019081526020016000208190555061d9bb565b61d9ba7fcd54273b660ce6cffd80afefdec59b42d4679a3bf27ad2452ca7dd7ebf9064a060001b6143ad565b5b50505050565b600061d9ef7f996468adab2cfba5de081e00c611ca70c15d8fec7d5bf522494a62c1469ffa6a60001b61da8f565b61da1b7f9f1ba2348d57cab76c102a92e631d7e3d939d3a1ce6cb3a01a504d1656b19f5060001b61da8f565b61da477f46d4aa33cd017349564c3524038979baabbfc921b9cf218610f32f2cefa7e6de60001b61da8f565b61da8783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061dcde565b905092915050565b50565b600061dac07f97bc992a4f710454ab746d4db616a64ea018383de54a85d139640731ed8b5fc560001b61da8f565b61daec7f67e24e464bd90888e5a6d6d7c05830895e792029cec27ec532870f3734c4e9ea60001b61da8f565b61db187f4039b6d8f47f4ca568e409887bf0e53b596c141aaf42f7df7fbed083576f3bfa60001b61da8f565b61db447fd3eabfc731565b9df642e5c91d1b10abe52f04d31e4ba5ae2cc5610aba56017960001b61da8f565b83831115829061dbef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561dbb457808201518184015260208101905061db99565b50505050905090810190601f16801561dbe15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061dc1c7f1be1097c7e714e366e7336e422166ce73c2ec11ee3b5c610e0201606faa1e3c360001b61da8f565b61dc487f62288fe6f0a7956d13aa94e419476e92affec09faeb973818c5a82c870581e6660001b61da8f565b61dc747f2eccc13b0d77f3b98461d150ed7c0bf1e17fbc9b8605d30fcc0d7af3d9c4977e60001b61da8f565b6000838503905061dca77f090094c41ccfe2cce7f6f6a4a1a9aecd44506a466b0045ca8d92810149fede6960001b61da8f565b61dcd37f93915212060404093bbcece6fae9c03e5916d81ccc52020014493ab5283dd97560001b61da8f565b809150509392505050565b600061dd0c7f196dd912071b7ac5c8a10b8a236898e903a5c95f5189a9aeb16dc1191096752060001b61da8f565b61dd387ff25ec16e9c80532b14a66f8cd16ae291eebc856235e409a39c3fbd9dc53e53fb60001b61da8f565b61dd647ffb609f676697fca43f3242dd637f8af44d19e0456d05ec1547a1557478b8a1ea60001b61da8f565b61dd907ffc25a7e532044dc446303b3445457a6ba5f30c2ec2085a7b37e4ae0e05b09ba260001b61da8f565b6000831415829061de3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561de0157808201518184015260208101905061dde6565b50505050905090810190601f16801561de2e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061de697f295ce5b61523fe81f08b0e41715a55fb7cc4323fa58af5f536a59e28b507ad6660001b61da8f565b61de957f4460e22500904e71005e8ef95355467cd96d8038ca3b358379ef52915f4cd11a60001b61da8f565b61dec17f898838ee4191c5d93d43aba28d5dace210f5b5fe59d06155be60fc494d99a9f060001b61da8f565b600083858161decc57fe5b04905061defb7f6d2a274d329c86c87e9d63cea7c87a6fd3d3ca9ab129144ff43f4724a38a4a5960001b61da8f565b61df277fbb4fe2c1c37d48811af5ff17eb49f43a22d0b33ae049d66f26c63e5ac81928dc60001b61da8f565b809150509392505050565b604051806101e0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000600181111561dfae57fe5b81526020016000600281111561dfc057fe5b81526020016000600381111561dfd257fe5b81526020016000600481111561dfe457fe5b8152509056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158204455e84ba3cbafc26c52c9ae32267af0c9cfb94d4e062e3afa07cf8e81f0521664736f6c63430005110032", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200469c3803806200469c833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82518660208202830111640100000000821117156200008c57600080fd5b82525081516020918201928201910280838360005b83811015620000bb578181015183820152602001620000a1565b50505050919091016040525060200151835190925083915060005b81811015620002325760026000848381518110620000f057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615620001555760405162461bcd60e51b81526004018080602001828103825260308152602001806200466c6030913960400191505060405180910390fd5b6001600260008584815181106200016857fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000838281518110620001b657fe5b602090810291909101810151825460018101845560009384529282902090920180546001600160a01b0319166001600160a01b03909316929092179091556040805133808252915191927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92918290030190a2600101620000d6565b5050506001600160a01b038116156200029157600580546001600160a01b0319166001600160a01b03831690811790915560405160009033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc50908390a45b50506143c980620002a36000396000f3fe6080604052600436106101f95760003560e01c8063836e386d1161010d578063b3ce74c7116100a0578063e0e3671c1161006f578063e0e3671c146109ed578063e87471a514610a20578063ea4ba2fa14610a53578063ee56797514610a9e578063fdc704d714610ab3576101f9565b8063b3ce74c7146108c1578063ca2dfd0a146108fa578063d6febde81461092d578063d96e9de314610950576101f9565b8063a0e67e2b116100dc578063a0e67e2b1461079a578063a935e766146107ff578063ab18af2714610814578063af7cea7d14610847576101f9565b8063836e386d146106235780638acb0e6b146106615780638e1ba962146106ec5780639000b3d614610767576101f9565b806321df0da7116101905780636e1b400b1161015f5780636e1b400b1461053c5780637065cb481461055157806376d73a76146105845780637baec6ae146105ba5780638259ab11146105f3576101f9565b806321df0da71461049757806343a40e3f146104ac57806365e168d3146104df57806367184e2814610527576101f9565b806315cccf8e116101cc57806315cccf8e146103d157806316a6288914610410578063173825d91461043a578063194e13621461046d576101f9565b80630487e0b2146101fe57806309d5ff14146102495780631291e84f146102d357806312b0d400146103a0575b600080fd5b34801561020a57600080fd5b506102376004803603604081101561022157600080fd5b506001600160a01b038135169060200135610ae6565b60408051918252519081900360200190f35b34801561025557600080fd5b5061023760048036036101a081101561026d57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906001600160a01b03610100820135169060ff610120820135811691610140810135821691610160820135811691610180013516610b11565b3480156102df57600080fd5b5061039e600480360360408110156102f657600080fd5b810190602081018135600160201b81111561031057600080fd5b82018360208201111561032257600080fd5b803590602001918460208302840111600160201b8311171561034357600080fd5b919390929091602081019035600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b509092509050610beb565b005b3480156103ac57600080fd5b506103b5610cc8565b604080516001600160a01b039092168252519081900360200190f35b3480156103dd57600080fd5b5061039e600480360360808110156103f457600080fd5b508035906020810135906040810135906060013560ff16610cd7565b34801561041c57600080fd5b506102376004803603602081101561043357600080fd5b5035610d37565b34801561044657600080fd5b5061039e6004803603602081101561045d57600080fd5b50356001600160a01b0316610d4c565b34801561047957600080fd5b506102376004803603602081101561049057600080fd5b5035610da6565b3480156104a357600080fd5b506103b5610db8565b3480156104b857600080fd5b5061039e600480360360408110156104cf57600080fd5b508035906020013560ff16610dc7565b3480156104eb57600080fd5b5061039e6004803603608081101561050257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610e23565b34801561053357600080fd5b50610237610e7d565b34801561054857600080fd5b506103b5610e83565b34801561055d57600080fd5b5061039e6004803603602081101561057457600080fd5b50356001600160a01b0316610e92565b34801561059057600080fd5b5061039e600480360360608110156105a757600080fd5b5080359060208101359060400135610ee9565b3480156105c657600080fd5b5061039e600480360360408110156105dd57600080fd5b506001600160a01b038135169060200135610f47565b3480156105ff57600080fd5b5061039e6004803603604081101561061657600080fd5b5080359060200135610f9f565b34801561062f57600080fd5b5061064d6004803603602081101561064657600080fd5b5035610ff7565b604080519115158252519081900360200190f35b34801561066d57600080fd5b5061039e6004803603604081101561068457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b50909250905061100c565b3480156106f857600080fd5b5061039e6004803603604081101561070f57600080fd5b810190602081018135600160201b81111561072957600080fd5b82018360208201111561073b57600080fd5b803590602001918460208302840111600160201b8311171561075c57600080fd5b91935091503561107d565b34801561077357600080fd5b5061039e6004803603602081101561078a57600080fd5b50356001600160a01b0316611103565b3480156107a657600080fd5b506107af61115a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107eb5781810151838201526020016107d3565b505050509050019250505060405180910390f35b34801561080b57600080fd5b506107af6111bc565b34801561082057600080fd5b5061039e6004803603602081101561083757600080fd5b50356001600160a01b031661121c565b34801561085357600080fd5b506108716004803603602081101561086a57600080fd5b5035611273565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b3480156108cd57600080fd5b5061064d600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611427565b34801561090657600080fd5b5061039e6004803603602081101561091d57600080fd5b50356001600160a01b0316611452565b61039e6004803603604081101561094357600080fd5b50803590602001356114a9565b34801561095c57600080fd5b5061097a6004803603602081101561097357600080fd5b50356114b3565b6040516001600160a01b03861681526020810185600181111561099957fe5b60ff1681526020018460028111156109ad57fe5b60ff1681526020018360038111156109c157fe5b60ff1681526020018260048111156109d557fe5b60ff1681526020019550505050505060405180910390f35b3480156109f957600080fd5b5061064d60048036036020811015610a1057600080fd5b50356001600160a01b0316611638565b348015610a2c57600080fd5b5061039e60048036036020811015610a4357600080fd5b50356001600160a01b0316611656565b348015610a5f57600080fd5b5061039e600480360360c0811015610a7657600080fd5b5080359060208101359060408101359060608101359060808101359060a0013560ff166116ad565b348015610aaa57600080fd5b5061039e611711565b348015610abf57600080fd5b5061064d60048036036020811015610ad657600080fd5b50356001600160a01b031661171b565b6001600160a01b03821660009081526009602090815260408083208484529091529020545b92915050565b3360009081526002602052604081205460ff16610b5f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b50600480546001019081905560408051828152905133917eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b919081900360200190a2610baa8185611739565b610bb6818888886117c7565b610bc0818f61190e565b610bce818a8a8e8e87611ca7565b610bda818e8e86611ddd565b9d9c50505050505050505050505050565b3360009081526003602052604090205460ff16610c395760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b828114610c775760405162461bcd60e51b8152600401808060200182810382526034815260200180613e366034913960400191505060405180910390fd5b60005b83811015610cc157610cb9858583818110610c9157fe5b905060200201356001600160a01b0316848484818110610cad57fe5b90506020020135611f99565b600101610c7a565b5050505050565b6005546001600160a01b031690565b3360009081526002602052604090205460ff16610d255760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d3184848484611ddd565b50505050565b6000818152600b60205260409020545b919050565b3360009081526002602052604090205460ff16610d9a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612043565b50565b6000908152600a602052604090205490565b6006546001600160a01b031690565b3360009081526002602052604090205460ff16610e155760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f8282611739565b5050565b3360009081526002602052604090205460ff16610e715760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d31848484846117c7565b60045490565b6007546001600160a01b031690565b3360009081526002602052604090205460ff16610ee05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816121d4565b3360009081526002602052604090205460ff16610f375760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610f42838383612323565b505050565b3360009081526003602052604090205460ff16610f955760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b610e1f8282611f99565b3360009081526002602052604090205460ff16610fed5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f828261190e565b6000908152600c602052604090205460ff1690565b3360009081526003602052604090205460ff1661105a5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b81811015610d315761107584848484818110610cad57fe5b60010161105d565b3360009081526003602052604090205460ff166110cb5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b82811015610d31576110fb8484838181106110e557fe5b905060200201356001600160a01b031683611f99565b6001016110ce565b3360009081526002602052604090205460ff166111515760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816123c2565b606060008054806020026020016040519081016040528092919081815260200182805480156111b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611194575b5050505050905090565b606060018054806020026020016040519081016040528092919081815260200182805480156111b2576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611194575050505050905090565b3360009081526002602052604090205460ff1661126a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612510565b60008060008060008060008060008061128a613c88565b60008c81526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561133957fe5b600181111561134457fe5b8152602001600a820160159054906101000a900460ff16600281111561136657fe5b600281111561137157fe5b8152602001600a820160169054906101000a900460ff16600381111561139357fe5b600381111561139e57fe5b8152602001600a820160179054906101000a900460ff1660048111156113c057fe5b60048111156113cb57fe5b815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b6001600160a01b03919091166000908152600d60209081526040808320938352929052205460ff1690565b3360009081526002602052604090205460ff166114a05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816125b3565b610e1f8282612746565b60008060008060006114c3613c88565b60008781526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561157257fe5b600181111561157d57fe5b8152602001600a820160159054906101000a900460ff16600281111561159f57fe5b60028111156115aa57fe5b8152602001600a820160169054906101000a900460ff1660038111156115cc57fe5b60038111156115d757fe5b8152602001600a820160179054906101000a900460ff1660048111156115f957fe5b600481111561160457fe5b9052506101408101516101608201516101808301516101a08401516101c090940151929b919a509850919650945092505050565b6001600160a01b031660009081526002602052604090205460ff1690565b3360009081526002602052604090205460ff166116a45760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612db8565b3360009081526002602052604090205460ff166116fb5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b611709868686868686611ca7565b505050505050565b611719612e5b565b565b6001600160a01b031660009081526003602052604090205460ff1690565b6000828152600860205260409020600a01805482919060ff60a81b1916600160a81b83600281111561176757fe5b0217905550336001600160a01b03167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a482378383604051808381526020018260028111156117af57fe5b60ff1681526020019250505060405180910390a25050565b600083116118065760405162461bcd60e51b815260040180806020018281038252602981526020018061425e6029913960400191505060405180910390fd5b600181600181111561181457fe5b141561185f576001600160a01b03821661185f5760405162461bcd60e51b81526004018080602001828103825260328152602001806140a86032913960400191505060405180910390fd5b600084815260086020526040902060098101849055600a0180546001600160a01b0319166001600160a01b0384161780825582919060ff60a01b1916600160a01b8360018111156118ac57fe5b02179055508060018111156118bd57fe5b60408051868152602081018690526001600160a01b03851681830152905133917f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7919081900360600190a350505050565b6000811161194d5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e6a603c913960400191505060405180910390fd5b600082815260086020526040902060098101546001909101548291611978919063ffffffff6130e416565b11156119b55760405162461bcd60e51b815260040180806020018281038252604c8152602001806142c1604c913960600191505060405180910390fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d6020811015611a2a57600080fd5b505160008481526008602052604081206002015491925090611a6a90611a5e85611a52613144565b9063ffffffff61318316565b9063ffffffff6131dd16565b905081811115611b72576006546000906001600160a01b03166323b872dd3330611a9a868863ffffffff6131dd16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b505050506040513d6020811015611b2c57600080fd5b5051905080611b6c5760405162461bcd60e51b815260040180806020018281038252603e8152602001806141ea603e913960400191505060405180910390fd5b50611c52565b6006546000906001600160a01b031663a9059cbb33611b97868663ffffffff6131dd16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b5051905080611c505760405162461bcd60e51b8152600401808060200182810382526038815260200180613fdf6038913960400191505060405180910390fd5b505b6000848152600860209081526040918290206002018590558151868152908101859052815133927fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca95928290030190a250505050565b83851115611ce65760405162461bcd60e51b8152600401808060200182810382526029815260200180613fb66029913960400191505060405180910390fd5b612710821115611d275760405162461bcd60e51b81526004018080602001828103825260378152602001806140386037913960400191505060405180910390fd5b6000868152600860208190526040909120600781018790559081018590556005810184905560068101839055600a01805482919060ff60b81b1916600160b81b836004811115611d7357fe5b0217905550806004811115611d8457fe5b60408051888152602081018890528082018790526060810186905260808101859052905133917f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e3919081900360a00190a3505050505050565b8215801590611deb57508115155b8015611e0257506002816003811115611e0057fe5b145b15611e595742611e18848463ffffffff61318316565b11611e545760405162461bcd60e51b815260040180806020018281038252603a815260200180614287603a913960400191505060405180910390fd5b611efe565b82151580611e6657508115155b8015611e7d57506003816003811115611e7b57fe5b145b15611efe57818310611ec05760405162461bcd60e51b815260040180806020018281038252603b815260200180613dcf603b913960400191505060405180910390fd5b428211611efe5760405162461bcd60e51b81526004018080602001828103825260368152602001806142286036913960400191505060405180910390fd5b6000848152600860205260409020600380820185905560048201849055600a9091018054839260ff60b01b1990911690600160b01b908490811115611f3f57fe5b0217905550806003811115611f5057fe5b6040805186815260208101869052808201859052905133917f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f582650919081900360600190a350505050565b6001600160a01b038216611fde5760405162461bcd60e51b8152600401808060200182810382526033815260200180613ea66033913960400191505060405180910390fd5b6001600160a01b0382166000818152600d60209081526040808320858452825291829020805460ff191660011790558151848152915133927fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f492908290030190a35050565b6001600160a01b03811660009081526002602052604090205460ff1661209a5760405162461bcd60e51b815260040180806020018281038252602681526020018061430d6026913960400191505060405180910390fd5b6001600160a01b0381166000908152600260205260408120805460ff191690558054905b8181101561216157600081815481106120d357fe5b6000918252602090912001546001600160a01b0384811691161415612159576000600183038154811061210257fe5b600091825260208220015481546001600160a01b0390911691908390811061212657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612161565b6001016120be565b50600080548061216d57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f93003679928290030190a25050565b6001600160a01b03811661222f576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156122875760405162461bcd60e51b815260040180806020018281038252602a815260200180613da5602a913960400191505060405180910390fd5b6001600160a01b0381166000818152600260209081526040808320805460ff19166001908117909155835490810184559280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390920180546001600160a01b031916841790558151928352905133927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92908290030190a250565b808211156123625760405162461bcd60e51b815260040180806020018281038252603981526020018061406f6039913960400191505060405180910390fd5b6000838152600860209081526040918290208481556001018390558151858152908101849052808201839052905133917fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c919081900360600190a2505050565b6001600160a01b03811661241d576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16156124755760405162461bcd60e51b815260040180806020018281038252602c815260200180613ed9602c913960400191505060405180910390fd5b6001600160a01b0381166000818152600360209081526040808320805460ff191660019081179091558054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b031916841790558151928352905133927fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e92908290030190a250565b6001600160a01b0381166125555760405162461bcd60e51b815260040180806020018281038252602c815260200180613e0a602c913960400191505060405180910390fd5b6005546040516001600160a01b0380841692169033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5090600090a4600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604090205460ff1661260a5760405162461bcd60e51b81526004018080602001828103825260288152602001806141976028913960400191505060405180910390fd5b6001600160a01b0381166000908152600360205260408120805460ff19169055600154905b818110156126d3576001818154811061264457fe5b6000918252602090912001546001600160a01b03848116911614156126cb5760018083038154811061267257fe5b600091825260209091200154600180546001600160a01b03909216918390811061269857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506126d3565b60010161262f565b5060018054806126df57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed6928290030190a25050565b61274f8261321f565b6127a0576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6127a8613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561285757fe5b600181111561286257fe5b8152602001600a820160159054906101000a900460ff16600281111561288457fe5b600281111561288f57fe5b8152602001600a820160169054906101000a900460ff1660038111156128b157fe5b60038111156128bc57fe5b8152602001600a820160179054906101000a900460ff1660048111156128de57fe5b60048111156128e957fe5b90525090506000816101800151600281111561290157fe5b141561293e5760405162461bcd60e51b815260040180806020018281038252602881526020018061436d6028913960400191505060405180910390fd5b6002816101800151600281111561295157fe5b14156129b057336000908152600d6020908152604080832086845290915290205460ff166129b05760405162461bcd60e51b8152600401808060200182810382526028815260200180613f686028913960400191505060405180910390fd5b336000908152600960209081526040808320868452825290912054908201518110612a0c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613f056031913960400191505060405180910390fd5b6000808361016001516001811115612a2057fe5b1415612a2d575034612b7e565b83612a695760405162461bcd60e51b81526004018080602001828103825260238152602001806141486023913960400191505060405180910390fd5b6101408301516001600160a01b0316612ab35760405162461bcd60e51b815260040180806020018281038252602c81526020018061416b602c913960400191505060405180910390fd5b610140830151604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015612b0f57600080fd5b505af1158015612b23573d6000803e3d6000fd5b505050506040513d6020811015612b3957600080fd5b5051905080612b795760405162461bcd60e51b815260040180806020018281038252603a815260200180614333603a913960400191505060405180910390fd5b849150505b8251600090821015612bc15760405162461bcd60e51b8152600401808060200182810382526032815260200180613f366032913960400191505060405180910390fd5b60208401518290612bd8908563ffffffff6131dd16565b11612c11576020840151612bf690611a5e848663ffffffff61318316565b6020850151909150612c0e908463ffffffff6131dd16565b91505b6000612c2b856101200151846130e490919063ffffffff16565b6040860151909150612c43908263ffffffff6131dd16565b604080870191909152336000908152600960209081528282208a835290522054612c73908263ffffffff61318316565b3360009081526009602090815260408083208b8452909152902055612c988782613463565b612ca18761388f565b612cad87848684613af5565b8115612d75576101408501516040805163a9059cbb60e01b81523360048201526024810185905290516000926001600160a01b03169163a9059cbb91604480830192602092919082900301818787803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506040513d6020811015612d3357600080fd5b5051905080612d735760405162461bcd60e51b815260040180806020018281038252603981526020018061410f6039913960400191505060405180910390fd5b505b6040805188815260208101839052815133927f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba0928290030190a250505050505050565b6001600160a01b038116612dfd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d756030913960400191505060405180910390fd5b6007546040516001600160a01b0380841692169033907f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce190600090a4600780546001600160a01b0319166001600160a01b0392909216919091179055565b612e6433611638565b80612e7957506005546001600160a01b031633145b612eb45760405162461bcd60e51b81526004018080602001828103825260358152602001806140da6035913960400191505060405180910390fd5b60055433906001600160a01b031615612ed557506005546001600160a01b03165b60015b6004548111610e1f576000818152600c602052604090205460ff16156130dc57600081815260086020908152604080832060090154600b909252822054612f249163ffffffff613b4a16565b9050600080838152600860205260409020600a0154600160a01b900460ff166001811115612f4e57fe5b1415612ffa576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612f8a573d6000803e3d6000fd5b50826001600160a01b0316336001600160a01b03167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c8460008560405180848152602001836001811115612fda57fe5b60ff168152602001828152602001935050505060405180910390a36130da565b6000828152600860209081526040808320600a0154815163a9059cbb60e01b81526001600160a01b038881166004830152602482018790529251929091169363a9059cbb9360448084019491939192918390030190829087803b15801561306057600080fd5b505af1158015613074573d6000803e3d6000fd5b505050506040513d602081101561308a57600080fd5b5050604080518381526001602082015280820183905290516001600160a01b0385169133917fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c9181900360600190a35b505b600101612ed8565b6000826130f357506000610b0b565b8282028284828161310057fe5b041461313d5760405162461bcd60e51b81526004018080602001828103825260218152602001806140176021913960400191505060405180910390fd5b9392505050565b600060015b600454811161317f5760008181526008602052604090206002015461317590839063ffffffff61318316565b9150600101613149565b5090565b60008282018381101561313d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061313d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8c565b60008181526008602052604081206003015461326c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613f906026913960400191505060405180910390fd5b6000828152600c602052604090205460ff16156132d0576040805162461bcd60e51b815260206004820152601860248201527f4f726967696e73426173653a2053616c6520656e6465642e0000000000000000604482015290519081900360640190fd5b600080838152600860205260409020600a0154600160b01b900460ff1660038111156132f857fe5b141561330657506000610d47565b60016000838152600860205260409020600a0154600160b01b900460ff16600381111561332f57fe5b14801561334b5750600082815260086020526040902060020154155b1561336f57506000818152600c60205260408120805460ff19166001179055610d47565b60036000838152600860205260409020600a0154600160b01b900460ff16600381111561339857fe5b1480156133b5575060008281526008602052604090206004015442115b156133d957506000818152600c60205260408120805460ff19166001179055610d47565b60026000838152600860205260409020600a0154600160b01b900460ff16600381111561340257fe5b1480156134375750600082815260086020526040902060048101546003909101544291613435919063ffffffff61318316565b105b1561345b57506000818152600c60205260408120805460ff19166001179055610d47565b506001919050565b61346b613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561351a57fe5b600181111561352557fe5b8152602001600a820160159054906101000a900460ff16600281111561354757fe5b600281111561355257fe5b8152602001600a820160169054906101000a900460ff16600381111561357457fe5b600381111561357f57fe5b8152602001600a820160179054906101000a900460ff1660048111156135a157fe5b60048111156135ac57fe5b90525090506000816101c0015160048111156135c457fe5b14156136015760405162461bcd60e51b815260040180806020018281038252602b8152602001806141bf602b913960400191505060405180910390fd5b6001816101c00151600481111561361457fe5b14156136a3576101408101516040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50610f429050565b6002816101c0015160048111156136b657fe5b1415613700576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b6003816101c00151600481111561371357fe5b1415613832576006546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561377257600080fd5b505af1158015613786573d6000803e3d6000fd5b505050506040513d602081101561379c57600080fd5b505060075460e082015161010083015160c08401516040805163849a681760e01b815233600482015260248101889052604481019490945260648401929092526084830152516001600160a01b039092169163849a68179160a48082019260009290919082900301818387803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b50505050610f42565b6004816101c00151600481111561384557fe5b1415610f42576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b613897613c88565b60008281526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561394657fe5b600181111561395157fe5b8152602001600a820160159054906101000a900460ff16600281111561397357fe5b600281111561397e57fe5b8152602001600a820160169054906101000a900460ff1660038111156139a057fe5b60038111156139ab57fe5b8152602001600a820160179054906101000a900460ff1660048111156139cd57fe5b60048111156139d857fe5b815250509050806020015181604001511015610e1f57805160408201511015613a9c576040810151613a54576000828152600c6020908152604091829020805460ff191660011790558151848152915133927f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c492908290030190a25b6000828152600860209081526040808320929092558151848152915133927f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a7892908290030190a25b6040808201805160008581526008602090815290849020600101919091559051825185815291820152815133927f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445928290030190a25050565b8215610d315781613b16576000848152600a60205260409020805460010190555b6000848152600b6020526040902054613b35908263ffffffff61318316565b6000858152600b602052604090205550505050565b600061313d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c23565b60008184841115613c1b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be0578181015183820152602001613bc8565b50505050905090810190601f168015613c0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c725760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be0578181015183820152602001613bc8565b506000838581613c7e57fe5b0495945050505050565b604051806101e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001811115613cf757fe5b81526020016000815260200160008152602001600090529056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158202d89714341304412ad9b2eeadcb8fe4b28f640f6add719b48e8bd0a43deef74364736f6c634300051100324f726967696e7341646d696e3a2045616368206f776e65722063616e206265206164646564206f6e6c79206f6e63652e", + "deployedBytecode": "0x6080604052600436106101f95760003560e01c8063836e386d1161010d578063b3ce74c7116100a0578063e0e3671c1161006f578063e0e3671c146109ed578063e87471a514610a20578063ea4ba2fa14610a53578063ee56797514610a9e578063fdc704d714610ab3576101f9565b8063b3ce74c7146108c1578063ca2dfd0a146108fa578063d6febde81461092d578063d96e9de314610950576101f9565b8063a0e67e2b116100dc578063a0e67e2b1461079a578063a935e766146107ff578063ab18af2714610814578063af7cea7d14610847576101f9565b8063836e386d146106235780638acb0e6b146106615780638e1ba962146106ec5780639000b3d614610767576101f9565b806321df0da7116101905780636e1b400b1161015f5780636e1b400b1461053c5780637065cb481461055157806376d73a76146105845780637baec6ae146105ba5780638259ab11146105f3576101f9565b806321df0da71461049757806343a40e3f146104ac57806365e168d3146104df57806367184e2814610527576101f9565b806315cccf8e116101cc57806315cccf8e146103d157806316a6288914610410578063173825d91461043a578063194e13621461046d576101f9565b80630487e0b2146101fe57806309d5ff14146102495780631291e84f146102d357806312b0d400146103a0575b600080fd5b34801561020a57600080fd5b506102376004803603604081101561022157600080fd5b506001600160a01b038135169060200135610ae6565b60408051918252519081900360200190f35b34801561025557600080fd5b5061023760048036036101a081101561026d57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906001600160a01b03610100820135169060ff610120820135811691610140810135821691610160820135811691610180013516610b11565b3480156102df57600080fd5b5061039e600480360360408110156102f657600080fd5b810190602081018135600160201b81111561031057600080fd5b82018360208201111561032257600080fd5b803590602001918460208302840111600160201b8311171561034357600080fd5b919390929091602081019035600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b509092509050610beb565b005b3480156103ac57600080fd5b506103b5610cc8565b604080516001600160a01b039092168252519081900360200190f35b3480156103dd57600080fd5b5061039e600480360360808110156103f457600080fd5b508035906020810135906040810135906060013560ff16610cd7565b34801561041c57600080fd5b506102376004803603602081101561043357600080fd5b5035610d37565b34801561044657600080fd5b5061039e6004803603602081101561045d57600080fd5b50356001600160a01b0316610d4c565b34801561047957600080fd5b506102376004803603602081101561049057600080fd5b5035610da6565b3480156104a357600080fd5b506103b5610db8565b3480156104b857600080fd5b5061039e600480360360408110156104cf57600080fd5b508035906020013560ff16610dc7565b3480156104eb57600080fd5b5061039e6004803603608081101561050257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610e23565b34801561053357600080fd5b50610237610e7d565b34801561054857600080fd5b506103b5610e83565b34801561055d57600080fd5b5061039e6004803603602081101561057457600080fd5b50356001600160a01b0316610e92565b34801561059057600080fd5b5061039e600480360360608110156105a757600080fd5b5080359060208101359060400135610ee9565b3480156105c657600080fd5b5061039e600480360360408110156105dd57600080fd5b506001600160a01b038135169060200135610f47565b3480156105ff57600080fd5b5061039e6004803603604081101561061657600080fd5b5080359060200135610f9f565b34801561062f57600080fd5b5061064d6004803603602081101561064657600080fd5b5035610ff7565b604080519115158252519081900360200190f35b34801561066d57600080fd5b5061039e6004803603604081101561068457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b50909250905061100c565b3480156106f857600080fd5b5061039e6004803603604081101561070f57600080fd5b810190602081018135600160201b81111561072957600080fd5b82018360208201111561073b57600080fd5b803590602001918460208302840111600160201b8311171561075c57600080fd5b91935091503561107d565b34801561077357600080fd5b5061039e6004803603602081101561078a57600080fd5b50356001600160a01b0316611103565b3480156107a657600080fd5b506107af61115a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107eb5781810151838201526020016107d3565b505050509050019250505060405180910390f35b34801561080b57600080fd5b506107af6111bc565b34801561082057600080fd5b5061039e6004803603602081101561083757600080fd5b50356001600160a01b031661121c565b34801561085357600080fd5b506108716004803603602081101561086a57600080fd5b5035611273565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b3480156108cd57600080fd5b5061064d600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611427565b34801561090657600080fd5b5061039e6004803603602081101561091d57600080fd5b50356001600160a01b0316611452565b61039e6004803603604081101561094357600080fd5b50803590602001356114a9565b34801561095c57600080fd5b5061097a6004803603602081101561097357600080fd5b50356114b3565b6040516001600160a01b03861681526020810185600181111561099957fe5b60ff1681526020018460028111156109ad57fe5b60ff1681526020018360038111156109c157fe5b60ff1681526020018260048111156109d557fe5b60ff1681526020019550505050505060405180910390f35b3480156109f957600080fd5b5061064d60048036036020811015610a1057600080fd5b50356001600160a01b0316611638565b348015610a2c57600080fd5b5061039e60048036036020811015610a4357600080fd5b50356001600160a01b0316611656565b348015610a5f57600080fd5b5061039e600480360360c0811015610a7657600080fd5b5080359060208101359060408101359060608101359060808101359060a0013560ff166116ad565b348015610aaa57600080fd5b5061039e611711565b348015610abf57600080fd5b5061064d60048036036020811015610ad657600080fd5b50356001600160a01b031661171b565b6001600160a01b03821660009081526009602090815260408083208484529091529020545b92915050565b3360009081526002602052604081205460ff16610b5f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b50600480546001019081905560408051828152905133917eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b919081900360200190a2610baa8185611739565b610bb6818888886117c7565b610bc0818f61190e565b610bce818a8a8e8e87611ca7565b610bda818e8e86611ddd565b9d9c50505050505050505050505050565b3360009081526003602052604090205460ff16610c395760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b828114610c775760405162461bcd60e51b8152600401808060200182810382526034815260200180613e366034913960400191505060405180910390fd5b60005b83811015610cc157610cb9858583818110610c9157fe5b905060200201356001600160a01b0316848484818110610cad57fe5b90506020020135611f99565b600101610c7a565b5050505050565b6005546001600160a01b031690565b3360009081526002602052604090205460ff16610d255760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d3184848484611ddd565b50505050565b6000818152600b60205260409020545b919050565b3360009081526002602052604090205460ff16610d9a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612043565b50565b6000908152600a602052604090205490565b6006546001600160a01b031690565b3360009081526002602052604090205460ff16610e155760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f8282611739565b5050565b3360009081526002602052604090205460ff16610e715760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d31848484846117c7565b60045490565b6007546001600160a01b031690565b3360009081526002602052604090205460ff16610ee05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816121d4565b3360009081526002602052604090205460ff16610f375760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610f42838383612323565b505050565b3360009081526003602052604090205460ff16610f955760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b610e1f8282611f99565b3360009081526002602052604090205460ff16610fed5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f828261190e565b6000908152600c602052604090205460ff1690565b3360009081526003602052604090205460ff1661105a5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b81811015610d315761107584848484818110610cad57fe5b60010161105d565b3360009081526003602052604090205460ff166110cb5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b82811015610d31576110fb8484838181106110e557fe5b905060200201356001600160a01b031683611f99565b6001016110ce565b3360009081526002602052604090205460ff166111515760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816123c2565b606060008054806020026020016040519081016040528092919081815260200182805480156111b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611194575b5050505050905090565b606060018054806020026020016040519081016040528092919081815260200182805480156111b2576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611194575050505050905090565b3360009081526002602052604090205460ff1661126a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612510565b60008060008060008060008060008061128a613c88565b60008c81526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561133957fe5b600181111561134457fe5b8152602001600a820160159054906101000a900460ff16600281111561136657fe5b600281111561137157fe5b8152602001600a820160169054906101000a900460ff16600381111561139357fe5b600381111561139e57fe5b8152602001600a820160179054906101000a900460ff1660048111156113c057fe5b60048111156113cb57fe5b815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b6001600160a01b03919091166000908152600d60209081526040808320938352929052205460ff1690565b3360009081526002602052604090205460ff166114a05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816125b3565b610e1f8282612746565b60008060008060006114c3613c88565b60008781526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561157257fe5b600181111561157d57fe5b8152602001600a820160159054906101000a900460ff16600281111561159f57fe5b60028111156115aa57fe5b8152602001600a820160169054906101000a900460ff1660038111156115cc57fe5b60038111156115d757fe5b8152602001600a820160179054906101000a900460ff1660048111156115f957fe5b600481111561160457fe5b9052506101408101516101608201516101808301516101a08401516101c090940151929b919a509850919650945092505050565b6001600160a01b031660009081526002602052604090205460ff1690565b3360009081526002602052604090205460ff166116a45760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612db8565b3360009081526002602052604090205460ff166116fb5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b611709868686868686611ca7565b505050505050565b611719612e5b565b565b6001600160a01b031660009081526003602052604090205460ff1690565b6000828152600860205260409020600a01805482919060ff60a81b1916600160a81b83600281111561176757fe5b0217905550336001600160a01b03167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a482378383604051808381526020018260028111156117af57fe5b60ff1681526020019250505060405180910390a25050565b600083116118065760405162461bcd60e51b815260040180806020018281038252602981526020018061425e6029913960400191505060405180910390fd5b600181600181111561181457fe5b141561185f576001600160a01b03821661185f5760405162461bcd60e51b81526004018080602001828103825260328152602001806140a86032913960400191505060405180910390fd5b600084815260086020526040902060098101849055600a0180546001600160a01b0319166001600160a01b0384161780825582919060ff60a01b1916600160a01b8360018111156118ac57fe5b02179055508060018111156118bd57fe5b60408051868152602081018690526001600160a01b03851681830152905133917f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7919081900360600190a350505050565b6000811161194d5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e6a603c913960400191505060405180910390fd5b600082815260086020526040902060098101546001909101548291611978919063ffffffff6130e416565b11156119b55760405162461bcd60e51b815260040180806020018281038252604c8152602001806142c1604c913960600191505060405180910390fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d6020811015611a2a57600080fd5b505160008481526008602052604081206002015491925090611a6a90611a5e85611a52613144565b9063ffffffff61318316565b9063ffffffff6131dd16565b905081811115611b72576006546000906001600160a01b03166323b872dd3330611a9a868863ffffffff6131dd16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b505050506040513d6020811015611b2c57600080fd5b5051905080611b6c5760405162461bcd60e51b815260040180806020018281038252603e8152602001806141ea603e913960400191505060405180910390fd5b50611c52565b6006546000906001600160a01b031663a9059cbb33611b97868663ffffffff6131dd16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b5051905080611c505760405162461bcd60e51b8152600401808060200182810382526038815260200180613fdf6038913960400191505060405180910390fd5b505b6000848152600860209081526040918290206002018590558151868152908101859052815133927fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca95928290030190a250505050565b83851115611ce65760405162461bcd60e51b8152600401808060200182810382526029815260200180613fb66029913960400191505060405180910390fd5b612710821115611d275760405162461bcd60e51b81526004018080602001828103825260378152602001806140386037913960400191505060405180910390fd5b6000868152600860208190526040909120600781018790559081018590556005810184905560068101839055600a01805482919060ff60b81b1916600160b81b836004811115611d7357fe5b0217905550806004811115611d8457fe5b60408051888152602081018890528082018790526060810186905260808101859052905133917f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e3919081900360a00190a3505050505050565b8215801590611deb57508115155b8015611e0257506002816003811115611e0057fe5b145b15611e595742611e18848463ffffffff61318316565b11611e545760405162461bcd60e51b815260040180806020018281038252603a815260200180614287603a913960400191505060405180910390fd5b611efe565b82151580611e6657508115155b8015611e7d57506003816003811115611e7b57fe5b145b15611efe57818310611ec05760405162461bcd60e51b815260040180806020018281038252603b815260200180613dcf603b913960400191505060405180910390fd5b428211611efe5760405162461bcd60e51b81526004018080602001828103825260368152602001806142286036913960400191505060405180910390fd5b6000848152600860205260409020600380820185905560048201849055600a9091018054839260ff60b01b1990911690600160b01b908490811115611f3f57fe5b0217905550806003811115611f5057fe5b6040805186815260208101869052808201859052905133917f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f582650919081900360600190a350505050565b6001600160a01b038216611fde5760405162461bcd60e51b8152600401808060200182810382526033815260200180613ea66033913960400191505060405180910390fd5b6001600160a01b0382166000818152600d60209081526040808320858452825291829020805460ff191660011790558151848152915133927fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f492908290030190a35050565b6001600160a01b03811660009081526002602052604090205460ff1661209a5760405162461bcd60e51b815260040180806020018281038252602681526020018061430d6026913960400191505060405180910390fd5b6001600160a01b0381166000908152600260205260408120805460ff191690558054905b8181101561216157600081815481106120d357fe5b6000918252602090912001546001600160a01b0384811691161415612159576000600183038154811061210257fe5b600091825260208220015481546001600160a01b0390911691908390811061212657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612161565b6001016120be565b50600080548061216d57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f93003679928290030190a25050565b6001600160a01b03811661222f576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156122875760405162461bcd60e51b815260040180806020018281038252602a815260200180613da5602a913960400191505060405180910390fd5b6001600160a01b0381166000818152600260209081526040808320805460ff19166001908117909155835490810184559280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390920180546001600160a01b031916841790558151928352905133927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92908290030190a250565b808211156123625760405162461bcd60e51b815260040180806020018281038252603981526020018061406f6039913960400191505060405180910390fd5b6000838152600860209081526040918290208481556001018390558151858152908101849052808201839052905133917fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c919081900360600190a2505050565b6001600160a01b03811661241d576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16156124755760405162461bcd60e51b815260040180806020018281038252602c815260200180613ed9602c913960400191505060405180910390fd5b6001600160a01b0381166000818152600360209081526040808320805460ff191660019081179091558054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b031916841790558151928352905133927fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e92908290030190a250565b6001600160a01b0381166125555760405162461bcd60e51b815260040180806020018281038252602c815260200180613e0a602c913960400191505060405180910390fd5b6005546040516001600160a01b0380841692169033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5090600090a4600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604090205460ff1661260a5760405162461bcd60e51b81526004018080602001828103825260288152602001806141976028913960400191505060405180910390fd5b6001600160a01b0381166000908152600360205260408120805460ff19169055600154905b818110156126d3576001818154811061264457fe5b6000918252602090912001546001600160a01b03848116911614156126cb5760018083038154811061267257fe5b600091825260209091200154600180546001600160a01b03909216918390811061269857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506126d3565b60010161262f565b5060018054806126df57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed6928290030190a25050565b61274f8261321f565b6127a0576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6127a8613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561285757fe5b600181111561286257fe5b8152602001600a820160159054906101000a900460ff16600281111561288457fe5b600281111561288f57fe5b8152602001600a820160169054906101000a900460ff1660038111156128b157fe5b60038111156128bc57fe5b8152602001600a820160179054906101000a900460ff1660048111156128de57fe5b60048111156128e957fe5b90525090506000816101800151600281111561290157fe5b141561293e5760405162461bcd60e51b815260040180806020018281038252602881526020018061436d6028913960400191505060405180910390fd5b6002816101800151600281111561295157fe5b14156129b057336000908152600d6020908152604080832086845290915290205460ff166129b05760405162461bcd60e51b8152600401808060200182810382526028815260200180613f686028913960400191505060405180910390fd5b336000908152600960209081526040808320868452825290912054908201518110612a0c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613f056031913960400191505060405180910390fd5b6000808361016001516001811115612a2057fe5b1415612a2d575034612b7e565b83612a695760405162461bcd60e51b81526004018080602001828103825260238152602001806141486023913960400191505060405180910390fd5b6101408301516001600160a01b0316612ab35760405162461bcd60e51b815260040180806020018281038252602c81526020018061416b602c913960400191505060405180910390fd5b610140830151604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015612b0f57600080fd5b505af1158015612b23573d6000803e3d6000fd5b505050506040513d6020811015612b3957600080fd5b5051905080612b795760405162461bcd60e51b815260040180806020018281038252603a815260200180614333603a913960400191505060405180910390fd5b849150505b8251600090821015612bc15760405162461bcd60e51b8152600401808060200182810382526032815260200180613f366032913960400191505060405180910390fd5b60208401518290612bd8908563ffffffff6131dd16565b11612c11576020840151612bf690611a5e848663ffffffff61318316565b6020850151909150612c0e908463ffffffff6131dd16565b91505b6000612c2b856101200151846130e490919063ffffffff16565b6040860151909150612c43908263ffffffff6131dd16565b604080870191909152336000908152600960209081528282208a835290522054612c73908263ffffffff61318316565b3360009081526009602090815260408083208b8452909152902055612c988782613463565b612ca18761388f565b612cad87848684613af5565b8115612d75576101408501516040805163a9059cbb60e01b81523360048201526024810185905290516000926001600160a01b03169163a9059cbb91604480830192602092919082900301818787803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506040513d6020811015612d3357600080fd5b5051905080612d735760405162461bcd60e51b815260040180806020018281038252603981526020018061410f6039913960400191505060405180910390fd5b505b6040805188815260208101839052815133927f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba0928290030190a250505050505050565b6001600160a01b038116612dfd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d756030913960400191505060405180910390fd5b6007546040516001600160a01b0380841692169033907f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce190600090a4600780546001600160a01b0319166001600160a01b0392909216919091179055565b612e6433611638565b80612e7957506005546001600160a01b031633145b612eb45760405162461bcd60e51b81526004018080602001828103825260358152602001806140da6035913960400191505060405180910390fd5b60055433906001600160a01b031615612ed557506005546001600160a01b03165b60015b6004548111610e1f576000818152600c602052604090205460ff16156130dc57600081815260086020908152604080832060090154600b909252822054612f249163ffffffff613b4a16565b9050600080838152600860205260409020600a0154600160a01b900460ff166001811115612f4e57fe5b1415612ffa576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612f8a573d6000803e3d6000fd5b50826001600160a01b0316336001600160a01b03167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c8460008560405180848152602001836001811115612fda57fe5b60ff168152602001828152602001935050505060405180910390a36130da565b6000828152600860209081526040808320600a0154815163a9059cbb60e01b81526001600160a01b038881166004830152602482018790529251929091169363a9059cbb9360448084019491939192918390030190829087803b15801561306057600080fd5b505af1158015613074573d6000803e3d6000fd5b505050506040513d602081101561308a57600080fd5b5050604080518381526001602082015280820183905290516001600160a01b0385169133917fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c9181900360600190a35b505b600101612ed8565b6000826130f357506000610b0b565b8282028284828161310057fe5b041461313d5760405162461bcd60e51b81526004018080602001828103825260218152602001806140176021913960400191505060405180910390fd5b9392505050565b600060015b600454811161317f5760008181526008602052604090206002015461317590839063ffffffff61318316565b9150600101613149565b5090565b60008282018381101561313d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061313d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8c565b60008181526008602052604081206003015461326c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613f906026913960400191505060405180910390fd5b6000828152600c602052604090205460ff16156132d0576040805162461bcd60e51b815260206004820152601860248201527f4f726967696e73426173653a2053616c6520656e6465642e0000000000000000604482015290519081900360640190fd5b600080838152600860205260409020600a0154600160b01b900460ff1660038111156132f857fe5b141561330657506000610d47565b60016000838152600860205260409020600a0154600160b01b900460ff16600381111561332f57fe5b14801561334b5750600082815260086020526040902060020154155b1561336f57506000818152600c60205260408120805460ff19166001179055610d47565b60036000838152600860205260409020600a0154600160b01b900460ff16600381111561339857fe5b1480156133b5575060008281526008602052604090206004015442115b156133d957506000818152600c60205260408120805460ff19166001179055610d47565b60026000838152600860205260409020600a0154600160b01b900460ff16600381111561340257fe5b1480156134375750600082815260086020526040902060048101546003909101544291613435919063ffffffff61318316565b105b1561345b57506000818152600c60205260408120805460ff19166001179055610d47565b506001919050565b61346b613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561351a57fe5b600181111561352557fe5b8152602001600a820160159054906101000a900460ff16600281111561354757fe5b600281111561355257fe5b8152602001600a820160169054906101000a900460ff16600381111561357457fe5b600381111561357f57fe5b8152602001600a820160179054906101000a900460ff1660048111156135a157fe5b60048111156135ac57fe5b90525090506000816101c0015160048111156135c457fe5b14156136015760405162461bcd60e51b815260040180806020018281038252602b8152602001806141bf602b913960400191505060405180910390fd5b6001816101c00151600481111561361457fe5b14156136a3576101408101516040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50610f429050565b6002816101c0015160048111156136b657fe5b1415613700576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b6003816101c00151600481111561371357fe5b1415613832576006546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561377257600080fd5b505af1158015613786573d6000803e3d6000fd5b505050506040513d602081101561379c57600080fd5b505060075460e082015161010083015160c08401516040805163849a681760e01b815233600482015260248101889052604481019490945260648401929092526084830152516001600160a01b039092169163849a68179160a48082019260009290919082900301818387803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b50505050610f42565b6004816101c00151600481111561384557fe5b1415610f42576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b613897613c88565b60008281526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561394657fe5b600181111561395157fe5b8152602001600a820160159054906101000a900460ff16600281111561397357fe5b600281111561397e57fe5b8152602001600a820160169054906101000a900460ff1660038111156139a057fe5b60038111156139ab57fe5b8152602001600a820160179054906101000a900460ff1660048111156139cd57fe5b60048111156139d857fe5b815250509050806020015181604001511015610e1f57805160408201511015613a9c576040810151613a54576000828152600c6020908152604091829020805460ff191660011790558151848152915133927f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c492908290030190a25b6000828152600860209081526040808320929092558151848152915133927f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a7892908290030190a25b6040808201805160008581526008602090815290849020600101919091559051825185815291820152815133927f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445928290030190a25050565b8215610d315781613b16576000848152600a60205260409020805460010190555b6000848152600b6020526040902054613b35908263ffffffff61318316565b6000858152600b602052604090205550505050565b600061313d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c23565b60008184841115613c1b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be0578181015183820152602001613bc8565b50505050905090810190601f168015613c0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c725760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be0578181015183820152602001613bc8565b506000838581613c7e57fe5b0495945050505050565b604051806101e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001811115613cf757fe5b81526020016000815260200160008152602001600090529056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158202d89714341304412ad9b2eeadcb8fe4b28f640f6add719b48e8bd0a43deef74364736f6c63430005110032", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json b/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json index 75626e9..ce9ad16 100644 --- a/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json +++ b/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json @@ -532,51 +532,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x55aecb26", - "type": "bytes32" - } - ], - "name": "c_0x55aecb26", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x7d365384", - "type": "bytes32" - } - ], - "name": "c_0x7d365384", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x8209a966", - "type": "bytes32" - } - ], - "name": "c_0x8209a966", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [ diff --git a/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json b/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json index 8ae3da7..3438a09 100644 --- a/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json +++ b/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json @@ -109,36 +109,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x55aecb26", - "type": "bytes32" - } - ], - "name": "c_0x55aecb26", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "c__0x8209a966", - "type": "bytes32" - } - ], - "name": "c_0x8209a966", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [ From a3fb746c09a3c51c39514e29f4c716ba1040fa30 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 11:26:37 +0530 Subject: [PATCH 027/112] Updated the github workflow file --- .github/workflows/node.js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index ea9c384..ead49c0 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -23,6 +23,6 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: npm ci - - npm: npm run lint + - run: npm run lint - run: npm run coverage - run: cat coverage/lcov.info | coveralls From 13b95fafd4cfd50ab2cb9e90aa8d0ceea2bacdf3 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 17:50:01 +0530 Subject: [PATCH 028/112] Minor refactoring --- .gitignore | 6 +- .../Interfaces/IERC20.sol/IERC20.json | 251 ---- .../ILockedFund.sol/ILockedFund.json | 184 --- .../Interfaces/IOrigins.sol/IOrigins.json | 10 - .../IVestingLogic.sol/IVestingLogic.json | 71 - .../IVestingLogic.sol/VestingStorage.json | 41 - .../IVestingRegistry.json | 82 - .../contracts/LockedFund.sol/LockedFund.json | 803 ---------- .../Openzeppelin/Address.sol/Address.json | 10 - .../Openzeppelin/Context.sol/Context.json | 17 - .../Openzeppelin/ERC20.sol/ERC20.json | 258 ---- .../ERC20Detailed.sol/ERC20Detailed.json | 273 ---- .../Openzeppelin/IERC20_.sol/IERC20_.json | 206 --- .../Openzeppelin/Ownable.sol/Ownable.json | 81 - .../ReentrancyGuard.sol/ReentrancyGuard.json | 10 - .../Openzeppelin/SafeMath.sol/SafeMath.json | 10 - .../OriginsAdmin.sol/OriginsAdmin.json | 231 --- .../OriginsBase.sol/OriginsBase.json | 1326 ----------------- .../OriginsEvents.sol/OriginsEvents.json | 642 -------- .../OriginsStorage.sol/OriginsStorage.json | 219 --- docs/main.js | 6 +- 21 files changed, 6 insertions(+), 4731 deletions(-) delete mode 100644 artifacts/contracts/Interfaces/IERC20.sol/IERC20.json delete mode 100644 artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json delete mode 100644 artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json delete mode 100644 artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json delete mode 100644 artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json delete mode 100644 artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json delete mode 100644 artifacts/contracts/LockedFund.sol/LockedFund.json delete mode 100644 artifacts/contracts/Openzeppelin/Address.sol/Address.json delete mode 100644 artifacts/contracts/Openzeppelin/Context.sol/Context.json delete mode 100644 artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json delete mode 100644 artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json delete mode 100644 artifacts/contracts/Openzeppelin/IERC20_.sol/IERC20_.json delete mode 100644 artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json delete mode 100644 artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json delete mode 100644 artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json delete mode 100644 artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json delete mode 100644 artifacts/contracts/OriginsBase.sol/OriginsBase.json delete mode 100644 artifacts/contracts/OriginsEvents.sol/OriginsEvents.json delete mode 100644 artifacts/contracts/OriginsStorage.sol/OriginsStorage.json diff --git a/.gitignore b/.gitignore index f3dbdcd..76daf9e 100644 --- a/.gitignore +++ b/.gitignore @@ -106,8 +106,8 @@ dist # Custom cache build -*.dbg.json -artifacts/build-info +artifacts .vscode coverage -coverage.json \ No newline at end of file +coverage.json +.DS_Store \ No newline at end of file diff --git a/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json b/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json deleted file mode 100644 index 5cd6953..0000000 --- a/artifacts/contracts/Interfaces/IERC20.sol/IERC20.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IERC20", - "sourceName": "contracts/Interfaces/IERC20.sol", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json b/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json deleted file mode 100644 index 001e5ce..0000000 --- a/artifacts/contracts/Interfaces/ILockedFund.sol/ILockedFund.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "ILockedFund", - "sourceName": "contracts/Interfaces/ILockedFund.sol", - "abi": [ - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newAdmin", - "type": "address" - } - ], - "name": "addAdmin", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_vestingRegistry", - "type": "address" - } - ], - "name": "changeVestingRegistry", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_waitedTS", - "type": "uint256" - } - ], - "name": "changeWaitedTS", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "createVesting", - "outputs": [ - { - "internalType": "address", - "name": "_vestingAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "createVestingAndStake", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_userAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_cliff", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_duration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_basisPoint", - "type": "uint256" - } - ], - "name": "depositVested", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_adminToRemove", - "type": "address" - } - ], - "name": "removeAdmin", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "stakeTokens", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_receiverAddress", - "type": "address" - } - ], - "name": "withdrawAndStakeTokens", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_userAddress", - "type": "address" - } - ], - "name": "withdrawAndStakeTokensFrom", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_receiverAddress", - "type": "address" - } - ], - "name": "withdrawWaitedUnlockedBalance", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json b/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json deleted file mode 100644 index 16c17e3..0000000 --- a/artifacts/contracts/Interfaces/IOrigins.sol/IOrigins.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IOrigins", - "sourceName": "contracts/Interfaces/IOrigins.sol", - "abi": [], - "bytecode": "0x6080604052348015600f57600080fd5b50603e80601d6000396000f3fe6080604052600080fdfea265627a7a7231582069d28fbd1c39523d48d8e0ed954e4994f6c82194066536970e54dac7f43bbdf464736f6c63430005110032", - "deployedBytecode": "0x6080604052600080fdfea265627a7a7231582069d28fbd1c39523d48d8e0ed954e4994f6c82194066536970e54dac7f43bbdf464736f6c63430005110032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json b/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json deleted file mode 100644 index 44bc026..0000000 --- a/artifacts/contracts/Interfaces/IVestingLogic.sol/IVestingLogic.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IVestingLogic", - "sourceName": "contracts/Interfaces/IVestingLogic.sol", - "abi": [ - { - "constant": true, - "inputs": [], - "name": "cliff", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "duration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "stakeTokens", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "withdrawTokens", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json b/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json deleted file mode 100644 index 1dc0ae3..0000000 --- a/artifacts/contracts/Interfaces/IVestingLogic.sol/VestingStorage.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "VestingStorage", - "sourceName": "contracts/Interfaces/IVestingLogic.sol", - "abi": [ - { - "constant": true, - "inputs": [], - "name": "cliff", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "duration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630fb5a6b414603757806313d033c014604f575b600080fd5b603d6055565b60408051918252519081900360200190f35b603d605b565b60015481565b6000548156fea265627a7a723158201b2d50c8c3f492106d4b184574f602a8291079f1251415f1dc687a635ce82b7964736f6c63430005110032", - "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060325760003560e01c80630fb5a6b414603757806313d033c014604f575b600080fd5b603d6055565b60408051918252519081900360200190f35b603d605b565b60015481565b6000548156fea265627a7a723158201b2d50c8c3f492106d4b184574f602a8291079f1251415f1dc687a635ce82b7964736f6c63430005110032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json b/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json deleted file mode 100644 index 6263d94..0000000 --- a/artifacts/contracts/Interfaces/IVestingRegistry.sol/IVestingRegistry.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IVestingRegistry", - "sourceName": "contracts/Interfaces/IVestingRegistry.sol", - "abi": [ - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_tokenOwner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_cliff", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_duration", - "type": "uint256" - } - ], - "name": "createVesting", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_tokenOwner", - "type": "address" - } - ], - "name": "getVesting", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_vesting", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "stakeTokens", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/LockedFund.sol/LockedFund.json b/artifacts/contracts/LockedFund.sol/LockedFund.json deleted file mode 100644 index ab19bfc..0000000 --- a/artifacts/contracts/LockedFund.sol/LockedFund.json +++ /dev/null @@ -1,803 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "LockedFund", - "sourceName": "contracts/LockedFund.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "uint256", - "name": "_waitedTS", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "internalType": "address", - "name": "_vestingRegistry", - "type": "address" - }, - { - "internalType": "address[]", - "name": "_admins", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_newAdmin", - "type": "address" - } - ], - "name": "AdminAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_removedAdmin", - "type": "address" - } - ], - "name": "AdminRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_vesting", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "TokenStaked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_userAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_cliff", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_duration", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_basisPoint", - "type": "uint256" - } - ], - "name": "VestedDeposited", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_userAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_vesting", - "type": "address" - } - ], - "name": "VestingCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_vestingRegistry", - "type": "address" - } - ], - "name": "VestingRegistryUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_waitedTS", - "type": "uint256" - } - ], - "name": "WaitedTSUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_userAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "Withdrawn", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "INTERVAL", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_adminToRemove", - "type": "address" - } - ], - "name": "_removeAdmin", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newAdmin", - "type": "address" - } - ], - "name": "addAdmin", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "adminStatus", - "outputs": [ - { - "internalType": "bool", - "name": "_status", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_vestingRegistry", - "type": "address" - } - ], - "name": "changeVestingRegistry", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_waitedTS", - "type": "uint256" - } - ], - "name": "changeWaitedTS", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "cliff", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "createVesting", - "outputs": [ - { - "internalType": "address", - "name": "_vestingAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "createVestingAndStake", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_userAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_cliff", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_duration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_basisPoint", - "type": "uint256" - } - ], - "name": "depositVested", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "duration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "getCliffAndDuration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "getLockedBalance", - "outputs": [ - { - "internalType": "uint256", - "name": "_balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getToken", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "getUnlockedBalance", - "outputs": [ - { - "internalType": "uint256", - "name": "_balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getVestingDetails", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getWaitedTS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "getWaitedUnlockedBalance", - "outputs": [ - { - "internalType": "uint256", - "name": "_balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "isAdmin", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "lockedBalances", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_adminToRemove", - "type": "address" - } - ], - "name": "removeAdmin", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "stakeTokens", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "token", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "unlockedBalances", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "vestedBalance", - "outputs": [ - { - "internalType": "uint256", - "name": "_balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "vestedBalances", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "vestingRegistry", - "outputs": [ - { - "internalType": "contract IVestingRegistry", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "waitedTS", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "waitedUnlockedBalances", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_receiverAddress", - "type": "address" - } - ], - "name": "withdrawAndStakeTokens", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_userAddress", - "type": "address" - } - ], - "name": "withdrawAndStakeTokensFrom", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_receiverAddress", - "type": "address" - } - ], - "name": "withdrawWaitedUnlockedBalance", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x60806040523480156200001157600080fd5b5060405162001e1a38038062001e1a833981810160405260808110156200003757600080fd5b8151602083015160408085015160608601805192519496939591949391820192846401000000008211156200006b57600080fd5b9083019060208201858111156200008157600080fd5b82518660208202830111640100000000821117156200009f57600080fd5b82525081516020918201928201910280838360005b83811015620000ce578181015183820152602001620000b4565b5050505090500160405250505083600014156200011d5760405162461bcd60e51b815260040180806020018281038252602581526020018062001da36025913960400191505060405180910390fd5b6001600160a01b038316620001645760405162461bcd60e51b815260040180806020018281038252602281526020018062001dc86022913960400191505060405180910390fd5b6001600160a01b038216620001ab5760405162461bcd60e51b815260040180806020018281038252603081526020018062001dea6030913960400191505060405180910390fd5b6000848155600180546001600160a01b038087166001600160a01b03199283161790925560028054928616929091169190911790555b8151811015620003175760006001600160a01b03168282815181106200020357fe5b60200260200101516001600160a01b0316141562000268576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600760008484815181106200027b57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550818181518110620002c757fe5b60200260200101516001600160a01b0316336001600160a01b03167fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b60405160405180910390a3600101620001e1565b5050505050611a77806200032c6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806389facb201161010f578063c4086893116100a2578063ce46643b11610071578063ce46643b14610599578063e5545864146105a1578063ec3ea7d4146105c7578063fc0c546a146105ed576101f0565b8063c40868931461051f578063cb3fdb6114610545578063cc6f03331461056b578063cdce101b14610573576101f0565b80639114557e116100de5780639114557e146104a5578063aaba2c0d146104cb578063b36760a3146104f1578063c227cbd814610517576101f0565b806389facb20146104525780638c8ba66d1461045a5780638efd94f314610480578063904c5b8f1461049d576101f0565b80634558269f1161018757806361ade4261161015657806361ade426146103c057806370480275146103e657806377a69b521461040c578063849a681714610414576101f0565b80634558269f1461034b5780634c2a295c1461035357806355e715cf1461035b578063594092db14610381576101f0565b806324276777116101c3578063242767771461029f57806324d7806c146102c55780632b6df82a146102ff5780633e4a89d114610325576101f0565b80630483a7f6146101f5578063129de5bf1461022d5780631785f53c1461025357806321df0da71461027b575b600080fd5b61021b6004803603602081101561020b57600080fd5b50356001600160a01b03166105f5565b60408051918252519081900360200190f35b61021b6004803603602081101561024357600080fd5b50356001600160a01b0316610607565b6102796004803603602081101561026957600080fd5b50356001600160a01b0316610622565b005b610283610680565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102b557600080fd5b50356001600160a01b031661068f565b6102eb600480360360208110156102db57600080fd5b50356001600160a01b03166106a1565b604080519115158252519081900360200190f35b6102796004803603602081101561031557600080fd5b50356001600160a01b03166106b6565b6102eb6004803603602081101561033b57600080fd5b50356001600160a01b03166106c9565b6102796106e7565b61021b6106f2565b6102796004803603602081101561037157600080fd5b50356001600160a01b03166106f8565b6103a76004803603602081101561039757600080fd5b50356001600160a01b0316610702565b6040805192835260208301919091528051918290030190f35b610279600480360360208110156103d657600080fd5b50356001600160a01b031661072a565b610279600480360360208110156103fc57600080fd5b50356001600160a01b031661081d565b61021b610878565b610279600480360360a081101561042a57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013561087e565b61021b6108e4565b61021b6004803603602081101561047057600080fd5b50356001600160a01b03166108eb565b6102796004803603602081101561049657600080fd5b50356108fd565b610283610958565b61021b600480360360208110156104bb57600080fd5b50356001600160a01b0316610967565b61021b600480360360208110156104e157600080fd5b50356001600160a01b0316610982565b61021b6004803603602081101561050757600080fd5b50356001600160a01b031661099d565b6102836109af565b61021b6004803603602081101561053557600080fd5b50356001600160a01b03166109be565b61021b6004803603602081101561055b57600080fd5b50356001600160a01b03166109d9565b6102836109eb565b61021b6004803603602081101561058957600080fd5b50356001600160a01b03166109fb565b610279610a0d565b610279600480360360208110156105b757600080fd5b50356001600160a01b0316610b53565b610279600480360360208110156105dd57600080fd5b50356001600160a01b0316610b66565b610283610bc1565b60046020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b3360009081526007602052604090205460ff16610674576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161072a565b50565b6001546001600160a01b031690565b60056020526000908152604090205481565b60076020526000908152604090205460ff1681565b6106c08182610bd0565b61067d81610d84565b6001600160a01b031660009081526007602052604090205460ff1690565b6106f033610d84565b565b60005490565b61067d3382610bd0565b6001600160a01b03166000908152600860209081526040808320546009909252909120549091565b3360009081526007602052604090205460ff1661077c576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166107d35760405162461bcd60e51b81526004018080602001828103825260248152602001806118746024913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b3360009081526007602052604090205460ff1661086f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81610db9565b60005481565b3360009081526007602052604090205460ff166108d0576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6108dd8585858585610eb9565b5050505050565b6224ea0081565b60066020526000908152604090205481565b3360009081526007602052604090205460ff1661094f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161115d565b6002546001600160a01b031681565b6001600160a01b031660009081526003602052604090205490565b6001600160a01b031660009081526005602052604090205490565b60096020526000908152604090205481565b6002546001600160a01b031690565b6001600160a01b031660009081526004602052604090205490565b60036020526000908152604090205481565b60006109f6336111d7565b905090565b60086020526000908152604090205481565b6000610a183361132b565b9050806001600160a01b03166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b505133600090815260086020526040902054148015610b0e5750806001600160a01b0316630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6020811015610afa57600080fd5b505133600090815260096020526040902054145b610b495760405162461bcd60e51b81526004018080602001828103825260238152602001806119f06023913960400191505060405180910390fd5b61067d33826113ae565b610b5d3382610bd0565b61067d33610d84565b3360009081526007602052604090205460ff16610bb8576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81611540565b6001546001600160a01b031681565b600054610c0e5760405162461bcd60e51b815260040180806020018281038252602281526020018061197f6022913960400191505060405180910390fd5b4260005410610c4e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806118bc602a913960400191505060405180910390fd5b806001600160a01b038116610c605750815b6001600160a01b038084166000908152600560209081526040808320805490849055600154825163a9059cbb60e01b815287871660048201526024810183905292519195169263a9059cbb926044808201939182900301818787803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b5051905080610d325760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b826001600160a01b0316856001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6000610d8f8261132b565b90506001600160a01b038116610dab57610da8826111d7565b90505b610db582826113ae565b5050565b6001600160a01b038116610e14576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610e6c5760405162461bcd60e51b81526004018080602001828103825260258152602001806119a16025913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b81610ef55760405162461bcd60e51b81526004018080602001828103825260248152602001806118986024913960400191505060405180910390fd5b60258210610f345760405162461bcd60e51b81526004018080602001828103825260218152602001806119396021913960400191505060405180910390fd5b6127108110610f745760405162461bcd60e51b81526004018080602001828103825260328152602001806118e66032913960400191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050506040513d6020811015610ff757600080fd5b50519050806110375760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b600061105b61271061104f888663ffffffff6115d116565b9063ffffffff61163316565b6001600160a01b038816600090815260056020526040902054909150611087908263ffffffff61167516565b6001600160a01b0388166000908152600560209081526040808320939093556003905220546110ce9082906110c2908963ffffffff61167516565b9063ffffffff6116cf16565b6001600160a01b038816600081815260036020908152604080832094909455600881528382206224ea008a810290915560098252918490209188029091558251898152908101889052808301879052606081018690529151909133917fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a9181900360800190a350505050505050565b806111995760405162461bcd60e51b815260040180806020018281038252602581526020018061195a6025913960400191505060405180910390fd5b600081905560408051828152905133917f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94919081900360200190a250565b336000908152600860205260408120541580159061120357503360009081526009602052604090205415155b61123e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119c6602a913960400191505060405180910390fd5b6002546001600160a01b038381166000818152600860209081526040808320546009909252808320548151630665a06f60e01b815260048101959095526024850184905260448501929092526064840191909152519290931692630665a06f9260848084019382900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b505050506112da8261132b565b9050806001600160a01b0316826001600160a01b0316336001600160a01b03167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6002546040805163cc49ede760e01b81526001600160a01b0384811660048301529151600093929092169163cc49ede791602480820192602092909190829003018186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b505192915050565b6001600160a01b038083166000908152600460208181526040808420805490859055600154825163095ea7b360e01b8152888816958101959095526024850182905291519095919091169363095ea7b3936044808201949392918390030190829087803b15801561141e57600080fd5b505af1158015611432573d6000803e3d6000fd5b505050506040513d602081101561144857600080fd5b505161149b576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656446756e643a20417070726f7665206661696c65642e0000000000604482015290519081900360640190fd5b816001600160a01b0316637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506040805184815290516001600160a01b038087169450871692507f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b9181900360200190a3505050565b6001600160a01b0381166115855760405162461bcd60e51b8152600401808060200182810382526030815260200180611a136030913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e790600090a350565b6000826115e05750600061162d565b828202828482816115ed57fe5b041461162a5760405162461bcd60e51b81526004018080602001828103825260218152602001806119186021913960400191505060405180910390fd5b90505b92915050565b600061162a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611711565b60008282018381101561162a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061162a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b3565b6000818361179d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561176257818101518382015260200161174a565b50505050905090810190601f16801561178f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816117a957fe5b0495945050505050565b600081848411156118055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561176257818101518382015260200161174a565b50505090039056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4f6e6c792061646d696e2063616e2063616c6c20746869732e000000000000004c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a72315820458668e8d6ee8e9ea39ff268a3f1ba842cc9003ee32e59dba2d1ba7b352c0ac664736f6c634300051100324c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20496e76616c696420546f6b656e20416464726573732e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642e", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806389facb201161010f578063c4086893116100a2578063ce46643b11610071578063ce46643b14610599578063e5545864146105a1578063ec3ea7d4146105c7578063fc0c546a146105ed576101f0565b8063c40868931461051f578063cb3fdb6114610545578063cc6f03331461056b578063cdce101b14610573576101f0565b80639114557e116100de5780639114557e146104a5578063aaba2c0d146104cb578063b36760a3146104f1578063c227cbd814610517576101f0565b806389facb20146104525780638c8ba66d1461045a5780638efd94f314610480578063904c5b8f1461049d576101f0565b80634558269f1161018757806361ade4261161015657806361ade426146103c057806370480275146103e657806377a69b521461040c578063849a681714610414576101f0565b80634558269f1461034b5780634c2a295c1461035357806355e715cf1461035b578063594092db14610381576101f0565b806324276777116101c3578063242767771461029f57806324d7806c146102c55780632b6df82a146102ff5780633e4a89d114610325576101f0565b80630483a7f6146101f5578063129de5bf1461022d5780631785f53c1461025357806321df0da71461027b575b600080fd5b61021b6004803603602081101561020b57600080fd5b50356001600160a01b03166105f5565b60408051918252519081900360200190f35b61021b6004803603602081101561024357600080fd5b50356001600160a01b0316610607565b6102796004803603602081101561026957600080fd5b50356001600160a01b0316610622565b005b610283610680565b604080516001600160a01b039092168252519081900360200190f35b61021b600480360360208110156102b557600080fd5b50356001600160a01b031661068f565b6102eb600480360360208110156102db57600080fd5b50356001600160a01b03166106a1565b604080519115158252519081900360200190f35b6102796004803603602081101561031557600080fd5b50356001600160a01b03166106b6565b6102eb6004803603602081101561033b57600080fd5b50356001600160a01b03166106c9565b6102796106e7565b61021b6106f2565b6102796004803603602081101561037157600080fd5b50356001600160a01b03166106f8565b6103a76004803603602081101561039757600080fd5b50356001600160a01b0316610702565b6040805192835260208301919091528051918290030190f35b610279600480360360208110156103d657600080fd5b50356001600160a01b031661072a565b610279600480360360208110156103fc57600080fd5b50356001600160a01b031661081d565b61021b610878565b610279600480360360a081101561042a57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013561087e565b61021b6108e4565b61021b6004803603602081101561047057600080fd5b50356001600160a01b03166108eb565b6102796004803603602081101561049657600080fd5b50356108fd565b610283610958565b61021b600480360360208110156104bb57600080fd5b50356001600160a01b0316610967565b61021b600480360360208110156104e157600080fd5b50356001600160a01b0316610982565b61021b6004803603602081101561050757600080fd5b50356001600160a01b031661099d565b6102836109af565b61021b6004803603602081101561053557600080fd5b50356001600160a01b03166109be565b61021b6004803603602081101561055b57600080fd5b50356001600160a01b03166109d9565b6102836109eb565b61021b6004803603602081101561058957600080fd5b50356001600160a01b03166109fb565b610279610a0d565b610279600480360360208110156105b757600080fd5b50356001600160a01b0316610b53565b610279600480360360208110156105dd57600080fd5b50356001600160a01b0316610b66565b610283610bc1565b60046020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b3360009081526007602052604090205460ff16610674576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161072a565b50565b6001546001600160a01b031690565b60056020526000908152604090205481565b60076020526000908152604090205460ff1681565b6106c08182610bd0565b61067d81610d84565b6001600160a01b031660009081526007602052604090205460ff1690565b6106f033610d84565b565b60005490565b61067d3382610bd0565b6001600160a01b03166000908152600860209081526040808320546009909252909120549091565b3360009081526007602052604090205460ff1661077c576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166107d35760405162461bcd60e51b81526004018080602001828103825260248152602001806118746024913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b3360009081526007602052604090205460ff1661086f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81610db9565b60005481565b3360009081526007602052604090205460ff166108d0576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b6108dd8585858585610eb9565b5050505050565b6224ea0081565b60066020526000908152604090205481565b3360009081526007602052604090205460ff1661094f576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d8161115d565b6002546001600160a01b031681565b6001600160a01b031660009081526003602052604090205490565b6001600160a01b031660009081526005602052604090205490565b60096020526000908152604090205481565b6002546001600160a01b031690565b6001600160a01b031660009081526004602052604090205490565b60036020526000908152604090205481565b60006109f6336111d7565b905090565b60086020526000908152604090205481565b6000610a183361132b565b9050806001600160a01b03166313d033c06040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b505133600090815260086020526040902054148015610b0e5750806001600160a01b0316630fb5a6b46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad057600080fd5b505afa158015610ae4573d6000803e3d6000fd5b505050506040513d6020811015610afa57600080fd5b505133600090815260096020526040902054145b610b495760405162461bcd60e51b81526004018080602001828103825260238152602001806119f06023913960400191505060405180910390fd5b61067d33826113ae565b610b5d3382610bd0565b61067d33610d84565b3360009081526007602052604090205460ff16610bb8576040805162461bcd60e51b81526020600482015260196024820152600080516020611854833981519152604482015290519081900360640190fd5b61067d81611540565b6001546001600160a01b031681565b600054610c0e5760405162461bcd60e51b815260040180806020018281038252602281526020018061197f6022913960400191505060405180910390fd5b4260005410610c4e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806118bc602a913960400191505060405180910390fd5b806001600160a01b038116610c605750815b6001600160a01b038084166000908152600560209081526040808320805490849055600154825163a9059cbb60e01b815287871660048201526024810183905292519195169263a9059cbb926044808201939182900301818787803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b5051905080610d325760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b826001600160a01b0316856001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb846040518082815260200191505060405180910390a35050505050565b6000610d8f8261132b565b90506001600160a01b038116610dab57610da8826111d7565b90505b610db582826113ae565b5050565b6001600160a01b038116610e14576040805162461bcd60e51b815260206004820152601c60248201527f4c6f636b656446756e643a20496e76616c696420416464726573732e00000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610e6c5760405162461bcd60e51b81526004018080602001828103825260258152602001806119a16025913960400191505060405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b81610ef55760405162461bcd60e51b81526004018080602001828103825260248152602001806118986024913960400191505060405180910390fd5b60258210610f345760405162461bcd60e51b81526004018080602001828103825260218152602001806119396021913960400191505060405180910390fd5b6127108110610f745760405162461bcd60e51b81526004018080602001828103825260328152602001806118e66032913960400191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050506040513d6020811015610ff757600080fd5b50519050806110375760405162461bcd60e51b815260040180806020018281038252604681526020018061180e6046913960600191505060405180910390fd5b600061105b61271061104f888663ffffffff6115d116565b9063ffffffff61163316565b6001600160a01b038816600090815260056020526040902054909150611087908263ffffffff61167516565b6001600160a01b0388166000908152600560209081526040808320939093556003905220546110ce9082906110c2908963ffffffff61167516565b9063ffffffff6116cf16565b6001600160a01b038816600081815260036020908152604080832094909455600881528382206224ea008a810290915560098252918490209188029091558251898152908101889052808301879052606081018690529151909133917fdf0604a93cf2c070525999e93d1600fae85830a1b4b10e78f409f356257cbb2a9181900360800190a350505050505050565b806111995760405162461bcd60e51b815260040180806020018281038252602581526020018061195a6025913960400191505060405180910390fd5b600081905560408051828152905133917f199e9473de2d811b62d765c8ac3703d1369824c61bb67b2453f700615ffd0f94919081900360200190a250565b336000908152600860205260408120541580159061120357503360009081526009602052604090205415155b61123e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119c6602a913960400191505060405180910390fd5b6002546001600160a01b038381166000818152600860209081526040808320546009909252808320548151630665a06f60e01b815260048101959095526024850184905260448501929092526064840191909152519290931692630665a06f9260848084019382900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b505050506112da8261132b565b9050806001600160a01b0316826001600160a01b0316336001600160a01b03167fbca00eff836738917bc04c3b9c08d4bb6af3f58f9eb021d294e6b17bc6a3b86560405160405180910390a4919050565b6002546040805163cc49ede760e01b81526001600160a01b0384811660048301529151600093929092169163cc49ede791602480820192602092909190829003018186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b505192915050565b6001600160a01b038083166000908152600460208181526040808420805490859055600154825163095ea7b360e01b8152888816958101959095526024850182905291519095919091169363095ea7b3936044808201949392918390030190829087803b15801561141e57600080fd5b505af1158015611432573d6000803e3d6000fd5b505050506040513d602081101561144857600080fd5b505161149b576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656446756e643a20417070726f7665206661696c65642e0000000000604482015290519081900360640190fd5b816001600160a01b0316637547c7a3826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506040805184815290516001600160a01b038087169450871692507f17a90bf25d618e67de9bc66de5762d97787b11707d112164ab54c37111467f2b9181900360200190a3505050565b6001600160a01b0381166115855760405162461bcd60e51b8152600401808060200182810382526030815260200180611a136030913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f48c779b869b43e376452fea450ca0bcc7dde32d0c079cb448edb5b3f2ad4b3e790600090a350565b6000826115e05750600061162d565b828202828482816115ed57fe5b041461162a5760405162461bcd60e51b81526004018080602001828103825260218152602001806119186021913960400191505060405180910390fd5b90505b92915050565b600061162a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611711565b60008282018381101561162a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061162a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117b3565b6000818361179d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561176257818101518382015260200161174a565b50505050905090810190601f16801561178f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816117a957fe5b0495945050505050565b600081848411156118055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561176257818101518382015260200161174a565b50505090039056fe4c6f636b656446756e643a20546f6b656e207472616e7366657220776173206e6f74207375636365737366756c2e20436865636b20726563656976657220616464726573732e4f6e6c792061646d696e2063616e2063616c6c20746869732e000000000000004c6f636b656446756e643a2041646472657373206973206e6f7420616e2061646d696e2e4c6f636b656446756e643a204475726174696f6e2063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169742054696d657374616d70206e6f7420796574207061737365642e4c6f636b656446756e643a20426173697320506f696e742068617320746f206265206c657373207468616e2031303030302e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c6f636b656446756e643a204475726174696f6e20697320746f6f206c6f6e672e4c6f636b656446756e643a205761697465642054532063616e6e6f74206265207a65726f2e4c6f636b656446756e643a20576169746564205453206e6f7420736574207965742e4c6f636b656446756e643a204164647265737320697320616c72656164792061646d696e2e4c6f636b656446756e643a20436c69666620616e642f6f72204475726174696f6e206e6f74207365742e4c6f636b656446756e643a2057726f6e672056657374696e67205363686564756c652e4c6f636b656446756e643a2056657374696e67207265676973747279206164647265737320697320696e76616c69642ea265627a7a72315820458668e8d6ee8e9ea39ff268a3f1ba842cc9003ee32e59dba2d1ba7b352c0ac664736f6c63430005110032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Openzeppelin/Address.sol/Address.json b/artifacts/contracts/Openzeppelin/Address.sol/Address.json deleted file mode 100644 index 306abec..0000000 --- a/artifacts/contracts/Openzeppelin/Address.sol/Address.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "Address", - "sourceName": "contracts/Openzeppelin/Address.sol", - "abi": [], - "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723158205937740270c64775b05a5ffa30d0311e2674bb6aa0227c96dadead14f1cd0de364736f6c63430005110032", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723158205937740270c64775b05a5ffa30d0311e2674bb6aa0227c96dadead14f1cd0de364736f6c63430005110032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Openzeppelin/Context.sol/Context.json b/artifacts/contracts/Openzeppelin/Context.sol/Context.json deleted file mode 100644 index b861471..0000000 --- a/artifacts/contracts/Openzeppelin/Context.sol/Context.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "Context", - "sourceName": "contracts/Openzeppelin/Context.sol", - "abi": [ - { - "inputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json b/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json deleted file mode 100644 index ed43432..0000000 --- a/artifacts/contracts/Openzeppelin/ERC20.sol/ERC20.json +++ /dev/null @@ -1,258 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "ERC20", - "sourceName": "contracts/Openzeppelin/ERC20.sol", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x608060405261083b806100136000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a0823114610149578063a457c2d71461016f578063a9059cbb1461019b578063dd62ed3e146101c757610088565b8063095ea7b31461008d57806318160ddd146100cd57806323b872dd146100e7578063395093511461011d575b600080fd5b6100b9600480360360408110156100a357600080fd5b506001600160a01b0381351690602001356101f5565b604080519115158252519081900360200190f35b6100d5610212565b60408051918252519081900360200190f35b6100b9600480360360608110156100fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610218565b6100b96004803603604081101561013357600080fd5b506001600160a01b0381351690602001356102a5565b6100d56004803603602081101561015f57600080fd5b50356001600160a01b03166102f9565b6100b96004803603604081101561018557600080fd5b506001600160a01b038135169060200135610314565b6100b9600480360360408110156101b157600080fd5b506001600160a01b038135169060200135610382565b6100d5600480360360408110156101dd57600080fd5b506001600160a01b0381358116916020013516610396565b60006102096102026103c1565b84846103c5565b50600192915050565b60025490565b60006102258484846104b1565b61029b846102316103c1565b61029685604051806060016040528060288152602001610771602891396001600160a01b038a1660009081526001602052604081209061026f6103c1565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61060d16565b6103c5565b5060019392505050565b60006102096102b26103c1565b8461029685600160006102c36103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6106a416565b6001600160a01b031660009081526020819052604090205490565b60006102096103216103c1565b84610296856040518060600160405280602581526020016107e2602591396001600061034b6103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61060d16565b600061020961038f6103c1565b84846104b1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661040a5760405162461bcd60e51b81526004018080602001828103825260248152602001806107be6024913960400191505060405180910390fd5b6001600160a01b03821661044f5760405162461bcd60e51b81526004018080602001828103825260228152602001806107296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166104f65760405162461bcd60e51b81526004018080602001828103825260258152602001806107996025913960400191505060405180910390fd5b6001600160a01b03821661053b5760405162461bcd60e51b81526004018080602001828103825260238152602001806107066023913960400191505060405180910390fd5b61057e8160405180606001604052806026815260200161074b602691396001600160a01b038616600090815260208190526040902054919063ffffffff61060d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105b3908263ffffffff6106a416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561069c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610661578181015183820152602001610649565b50505050905090810190601f16801561068e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156106fe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202b065b6405111e5e88a2151ff2c365680198043a1a70f31cdde369fba031945a64736f6c63430005110032", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a0823114610149578063a457c2d71461016f578063a9059cbb1461019b578063dd62ed3e146101c757610088565b8063095ea7b31461008d57806318160ddd146100cd57806323b872dd146100e7578063395093511461011d575b600080fd5b6100b9600480360360408110156100a357600080fd5b506001600160a01b0381351690602001356101f5565b604080519115158252519081900360200190f35b6100d5610212565b60408051918252519081900360200190f35b6100b9600480360360608110156100fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610218565b6100b96004803603604081101561013357600080fd5b506001600160a01b0381351690602001356102a5565b6100d56004803603602081101561015f57600080fd5b50356001600160a01b03166102f9565b6100b96004803603604081101561018557600080fd5b506001600160a01b038135169060200135610314565b6100b9600480360360408110156101b157600080fd5b506001600160a01b038135169060200135610382565b6100d5600480360360408110156101dd57600080fd5b506001600160a01b0381358116916020013516610396565b60006102096102026103c1565b84846103c5565b50600192915050565b60025490565b60006102258484846104b1565b61029b846102316103c1565b61029685604051806060016040528060288152602001610771602891396001600160a01b038a1660009081526001602052604081209061026f6103c1565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61060d16565b6103c5565b5060019392505050565b60006102096102b26103c1565b8461029685600160006102c36103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6106a416565b6001600160a01b031660009081526020819052604090205490565b60006102096103216103c1565b84610296856040518060600160405280602581526020016107e2602591396001600061034b6103c1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61060d16565b600061020961038f6103c1565b84846104b1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661040a5760405162461bcd60e51b81526004018080602001828103825260248152602001806107be6024913960400191505060405180910390fd5b6001600160a01b03821661044f5760405162461bcd60e51b81526004018080602001828103825260228152602001806107296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166104f65760405162461bcd60e51b81526004018080602001828103825260258152602001806107996025913960400191505060405180910390fd5b6001600160a01b03821661053b5760405162461bcd60e51b81526004018080602001828103825260238152602001806107066023913960400191505060405180910390fd5b61057e8160405180606001604052806026815260200161074b602691396001600160a01b038616600090815260208190526040902054919063ffffffff61060d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546105b3908263ffffffff6106a416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561069c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610661578181015183820152602001610649565b50505050905090810190601f16801561068e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156106fe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202b065b6405111e5e88a2151ff2c365680198043a1a70f31cdde369fba031945a64736f6c63430005110032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json b/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json deleted file mode 100644 index 9019a60..0000000 --- a/artifacts/contracts/Openzeppelin/ERC20Detailed.sol/ERC20Detailed.json +++ /dev/null @@ -1,273 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "ERC20Detailed", - "sourceName": "contracts/Openzeppelin/ERC20Detailed.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "string", - "name": "symbol", - "type": "string" - }, - { - "internalType": "uint8", - "name": "decimals", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Openzeppelin/IERC20_.sol/IERC20_.json b/artifacts/contracts/Openzeppelin/IERC20_.sol/IERC20_.json deleted file mode 100644 index 5c8bb1d..0000000 --- a/artifacts/contracts/Openzeppelin/IERC20_.sol/IERC20_.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IERC20_", - "sourceName": "contracts/Openzeppelin/IERC20_.sol", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json b/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json deleted file mode 100644 index 494672e..0000000 --- a/artifacts/contracts/Openzeppelin/Ownable.sol/Ownable.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "Ownable", - "sourceName": "contracts/Openzeppelin/Ownable.sol", - "abi": [ - { - "inputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "isOwner", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json b/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json deleted file mode 100644 index 4ab44f7..0000000 --- a/artifacts/contracts/Openzeppelin/ReentrancyGuard.sol/ReentrancyGuard.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "ReentrancyGuard", - "sourceName": "contracts/Openzeppelin/ReentrancyGuard.sol", - "abi": [], - "bytecode": "0x60806040526001600055348015601457600080fd5b50603e8060226000396000f3fe6080604052600080fdfea265627a7a723158203788d8b2241852354e8f19939d533dabc145e0bae35eca067031c2bfa406146064736f6c63430005110032", - "deployedBytecode": "0x6080604052600080fdfea265627a7a723158203788d8b2241852354e8f19939d533dabc145e0bae35eca067031c2bfa406146064736f6c63430005110032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json b/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json deleted file mode 100644 index 31bcc6c..0000000 --- a/artifacts/contracts/Openzeppelin/SafeMath.sol/SafeMath.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "SafeMath", - "sourceName": "contracts/Openzeppelin/SafeMath.sol", - "abi": [], - "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72315820afbfb598f394b83d986407677d26d9a954705283684f0c5d4d9de47c9f54693864736f6c63430005110032", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72315820afbfb598f394b83d986407677d26d9a954705283684f0c5d4d9de47c9f54693864736f6c63430005110032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json b/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json deleted file mode 100644 index 7ced857..0000000 --- a/artifacts/contracts/OriginsAdmin.sol/OriginsAdmin.json +++ /dev/null @@ -1,231 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "OriginsAdmin", - "sourceName": "contracts/OriginsAdmin.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address[]", - "name": "_owners", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "OwnerAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_removedOwner", - "type": "address" - } - ], - "name": "OwnerRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newVerifier", - "type": "address" - } - ], - "name": "VerifierAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_removedVerifier", - "type": "address" - } - ], - "name": "VerifierRemoved", - "type": "event" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "addOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newVerifier", - "type": "address" - } - ], - "name": "addVerifier", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "checkOwner", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "checkVerifier", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getOwners", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getVerifiers", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_ownerToRemove", - "type": "address" - } - ], - "name": "removeOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_verifierToRemove", - "type": "address" - } - ], - "name": "removeVerifier", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/OriginsBase.sol/OriginsBase.json b/artifacts/contracts/OriginsBase.sol/OriginsBase.json deleted file mode 100644 index c8fc307..0000000 --- a/artifacts/contracts/OriginsBase.sol/OriginsBase.json +++ /dev/null @@ -1,1326 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "OriginsBase", - "sourceName": "contracts/OriginsBase.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address[]", - "name": "_owners", - "type": "address[]" - }, - { - "internalType": "address payable", - "name": "_depositAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_verifiedAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "AddressVerified", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_oldDepositAddr", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_newDepositAddr", - "type": "address" - } - ], - "name": "DepositAddressUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_oldLockedFund", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_newLockedFund", - "type": "address" - } - ], - "name": "LockedFundUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "NewTierCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "OwnerAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_removedOwner", - "type": "address" - } - ], - "name": "OwnerRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_receiver", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum OriginsStorage.DepositType", - "name": "_depositType", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "ProceedingWithdrawn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_depositRate", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "_depositToken", - "type": "address" - }, - { - "indexed": true, - "internalType": "enum OriginsStorage.DepositType", - "name": "_depositType", - "type": "uint8" - } - ], - "name": "TierDepositUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "TierSaleEnded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_updatedMaxAmount", - "type": "uint256" - } - ], - "name": "TierSaleUpdatedMaximum", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "TierSaleUpdatedMinimum", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_saleStartTS", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_saleEnd", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "enum OriginsStorage.SaleEndDurationOrTS", - "name": "_saleEndDurationOrTS", - "type": "uint8" - } - ], - "name": "TierTimeUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_remainingTokens", - "type": "uint256" - } - ], - "name": "TierTokenAmountUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_minAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_maxAmount", - "type": "uint256" - } - ], - "name": "TierTokenLimitUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum OriginsStorage.VerificationType", - "name": "_verificationType", - "type": "uint8" - } - ], - "name": "TierVerificationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_vestOrLockCliff", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_vestOrLockDuration", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_unlockedTokenWithdrawTS", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_unlockedBP", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "enum OriginsStorage.TransferType", - "name": "_transferType", - "type": "uint8" - } - ], - "name": "TierVestOrLockUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tokensBought", - "type": "uint256" - } - ], - "name": "TokenBuy", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newVerifier", - "type": "address" - } - ], - "name": "VerifierAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_removedVerifier", - "type": "address" - } - ], - "name": "VerifierRemoved", - "type": "event" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "addOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newVerifier", - "type": "address" - } - ], - "name": "addVerifier", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_addressToBeVerified", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "addressVerification", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "buy", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "checkOwner", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "checkSaleEnded", - "outputs": [ - { - "internalType": "bool", - "name": "_status", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "checkVerifier", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_remainingTokens", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_saleStartTS", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_saleEnd", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_unlockedTokenWithdrawTS", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_unlockedBP", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_vestOrLockCliff", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_vestOrLockDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_depositRate", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_depositToken", - "type": "address" - }, - { - "internalType": "enum OriginsStorage.DepositType", - "name": "_depositType", - "type": "uint8" - }, - { - "internalType": "enum OriginsStorage.VerificationType", - "name": "_verificationType", - "type": "uint8" - }, - { - "internalType": "enum OriginsStorage.SaleEndDurationOrTS", - "name": "_saleEndDurationOrTS", - "type": "uint8" - }, - { - "internalType": "enum OriginsStorage.TransferType", - "name": "_transferType", - "type": "uint8" - } - ], - "name": "createTier", - "outputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getDepositAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getLockDetails", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getOwners", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "getParticipatingWalletCountPerTier", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getTierCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getToken", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "getTokensBoughtByAddressOnTier", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "getTokensSoldPerTier", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getVerifiers", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "isAddressApproved", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address[]", - "name": "_addressToBeVerified", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "_tierID", - "type": "uint256[]" - } - ], - "name": "multipleAddressAndTierVerification", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address[]", - "name": "_addressToBeVerified", - "type": "address[]" - }, - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "multipleAddressSingleTierVerification", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "readTierPartA", - "outputs": [ - { - "internalType": "uint256", - "name": "_minAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_remainingTokens", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_saleStartTS", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_saleEnd", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_unlockedTokenWithdrawTS", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_unlockedBP", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_vestOrLockCliff", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_vestOrLockDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_depositRate", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "readTierPartB", - "outputs": [ - { - "internalType": "address", - "name": "_depositToken", - "type": "address" - }, - { - "internalType": "enum OriginsStorage.DepositType", - "name": "_depositType", - "type": "uint8" - }, - { - "internalType": "enum OriginsStorage.VerificationType", - "name": "_verificationType", - "type": "uint8" - }, - { - "internalType": "enum OriginsStorage.SaleEndDurationOrTS", - "name": "_saleEndDurationOrTS", - "type": "uint8" - }, - { - "internalType": "enum OriginsStorage.TransferType", - "name": "_transferType", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_ownerToRemove", - "type": "address" - } - ], - "name": "removeOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_verifierToRemove", - "type": "address" - } - ], - "name": "removeVerifier", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address payable", - "name": "_depositAddress", - "type": "address" - } - ], - "name": "setDepositAddress", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_lockedFund", - "type": "address" - } - ], - "name": "setLockedFund", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_depositRate", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_depositToken", - "type": "address" - }, - { - "internalType": "enum OriginsStorage.DepositType", - "name": "_depositType", - "type": "uint8" - } - ], - "name": "setTierDeposit", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_saleStartTS", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_saleEnd", - "type": "uint256" - }, - { - "internalType": "enum OriginsStorage.SaleEndDurationOrTS", - "name": "_saleEndDurationOrTS", - "type": "uint8" - } - ], - "name": "setTierTime", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_remainingTokens", - "type": "uint256" - } - ], - "name": "setTierTokenAmount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_minAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxAmount", - "type": "uint256" - } - ], - "name": "setTierTokenLimit", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "internalType": "enum OriginsStorage.VerificationType", - "name": "_verificationType", - "type": "uint8" - } - ], - "name": "setTierVerification", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_vestOrLockCliff", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_vestOrLockDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_unlockedTokenWithdrawTS", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_unlockedBP", - "type": "uint256" - }, - { - "internalType": "enum OriginsStorage.TransferType", - "name": "_transferType", - "type": "uint8" - } - ], - "name": "setTierVestOrLock", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_addressToBeVerified", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "_tierID", - "type": "uint256[]" - } - ], - "name": "singleAddressMultipleTierVerification", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "withdrawSaleDeposit", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x60806040523480156200001157600080fd5b506040516200469c3803806200469c833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82518660208202830111640100000000821117156200008c57600080fd5b82525081516020918201928201910280838360005b83811015620000bb578181015183820152602001620000a1565b50505050919091016040525060200151835190925083915060005b81811015620002325760026000848381518110620000f057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615620001555760405162461bcd60e51b81526004018080602001828103825260308152602001806200466c6030913960400191505060405180910390fd5b6001600260008584815181106200016857fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000838281518110620001b657fe5b602090810291909101810151825460018101845560009384529282902090920180546001600160a01b0319166001600160a01b03909316929092179091556040805133808252915191927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92918290030190a2600101620000d6565b5050506001600160a01b038116156200029157600580546001600160a01b0319166001600160a01b03831690811790915560405160009033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc50908390a45b50506143c980620002a36000396000f3fe6080604052600436106101f95760003560e01c8063836e386d1161010d578063b3ce74c7116100a0578063e0e3671c1161006f578063e0e3671c146109ed578063e87471a514610a20578063ea4ba2fa14610a53578063ee56797514610a9e578063fdc704d714610ab3576101f9565b8063b3ce74c7146108c1578063ca2dfd0a146108fa578063d6febde81461092d578063d96e9de314610950576101f9565b8063a0e67e2b116100dc578063a0e67e2b1461079a578063a935e766146107ff578063ab18af2714610814578063af7cea7d14610847576101f9565b8063836e386d146106235780638acb0e6b146106615780638e1ba962146106ec5780639000b3d614610767576101f9565b806321df0da7116101905780636e1b400b1161015f5780636e1b400b1461053c5780637065cb481461055157806376d73a76146105845780637baec6ae146105ba5780638259ab11146105f3576101f9565b806321df0da71461049757806343a40e3f146104ac57806365e168d3146104df57806367184e2814610527576101f9565b806315cccf8e116101cc57806315cccf8e146103d157806316a6288914610410578063173825d91461043a578063194e13621461046d576101f9565b80630487e0b2146101fe57806309d5ff14146102495780631291e84f146102d357806312b0d400146103a0575b600080fd5b34801561020a57600080fd5b506102376004803603604081101561022157600080fd5b506001600160a01b038135169060200135610ae6565b60408051918252519081900360200190f35b34801561025557600080fd5b5061023760048036036101a081101561026d57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906001600160a01b03610100820135169060ff610120820135811691610140810135821691610160820135811691610180013516610b11565b3480156102df57600080fd5b5061039e600480360360408110156102f657600080fd5b810190602081018135600160201b81111561031057600080fd5b82018360208201111561032257600080fd5b803590602001918460208302840111600160201b8311171561034357600080fd5b919390929091602081019035600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b509092509050610beb565b005b3480156103ac57600080fd5b506103b5610cc8565b604080516001600160a01b039092168252519081900360200190f35b3480156103dd57600080fd5b5061039e600480360360808110156103f457600080fd5b508035906020810135906040810135906060013560ff16610cd7565b34801561041c57600080fd5b506102376004803603602081101561043357600080fd5b5035610d37565b34801561044657600080fd5b5061039e6004803603602081101561045d57600080fd5b50356001600160a01b0316610d4c565b34801561047957600080fd5b506102376004803603602081101561049057600080fd5b5035610da6565b3480156104a357600080fd5b506103b5610db8565b3480156104b857600080fd5b5061039e600480360360408110156104cf57600080fd5b508035906020013560ff16610dc7565b3480156104eb57600080fd5b5061039e6004803603608081101561050257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610e23565b34801561053357600080fd5b50610237610e7d565b34801561054857600080fd5b506103b5610e83565b34801561055d57600080fd5b5061039e6004803603602081101561057457600080fd5b50356001600160a01b0316610e92565b34801561059057600080fd5b5061039e600480360360608110156105a757600080fd5b5080359060208101359060400135610ee9565b3480156105c657600080fd5b5061039e600480360360408110156105dd57600080fd5b506001600160a01b038135169060200135610f47565b3480156105ff57600080fd5b5061039e6004803603604081101561061657600080fd5b5080359060200135610f9f565b34801561062f57600080fd5b5061064d6004803603602081101561064657600080fd5b5035610ff7565b604080519115158252519081900360200190f35b34801561066d57600080fd5b5061039e6004803603604081101561068457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b50909250905061100c565b3480156106f857600080fd5b5061039e6004803603604081101561070f57600080fd5b810190602081018135600160201b81111561072957600080fd5b82018360208201111561073b57600080fd5b803590602001918460208302840111600160201b8311171561075c57600080fd5b91935091503561107d565b34801561077357600080fd5b5061039e6004803603602081101561078a57600080fd5b50356001600160a01b0316611103565b3480156107a657600080fd5b506107af61115a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107eb5781810151838201526020016107d3565b505050509050019250505060405180910390f35b34801561080b57600080fd5b506107af6111bc565b34801561082057600080fd5b5061039e6004803603602081101561083757600080fd5b50356001600160a01b031661121c565b34801561085357600080fd5b506108716004803603602081101561086a57600080fd5b5035611273565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b3480156108cd57600080fd5b5061064d600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611427565b34801561090657600080fd5b5061039e6004803603602081101561091d57600080fd5b50356001600160a01b0316611452565b61039e6004803603604081101561094357600080fd5b50803590602001356114a9565b34801561095c57600080fd5b5061097a6004803603602081101561097357600080fd5b50356114b3565b6040516001600160a01b03861681526020810185600181111561099957fe5b60ff1681526020018460028111156109ad57fe5b60ff1681526020018360038111156109c157fe5b60ff1681526020018260048111156109d557fe5b60ff1681526020019550505050505060405180910390f35b3480156109f957600080fd5b5061064d60048036036020811015610a1057600080fd5b50356001600160a01b0316611638565b348015610a2c57600080fd5b5061039e60048036036020811015610a4357600080fd5b50356001600160a01b0316611656565b348015610a5f57600080fd5b5061039e600480360360c0811015610a7657600080fd5b5080359060208101359060408101359060608101359060808101359060a0013560ff166116ad565b348015610aaa57600080fd5b5061039e611711565b348015610abf57600080fd5b5061064d60048036036020811015610ad657600080fd5b50356001600160a01b031661171b565b6001600160a01b03821660009081526009602090815260408083208484529091529020545b92915050565b3360009081526002602052604081205460ff16610b5f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b50600480546001019081905560408051828152905133917eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b919081900360200190a2610baa8185611739565b610bb6818888886117c7565b610bc0818f61190e565b610bce818a8a8e8e87611ca7565b610bda818e8e86611ddd565b9d9c50505050505050505050505050565b3360009081526003602052604090205460ff16610c395760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b828114610c775760405162461bcd60e51b8152600401808060200182810382526034815260200180613e366034913960400191505060405180910390fd5b60005b83811015610cc157610cb9858583818110610c9157fe5b905060200201356001600160a01b0316848484818110610cad57fe5b90506020020135611f99565b600101610c7a565b5050505050565b6005546001600160a01b031690565b3360009081526002602052604090205460ff16610d255760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d3184848484611ddd565b50505050565b6000818152600b60205260409020545b919050565b3360009081526002602052604090205460ff16610d9a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612043565b50565b6000908152600a602052604090205490565b6006546001600160a01b031690565b3360009081526002602052604090205460ff16610e155760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f8282611739565b5050565b3360009081526002602052604090205460ff16610e715760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d31848484846117c7565b60045490565b6007546001600160a01b031690565b3360009081526002602052604090205460ff16610ee05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816121d4565b3360009081526002602052604090205460ff16610f375760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610f42838383612323565b505050565b3360009081526003602052604090205460ff16610f955760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b610e1f8282611f99565b3360009081526002602052604090205460ff16610fed5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f828261190e565b6000908152600c602052604090205460ff1690565b3360009081526003602052604090205460ff1661105a5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b81811015610d315761107584848484818110610cad57fe5b60010161105d565b3360009081526003602052604090205460ff166110cb5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b82811015610d31576110fb8484838181106110e557fe5b905060200201356001600160a01b031683611f99565b6001016110ce565b3360009081526002602052604090205460ff166111515760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816123c2565b606060008054806020026020016040519081016040528092919081815260200182805480156111b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611194575b5050505050905090565b606060018054806020026020016040519081016040528092919081815260200182805480156111b2576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611194575050505050905090565b3360009081526002602052604090205460ff1661126a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612510565b60008060008060008060008060008061128a613c88565b60008c81526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561133957fe5b600181111561134457fe5b8152602001600a820160159054906101000a900460ff16600281111561136657fe5b600281111561137157fe5b8152602001600a820160169054906101000a900460ff16600381111561139357fe5b600381111561139e57fe5b8152602001600a820160179054906101000a900460ff1660048111156113c057fe5b60048111156113cb57fe5b815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b6001600160a01b03919091166000908152600d60209081526040808320938352929052205460ff1690565b3360009081526002602052604090205460ff166114a05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816125b3565b610e1f8282612746565b60008060008060006114c3613c88565b60008781526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561157257fe5b600181111561157d57fe5b8152602001600a820160159054906101000a900460ff16600281111561159f57fe5b60028111156115aa57fe5b8152602001600a820160169054906101000a900460ff1660038111156115cc57fe5b60038111156115d757fe5b8152602001600a820160179054906101000a900460ff1660048111156115f957fe5b600481111561160457fe5b9052506101408101516101608201516101808301516101a08401516101c090940151929b919a509850919650945092505050565b6001600160a01b031660009081526002602052604090205460ff1690565b3360009081526002602052604090205460ff166116a45760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612db8565b3360009081526002602052604090205460ff166116fb5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b611709868686868686611ca7565b505050505050565b611719612e5b565b565b6001600160a01b031660009081526003602052604090205460ff1690565b6000828152600860205260409020600a01805482919060ff60a81b1916600160a81b83600281111561176757fe5b0217905550336001600160a01b03167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a482378383604051808381526020018260028111156117af57fe5b60ff1681526020019250505060405180910390a25050565b600083116118065760405162461bcd60e51b815260040180806020018281038252602981526020018061425e6029913960400191505060405180910390fd5b600181600181111561181457fe5b141561185f576001600160a01b03821661185f5760405162461bcd60e51b81526004018080602001828103825260328152602001806140a86032913960400191505060405180910390fd5b600084815260086020526040902060098101849055600a0180546001600160a01b0319166001600160a01b0384161780825582919060ff60a01b1916600160a01b8360018111156118ac57fe5b02179055508060018111156118bd57fe5b60408051868152602081018690526001600160a01b03851681830152905133917f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7919081900360600190a350505050565b6000811161194d5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e6a603c913960400191505060405180910390fd5b600082815260086020526040902060098101546001909101548291611978919063ffffffff6130e416565b11156119b55760405162461bcd60e51b815260040180806020018281038252604c8152602001806142c1604c913960600191505060405180910390fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d6020811015611a2a57600080fd5b505160008481526008602052604081206002015491925090611a6a90611a5e85611a52613144565b9063ffffffff61318316565b9063ffffffff6131dd16565b905081811115611b72576006546000906001600160a01b03166323b872dd3330611a9a868863ffffffff6131dd16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b505050506040513d6020811015611b2c57600080fd5b5051905080611b6c5760405162461bcd60e51b815260040180806020018281038252603e8152602001806141ea603e913960400191505060405180910390fd5b50611c52565b6006546000906001600160a01b031663a9059cbb33611b97868663ffffffff6131dd16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b5051905080611c505760405162461bcd60e51b8152600401808060200182810382526038815260200180613fdf6038913960400191505060405180910390fd5b505b6000848152600860209081526040918290206002018590558151868152908101859052815133927fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca95928290030190a250505050565b83851115611ce65760405162461bcd60e51b8152600401808060200182810382526029815260200180613fb66029913960400191505060405180910390fd5b612710821115611d275760405162461bcd60e51b81526004018080602001828103825260378152602001806140386037913960400191505060405180910390fd5b6000868152600860208190526040909120600781018790559081018590556005810184905560068101839055600a01805482919060ff60b81b1916600160b81b836004811115611d7357fe5b0217905550806004811115611d8457fe5b60408051888152602081018890528082018790526060810186905260808101859052905133917f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e3919081900360a00190a3505050505050565b8215801590611deb57508115155b8015611e0257506002816003811115611e0057fe5b145b15611e595742611e18848463ffffffff61318316565b11611e545760405162461bcd60e51b815260040180806020018281038252603a815260200180614287603a913960400191505060405180910390fd5b611efe565b82151580611e6657508115155b8015611e7d57506003816003811115611e7b57fe5b145b15611efe57818310611ec05760405162461bcd60e51b815260040180806020018281038252603b815260200180613dcf603b913960400191505060405180910390fd5b428211611efe5760405162461bcd60e51b81526004018080602001828103825260368152602001806142286036913960400191505060405180910390fd5b6000848152600860205260409020600380820185905560048201849055600a9091018054839260ff60b01b1990911690600160b01b908490811115611f3f57fe5b0217905550806003811115611f5057fe5b6040805186815260208101869052808201859052905133917f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f582650919081900360600190a350505050565b6001600160a01b038216611fde5760405162461bcd60e51b8152600401808060200182810382526033815260200180613ea66033913960400191505060405180910390fd5b6001600160a01b0382166000818152600d60209081526040808320858452825291829020805460ff191660011790558151848152915133927fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f492908290030190a35050565b6001600160a01b03811660009081526002602052604090205460ff1661209a5760405162461bcd60e51b815260040180806020018281038252602681526020018061430d6026913960400191505060405180910390fd5b6001600160a01b0381166000908152600260205260408120805460ff191690558054905b8181101561216157600081815481106120d357fe5b6000918252602090912001546001600160a01b0384811691161415612159576000600183038154811061210257fe5b600091825260208220015481546001600160a01b0390911691908390811061212657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612161565b6001016120be565b50600080548061216d57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f93003679928290030190a25050565b6001600160a01b03811661222f576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156122875760405162461bcd60e51b815260040180806020018281038252602a815260200180613da5602a913960400191505060405180910390fd5b6001600160a01b0381166000818152600260209081526040808320805460ff19166001908117909155835490810184559280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390920180546001600160a01b031916841790558151928352905133927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92908290030190a250565b808211156123625760405162461bcd60e51b815260040180806020018281038252603981526020018061406f6039913960400191505060405180910390fd5b6000838152600860209081526040918290208481556001018390558151858152908101849052808201839052905133917fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c919081900360600190a2505050565b6001600160a01b03811661241d576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16156124755760405162461bcd60e51b815260040180806020018281038252602c815260200180613ed9602c913960400191505060405180910390fd5b6001600160a01b0381166000818152600360209081526040808320805460ff191660019081179091558054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b031916841790558151928352905133927fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e92908290030190a250565b6001600160a01b0381166125555760405162461bcd60e51b815260040180806020018281038252602c815260200180613e0a602c913960400191505060405180910390fd5b6005546040516001600160a01b0380841692169033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5090600090a4600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604090205460ff1661260a5760405162461bcd60e51b81526004018080602001828103825260288152602001806141976028913960400191505060405180910390fd5b6001600160a01b0381166000908152600360205260408120805460ff19169055600154905b818110156126d3576001818154811061264457fe5b6000918252602090912001546001600160a01b03848116911614156126cb5760018083038154811061267257fe5b600091825260209091200154600180546001600160a01b03909216918390811061269857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506126d3565b60010161262f565b5060018054806126df57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed6928290030190a25050565b61274f8261321f565b6127a0576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6127a8613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561285757fe5b600181111561286257fe5b8152602001600a820160159054906101000a900460ff16600281111561288457fe5b600281111561288f57fe5b8152602001600a820160169054906101000a900460ff1660038111156128b157fe5b60038111156128bc57fe5b8152602001600a820160179054906101000a900460ff1660048111156128de57fe5b60048111156128e957fe5b90525090506000816101800151600281111561290157fe5b141561293e5760405162461bcd60e51b815260040180806020018281038252602881526020018061436d6028913960400191505060405180910390fd5b6002816101800151600281111561295157fe5b14156129b057336000908152600d6020908152604080832086845290915290205460ff166129b05760405162461bcd60e51b8152600401808060200182810382526028815260200180613f686028913960400191505060405180910390fd5b336000908152600960209081526040808320868452825290912054908201518110612a0c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613f056031913960400191505060405180910390fd5b6000808361016001516001811115612a2057fe5b1415612a2d575034612b7e565b83612a695760405162461bcd60e51b81526004018080602001828103825260238152602001806141486023913960400191505060405180910390fd5b6101408301516001600160a01b0316612ab35760405162461bcd60e51b815260040180806020018281038252602c81526020018061416b602c913960400191505060405180910390fd5b610140830151604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015612b0f57600080fd5b505af1158015612b23573d6000803e3d6000fd5b505050506040513d6020811015612b3957600080fd5b5051905080612b795760405162461bcd60e51b815260040180806020018281038252603a815260200180614333603a913960400191505060405180910390fd5b849150505b8251600090821015612bc15760405162461bcd60e51b8152600401808060200182810382526032815260200180613f366032913960400191505060405180910390fd5b60208401518290612bd8908563ffffffff6131dd16565b11612c11576020840151612bf690611a5e848663ffffffff61318316565b6020850151909150612c0e908463ffffffff6131dd16565b91505b6000612c2b856101200151846130e490919063ffffffff16565b6040860151909150612c43908263ffffffff6131dd16565b604080870191909152336000908152600960209081528282208a835290522054612c73908263ffffffff61318316565b3360009081526009602090815260408083208b8452909152902055612c988782613463565b612ca18761388f565b612cad87848684613af5565b8115612d75576101408501516040805163a9059cbb60e01b81523360048201526024810185905290516000926001600160a01b03169163a9059cbb91604480830192602092919082900301818787803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506040513d6020811015612d3357600080fd5b5051905080612d735760405162461bcd60e51b815260040180806020018281038252603981526020018061410f6039913960400191505060405180910390fd5b505b6040805188815260208101839052815133927f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba0928290030190a250505050505050565b6001600160a01b038116612dfd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d756030913960400191505060405180910390fd5b6007546040516001600160a01b0380841692169033907f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce190600090a4600780546001600160a01b0319166001600160a01b0392909216919091179055565b612e6433611638565b80612e7957506005546001600160a01b031633145b612eb45760405162461bcd60e51b81526004018080602001828103825260358152602001806140da6035913960400191505060405180910390fd5b60055433906001600160a01b031615612ed557506005546001600160a01b03165b60015b6004548111610e1f576000818152600c602052604090205460ff16156130dc57600081815260086020908152604080832060090154600b909252822054612f249163ffffffff613b4a16565b9050600080838152600860205260409020600a0154600160a01b900460ff166001811115612f4e57fe5b1415612ffa576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612f8a573d6000803e3d6000fd5b50826001600160a01b0316336001600160a01b03167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c8460008560405180848152602001836001811115612fda57fe5b60ff168152602001828152602001935050505060405180910390a36130da565b6000828152600860209081526040808320600a0154815163a9059cbb60e01b81526001600160a01b038881166004830152602482018790529251929091169363a9059cbb9360448084019491939192918390030190829087803b15801561306057600080fd5b505af1158015613074573d6000803e3d6000fd5b505050506040513d602081101561308a57600080fd5b5050604080518381526001602082015280820183905290516001600160a01b0385169133917fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c9181900360600190a35b505b600101612ed8565b6000826130f357506000610b0b565b8282028284828161310057fe5b041461313d5760405162461bcd60e51b81526004018080602001828103825260218152602001806140176021913960400191505060405180910390fd5b9392505050565b600060015b600454811161317f5760008181526008602052604090206002015461317590839063ffffffff61318316565b9150600101613149565b5090565b60008282018381101561313d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061313d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8c565b60008181526008602052604081206003015461326c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613f906026913960400191505060405180910390fd5b6000828152600c602052604090205460ff16156132d0576040805162461bcd60e51b815260206004820152601860248201527f4f726967696e73426173653a2053616c6520656e6465642e0000000000000000604482015290519081900360640190fd5b600080838152600860205260409020600a0154600160b01b900460ff1660038111156132f857fe5b141561330657506000610d47565b60016000838152600860205260409020600a0154600160b01b900460ff16600381111561332f57fe5b14801561334b5750600082815260086020526040902060020154155b1561336f57506000818152600c60205260408120805460ff19166001179055610d47565b60036000838152600860205260409020600a0154600160b01b900460ff16600381111561339857fe5b1480156133b5575060008281526008602052604090206004015442115b156133d957506000818152600c60205260408120805460ff19166001179055610d47565b60026000838152600860205260409020600a0154600160b01b900460ff16600381111561340257fe5b1480156134375750600082815260086020526040902060048101546003909101544291613435919063ffffffff61318316565b105b1561345b57506000818152600c60205260408120805460ff19166001179055610d47565b506001919050565b61346b613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561351a57fe5b600181111561352557fe5b8152602001600a820160159054906101000a900460ff16600281111561354757fe5b600281111561355257fe5b8152602001600a820160169054906101000a900460ff16600381111561357457fe5b600381111561357f57fe5b8152602001600a820160179054906101000a900460ff1660048111156135a157fe5b60048111156135ac57fe5b90525090506000816101c0015160048111156135c457fe5b14156136015760405162461bcd60e51b815260040180806020018281038252602b8152602001806141bf602b913960400191505060405180910390fd5b6001816101c00151600481111561361457fe5b14156136a3576101408101516040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50610f429050565b6002816101c0015160048111156136b657fe5b1415613700576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b6003816101c00151600481111561371357fe5b1415613832576006546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561377257600080fd5b505af1158015613786573d6000803e3d6000fd5b505050506040513d602081101561379c57600080fd5b505060075460e082015161010083015160c08401516040805163849a681760e01b815233600482015260248101889052604481019490945260648401929092526084830152516001600160a01b039092169163849a68179160a48082019260009290919082900301818387803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b50505050610f42565b6004816101c00151600481111561384557fe5b1415610f42576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b613897613c88565b60008281526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561394657fe5b600181111561395157fe5b8152602001600a820160159054906101000a900460ff16600281111561397357fe5b600281111561397e57fe5b8152602001600a820160169054906101000a900460ff1660038111156139a057fe5b60038111156139ab57fe5b8152602001600a820160179054906101000a900460ff1660048111156139cd57fe5b60048111156139d857fe5b815250509050806020015181604001511015610e1f57805160408201511015613a9c576040810151613a54576000828152600c6020908152604091829020805460ff191660011790558151848152915133927f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c492908290030190a25b6000828152600860209081526040808320929092558151848152915133927f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a7892908290030190a25b6040808201805160008581526008602090815290849020600101919091559051825185815291820152815133927f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445928290030190a25050565b8215610d315781613b16576000848152600a60205260409020805460010190555b6000848152600b6020526040902054613b35908263ffffffff61318316565b6000858152600b602052604090205550505050565b600061313d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c23565b60008184841115613c1b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be0578181015183820152602001613bc8565b50505050905090810190601f168015613c0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c725760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be0578181015183820152602001613bc8565b506000838581613c7e57fe5b0495945050505050565b604051806101e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001811115613cf757fe5b81526020016000815260200160008152602001600090529056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158202d89714341304412ad9b2eeadcb8fe4b28f640f6add719b48e8bd0a43deef74364736f6c634300051100324f726967696e7341646d696e3a2045616368206f776e65722063616e206265206164646564206f6e6c79206f6e63652e", - "deployedBytecode": "0x6080604052600436106101f95760003560e01c8063836e386d1161010d578063b3ce74c7116100a0578063e0e3671c1161006f578063e0e3671c146109ed578063e87471a514610a20578063ea4ba2fa14610a53578063ee56797514610a9e578063fdc704d714610ab3576101f9565b8063b3ce74c7146108c1578063ca2dfd0a146108fa578063d6febde81461092d578063d96e9de314610950576101f9565b8063a0e67e2b116100dc578063a0e67e2b1461079a578063a935e766146107ff578063ab18af2714610814578063af7cea7d14610847576101f9565b8063836e386d146106235780638acb0e6b146106615780638e1ba962146106ec5780639000b3d614610767576101f9565b806321df0da7116101905780636e1b400b1161015f5780636e1b400b1461053c5780637065cb481461055157806376d73a76146105845780637baec6ae146105ba5780638259ab11146105f3576101f9565b806321df0da71461049757806343a40e3f146104ac57806365e168d3146104df57806367184e2814610527576101f9565b806315cccf8e116101cc57806315cccf8e146103d157806316a6288914610410578063173825d91461043a578063194e13621461046d576101f9565b80630487e0b2146101fe57806309d5ff14146102495780631291e84f146102d357806312b0d400146103a0575b600080fd5b34801561020a57600080fd5b506102376004803603604081101561022157600080fd5b506001600160a01b038135169060200135610ae6565b60408051918252519081900360200190f35b34801561025557600080fd5b5061023760048036036101a081101561026d57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906001600160a01b03610100820135169060ff610120820135811691610140810135821691610160820135811691610180013516610b11565b3480156102df57600080fd5b5061039e600480360360408110156102f657600080fd5b810190602081018135600160201b81111561031057600080fd5b82018360208201111561032257600080fd5b803590602001918460208302840111600160201b8311171561034357600080fd5b919390929091602081019035600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b509092509050610beb565b005b3480156103ac57600080fd5b506103b5610cc8565b604080516001600160a01b039092168252519081900360200190f35b3480156103dd57600080fd5b5061039e600480360360808110156103f457600080fd5b508035906020810135906040810135906060013560ff16610cd7565b34801561041c57600080fd5b506102376004803603602081101561043357600080fd5b5035610d37565b34801561044657600080fd5b5061039e6004803603602081101561045d57600080fd5b50356001600160a01b0316610d4c565b34801561047957600080fd5b506102376004803603602081101561049057600080fd5b5035610da6565b3480156104a357600080fd5b506103b5610db8565b3480156104b857600080fd5b5061039e600480360360408110156104cf57600080fd5b508035906020013560ff16610dc7565b3480156104eb57600080fd5b5061039e6004803603608081101561050257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610e23565b34801561053357600080fd5b50610237610e7d565b34801561054857600080fd5b506103b5610e83565b34801561055d57600080fd5b5061039e6004803603602081101561057457600080fd5b50356001600160a01b0316610e92565b34801561059057600080fd5b5061039e600480360360608110156105a757600080fd5b5080359060208101359060400135610ee9565b3480156105c657600080fd5b5061039e600480360360408110156105dd57600080fd5b506001600160a01b038135169060200135610f47565b3480156105ff57600080fd5b5061039e6004803603604081101561061657600080fd5b5080359060200135610f9f565b34801561062f57600080fd5b5061064d6004803603602081101561064657600080fd5b5035610ff7565b604080519115158252519081900360200190f35b34801561066d57600080fd5b5061039e6004803603604081101561068457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b50909250905061100c565b3480156106f857600080fd5b5061039e6004803603604081101561070f57600080fd5b810190602081018135600160201b81111561072957600080fd5b82018360208201111561073b57600080fd5b803590602001918460208302840111600160201b8311171561075c57600080fd5b91935091503561107d565b34801561077357600080fd5b5061039e6004803603602081101561078a57600080fd5b50356001600160a01b0316611103565b3480156107a657600080fd5b506107af61115a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107eb5781810151838201526020016107d3565b505050509050019250505060405180910390f35b34801561080b57600080fd5b506107af6111bc565b34801561082057600080fd5b5061039e6004803603602081101561083757600080fd5b50356001600160a01b031661121c565b34801561085357600080fd5b506108716004803603602081101561086a57600080fd5b5035611273565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b3480156108cd57600080fd5b5061064d600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611427565b34801561090657600080fd5b5061039e6004803603602081101561091d57600080fd5b50356001600160a01b0316611452565b61039e6004803603604081101561094357600080fd5b50803590602001356114a9565b34801561095c57600080fd5b5061097a6004803603602081101561097357600080fd5b50356114b3565b6040516001600160a01b03861681526020810185600181111561099957fe5b60ff1681526020018460028111156109ad57fe5b60ff1681526020018360038111156109c157fe5b60ff1681526020018260048111156109d557fe5b60ff1681526020019550505050505060405180910390f35b3480156109f957600080fd5b5061064d60048036036020811015610a1057600080fd5b50356001600160a01b0316611638565b348015610a2c57600080fd5b5061039e60048036036020811015610a4357600080fd5b50356001600160a01b0316611656565b348015610a5f57600080fd5b5061039e600480360360c0811015610a7657600080fd5b5080359060208101359060408101359060608101359060808101359060a0013560ff166116ad565b348015610aaa57600080fd5b5061039e611711565b348015610abf57600080fd5b5061064d60048036036020811015610ad657600080fd5b50356001600160a01b031661171b565b6001600160a01b03821660009081526009602090815260408083208484529091529020545b92915050565b3360009081526002602052604081205460ff16610b5f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b50600480546001019081905560408051828152905133917eff2cad8a1c7cc34ae612e3e9ad82f01ce5763fe04571579810203f1083249b919081900360200190a2610baa8185611739565b610bb6818888886117c7565b610bc0818f61190e565b610bce818a8a8e8e87611ca7565b610bda818e8e86611ddd565b9d9c50505050505050505050505050565b3360009081526003602052604090205460ff16610c395760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b828114610c775760405162461bcd60e51b8152600401808060200182810382526034815260200180613e366034913960400191505060405180910390fd5b60005b83811015610cc157610cb9858583818110610c9157fe5b905060200201356001600160a01b0316848484818110610cad57fe5b90506020020135611f99565b600101610c7a565b5050505050565b6005546001600160a01b031690565b3360009081526002602052604090205460ff16610d255760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d3184848484611ddd565b50505050565b6000818152600b60205260409020545b919050565b3360009081526002602052604090205460ff16610d9a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612043565b50565b6000908152600a602052604090205490565b6006546001600160a01b031690565b3360009081526002602052604090205460ff16610e155760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f8282611739565b5050565b3360009081526002602052604090205460ff16610e715760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610d31848484846117c7565b60045490565b6007546001600160a01b031690565b3360009081526002602052604090205460ff16610ee05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816121d4565b3360009081526002602052604090205460ff16610f375760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610f42838383612323565b505050565b3360009081526003602052604090205460ff16610f955760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b610e1f8282611f99565b3360009081526002602052604090205460ff16610fed5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610e1f828261190e565b6000908152600c602052604090205460ff1690565b3360009081526003602052604090205460ff1661105a5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b81811015610d315761107584848484818110610cad57fe5b60010161105d565b3360009081526003602052604090205460ff166110cb5760405162461bcd60e51b8152600401808060200182810382526033815260200180613d426033913960400191505060405180910390fd5b60005b82811015610d31576110fb8484838181106110e557fe5b905060200201356001600160a01b031683611f99565b6001016110ce565b3360009081526002602052604090205460ff166111515760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816123c2565b606060008054806020026020016040519081016040528092919081815260200182805480156111b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611194575b5050505050905090565b606060018054806020026020016040519081016040528092919081815260200182805480156111b2576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611194575050505050905090565b3360009081526002602052604090205460ff1661126a5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612510565b60008060008060008060008060008061128a613c88565b60008c81526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561133957fe5b600181111561134457fe5b8152602001600a820160159054906101000a900460ff16600281111561136657fe5b600281111561137157fe5b8152602001600a820160169054906101000a900460ff16600381111561139357fe5b600381111561139e57fe5b8152602001600a820160179054906101000a900460ff1660048111156113c057fe5b60048111156113cb57fe5b815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861010001518961012001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b6001600160a01b03919091166000908152600d60209081526040808320938352929052205460ff1690565b3360009081526002602052604090205460ff166114a05760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da3816125b3565b610e1f8282612746565b60008060008060006114c3613c88565b60008781526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561157257fe5b600181111561157d57fe5b8152602001600a820160159054906101000a900460ff16600281111561159f57fe5b60028111156115aa57fe5b8152602001600a820160169054906101000a900460ff1660038111156115cc57fe5b60038111156115d757fe5b8152602001600a820160179054906101000a900460ff1660048111156115f957fe5b600481111561160457fe5b9052506101408101516101608201516101808301516101a08401516101c090940151929b919a509850919650945092505050565b6001600160a01b031660009081526002602052604090205460ff1690565b3360009081526002602052604090205460ff166116a45760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b610da381612db8565b3360009081526002602052604090205460ff166116fb5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d126030913960400191505060405180910390fd5b611709868686868686611ca7565b505050505050565b611719612e5b565b565b6001600160a01b031660009081526003602052604090205460ff1690565b6000828152600860205260409020600a01805482919060ff60a81b1916600160a81b83600281111561176757fe5b0217905550336001600160a01b03167f30b04dd4504dbbe9129435f5a8860fb1566ebd3ee87bbb321b2f0b2f66a482378383604051808381526020018260028111156117af57fe5b60ff1681526020019250505060405180910390a25050565b600083116118065760405162461bcd60e51b815260040180806020018281038252602981526020018061425e6029913960400191505060405180910390fd5b600181600181111561181457fe5b141561185f576001600160a01b03821661185f5760405162461bcd60e51b81526004018080602001828103825260328152602001806140a86032913960400191505060405180910390fd5b600084815260086020526040902060098101849055600a0180546001600160a01b0319166001600160a01b0384161780825582919060ff60a01b1916600160a01b8360018111156118ac57fe5b02179055508060018111156118bd57fe5b60408051868152602081018690526001600160a01b03851681830152905133917f882910ddbf58df55bfdd81c1aecf9309fc1b7d7ec4129febe054a19bcba2bca7919081900360600190a350505050565b6000811161194d5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e6a603c913960400191505060405180910390fd5b600082815260086020526040902060098101546001909101548291611978919063ffffffff6130e416565b11156119b55760405162461bcd60e51b815260040180806020018281038252604c8152602001806142c1604c913960600191505060405180910390fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d6020811015611a2a57600080fd5b505160008481526008602052604081206002015491925090611a6a90611a5e85611a52613144565b9063ffffffff61318316565b9063ffffffff6131dd16565b905081811115611b72576006546000906001600160a01b03166323b872dd3330611a9a868863ffffffff6131dd16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b505050506040513d6020811015611b2c57600080fd5b5051905080611b6c5760405162461bcd60e51b815260040180806020018281038252603e8152602001806141ea603e913960400191505060405180910390fd5b50611c52565b6006546000906001600160a01b031663a9059cbb33611b97868663ffffffff6131dd16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b5051905080611c505760405162461bcd60e51b8152600401808060200182810382526038815260200180613fdf6038913960400191505060405180910390fd5b505b6000848152600860209081526040918290206002018590558151868152908101859052815133927fc5a6b5f24219e32b64633d07b7a8c575d1b35cce427f87164c9ddc6cca81ca95928290030190a250505050565b83851115611ce65760405162461bcd60e51b8152600401808060200182810382526029815260200180613fb66029913960400191505060405180910390fd5b612710821115611d275760405162461bcd60e51b81526004018080602001828103825260378152602001806140386037913960400191505060405180910390fd5b6000868152600860208190526040909120600781018790559081018590556005810184905560068101839055600a01805482919060ff60b81b1916600160b81b836004811115611d7357fe5b0217905550806004811115611d8457fe5b60408051888152602081018890528082018790526060810186905260808101859052905133917f65ac2502ce0d584ddd0a8a453b2d9b09a95a1d2bc6ca2b2036c7bcf0b11201e3919081900360a00190a3505050505050565b8215801590611deb57508115155b8015611e0257506002816003811115611e0057fe5b145b15611e595742611e18848463ffffffff61318316565b11611e545760405162461bcd60e51b815260040180806020018281038252603a815260200180614287603a913960400191505060405180910390fd5b611efe565b82151580611e6657508115155b8015611e7d57506003816003811115611e7b57fe5b145b15611efe57818310611ec05760405162461bcd60e51b815260040180806020018281038252603b815260200180613dcf603b913960400191505060405180910390fd5b428211611efe5760405162461bcd60e51b81526004018080602001828103825260368152602001806142286036913960400191505060405180910390fd5b6000848152600860205260409020600380820185905560048201849055600a9091018054839260ff60b01b1990911690600160b01b908490811115611f3f57fe5b0217905550806003811115611f5057fe5b6040805186815260208101869052808201859052905133917f3f264dd252fb54617abbe8610c74bfdb21fab381bfafb7b8ec10f02b2f582650919081900360600190a350505050565b6001600160a01b038216611fde5760405162461bcd60e51b8152600401808060200182810382526033815260200180613ea66033913960400191505060405180910390fd5b6001600160a01b0382166000818152600d60209081526040808320858452825291829020805460ff191660011790558151848152915133927fd0341f7bb58d2e2f1e505b4b8cd3883a80a71813da8e912b67c68bb99214d5f492908290030190a35050565b6001600160a01b03811660009081526002602052604090205460ff1661209a5760405162461bcd60e51b815260040180806020018281038252602681526020018061430d6026913960400191505060405180910390fd5b6001600160a01b0381166000908152600260205260408120805460ff191690558054905b8181101561216157600081815481106120d357fe5b6000918252602090912001546001600160a01b0384811691161415612159576000600183038154811061210257fe5b600091825260208220015481546001600160a01b0390911691908390811061212657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612161565b6001016120be565b50600080548061216d57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f93003679928290030190a25050565b6001600160a01b03811661222f576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156122875760405162461bcd60e51b815260040180806020018281038252602a815260200180613da5602a913960400191505060405180910390fd5b6001600160a01b0381166000818152600260209081526040808320805460ff19166001908117909155835490810184559280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390920180546001600160a01b031916841790558151928352905133927fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a92908290030190a250565b808211156123625760405162461bcd60e51b815260040180806020018281038252603981526020018061406f6039913960400191505060405180910390fd5b6000838152600860209081526040918290208481556001018390558151858152908101849052808201839052905133917fb6038050d95c3845ef9ec3e0b146c25d855715b5a69fa279ddb20f35e926f90c919081900360600190a2505050565b6001600160a01b03811661241d576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e7341646d696e3a20496e76616c696420416464726573732e0000604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16156124755760405162461bcd60e51b815260040180806020018281038252602c815260200180613ed9602c913960400191505060405180910390fd5b6001600160a01b0381166000818152600360209081526040808320805460ff191660019081179091558054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b031916841790558151928352905133927fcded52b8cbf99afd8d08e8cbbd08132079749ce1735c8ff927d746d8af29782e92908290030190a250565b6001600160a01b0381166125555760405162461bcd60e51b815260040180806020018281038252602c815260200180613e0a602c913960400191505060405180910390fd5b6005546040516001600160a01b0380841692169033907faaa05da162537d6c0a2c5e57caf1cb6bea97efc44ce3cda5d269dd2f3b03bc5090600090a4600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604090205460ff1661260a5760405162461bcd60e51b81526004018080602001828103825260288152602001806141976028913960400191505060405180910390fd5b6001600160a01b0381166000908152600360205260408120805460ff19169055600154905b818110156126d3576001818154811061264457fe5b6000918252602090912001546001600160a01b03848116911614156126cb5760018083038154811061267257fe5b600091825260209091200154600180546001600160a01b03909216918390811061269857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506126d3565b60010161262f565b5060018054806126df57fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b0385168152905133927f490861baee43b8ebd28f134f99c0aa7848888c4bde402256ad4cf455d147aed6928290030190a25050565b61274f8261321f565b6127a0576040805162461bcd60e51b815260206004820152601e60248201527f4f726967696e73426173653a2053616c65206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6127a8613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561285757fe5b600181111561286257fe5b8152602001600a820160159054906101000a900460ff16600281111561288457fe5b600281111561288f57fe5b8152602001600a820160169054906101000a900460ff1660038111156128b157fe5b60038111156128bc57fe5b8152602001600a820160179054906101000a900460ff1660048111156128de57fe5b60048111156128e957fe5b90525090506000816101800151600281111561290157fe5b141561293e5760405162461bcd60e51b815260040180806020018281038252602881526020018061436d6028913960400191505060405180910390fd5b6002816101800151600281111561295157fe5b14156129b057336000908152600d6020908152604080832086845290915290205460ff166129b05760405162461bcd60e51b8152600401808060200182810382526028815260200180613f686028913960400191505060405180910390fd5b336000908152600960209081526040808320868452825290912054908201518110612a0c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613f056031913960400191505060405180910390fd5b6000808361016001516001811115612a2057fe5b1415612a2d575034612b7e565b83612a695760405162461bcd60e51b81526004018080602001828103825260238152602001806141486023913960400191505060405180910390fd5b6101408301516001600160a01b0316612ab35760405162461bcd60e51b815260040180806020018281038252602c81526020018061416b602c913960400191505060405180910390fd5b610140830151604080516323b872dd60e01b81523360048201523060248201526044810187905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b158015612b0f57600080fd5b505af1158015612b23573d6000803e3d6000fd5b505050506040513d6020811015612b3957600080fd5b5051905080612b795760405162461bcd60e51b815260040180806020018281038252603a815260200180614333603a913960400191505060405180910390fd5b849150505b8251600090821015612bc15760405162461bcd60e51b8152600401808060200182810382526032815260200180613f366032913960400191505060405180910390fd5b60208401518290612bd8908563ffffffff6131dd16565b11612c11576020840151612bf690611a5e848663ffffffff61318316565b6020850151909150612c0e908463ffffffff6131dd16565b91505b6000612c2b856101200151846130e490919063ffffffff16565b6040860151909150612c43908263ffffffff6131dd16565b604080870191909152336000908152600960209081528282208a835290522054612c73908263ffffffff61318316565b3360009081526009602090815260408083208b8452909152902055612c988782613463565b612ca18761388f565b612cad87848684613af5565b8115612d75576101408501516040805163a9059cbb60e01b81523360048201526024810185905290516000926001600160a01b03169163a9059cbb91604480830192602092919082900301818787803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506040513d6020811015612d3357600080fd5b5051905080612d735760405162461bcd60e51b815260040180806020018281038252603981526020018061410f6039913960400191505060405180910390fd5b505b6040805188815260208101839052815133927f5798ec577126413c34eec76755f7164dc2f21b7d22d79c3c2a20d321dea24ba0928290030190a250505050505050565b6001600160a01b038116612dfd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613d756030913960400191505060405180910390fd5b6007546040516001600160a01b0380841692169033907f60452ee74fb08abf5725eba28508ae637c75d7c59c13091cdda93de07ee01ce190600090a4600780546001600160a01b0319166001600160a01b0392909216919091179055565b612e6433611638565b80612e7957506005546001600160a01b031633145b612eb45760405162461bcd60e51b81526004018080602001828103825260358152602001806140da6035913960400191505060405180910390fd5b60055433906001600160a01b031615612ed557506005546001600160a01b03165b60015b6004548111610e1f576000818152600c602052604090205460ff16156130dc57600081815260086020908152604080832060090154600b909252822054612f249163ffffffff613b4a16565b9050600080838152600860205260409020600a0154600160a01b900460ff166001811115612f4e57fe5b1415612ffa576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612f8a573d6000803e3d6000fd5b50826001600160a01b0316336001600160a01b03167fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c8460008560405180848152602001836001811115612fda57fe5b60ff168152602001828152602001935050505060405180910390a36130da565b6000828152600860209081526040808320600a0154815163a9059cbb60e01b81526001600160a01b038881166004830152602482018790529251929091169363a9059cbb9360448084019491939192918390030190829087803b15801561306057600080fd5b505af1158015613074573d6000803e3d6000fd5b505050506040513d602081101561308a57600080fd5b5050604080518381526001602082015280820183905290516001600160a01b0385169133917fe5f003b9660aa49e20ff06aa0013c74df4791fd3489ec2693d3d78db7f47285c9181900360600190a35b505b600101612ed8565b6000826130f357506000610b0b565b8282028284828161310057fe5b041461313d5760405162461bcd60e51b81526004018080602001828103825260218152602001806140176021913960400191505060405180910390fd5b9392505050565b600060015b600454811161317f5760008181526008602052604090206002015461317590839063ffffffff61318316565b9150600101613149565b5090565b60008282018381101561313d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061313d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8c565b60008181526008602052604081206003015461326c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613f906026913960400191505060405180910390fd5b6000828152600c602052604090205460ff16156132d0576040805162461bcd60e51b815260206004820152601860248201527f4f726967696e73426173653a2053616c6520656e6465642e0000000000000000604482015290519081900360640190fd5b600080838152600860205260409020600a0154600160b01b900460ff1660038111156132f857fe5b141561330657506000610d47565b60016000838152600860205260409020600a0154600160b01b900460ff16600381111561332f57fe5b14801561334b5750600082815260086020526040902060020154155b1561336f57506000818152600c60205260408120805460ff19166001179055610d47565b60036000838152600860205260409020600a0154600160b01b900460ff16600381111561339857fe5b1480156133b5575060008281526008602052604090206004015442115b156133d957506000818152600c60205260408120805460ff19166001179055610d47565b60026000838152600860205260409020600a0154600160b01b900460ff16600381111561340257fe5b1480156134375750600082815260086020526040902060048101546003909101544291613435919063ffffffff61318316565b105b1561345b57506000818152600c60205260408120805460ff19166001179055610d47565b506001919050565b61346b613c88565b60008381526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561351a57fe5b600181111561352557fe5b8152602001600a820160159054906101000a900460ff16600281111561354757fe5b600281111561355257fe5b8152602001600a820160169054906101000a900460ff16600381111561357457fe5b600381111561357f57fe5b8152602001600a820160179054906101000a900460ff1660048111156135a157fe5b60048111156135ac57fe5b90525090506000816101c0015160048111156135c457fe5b14156136015760405162461bcd60e51b815260040180806020018281038252602b8152602001806141bf602b913960400191505060405180910390fd5b6001816101c00151600481111561361457fe5b14156136a3576101408101516040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561367157600080fd5b505af1158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50610f429050565b6002816101c0015160048111156136b657fe5b1415613700576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b6003816101c00151600481111561371357fe5b1415613832576006546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561377257600080fd5b505af1158015613786573d6000803e3d6000fd5b505050506040513d602081101561379c57600080fd5b505060075460e082015161010083015160c08401516040805163849a681760e01b815233600482015260248101889052604481019490945260648401929092526084830152516001600160a01b039092169163849a68179160a48082019260009290919082900301818387803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b50505050610f42565b6004816101c00151600481111561384557fe5b1415610f42576040805162461bcd60e51b81526020600482015260146024820152732737ba1034b6b83632b6b2b73a32b2103cb2ba1760611b604482015290519081900360640190fd5b613897613c88565b60008281526008602081815260409283902083516101e08101855281548152600180830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152918201546101008401526009820154610120840152600a8201546001600160a01b038116610140850152610160840191600160a01b90910460ff169081111561394657fe5b600181111561395157fe5b8152602001600a820160159054906101000a900460ff16600281111561397357fe5b600281111561397e57fe5b8152602001600a820160169054906101000a900460ff1660038111156139a057fe5b60038111156139ab57fe5b8152602001600a820160179054906101000a900460ff1660048111156139cd57fe5b60048111156139d857fe5b815250509050806020015181604001511015610e1f57805160408201511015613a9c576040810151613a54576000828152600c6020908152604091829020805460ff191660011790558151848152915133927f152ad6cb319c0648f84e894118c3ab080fb489f51dc96fe9c512cdeb187446c492908290030190a25b6000828152600860209081526040808320929092558151848152915133927f05be2db72a541e616b902f2776f565a7a5e24042a20a5208727f7b6620a70a7892908290030190a25b6040808201805160008581526008602090815290849020600101919091559051825185815291820152815133927f830333ebfc6ce9e8856601707ff38342751997fafea5cd12bd5fc11076e1a445928290030190a25050565b8215610d315781613b16576000848152600a60205260409020805460010190555b6000848152600b6020526040902054613b35908263ffffffff61318316565b6000858152600b602052604090205550505050565b600061313d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c23565b60008184841115613c1b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be0578181015183820152602001613bc8565b50505050905090810190601f168015613c0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c725760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be0578181015183820152602001613bc8565b506000838581613c7e57fe5b0495945050505050565b604051806101e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001811115613cf757fe5b81526020016000815260200160008152602001600090529056fe4f726967696e7341646d696e3a204f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e7341646d696e3a204f6e6c792076657269666965722063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a204c6f636b65642046756e6420416464726573732063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920616e206f776e65722e4f726967696e73426173653a205468652073616c652073746172742054532063616e6e6f742062652061667465722073616c6520656e642054532e4f726967696e73426173653a204465706f73697420416464726573732063616e6e6f74206265207a65726f2e4f726967696e73426173653a204164647265737320616e642054696572204172726179206c656e677468206d69736d617463682e4f726967696e73426173653a20546f74616c20746f6b656e20746f2073656c6c2073686f756c6420626520686967686572207468616e207a65726f2e4f726967696e73426173653a204164647265737320746f2062652076657269666965642063616e6e6f74206265207a65726f2e4f726967696e7341646d696e3a204164647265737320697320616c726561647920612076657269666965722e4f726967696e73426173653a205573657220616c726561647920626f75676874206d6178696d756d20616c6c6f7765642e4f726967696e73426173653a204465706f736974206973206c657373207468616e206d696e696d756d20616c6c6f7765642e4f726967696e73426173653a2055736572206e6f7420617070726f76656420666f722073616c652e4f726967696e73426173653a2053616c6520686173206e6f742073746172746564207965742e4f726967696e73426173653a20436c6966662068617320746f206265203c3d206475726174696f6e2e4f726967696e73426173653a2041646d696e206469646e27742072656365697665642074686520746f6b656e7320636f72726563746c792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726967696e73426173653a2054686520626173697320706f696e742063616e6e6f7420626520686967686572207468616e2031304b2e4f726967696e73426173653a204d696e20416d6f756e742063616e6e6f7420626520686967686572207468616e204d617820416d6f756e742e4f726967696e73426173653a204465706f73697420546f6b656e20416464726573732063616e6e6f74206265207a65726f2e4f6e6c79206f776e6572206f72206465706f73697420616464726573732063616e2063616c6c20746869732066756e6374696f6e2e4f726967696e73426173653a20546f6b656e20726566756e64206e6f74207265636569766564206279207573657220636f72726563746c792e4f726967696e73426173653a20416d6f756e742063616e6e6f74206265207a65726f2e4f726967696e73426173653a204465706f73697420546f6b656e206e6f7420736574206279206f776e65722e4f726967696e7341646d696e3a2041646472657373206973206e6f7420612076657269666965722e4f726967696e73426173653a205472616e736665722054797065206e6f7420736574206279206f776e65724f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c69656420666f7220546f6b656e20446973747269627574696f6e2e4f726967696e73426173653a205468652073616c6520656e642074696d652063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204465706f73697420526174652063616e6e6f74206265207a65726f2e4f726967696e73426173653a205468652073616c6520656e64206475726174696f6e2063616e6e6f74206265207061737420616c72656164792e4f726967696e73426173653a204d617820416d6f756e7420746f206275792073686f756c64206e6f7420626520686967686572207468616e20746f6b656e20617661696c6162696c6974792e4f726967696e7341646d696e3a2041646472657373206973206e6f7420616e206f776e65722e4f726967696e73426173653a204e6f7420656e6f75676820746f6b656e20737570706c696564206279207573657220666f7220627579696e672e4f726967696e73426173653a204e6f206f6e6520697320616c6c6f77656420666f722073616c652ea265627a7a723158202d89714341304412ad9b2eeadcb8fe4b28f640f6add719b48e8bd0a43deef74364736f6c63430005110032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json b/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json deleted file mode 100644 index ce9ad16..0000000 --- a/artifacts/contracts/OriginsEvents.sol/OriginsEvents.json +++ /dev/null @@ -1,642 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "OriginsEvents", - "sourceName": "contracts/OriginsEvents.sol", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_verifiedAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "AddressVerified", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_oldDepositAddr", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_newDepositAddr", - "type": "address" - } - ], - "name": "DepositAddressUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_oldLockedFund", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_newLockedFund", - "type": "address" - } - ], - "name": "LockedFundUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "NewTierCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "OwnerAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_removedOwner", - "type": "address" - } - ], - "name": "OwnerRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_receiver", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum OriginsStorage.DepositType", - "name": "_depositType", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "ProceedingWithdrawn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_depositRate", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "_depositToken", - "type": "address" - }, - { - "indexed": true, - "internalType": "enum OriginsStorage.DepositType", - "name": "_depositType", - "type": "uint8" - } - ], - "name": "TierDepositUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "TierSaleEnded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_updatedMaxAmount", - "type": "uint256" - } - ], - "name": "TierSaleUpdatedMaximum", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - } - ], - "name": "TierSaleUpdatedMinimum", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_saleStartTS", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_saleEnd", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "enum OriginsStorage.SaleEndDurationOrTS", - "name": "_saleEndDurationOrTS", - "type": "uint8" - } - ], - "name": "TierTimeUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_remainingTokens", - "type": "uint256" - } - ], - "name": "TierTokenAmountUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_minAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_maxAmount", - "type": "uint256" - } - ], - "name": "TierTokenLimitUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum OriginsStorage.VerificationType", - "name": "_verificationType", - "type": "uint8" - } - ], - "name": "TierVerificationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_vestOrLockCliff", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_vestOrLockDuration", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_unlockedTokenWithdrawTS", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_unlockedBP", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "enum OriginsStorage.TransferType", - "name": "_transferType", - "type": "uint8" - } - ], - "name": "TierVestOrLockUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tierID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_tokensBought", - "type": "uint256" - } - ], - "name": "TokenBuy", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newVerifier", - "type": "address" - } - ], - "name": "VerifierAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_removedVerifier", - "type": "address" - } - ], - "name": "VerifierRemoved", - "type": "event" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "addOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newVerifier", - "type": "address" - } - ], - "name": "addVerifier", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "checkOwner", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "checkVerifier", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getOwners", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getVerifiers", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_ownerToRemove", - "type": "address" - } - ], - "name": "removeOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_verifierToRemove", - "type": "address" - } - ], - "name": "removeVerifier", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json b/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json deleted file mode 100644 index 3438a09..0000000 --- a/artifacts/contracts/OriginsStorage.sol/OriginsStorage.json +++ /dev/null @@ -1,219 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "OriginsStorage", - "sourceName": "contracts/OriginsStorage.sol", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "OwnerAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_removedOwner", - "type": "address" - } - ], - "name": "OwnerRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newVerifier", - "type": "address" - } - ], - "name": "VerifierAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_removedVerifier", - "type": "address" - } - ], - "name": "VerifierRemoved", - "type": "event" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "addOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_newVerifier", - "type": "address" - } - ], - "name": "addVerifier", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "checkOwner", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "checkVerifier", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getOwners", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getVerifiers", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_ownerToRemove", - "type": "address" - } - ], - "name": "removeOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_verifierToRemove", - "type": "address" - } - ], - "name": "removeVerifier", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/docs/main.js b/docs/main.js index 85d2d51..aa4b60f 100644 --- a/docs/main.js +++ b/docs/main.js @@ -1,12 +1,12 @@ -!function(e){var t={};function n(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(t){return e[t]}.bind(null,r));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=10)}([function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";(function(e,n){ +!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=10)}([function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){"use strict";(function(t,n){ /*! * Vue.js v2.6.13 * (c) 2014-2021 Evan You * Released under the MIT License. */ -var a=Object.freeze({});function r(e){return null==e}function i(e){return null!=e}function s(e){return!0===e}function o(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function d(e){return null!==e&&"object"==typeof e}var u=Object.prototype.toString;function p(e){return"[object Object]"===u.call(e)}function c(e){return"[object RegExp]"===u.call(e)}function l(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function f(e){return i(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function y(e){return null==e?"":Array.isArray(e)||p(e)&&e.toString===u?JSON.stringify(e,null,2):String(e)}function m(e){var t=parseFloat(e);return isNaN(t)?e:t}function h(e,t){for(var n=Object.create(null),a=e.split(","),r=0;r-1)return e.splice(n,1)}}var _=Object.prototype.hasOwnProperty;function T(e,t){return _.call(e,t)}function w(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var k=/-(\w)/g,x=w((function(e){return e.replace(k,(function(e,t){return t?t.toUpperCase():""}))})),O=w((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),A=/\B([A-Z])/g,C=w((function(e){return e.replace(A,"-$1").toLowerCase()}));var S=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var a=arguments.length;return a?a>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function M(e,t){t=t||0;for(var n=e.length-t,a=new Array(n);n--;)a[n]=e[n+t];return a}function $(e,t){for(var n in t)e[n]=t[n];return e}function R(e){for(var t={},n=0;n0,Q=X&&X.indexOf("edge/")>0,ee=(X&&X.indexOf("android"),X&&/iphone|ipad|ipod|ios/.test(X)||"ios"===G),te=(X&&/chrome\/\d+/.test(X),X&&/phantomjs/.test(X),X&&X.match(/firefox\/(\d+)/)),ne={}.watch,ae=!1;if(K)try{var re={};Object.defineProperty(re,"passive",{get:function(){ae=!0}}),window.addEventListener("test-passive",null,re)}catch(e){}var ie=function(){return void 0===W&&(W=!K&&!J&&void 0!==e&&(e.process&&"server"===e.process.env.VUE_ENV)),W},se=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function oe(e){return"function"==typeof e&&/native code/.test(e.toString())}var de,ue="undefined"!=typeof Symbol&&oe(Symbol)&&"undefined"!=typeof Reflect&&oe(Reflect.ownKeys);de="undefined"!=typeof Set&&oe(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var pe=I,ce=0,le=function(){this.id=ce++,this.subs=[]};le.prototype.addSub=function(e){this.subs.push(e)},le.prototype.removeSub=function(e){g(this.subs,e)},le.prototype.depend=function(){le.target&&le.target.addDep(this)},le.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(i&&!T(r,"default"))s=!1;else if(""===s||s===C(e)){var d=He(String,r.type);(d<0||o0&&(ft((d=e(d,(n||"")+"_"+a))[0])&&ft(p)&&(c[u]=ge(p.text+d[0].text),d.shift()),c.push.apply(c,d)):o(d)?ft(p)?c[u]=ge(p.text+d):""!==d&&c.push(ge(d)):ft(d)&&ft(p)?c[u]=ge(p.text+d.text):(s(t._isVList)&&i(d.tag)&&r(d.key)&&i(n)&&(d.key="__vlist"+n+"_"+a+"__"),c.push(d)));return c}(e):void 0}function ft(e){return i(e)&&i(e.text)&&!1===e.isComment}function yt(e,t){if(e){for(var n=Object.create(null),a=ue?Reflect.ownKeys(e):Object.keys(e),r=0;r0,s=e?!!e.$stable:!i,o=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&n&&n!==a&&o===n.$key&&!i&&!n.$hasNormal)return n;for(var d in r={},e)e[d]&&"$"!==d[0]&&(r[d]=gt(t,d,e[d]))}else r={};for(var u in t)u in r||(r[u]=_t(t,u));return e&&Object.isExtensible(e)&&(e._normalized=r),z(r,"$stable",s),z(r,"$key",o),z(r,"$hasNormal",i),r}function gt(e,t,n){var a=function(){var e=arguments.length?n.apply(null,arguments):n({}),t=(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:lt(e))&&e[0];return e&&(!t||t.isComment&&!vt(t))?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:a,enumerable:!0,configurable:!0}),a}function _t(e,t){return function(){return e[t]}}function Tt(e,t){var n,a,r,s,o;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),a=0,r=e.length;adocument.createEvent("Event").timeStamp&&(cn=function(){return ln.now()})}function fn(){var e,t;for(pn=cn(),dn=!0,an.sort((function(e,t){return e.id-t.id})),un=0;unun&&an[n].id>e.id;)n--;an.splice(n+1,0,e)}else an.push(e);on||(on=!0,rt(fn))}}(this)},mn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||d(e)||this.deep){var t=this.value;if(this.value=e,this.user){var n='callback for watcher "'+this.expression+'"';qe(this.cb,this.vm,[e,t],this.vm,n)}else this.cb.call(this.vm,e,t)}}},mn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},mn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},mn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||g(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:I,set:I};function vn(e,t,n){hn.get=function(){return this[t][n]},hn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,hn)}function bn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},a=e._props={},r=e.$options._propKeys=[];e.$parent&&Oe(!1);var i=function(i){r.push(i);var s=Ne(i,t,n,e);Se(a,i,s),i in e||vn(e,"_props",i)};for(var s in t)i(s);Oe(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?I:S(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;p(t=e._data="function"==typeof t?function(e,t){ye();try{return e.call(t,t)}catch(e){return We(e,t,"data()"),{}}finally{me()}}(t,e):t||{})||(t={});var n=Object.keys(t),a=e.$options.props,r=(e.$options.methods,n.length);for(;r--;){var i=n[r];0,a&&T(a,i)||U(i)||vn(e,"_data",i)}Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),a=ie();for(var r in t){var i=t[r],s="function"==typeof i?i:i.get;0,a||(n[r]=new mn(e,s||I,I,gn)),r in e||_n(e,r,i)}}(e,t.computed),t.watch&&t.watch!==ne&&function(e,t){for(var n in t){var a=t[n];if(Array.isArray(a))for(var r=0;r-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!c(e)&&e.test(t)}function $n(e,t){var n=e.cache,a=e.keys,r=e._vnode;for(var i in n){var s=n[i];if(s){var o=s.name;o&&!t(o)&&Rn(n,i,a,r)}}}function Rn(e,t,n,a){var r=e[t];!r||a&&r.tag===a.tag||r.componentInstance.$destroy(),e[t]=null,g(n,t)}!function(e){e.prototype._init=function(e){var t=this;t._uid=xn++,t._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),a=t._parentVnode;n.parent=t.parent,n._parentVnode=a;var r=a.componentOptions;n.propsData=r.propsData,n._parentListeners=r.listeners,n._renderChildren=r.children,n._componentTag=r.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=Fe(On(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Zt(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,r=n&&n.context;e.$slots=mt(t._renderChildren,r),e.$scopedSlots=a,e._c=function(t,n,a,r){return zt(e,t,n,a,r,!1)},e.$createElement=function(t,n,a,r){return zt(e,t,n,a,r,!0)};var i=n&&n.data;Se(e,"$attrs",i&&i.attrs||a,null,!0),Se(e,"$listeners",t._parentListeners||a,null,!0)}(t),nn(t,"beforeCreate"),function(e){var t=yt(e.$options.inject,e);t&&(Oe(!1),Object.keys(t).forEach((function(n){Se(e,n,t[n])})),Oe(!0))}(t),bn(t),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(t),nn(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(An),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=Me,e.prototype.$delete=$e,e.prototype.$watch=function(e,t,n){if(p(t))return kn(this,e,t,n);(n=n||{}).user=!0;var a=new mn(this,e,t,n);if(n.immediate){var r='callback for immediate watcher "'+a.expression+'"';ye(),qe(t,this,[a.value],this,r),me()}return function(){a.teardown()}}}(An),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var a=this;if(Array.isArray(e))for(var r=0,i=e.length;r1?M(n):n;for(var a=M(arguments,1),r='event handler for "'+e+'"',i=0,s=n.length;iparseInt(this.max)&&Rn(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Rn(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){$n(e,(function(e){return Mn(t,e)}))})),this.$watch("exclude",(function(t){$n(e,(function(e){return!Mn(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=Kt(e),n=t&&t.componentOptions;if(n){var a=Sn(n),r=this.include,i=this.exclude;if(r&&(!a||!Mn(r,a))||i&&a&&Mn(i,a))return t;var s=this.cache,o=this.keys,d=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;s[d]?(t.componentInstance=s[d].componentInstance,g(o,d),o.push(d)):(this.vnodeToCache=t,this.keyToCache=d),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return N}};Object.defineProperty(e,"config",t),e.util={warn:pe,extend:$,mergeOptions:Fe,defineReactive:Se},e.set=Me,e.delete=$e,e.nextTick=rt,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),F.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,$(e.options.components,En),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=M(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=Fe(this.options,e),this}}(e),Cn(e),function(e){F.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&p(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(An),Object.defineProperty(An.prototype,"$isServer",{get:ie}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Vt}),An.version="2.6.13";var Dn=h("style,class"),jn=h("input,textarea,option,select,progress"),Vn=function(e,t,n){return"value"===n&&jn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Ln=h("contenteditable,draggable,spellcheck"),Fn=h("events,caret,typing,plaintext-only"),Pn=h("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Nn="http://www.w3.org/1999/xlink",Bn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Un=function(e){return Bn(e)?e.slice(6,e.length):""},zn=function(e){return null==e||!1===e};function Hn(e){for(var t=e.data,n=e,a=e;i(a.componentInstance);)(a=a.componentInstance._vnode)&&a.data&&(t=Wn(a.data,t));for(;i(n=n.parent);)n&&n.data&&(t=Wn(t,n.data));return function(e,t){if(i(e)||i(t))return qn(e,Kn(t));return""}(t.staticClass,t.class)}function Wn(e,t){return{staticClass:qn(e.staticClass,t.staticClass),class:i(e.class)?[e.class,t.class]:t.class}}function qn(e,t){return e?t?e+" "+t:e:t||""}function Kn(e){return Array.isArray(e)?function(e){for(var t,n="",a=0,r=e.length;a-1?ba(e,t,n):Pn(t)?zn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Ln(t)?e.setAttribute(t,function(e,t){return zn(t)||"false"===t?"false":"contenteditable"===e&&Fn(t)?t:"true"}(t,n)):Bn(t)?zn(n)?e.removeAttributeNS(Nn,Un(t)):e.setAttributeNS(Nn,t,n):ba(e,t,n)}function ba(e,t,n){if(zn(n))e.removeAttribute(t);else{if(Z&&!Y&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var a=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",a)};e.addEventListener("input",a),e.__ieph=!0}e.setAttribute(t,n)}}var ga={create:ha,update:ha};function _a(e,t){var n=t.elm,a=t.data,s=e.data;if(!(r(a.staticClass)&&r(a.class)&&(r(s)||r(s.staticClass)&&r(s.class)))){var o=Hn(t),d=n._transitionClasses;i(d)&&(o=qn(o,Kn(d))),o!==n._prevClass&&(n.setAttribute("class",o),n._prevClass=o)}}var Ta,wa,ka,xa,Oa,Aa,Ca={create:_a,update:_a},Sa=/[\w).+\-_$\]]/;function Ma(e){var t,n,a,r,i,s=!1,o=!1,d=!1,u=!1,p=0,c=0,l=0,f=0;for(a=0;a=0&&" "===(m=e.charAt(y));y--);m&&Sa.test(m)||(u=!0)}}else void 0===r?(f=a+1,r=e.slice(0,a).trim()):h();function h(){(i||(i=[])).push(e.slice(f,a).trim()),f=a+1}if(void 0===r?r=e.slice(0,a).trim():0!==f&&h(),i)for(a=0;a-1?{exp:e.slice(0,xa),key:'"'+e.slice(xa+1)+'"'}:{exp:e,key:null};wa=e,xa=Oa=Aa=0;for(;!qa();)Ka(ka=Wa())?Ga(ka):91===ka&&Ja(ka);return{exp:e.slice(0,Oa),key:e.slice(Oa+1,Aa)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Wa(){return wa.charCodeAt(++xa)}function qa(){return xa>=Ta}function Ka(e){return 34===e||39===e}function Ja(e){var t=1;for(Oa=xa;!qa();)if(Ka(e=Wa()))Ga(e);else if(91===e&&t++,93===e&&t--,0===t){Aa=xa;break}}function Ga(e){for(var t=e;!qa()&&(e=Wa())!==t;);}var Xa;function Za(e,t,n){var a=Xa;return function r(){var i=t.apply(null,arguments);null!==i&&er(e,r,n,a)}}var Ya=Xe&&!(te&&Number(te[1])<=53);function Qa(e,t,n,a){if(Ya){var r=pn,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=r||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}Xa.addEventListener(e,t,ae?{capture:n,passive:a}:n)}function er(e,t,n,a){(a||Xa).removeEventListener(e,t._wrapper||t,n)}function tr(e,t){if(!r(e.data.on)||!r(t.data.on)){var n=t.data.on||{},a=e.data.on||{};Xa=t.elm,function(e){if(i(e.__r)){var t=Z?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}i(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),ut(n,a,Qa,er,Za,t.context),Xa=void 0}}var nr,ar={create:tr,update:tr};function rr(e,t){if(!r(e.data.domProps)||!r(t.data.domProps)){var n,a,s=t.elm,o=e.data.domProps||{},d=t.data.domProps||{};for(n in i(d.__ob__)&&(d=t.data.domProps=$({},d)),o)n in d||(s[n]="");for(n in d){if(a=d[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),a===o[n])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if("value"===n&&"PROGRESS"!==s.tagName){s._value=a;var u=r(a)?"":String(a);ir(s,u)&&(s.value=u)}else if("innerHTML"===n&&Xn(s.tagName)&&r(s.innerHTML)){(nr=nr||document.createElement("div")).innerHTML=""+a+"";for(var p=nr.firstChild;s.firstChild;)s.removeChild(s.firstChild);for(;p.firstChild;)s.appendChild(p.firstChild)}else if(a!==o[n])try{s[n]=a}catch(e){}}}}function ir(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,a=e._vModifiers;if(i(a)){if(a.number)return m(n)!==m(t);if(a.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var sr={create:rr,update:rr},or=w((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var a=e.split(n);a.length>1&&(t[a[0].trim()]=a[1].trim())}})),t}));function dr(e){var t=ur(e.style);return e.staticStyle?$(e.staticStyle,t):t}function ur(e){return Array.isArray(e)?R(e):"string"==typeof e?or(e):e}var pr,cr=/^--/,lr=/\s*!important$/,fr=function(e,t,n){if(cr.test(t))e.style.setProperty(t,n);else if(lr.test(n))e.style.setProperty(C(t),n.replace(lr,""),"important");else{var a=mr(t);if(Array.isArray(n))for(var r=0,i=n.length;r-1?t.split(br).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function _r(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(br).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",a=" "+t+" ";n.indexOf(a)>=0;)n=n.replace(a," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function Tr(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&$(t,wr(e.name||"v")),$(t,e),t}return"string"==typeof e?wr(e):void 0}}var wr=w((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),kr=K&&!Y,xr="transition",Or="transitionend",Ar="animation",Cr="animationend";kr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(xr="WebkitTransition",Or="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Ar="WebkitAnimation",Cr="webkitAnimationEnd"));var Sr=K?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Mr(e){Sr((function(){Sr(e)}))}function $r(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),gr(e,t))}function Rr(e,t){e._transitionClasses&&g(e._transitionClasses,t),_r(e,t)}function Ir(e,t,n){var a=Dr(e,t),r=a.type,i=a.timeout,s=a.propCount;if(!r)return n();var o="transition"===r?Or:Cr,d=0,u=function(){e.removeEventListener(o,p),n()},p=function(t){t.target===e&&++d>=s&&u()};setTimeout((function(){d0&&(n="transition",p=s,c=i.length):"animation"===t?u>0&&(n="animation",p=u,c=d.length):c=(n=(p=Math.max(s,u))>0?s>u?"transition":"animation":null)?"transition"===n?i.length:d.length:0,{type:n,timeout:p,propCount:c,hasTransform:"transition"===n&&Er.test(a[xr+"Property"])}}function jr(e,t){for(;e.length1}function Br(e,t){!0!==t.data.show&&Lr(t)}var Ur=function(e){var t,n,a={},d=e.modules,u=e.nodeOps;for(t=0;ty?g(e,r(n[v+1])?null:n[v+1].elm,n,f,v,a):f>v&&T(t,l,y)}(l,h,v,n,p):i(v)?(i(e.text)&&u.setTextContent(l,""),g(l,null,v,0,v.length-1,n)):i(h)?T(h,0,h.length-1):i(e.text)&&u.setTextContent(l,""):e.text!==t.text&&u.setTextContent(l,t.text),i(y)&&i(f=y.hook)&&i(f=f.postpatch)&&f(e,t)}}}function O(e,t,n){if(s(n)&&i(e.parent))e.parent.data.pendingInsert=t;else for(var a=0;a-1,s.selected!==i&&(s.selected=i);else if(j(Kr(s),a))return void(e.selectedIndex!==o&&(e.selectedIndex=o));r||(e.selectedIndex=-1)}}function qr(e,t){return t.every((function(t){return!j(t,e)}))}function Kr(e){return"_value"in e?e._value:e.value}function Jr(e){e.target.composing=!0}function Gr(e){e.target.composing&&(e.target.composing=!1,Xr(e.target,"input"))}function Xr(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Zr(e){return!e.componentInstance||e.data&&e.data.transition?e:Zr(e.componentInstance._vnode)}var Yr={model:zr,show:{bind:function(e,t,n){var a=t.value,r=(n=Zr(n)).data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;a&&r?(n.data.show=!0,Lr(n,(function(){e.style.display=i}))):e.style.display=a?i:"none"},update:function(e,t,n){var a=t.value;!a!=!t.oldValue&&((n=Zr(n)).data&&n.data.transition?(n.data.show=!0,a?Lr(n,(function(){e.style.display=e.__vOriginalDisplay})):Fr(n,(function(){e.style.display="none"}))):e.style.display=a?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,a,r){r||(e.style.display=e.__vOriginalDisplay)}}},Qr={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ei(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?ei(Kt(t.children)):e}function ti(e){var t={},n=e.$options;for(var a in n.propsData)t[a]=e[a];var r=n._parentListeners;for(var i in r)t[x(i)]=r[i];return t}function ni(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var ai=function(e){return e.tag||vt(e)},ri=function(e){return"show"===e.name},ii={name:"transition",props:Qr,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(ai)).length){0;var a=this.mode;0;var r=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return r;var i=ei(r);if(!i)return r;if(this._leaving)return ni(e,r);var s="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?s+"comment":s+i.tag:o(i.key)?0===String(i.key).indexOf(s)?i.key:s+i.key:i.key;var d=(i.data||(i.data={})).transition=ti(this),u=this._vnode,p=ei(u);if(i.data.directives&&i.data.directives.some(ri)&&(i.data.show=!0),p&&p.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(i,p)&&!vt(p)&&(!p.componentInstance||!p.componentInstance._vnode.isComment)){var c=p.data.transition=$({},d);if("out-in"===a)return this._leaving=!0,pt(c,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),ni(e,r);if("in-out"===a){if(vt(i))return u;var l,f=function(){l()};pt(d,"afterEnter",f),pt(d,"enterCancelled",f),pt(c,"delayLeave",(function(e){l=e}))}}return r}}},si=$({tag:String,moveClass:String},Qr);function oi(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function di(e){e.data.newPos=e.elm.getBoundingClientRect()}function ui(e){var t=e.data.pos,n=e.data.newPos,a=t.left-n.left,r=t.top-n.top;if(a||r){e.data.moved=!0;var i=e.elm.style;i.transform=i.WebkitTransform="translate("+a+"px,"+r+"px)",i.transitionDuration="0s"}}delete si.mode;var pi={Transition:ii,TransitionGroup:{props:si,beforeMount:function(){var e=this,t=this._update;this._update=function(n,a){var r=Qt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,r(),t.call(e,n,a)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),a=this.prevChildren=this.children,r=this.$slots.default||[],i=this.children=[],s=ti(this),o=0;o-1?Qn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Qn[e]=/HTMLUnknownElement/.test(t.toString())},$(An.options.directives,Yr),$(An.options.components,pi),An.prototype.__patch__=K?Ur:I,An.prototype.$mount=function(e,t){return function(e,t,n){var a;return e.$el=t,e.$options.render||(e.$options.render=be),nn(e,"beforeMount"),a=function(){e._update(e._render(),n)},new mn(e,a,I,{before:function(){e._isMounted&&!e._isDestroyed&&nn(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,nn(e,"mounted")),e}(this,e=e&&K?ta(e):void 0,t)},K&&setTimeout((function(){N.devtools&&se&&se.emit("init",An)}),0);var ci=/\{\{((?:.|\r?\n)+?)\}\}/g,li=/[-.*+?^${}()|[\]\/\\]/g,fi=w((function(e){var t=e[0].replace(li,"\\$&"),n=e[1].replace(li,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}));var yi={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Na(e,"class");n&&(e.staticClass=JSON.stringify(n));var a=Pa(e,"class",!1);a&&(e.classBinding=a)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var mi,hi={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Na(e,"style");n&&(e.staticStyle=JSON.stringify(or(n)));var a=Pa(e,"style",!1);a&&(e.styleBinding=a)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},vi=function(e){return(mi=mi||document.createElement("div")).innerHTML=e,mi.textContent},bi=h("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),gi=h("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),_i=h("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),Ti=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,wi=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ki="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+B.source+"]*",xi="((?:"+ki+"\\:)?"+ki+")",Oi=new RegExp("^<"+xi),Ai=/^\s*(\/?)>/,Ci=new RegExp("^<\\/"+xi+"[^>]*>"),Si=/^]+>/i,Mi=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Di=/&(?:lt|gt|quot|amp|#39);/g,ji=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Vi=h("pre,textarea",!0),Li=function(e,t){return e&&Vi(e)&&"\n"===t[0]};function Fi(e,t){var n=t?ji:Di;return e.replace(n,(function(e){return Ei[e]}))}var Pi,Ni,Bi,Ui,zi,Hi,Wi,qi,Ki=/^@|^v-on:/,Ji=/^v-|^@|^:|^#/,Gi=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Xi=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Zi=/^\(|\)$/g,Yi=/^\[.*\]$/,Qi=/:(.*)$/,es=/^:|^\.|^v-bind:/,ts=/\.[^.\]]+(?=[^\]]*$)/g,ns=/^v-slot(:|$)|^#/,as=/[\r\n]/,rs=/[ \f\t\r\n]+/g,is=w(vi);function ss(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:fs(t),rawAttrsMap:{},parent:n,children:[]}}function os(e,t){Pi=t.warn||Ra,Hi=t.isPreTag||E,Wi=t.mustUseProp||E,qi=t.getTagNamespace||E;var n=t.isReservedTag||E;(function(e){return!(!(e.component||e.attrsMap[":is"]||e.attrsMap["v-bind:is"])&&(e.attrsMap.is?n(e.attrsMap.is):n(e.tag)))}),Bi=Ia(t.modules,"transformNode"),Ui=Ia(t.modules,"preTransformNode"),zi=Ia(t.modules,"postTransformNode"),Ni=t.delimiters;var a,r,i=[],s=!1!==t.preserveWhitespace,o=t.whitespace,d=!1,u=!1;function p(e){if(c(e),d||e.processed||(e=ds(e,t)),i.length||e===a||a.if&&(e.elseif||e.else)&&ps(a,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)s=e,(o=function(e){for(var t=e.length;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&o.if&&ps(o,{exp:s.elseif,block:s});else{if(e.slotScope){var n=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[n]=e}r.children.push(e),e.parent=r}var s,o;e.children=e.children.filter((function(e){return!e.slotScope})),c(e),e.pre&&(d=!1),Hi(e.tag)&&(u=!1);for(var p=0;p]*>)","i")),l=e.replace(c,(function(e,n,a){return u=a.length,Ri(p)||"noscript"===p||(n=n.replace(//g,"$1").replace(//g,"$1")),Li(p,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));d+=e.length-l.length,e=l,A(p,d-u,d)}else{var f=e.indexOf("<");if(0===f){if(Mi.test(e)){var y=e.indexOf("--\x3e");if(y>=0){t.shouldKeepComment&&t.comment(e.substring(4,y),d,d+y+3),k(y+3);continue}}if($i.test(e)){var m=e.indexOf("]>");if(m>=0){k(m+2);continue}}var h=e.match(Si);if(h){k(h[0].length);continue}var v=e.match(Ci);if(v){var b=d;k(v[0].length),A(v[1],b,d);continue}var g=x();if(g){O(g),Li(g.tagName,e)&&k(1);continue}}var _=void 0,T=void 0,w=void 0;if(f>=0){for(T=e.slice(f);!(Ci.test(T)||Oi.test(T)||Mi.test(T)||$i.test(T)||(w=T.indexOf("<",1))<0);)f+=w,T=e.slice(f);_=e.substring(0,f)}f<0&&(_=e),_&&k(_.length),t.chars&&_&&t.chars(_,d-_.length,d)}if(e===n){t.chars&&t.chars(e);break}}function k(t){d+=t,e=e.substring(t)}function x(){var t=e.match(Oi);if(t){var n,a,r={tagName:t[1],attrs:[],start:d};for(k(t[0].length);!(n=e.match(Ai))&&(a=e.match(wi)||e.match(Ti));)a.start=d,k(a[0].length),a.end=d,r.attrs.push(a);if(n)return r.unarySlash=n[1],k(n[0].length),r.end=d,r}}function O(e){var n=e.tagName,d=e.unarySlash;i&&("p"===a&&_i(n)&&A(a),o(n)&&a===n&&A(n));for(var u=s(n)||!!d,p=e.attrs.length,c=new Array(p),l=0;l=0&&r[s].lowerCasedTag!==o;s--);else s=0;if(s>=0){for(var u=r.length-1;u>=s;u--)t.end&&t.end(r[u].tag,n,i);r.length=s,a=s&&r[s-1].tag}else"br"===o?t.start&&t.start(e,[],!0,n,i):"p"===o&&(t.start&&t.start(e,[],!1,n,i),t.end&&t.end(e,n,i))}A()}(e,{warn:Pi,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,n,s,o,c){var l=r&&r.ns||qi(e);Z&&"svg"===l&&(n=function(e){for(var t=[],n=0;nd&&(o.push(i=e.slice(d,r)),s.push(JSON.stringify(i)));var u=Ma(a[1].trim());s.push("_s("+u+")"),o.push({"@binding":u}),d=r+a[0].length}return d-1"+("true"===i?":("+t+")":":_q("+t+","+i+")")),Fa(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+i+"):("+s+");if(Array.isArray($$a)){var $$v="+(a?"_n("+r+")":r)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Ha(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Ha(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Ha(t,"$$c")+"}",null,!0)}(e,a,r);else if("input"===i&&"radio"===s)!function(e,t,n){var a=n&&n.number,r=Pa(e,"value")||"null";Ea(e,"checked","_q("+t+","+(r=a?"_n("+r+")":r)+")"),Fa(e,"change",Ha(t,r),null,!0)}(e,a,r);else if("input"===i||"textarea"===i)!function(e,t,n){var a=e.attrsMap.type;0;var r=n||{},i=r.lazy,s=r.number,o=r.trim,d=!i&&"range"!==a,u=i?"change":"range"===a?"__r":"input",p="$event.target.value";o&&(p="$event.target.value.trim()");s&&(p="_n("+p+")");var c=Ha(t,p);d&&(c="if($event.target.composing)return;"+c);Ea(e,"value","("+t+")"),Fa(e,u,c,null,!0),(o||s)&&Fa(e,"blur","$forceUpdate()")}(e,a,r);else{if(!N.isReservedTag(i))return za(e,a,r),!1}return!0},text:function(e,t){t.value&&Ea(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Ea(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:bi,mustUseProp:Vn,canBeLeftOpenTag:gi,isReservedTag:Zn,getTagNamespace:Yn,staticKeys:function(e){return e.reduce((function(e,t){return e.concat(t.staticKeys||[])}),[]).join(",")}(vs)},Ts=w((function(e){return h("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))}));function ws(e,t){e&&(bs=Ts(t.staticKeys||""),gs=t.isReservedTag||E,function e(t){if(t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||v(e.tag)||!gs(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(bs)))}(t),1===t.type){if(!gs(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,a=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,xs=/\([^)]*?\);*$/,Os=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,As={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Cs={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Ss=function(e){return"if("+e+")return null;"},Ms={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Ss("$event.target !== $event.currentTarget"),ctrl:Ss("!$event.ctrlKey"),shift:Ss("!$event.shiftKey"),alt:Ss("!$event.altKey"),meta:Ss("!$event.metaKey"),left:Ss("'button' in $event && $event.button !== 0"),middle:Ss("'button' in $event && $event.button !== 1"),right:Ss("'button' in $event && $event.button !== 2")};function $s(e,t){var n=t?"nativeOn:":"on:",a="",r="";for(var i in e){var s=Rs(e[i]);e[i]&&e[i].dynamic?r+=i+","+s+",":a+='"'+i+'":'+s+","}return a="{"+a.slice(0,-1)+"}",r?n+"_d("+a+",["+r.slice(0,-1)+"])":n+a}function Rs(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return Rs(e)})).join(",")+"]";var t=Os.test(e.value),n=ks.test(e.value),a=Os.test(e.value.replace(xs,""));if(e.modifiers){var r="",i="",s=[];for(var o in e.modifiers)if(Ms[o])i+=Ms[o],As[o]&&s.push(o);else if("exact"===o){var d=e.modifiers;i+=Ss(["ctrl","shift","alt","meta"].filter((function(e){return!d[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else s.push(o);return s.length&&(r+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Is).join("&&")+")return null;"}(s)),i&&(r+=i),"function($event){"+r+(t?"return "+e.value+".apply(null, arguments)":n?"return ("+e.value+").apply(null, arguments)":a?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(a?"return "+e.value:e.value)+"}"}function Is(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=As[e],a=Cs[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(a)+")"}var Es={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:I},Ds=function(e){this.options=e,this.warn=e.warn||Ra,this.transforms=Ia(e.modules,"transformCode"),this.dataGenFns=Ia(e.modules,"genData"),this.directives=$($({},Es),e.directives);var t=e.isReservedTag||E;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function js(e,t){var n=new Ds(t);return{render:"with(this){return "+(e?"script"===e.tag?"null":Vs(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Vs(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ls(e,t);if(e.once&&!e.onceProcessed)return Fs(e,t);if(e.for&&!e.forProcessed)return Ns(e,t);if(e.if&&!e.ifProcessed)return Ps(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',a=Hs(e,t),r="_t("+n+(a?",function(){return "+a+"}":""),i=e.attrs||e.dynamicAttrs?Ks((e.attrs||[]).concat(e.dynamicAttrs||[]).map((function(e){return{name:x(e.name),value:e.value,dynamic:e.dynamic}}))):null,s=e.attrsMap["v-bind"];!i&&!s||a||(r+=",null");i&&(r+=","+i);s&&(r+=(i?"":",null")+","+s);return r+")"}(e,t);var n;if(e.component)n=function(e,t,n){var a=t.inlineTemplate?null:Hs(t,n,!0);return"_c("+e+","+Bs(t,n)+(a?","+a:"")+")"}(e.component,e,t);else{var a;(!e.plain||e.pre&&t.maybeComponent(e))&&(a=Bs(e,t));var r=e.inlineTemplate?null:Hs(e,t,!0);n="_c('"+e.tag+"'"+(a?","+a:"")+(r?","+r:"")+")"}for(var i=0;i>>0}(s):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var i=function(e,t){var n=e.children[0];0;if(n&&1===n.type){var a=js(n,t.options);return"inlineTemplate:{render:function(){"+a.render+"},staticRenderFns:["+a.staticRenderFns.map((function(e){return"function(){"+e+"}"})).join(",")+"]}"}}(e,t);i&&(n+=i+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Ks(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Us(e){return 1===e.type&&("slot"===e.tag||e.children.some(Us))}function zs(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ps(e,t,zs,"null");if(e.for&&!e.forProcessed)return Ns(e,t,zs);var a="_empty_"===e.slotScope?"":String(e.slotScope),r="function("+a+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Hs(e,t)||"undefined")+":undefined":Hs(e,t)||"undefined":Vs(e,t))+"}",i=a?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+r+i+"}"}function Hs(e,t,n,a,r){var i=e.children;if(i.length){var s=i[0];if(1===i.length&&s.for&&"template"!==s.tag&&"slot"!==s.tag){var o=n?t.maybeComponent(s)?",1":",0":"";return""+(a||Vs)(s,t)+o}var d=n?function(e,t){for(var n=0,a=0;a':'
',Ys.innerHTML.indexOf(" ")>0}var no=!!K&&to(!1),ao=!!K&&to(!0),ro=w((function(e){var t=ta(e);return t&&t.innerHTML})),io=An.prototype.$mount;An.prototype.$mount=function(e,t){if((e=e&&ta(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var a=n.template;if(a)if("string"==typeof a)"#"===a.charAt(0)&&(a=ro(a));else{if(!a.nodeType)return this;a=a.innerHTML}else e&&(a=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(a){0;var r=eo(a,{outputSourceRange:!1,shouldDecodeNewlines:no,shouldDecodeNewlinesForHref:ao,delimiters:n.delimiters,comments:n.comments},this),i=r.render,s=r.staticRenderFns;n.render=i,n.staticRenderFns=s}}return io.call(this,e,t)},An.compile=eo,t.a=An}).call(this,n(0),n(7).setImmediate)},function(e){e.exports=JSON.parse('{"a":"hardhat-docgen","b":{"type":"git","url":"git+https://github.com/ItsNickBarry/hardhat-docgen.git"}}')},function(e,t,n){var a=n(5);a.__esModule&&(a=a.default),"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals);(0,n(11).default)("0b345cf4",a,!1,{})},function(e,t,n){"use strict";n(3)},function(e,t,n){(t=e.exports=n(6)(!1)).push([e.i,"@import url(https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600;700&display=swap);",""]),t.push([e.i,"\nhtml,\nbody {\n font-family: 'Source Code Pro', monospace;\n}\n",""])},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",a=e[3];if(!a)return n;if(t&&"function"==typeof btoa){var r=(s=a,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(s))))+" */"),i=a.sources.map((function(e){return"/*# sourceURL="+a.sourceRoot+e+" */"}));return[n].concat(i).concat([r]).join("\n")}var s;return[n].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var a={},r=0;r=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(8),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(0))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var a,r,i,s,o,d=1,u={},p=!1,c=e.document,l=Object.getPrototypeOf&&Object.getPrototypeOf(e);l=l&&l.setTimeout?l:e,"[object process]"==={}.toString.call(e.process)?a=function(){var e=f(arguments);return t.nextTick(y(m,e)),e}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){m(e.data)},a=function(){var e=f(arguments);return i.port2.postMessage(e),e}):c&&"onreadystatechange"in c.createElement("script")?(r=c.documentElement,a=function(){var e=f(arguments),t=c.createElement("script");return t.onreadystatechange=function(){m(e),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t),e}):a=function(){var e=f(arguments);return setTimeout(y(m,e),0),e}:(s="setImmediate$"+Math.random()+"$",o=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&m(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",o,!1):e.attachEvent("onmessage",o),a=function(){var t=f(arguments);return e.postMessage(s+t,"*"),t}),l.setImmediate=a,l.clearImmediate=h}function f(e){return u[d]=y.apply(void 0,e),d++}function y(e){var t=[].slice.call(arguments,1);return function(){"function"==typeof e?e.apply(void 0,t):new Function(""+e)()}}function m(e){if(p)setTimeout(y(m,e),0);else{var t=u[e];if(t){p=!0;try{t()}finally{h(e),p=!1}}}}function h(e){delete u[e]}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,n(0),n(9))},function(e,t){var n,a,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function o(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{a="function"==typeof clearTimeout?clearTimeout:s}catch(e){a=s}}();var d,u=[],p=!1,c=-1;function l(){p&&d&&(p=!1,d.length?u=d.concat(u):c=-1,u.length&&f())}function f(){if(!p){var e=o(l);p=!0;for(var t=u.length;t;){for(d=u,u=[];++c1)for(var n=1;n=0&&Math.floor(e)===e&&isFinite(t)}function d(t){return i(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function v(t){return null==t?"":Array.isArray(t)||l(t)&&t.toString===u?JSON.stringify(t,null,2):String(t)}function h(t){var e=parseFloat(t);return isNaN(e)?t:e}function m(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function w(t,e){return b.call(t,e)}function x(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var $=/-(\w)/g,C=x((function(t){return t.replace($,(function(t,e){return e?e.toUpperCase():""}))})),k=x((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),A=/\B([A-Z])/g,S=x((function(t){return t.replace(A,"-$1").toLowerCase()}));var O=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function T(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function j(t,e){for(var n in e)t[n]=e[n];return t}function E(t){for(var e={},n=0;n0,Q=X&&X.indexOf("edge/")>0,tt=(X&&X.indexOf("android"),X&&/iphone|ipad|ipod|ios/.test(X)||"ios"===G),et=(X&&/chrome\/\d+/.test(X),X&&/phantomjs/.test(X),X&&X.match(/firefox\/(\d+)/)),nt={}.watch,rt=!1;if(J)try{var ot={};Object.defineProperty(ot,"passive",{get:function(){rt=!0}}),window.addEventListener("test-passive",null,ot)}catch(t){}var it=function(){return void 0===z&&(z=!J&&!W&&void 0!==t&&(t.process&&"server"===t.process.env.VUE_ENV)),z},at=J&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function st(t){return"function"==typeof t&&/native code/.test(t.toString())}var ct,ut="undefined"!=typeof Symbol&&st(Symbol)&&"undefined"!=typeof Reflect&&st(Reflect.ownKeys);ct="undefined"!=typeof Set&&st(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var lt=M,ft=0,pt=function(){this.id=ft++,this.subs=[]};pt.prototype.addSub=function(t){this.subs.push(t)},pt.prototype.removeSub=function(t){_(this.subs,t)},pt.prototype.depend=function(){pt.target&&pt.target.addDep(this)},pt.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(i&&!w(o,"default"))a=!1;else if(""===a||a===S(t)){var c=qt(String,o.type);(c<0||s0&&(de((c=t(c,(n||"")+"_"+r))[0])&&de(l)&&(f[u]=_t(l.text+c[0].text),c.shift()),f.push.apply(f,c)):s(c)?de(l)?f[u]=_t(l.text+c):""!==c&&f.push(_t(c)):de(c)&&de(l)?f[u]=_t(l.text+c.text):(a(e._isVList)&&i(c.tag)&&o(c.key)&&i(n)&&(c.key="__vlist"+n+"_"+r+"__"),f.push(c)));return f}(t):void 0}function de(t){return i(t)&&i(t.text)&&!1===t.isComment}function ve(t,e){if(t){for(var n=Object.create(null),r=ut?Reflect.ownKeys(t):Object.keys(t),o=0;o0,a=t?!!t.$stable:!i,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&n&&n!==r&&s===n.$key&&!i&&!n.$hasNormal)return n;for(var c in o={},t)t[c]&&"$"!==c[0]&&(o[c]=_e(e,c,t[c]))}else o={};for(var u in e)u in o||(o[u]=be(e,u));return t&&Object.isExtensible(t)&&(t._normalized=o),V(o,"$stable",a),V(o,"$key",s),V(o,"$hasNormal",i),o}function _e(t,e,n){var r=function(){var t=arguments.length?n.apply(null,arguments):n({}),e=(t=t&&"object"==typeof t&&!Array.isArray(t)?[t]:pe(t))&&t[0];return t&&(!e||e.isComment&&!ye(e))?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:r,enumerable:!0,configurable:!0}),r}function be(t,e){return function(){return t[e]}}function we(t,e){var n,r,o,a,s;if(Array.isArray(t)||"string"==typeof t)for(n=new Array(t.length),r=0,o=t.length;rdocument.createEvent("Event").timeStamp&&(fn=function(){return pn.now()})}function dn(){var t,e;for(ln=fn(),cn=!0,rn.sort((function(t,e){return t.id-e.id})),un=0;unun&&rn[n].id>t.id;)n--;rn.splice(n+1,0,t)}else rn.push(t);sn||(sn=!0,oe(dn))}}(this)},hn.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||c(t)||this.deep){var e=this.value;if(this.value=t,this.user){var n='callback for watcher "'+this.expression+'"';Kt(this.cb,this.vm,[t,e],this.vm,n)}else this.cb.call(this.vm,t,e)}}},hn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},hn.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},hn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||_(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var mn={enumerable:!0,configurable:!0,get:M,set:M};function yn(t,e,n){mn.get=function(){return this[e][n]},mn.set=function(t){this[e][n]=t},Object.defineProperty(t,n,mn)}function gn(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){var n=t.$options.propsData||{},r=t._props={},o=t.$options._propKeys=[];t.$parent&&kt(!1);var i=function(i){o.push(i);var a=Bt(i,e,n,t);Ot(r,i,a),i in t||yn(t,"_props",i)};for(var a in e)i(a);kt(!0)}(t,e.props),e.methods&&function(t,e){t.$options.props;for(var n in e)t[n]="function"!=typeof e[n]?M:O(e[n],t)}(t,e.methods),e.data?function(t){var e=t.$options.data;l(e=t._data="function"==typeof e?function(t,e){vt();try{return t.call(e,e)}catch(t){return zt(t,e,"data()"),{}}finally{ht()}}(e,t):e||{})||(e={});var n=Object.keys(e),r=t.$options.props,o=(t.$options.methods,n.length);for(;o--;){var i=n[o];0,r&&w(r,i)||H(i)||yn(t,"_data",i)}St(e,!0)}(t):St(t._data={},!0),e.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),r=it();for(var o in e){var i=e[o],a="function"==typeof i?i:i.get;0,r||(n[o]=new hn(t,a||M,M,_n)),o in t||bn(t,o,i)}}(t,e.computed),e.watch&&e.watch!==nt&&function(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var o=0;o-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!f(t)&&t.test(e)}function jn(t,e){var n=t.cache,r=t.keys,o=t._vnode;for(var i in n){var a=n[i];if(a){var s=a.name;s&&!e(s)&&En(n,i,r,o)}}}function En(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,_(n,e)}!function(t){t.prototype._init=function(t){var e=this;e._uid=Cn++,e._isVue=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Dt(kn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ze(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=he(e._renderChildren,o),t.$scopedSlots=r,t._c=function(e,n,r,o){return Ve(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return Ve(t,e,n,r,o,!0)};var i=n&&n.data;Ot(t,"$attrs",i&&i.attrs||r,null,!0),Ot(t,"$listeners",e._parentListeners||r,null,!0)}(e),nn(e,"beforeCreate"),function(t){var e=ve(t.$options.inject,t);e&&(kt(!1),Object.keys(e).forEach((function(n){Ot(t,n,e[n])})),kt(!0))}(e),gn(e),function(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}(e),nn(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}(An),function(t){var e={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",n),t.prototype.$set=Tt,t.prototype.$delete=jt,t.prototype.$watch=function(t,e,n){if(l(e))return $n(this,t,e,n);(n=n||{}).user=!0;var r=new hn(this,t,e,n);if(n.immediate){var o='callback for immediate watcher "'+r.expression+'"';vt(),Kt(e,this,[r.value],this,o),ht()}return function(){r.teardown()}}}(An),function(t){var e=/^hook:/;t.prototype.$on=function(t,n){var r=this;if(Array.isArray(t))for(var o=0,i=t.length;o1?T(n):n;for(var r=T(arguments,1),o='event handler for "'+t+'"',i=0,a=n.length;iparseInt(this.max)&&En(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)En(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){jn(t,(function(t){return Tn(e,t)}))})),this.$watch("exclude",(function(e){jn(t,(function(t){return!Tn(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Je(t),n=e&&e.componentOptions;if(n){var r=On(n),o=this.include,i=this.exclude;if(o&&(!r||!Tn(o,r))||i&&r&&Tn(i,r))return e;var a=this.cache,s=this.keys,c=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;a[c]?(e.componentInstance=a[c].componentInstance,_(s,c),s.push(c)):(this.vnodeToCache=e,this.keyToCache=c),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return B}};Object.defineProperty(t,"config",e),t.util={warn:lt,extend:j,mergeOptions:Dt,defineReactive:Ot},t.set=Tt,t.delete=jt,t.nextTick=oe,t.observable=function(t){return St(t),t},t.options=Object.create(null),D.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,j(t.options.components,Rn),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=T(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Dt(this.options,t),this}}(t),Sn(t),function(t){D.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&l(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(An),Object.defineProperty(An.prototype,"$isServer",{get:it}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Ne}),An.version="2.6.13";var Ln=m("style,class"),In=m("input,textarea,option,select,progress"),Nn=function(t,e,n){return"value"===n&&In(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Pn=m("contenteditable,draggable,spellcheck"),Dn=m("events,caret,typing,plaintext-only"),Fn=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Bn="http://www.w3.org/1999/xlink",Un=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Hn=function(t){return Un(t)?t.slice(6,t.length):""},Vn=function(t){return null==t||!1===t};function qn(t){for(var e=t.data,n=t,r=t;i(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=zn(r.data,e));for(;i(n=n.parent);)n&&n.data&&(e=zn(e,n.data));return function(t,e){if(i(t)||i(e))return Kn(t,Jn(e));return""}(e.staticClass,e.class)}function zn(t,e){return{staticClass:Kn(t.staticClass,e.staticClass),class:i(t.class)?[t.class,e.class]:e.class}}function Kn(t,e){return t?e?t+" "+e:t:e||""}function Jn(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?gr(t,e,n):Fn(e)?Vn(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Pn(e)?t.setAttribute(e,function(t,e){return Vn(e)||"false"===e?"false":"contenteditable"===t&&Dn(e)?e:"true"}(e,n)):Un(e)?Vn(n)?t.removeAttributeNS(Bn,Hn(e)):t.setAttributeNS(Bn,e,n):gr(t,e,n)}function gr(t,e,n){if(Vn(n))t.removeAttribute(e);else{if(Z&&!Y&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var _r={create:mr,update:mr};function br(t,e){var n=e.elm,r=e.data,a=t.data;if(!(o(r.staticClass)&&o(r.class)&&(o(a)||o(a.staticClass)&&o(a.class)))){var s=qn(e),c=n._transitionClasses;i(c)&&(s=Kn(s,Jn(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var wr,xr,$r,Cr,kr,Ar,Sr={create:br,update:br},Or=/[\w).+\-_$\]]/;function Tr(t){var e,n,r,o,i,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&" "===(h=t.charAt(v));v--);h&&Or.test(h)||(u=!0)}}else void 0===o?(d=r+1,o=t.slice(0,r).trim()):m();function m(){(i||(i=[])).push(t.slice(d,r).trim()),d=r+1}if(void 0===o?o=t.slice(0,r).trim():0!==d&&m(),i)for(r=0;r-1?{exp:t.slice(0,Cr),key:'"'+t.slice(Cr+1)+'"'}:{exp:t,key:null};xr=t,Cr=kr=Ar=0;for(;!Kr();)Jr($r=zr())?Gr($r):91===$r&&Wr($r);return{exp:t.slice(0,kr),key:t.slice(kr+1,Ar)}}(t);return null===n.key?t+"="+e:"$set("+n.exp+", "+n.key+", "+e+")"}function zr(){return xr.charCodeAt(++Cr)}function Kr(){return Cr>=wr}function Jr(t){return 34===t||39===t}function Wr(t){var e=1;for(kr=Cr;!Kr();)if(Jr(t=zr()))Gr(t);else if(91===t&&e++,93===t&&e--,0===e){Ar=Cr;break}}function Gr(t){for(var e=t;!Kr()&&(t=zr())!==e;);}var Xr;function Zr(t,e,n){var r=Xr;return function o(){var i=e.apply(null,arguments);null!==i&&to(t,o,n,r)}}var Yr=Xt&&!(et&&Number(et[1])<=53);function Qr(t,e,n,r){if(Yr){var o=ln,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Xr.addEventListener(t,e,rt?{capture:n,passive:r}:n)}function to(t,e,n,r){(r||Xr).removeEventListener(t,e._wrapper||e,n)}function eo(t,e){if(!o(t.data.on)||!o(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Xr=e.elm,function(t){if(i(t.__r)){var e=Z?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}i(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),ue(n,r,Qr,to,Zr,e.context),Xr=void 0}}var no,ro={create:eo,update:eo};function oo(t,e){if(!o(t.data.domProps)||!o(e.data.domProps)){var n,r,a=e.elm,s=t.data.domProps||{},c=e.data.domProps||{};for(n in i(c.__ob__)&&(c=e.data.domProps=j({},c)),s)n in c||(a[n]="");for(n in c){if(r=c[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=r;var u=o(r)?"":String(r);io(a,u)&&(a.value=u)}else if("innerHTML"===n&&Xn(a.tagName)&&o(a.innerHTML)){(no=no||document.createElement("div")).innerHTML=""+r+"";for(var l=no.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(r!==s[n])try{a[n]=r}catch(t){}}}}function io(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(i(r)){if(r.number)return h(n)!==h(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var ao={create:oo,update:oo},so=x((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function co(t){var e=uo(t.style);return t.staticStyle?j(t.staticStyle,e):e}function uo(t){return Array.isArray(t)?E(t):"string"==typeof t?so(t):t}var lo,fo=/^--/,po=/\s*!important$/,vo=function(t,e,n){if(fo.test(e))t.style.setProperty(e,n);else if(po.test(n))t.style.setProperty(S(e),n.replace(po,""),"important");else{var r=mo(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(_o).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function wo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(_o).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function xo(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&j(e,$o(t.name||"v")),j(e,t),e}return"string"==typeof t?$o(t):void 0}}var $o=x((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),Co=J&&!Y,ko="transition",Ao="transitionend",So="animation",Oo="animationend";Co&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ko="WebkitTransition",Ao="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(So="WebkitAnimation",Oo="webkitAnimationEnd"));var To=J?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function jo(t){To((function(){To(t)}))}function Eo(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),bo(t,e))}function Mo(t,e){t._transitionClasses&&_(t._transitionClasses,e),wo(t,e)}function Ro(t,e,n){var r=Io(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?Ao:Oo,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout((function(){c0&&(n="transition",l=a,f=i.length):"animation"===e?u>0&&(n="animation",l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?"transition":"animation":null)?"transition"===n?i.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:"transition"===n&&Lo.test(r[ko+"Property"])}}function No(t,e){for(;t.length1}function Ho(t,e){!0!==e.data.show&&Do(e)}var Vo=function(t){var e,n,r={},c=t.modules,u=t.nodeOps;for(e=0;ev?_(t,o(n[y+1])?null:n[y+1].elm,n,d,y,r):d>y&&w(e,p,v)}(p,m,y,n,l):i(y)?(i(t.text)&&u.setTextContent(p,""),_(p,null,y,0,y.length-1,n)):i(m)?w(m,0,m.length-1):i(t.text)&&u.setTextContent(p,""):t.text!==e.text&&u.setTextContent(p,e.text),i(v)&&i(d=v.hook)&&i(d=d.postpatch)&&d(t,e)}}}function k(t,e,n){if(a(n)&&i(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(I(Wo(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function Jo(t,e){return e.every((function(e){return!I(e,t)}))}function Wo(t){return"_value"in t?t._value:t.value}function Go(t){t.target.composing=!0}function Xo(t){t.target.composing&&(t.target.composing=!1,Zo(t.target,"input"))}function Zo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Yo(t){return!t.componentInstance||t.data&&t.data.transition?t:Yo(t.componentInstance._vnode)}var Qo={model:qo,show:{bind:function(t,e,n){var r=e.value,o=(n=Yo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,Do(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=Yo(n)).data&&n.data.transition?(n.data.show=!0,r?Do(n,(function(){t.style.display=t.__vOriginalDisplay})):Fo(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},ti={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ei(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?ei(Je(e.children)):t}function ni(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var i in o)e[C(i)]=o[i];return e}function ri(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var oi=function(t){return t.tag||ye(t)},ii=function(t){return"show"===t.name},ai={name:"transition",props:ti,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(oi)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=ei(o);if(!i)return o;if(this._leaving)return ri(t,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:s(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var c=(i.data||(i.data={})).transition=ni(this),u=this._vnode,l=ei(u);if(i.data.directives&&i.data.directives.some(ii)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!ye(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=j({},c);if("out-in"===r)return this._leaving=!0,le(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),ri(t,o);if("in-out"===r){if(ye(i))return u;var p,d=function(){p()};le(c,"afterEnter",d),le(c,"enterCancelled",d),le(f,"delayLeave",(function(t){p=t}))}}return o}}},si=j({tag:String,moveClass:String},ti);function ci(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function ui(t){t.data.newPos=t.elm.getBoundingClientRect()}function li(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate("+r+"px,"+o+"px)",i.transitionDuration="0s"}}delete si.mode;var fi={Transition:ai,TransitionGroup:{props:si,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Qe(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ni(this),s=0;s-1?Qn[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Qn[t]=/HTMLUnknownElement/.test(e.toString())},j(An.options.directives,Qo),j(An.options.components,fi),An.prototype.__patch__=J?Vo:M,An.prototype.$mount=function(t,e){return function(t,e,n){var r;return t.$el=e,t.$options.render||(t.$options.render=gt),nn(t,"beforeMount"),r=function(){t._update(t._render(),n)},new hn(t,r,M,{before:function(){t._isMounted&&!t._isDestroyed&&nn(t,"beforeUpdate")}},!0),n=!1,null==t.$vnode&&(t._isMounted=!0,nn(t,"mounted")),t}(this,t=t&&J?er(t):void 0,e)},J&&setTimeout((function(){B.devtools&&at&&at.emit("init",An)}),0);var pi=/\{\{((?:.|\r?\n)+?)\}\}/g,di=/[-.*+?^${}()|[\]\/\\]/g,vi=x((function(t){var e=t[0].replace(di,"\\$&"),n=t[1].replace(di,"\\$&");return new RegExp(e+"((?:.|\\n)+?)"+n,"g")}));var hi={staticKeys:["staticClass"],transformNode:function(t,e){e.warn;var n=Br(t,"class");n&&(t.staticClass=JSON.stringify(n));var r=Fr(t,"class",!1);r&&(t.classBinding=r)},genData:function(t){var e="";return t.staticClass&&(e+="staticClass:"+t.staticClass+","),t.classBinding&&(e+="class:"+t.classBinding+","),e}};var mi,yi={staticKeys:["staticStyle"],transformNode:function(t,e){e.warn;var n=Br(t,"style");n&&(t.staticStyle=JSON.stringify(so(n)));var r=Fr(t,"style",!1);r&&(t.styleBinding=r)},genData:function(t){var e="";return t.staticStyle&&(e+="staticStyle:"+t.staticStyle+","),t.styleBinding&&(e+="style:("+t.styleBinding+"),"),e}},gi=function(t){return(mi=mi||document.createElement("div")).innerHTML=t,mi.textContent},_i=m("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),bi=m("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),wi=m("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),xi=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,$i=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ci="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+U.source+"]*",ki="((?:"+Ci+"\\:)?"+Ci+")",Ai=new RegExp("^<"+ki),Si=/^\s*(\/?)>/,Oi=new RegExp("^<\\/"+ki+"[^>]*>"),Ti=/^]+>/i,ji=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Ii=/&(?:lt|gt|quot|amp|#39);/g,Ni=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Pi=m("pre,textarea",!0),Di=function(t,e){return t&&Pi(t)&&"\n"===e[0]};function Fi(t,e){var n=e?Ni:Ii;return t.replace(n,(function(t){return Li[t]}))}var Bi,Ui,Hi,Vi,qi,zi,Ki,Ji,Wi=/^@|^v-on:/,Gi=/^v-|^@|^:|^#/,Xi=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Zi=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Yi=/^\(|\)$/g,Qi=/^\[.*\]$/,ta=/:(.*)$/,ea=/^:|^\.|^v-bind:/,na=/\.[^.\]]+(?=[^\]]*$)/g,ra=/^v-slot(:|$)|^#/,oa=/[\r\n]/,ia=/[ \f\t\r\n]+/g,aa=x(gi);function sa(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:va(e),rawAttrsMap:{},parent:n,children:[]}}function ca(t,e){Bi=e.warn||Er,zi=e.isPreTag||R,Ki=e.mustUseProp||R,Ji=e.getTagNamespace||R;var n=e.isReservedTag||R;(function(t){return!(!(t.component||t.attrsMap[":is"]||t.attrsMap["v-bind:is"])&&(t.attrsMap.is?n(t.attrsMap.is):n(t.tag)))}),Hi=Mr(e.modules,"transformNode"),Vi=Mr(e.modules,"preTransformNode"),qi=Mr(e.modules,"postTransformNode"),Ui=e.delimiters;var r,o,i=[],a=!1!==e.preserveWhitespace,s=e.whitespace,c=!1,u=!1;function l(t){if(f(t),c||t.processed||(t=ua(t,e)),i.length||t===r||r.if&&(t.elseif||t.else)&&fa(r,{exp:t.elseif,block:t}),o&&!t.forbidden)if(t.elseif||t.else)a=t,(s=function(t){for(var e=t.length;e--;){if(1===t[e].type)return t[e];t.pop()}}(o.children))&&s.if&&fa(s,{exp:a.elseif,block:a});else{if(t.slotScope){var n=t.slotTarget||'"default"';(o.scopedSlots||(o.scopedSlots={}))[n]=t}o.children.push(t),t.parent=o}var a,s;t.children=t.children.filter((function(t){return!t.slotScope})),f(t),t.pre&&(c=!1),zi(t.tag)&&(u=!1);for(var l=0;l]*>)","i")),p=t.replace(f,(function(t,n,r){return u=r.length,Mi(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),Di(l,n)&&(n=n.slice(1)),e.chars&&e.chars(n),""}));c+=t.length-p.length,t=p,A(l,c-u,c)}else{var d=t.indexOf("<");if(0===d){if(ji.test(t)){var v=t.indexOf("--\x3e");if(v>=0){e.shouldKeepComment&&e.comment(t.substring(4,v),c,c+v+3),$(v+3);continue}}if(Ei.test(t)){var h=t.indexOf("]>");if(h>=0){$(h+2);continue}}var m=t.match(Ti);if(m){$(m[0].length);continue}var y=t.match(Oi);if(y){var g=c;$(y[0].length),A(y[1],g,c);continue}var _=C();if(_){k(_),Di(_.tagName,t)&&$(1);continue}}var b=void 0,w=void 0,x=void 0;if(d>=0){for(w=t.slice(d);!(Oi.test(w)||Ai.test(w)||ji.test(w)||Ei.test(w)||(x=w.indexOf("<",1))<0);)d+=x,w=t.slice(d);b=t.substring(0,d)}d<0&&(b=t),b&&$(b.length),e.chars&&b&&e.chars(b,c-b.length,c)}if(t===n){e.chars&&e.chars(t);break}}function $(e){c+=e,t=t.substring(e)}function C(){var e=t.match(Ai);if(e){var n,r,o={tagName:e[1],attrs:[],start:c};for($(e[0].length);!(n=t.match(Si))&&(r=t.match($i)||t.match(xi));)r.start=c,$(r[0].length),r.end=c,o.attrs.push(r);if(n)return o.unarySlash=n[1],$(n[0].length),o.end=c,o}}function k(t){var n=t.tagName,c=t.unarySlash;i&&("p"===r&&wi(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=t.attrs.length,f=new Array(l),p=0;p=0&&o[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=o.length-1;u>=a;u--)e.end&&e.end(o[u].tag,n,i);o.length=a,r=a&&o[a-1].tag}else"br"===s?e.start&&e.start(t,[],!0,n,i):"p"===s&&(e.start&&e.start(t,[],!1,n,i),e.end&&e.end(t,n,i))}A()}(t,{warn:Bi,expectHTML:e.expectHTML,isUnaryTag:e.isUnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,shouldDecodeNewlinesForHref:e.shouldDecodeNewlinesForHref,shouldKeepComment:e.comments,outputSourceRange:e.outputSourceRange,start:function(t,n,a,s,f){var p=o&&o.ns||Ji(t);Z&&"svg"===p&&(n=function(t){for(var e=[],n=0;nc&&(s.push(i=t.slice(c,o)),a.push(JSON.stringify(i)));var u=Tr(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=o+r[0].length}return c-1"+("true"===i?":("+e+")":":_q("+e+","+i+")")),Dr(t,"change","var $$a="+e+",$$el=$event.target,$$c=$$el.checked?("+i+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+o+")":o)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+qr(e,"$$a.concat([$$v])")+")}else{$$i>-1&&("+qr(e,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+qr(e,"$$c")+"}",null,!0)}(t,r,o);else if("input"===i&&"radio"===a)!function(t,e,n){var r=n&&n.number,o=Fr(t,"value")||"null";Rr(t,"checked","_q("+e+","+(o=r?"_n("+o+")":o)+")"),Dr(t,"change",qr(e,o),null,!0)}(t,r,o);else if("input"===i||"textarea"===i)!function(t,e,n){var r=t.attrsMap.type;0;var o=n||{},i=o.lazy,a=o.number,s=o.trim,c=!i&&"range"!==r,u=i?"change":"range"===r?"__r":"input",l="$event.target.value";s&&(l="$event.target.value.trim()");a&&(l="_n("+l+")");var f=qr(e,l);c&&(f="if($event.target.composing)return;"+f);Rr(t,"value","("+e+")"),Dr(t,u,f,null,!0),(s||a)&&Dr(t,"blur","$forceUpdate()")}(t,r,o);else{if(!B.isReservedTag(i))return Vr(t,r,o),!1}return!0},text:function(t,e){e.value&&Rr(t,"textContent","_s("+e.value+")",e)},html:function(t,e){e.value&&Rr(t,"innerHTML","_s("+e.value+")",e)}},isPreTag:function(t){return"pre"===t},isUnaryTag:_i,mustUseProp:Nn,canBeLeftOpenTag:bi,isReservedTag:Zn,getTagNamespace:Yn,staticKeys:function(t){return t.reduce((function(t,e){return t.concat(e.staticKeys||[])}),[]).join(",")}(ga)},xa=x((function(t){return m("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(t?","+t:""))}));function $a(t,e){t&&(_a=xa(e.staticKeys||""),ba=e.isReservedTag||R,function t(e){if(e.static=function(t){if(2===t.type)return!1;if(3===t.type)return!0;return!(!t.pre&&(t.hasBindings||t.if||t.for||y(t.tag)||!ba(t.tag)||function(t){for(;t.parent;){if("template"!==(t=t.parent).tag)return!1;if(t.for)return!0}return!1}(t)||!Object.keys(t).every(_a)))}(e),1===e.type){if(!ba(e.tag)&&"slot"!==e.tag&&null==e.attrsMap["inline-template"])return;for(var n=0,r=e.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,ka=/\([^)]*?\);*$/,Aa=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Sa={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Oa={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Ta=function(t){return"if("+t+")return null;"},ja={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Ta("$event.target !== $event.currentTarget"),ctrl:Ta("!$event.ctrlKey"),shift:Ta("!$event.shiftKey"),alt:Ta("!$event.altKey"),meta:Ta("!$event.metaKey"),left:Ta("'button' in $event && $event.button !== 0"),middle:Ta("'button' in $event && $event.button !== 1"),right:Ta("'button' in $event && $event.button !== 2")};function Ea(t,e){var n=e?"nativeOn:":"on:",r="",o="";for(var i in t){var a=Ma(t[i]);t[i]&&t[i].dynamic?o+=i+","+a+",":r+='"'+i+'":'+a+","}return r="{"+r.slice(0,-1)+"}",o?n+"_d("+r+",["+o.slice(0,-1)+"])":n+r}function Ma(t){if(!t)return"function(){}";if(Array.isArray(t))return"["+t.map((function(t){return Ma(t)})).join(",")+"]";var e=Aa.test(t.value),n=Ca.test(t.value),r=Aa.test(t.value.replace(ka,""));if(t.modifiers){var o="",i="",a=[];for(var s in t.modifiers)if(ja[s])i+=ja[s],Sa[s]&&a.push(s);else if("exact"===s){var c=t.modifiers;i+=Ta(["ctrl","shift","alt","meta"].filter((function(t){return!c[t]})).map((function(t){return"$event."+t+"Key"})).join("||"))}else a.push(s);return a.length&&(o+=function(t){return"if(!$event.type.indexOf('key')&&"+t.map(Ra).join("&&")+")return null;"}(a)),i&&(o+=i),"function($event){"+o+(e?"return "+t.value+".apply(null, arguments)":n?"return ("+t.value+").apply(null, arguments)":r?"return "+t.value:t.value)+"}"}return e||n?t.value:"function($event){"+(r?"return "+t.value:t.value)+"}"}function Ra(t){var e=parseInt(t,10);if(e)return"$event.keyCode!=="+e;var n=Sa[t],r=Oa[t];return"_k($event.keyCode,"+JSON.stringify(t)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var La={on:function(t,e){t.wrapListeners=function(t){return"_g("+t+","+e.value+")"}},bind:function(t,e){t.wrapData=function(n){return"_b("+n+",'"+t.tag+"',"+e.value+","+(e.modifiers&&e.modifiers.prop?"true":"false")+(e.modifiers&&e.modifiers.sync?",true":"")+")"}},cloak:M},Ia=function(t){this.options=t,this.warn=t.warn||Er,this.transforms=Mr(t.modules,"transformCode"),this.dataGenFns=Mr(t.modules,"genData"),this.directives=j(j({},La),t.directives);var e=t.isReservedTag||R;this.maybeComponent=function(t){return!!t.component||!e(t.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Na(t,e){var n=new Ia(e);return{render:"with(this){return "+(t?"script"===t.tag?"null":Pa(t,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Pa(t,e){if(t.parent&&(t.pre=t.pre||t.parent.pre),t.staticRoot&&!t.staticProcessed)return Da(t,e);if(t.once&&!t.onceProcessed)return Fa(t,e);if(t.for&&!t.forProcessed)return Ua(t,e);if(t.if&&!t.ifProcessed)return Ba(t,e);if("template"!==t.tag||t.slotTarget||e.pre){if("slot"===t.tag)return function(t,e){var n=t.slotName||'"default"',r=za(t,e),o="_t("+n+(r?",function(){return "+r+"}":""),i=t.attrs||t.dynamicAttrs?Wa((t.attrs||[]).concat(t.dynamicAttrs||[]).map((function(t){return{name:C(t.name),value:t.value,dynamic:t.dynamic}}))):null,a=t.attrsMap["v-bind"];!i&&!a||r||(o+=",null");i&&(o+=","+i);a&&(o+=(i?"":",null")+","+a);return o+")"}(t,e);var n;if(t.component)n=function(t,e,n){var r=e.inlineTemplate?null:za(e,n,!0);return"_c("+t+","+Ha(e,n)+(r?","+r:"")+")"}(t.component,t,e);else{var r;(!t.plain||t.pre&&e.maybeComponent(t))&&(r=Ha(t,e));var o=t.inlineTemplate?null:za(t,e,!0);n="_c('"+t.tag+"'"+(r?","+r:"")+(o?","+o:"")+")"}for(var i=0;i>>0}(a):"")+")"}(t,t.scopedSlots,e)+","),t.model&&(n+="model:{value:"+t.model.value+",callback:"+t.model.callback+",expression:"+t.model.expression+"},"),t.inlineTemplate){var i=function(t,e){var n=t.children[0];0;if(n&&1===n.type){var r=Na(n,e.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map((function(t){return"function(){"+t+"}"})).join(",")+"]}"}}(t,e);i&&(n+=i+",")}return n=n.replace(/,$/,"")+"}",t.dynamicAttrs&&(n="_b("+n+',"'+t.tag+'",'+Wa(t.dynamicAttrs)+")"),t.wrapData&&(n=t.wrapData(n)),t.wrapListeners&&(n=t.wrapListeners(n)),n}function Va(t){return 1===t.type&&("slot"===t.tag||t.children.some(Va))}function qa(t,e){var n=t.attrsMap["slot-scope"];if(t.if&&!t.ifProcessed&&!n)return Ba(t,e,qa,"null");if(t.for&&!t.forProcessed)return Ua(t,e,qa);var r="_empty_"===t.slotScope?"":String(t.slotScope),o="function("+r+"){return "+("template"===t.tag?t.if&&n?"("+t.if+")?"+(za(t,e)||"undefined")+":undefined":za(t,e)||"undefined":Pa(t,e))+"}",i=r?"":",proxy:true";return"{key:"+(t.slotTarget||'"default"')+",fn:"+o+i+"}"}function za(t,e,n,r,o){var i=t.children;if(i.length){var a=i[0];if(1===i.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?e.maybeComponent(a)?",1":",0":"";return""+(r||Pa)(a,e)+s}var c=n?function(t,e){for(var n=0,r=0;r':'
',Qa.innerHTML.indexOf(" ")>0}var rs=!!J&&ns(!1),os=!!J&&ns(!0),is=x((function(t){var e=er(t);return e&&e.innerHTML})),as=An.prototype.$mount;An.prototype.$mount=function(t,e){if((t=t&&er(t))===document.body||t===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=is(r));else{if(!r.nodeType)return this;r=r.innerHTML}else t&&(r=function(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement("div");return e.appendChild(t.cloneNode(!0)),e.innerHTML}(t));if(r){0;var o=es(r,{outputSourceRange:!1,shouldDecodeNewlines:rs,shouldDecodeNewlinesForHref:os,delimiters:n.delimiters,comments:n.comments},this),i=o.render,a=o.staticRenderFns;n.render=i,n.staticRenderFns=a}}return as.call(this,t,e)},An.compile=es,e.a=An}).call(this,n(0),n(7).setImmediate)},function(t){t.exports=JSON.parse('{"a":"hardhat-docgen","b":{"type":"git","url":"git+https://github.com/ItsNickBarry/hardhat-docgen.git"}}')},function(t,e,n){var r=n(5);r.__esModule&&(r=r.default),"string"==typeof r&&(r=[[t.i,r,""]]),r.locals&&(t.exports=r.locals);(0,n(11).default)("0b345cf4",r,!1,{})},function(t,e,n){"use strict";n(3)},function(t,e,n){(e=t.exports=n(6)(!1)).push([t.i,"@import url(https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600;700&display=swap);",""]),e.push([t.i,"\nhtml,\nbody {\n font-family: 'Source Code Pro', monospace;\n}\n",""])},function(t,e,n){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n=function(t,e){var n=t[1]||"",r=t[3];if(!r)return n;if(e&&"function"==typeof btoa){var o=(a=r,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(a))))+" */"),i=r.sources.map((function(t){return"/*# sourceURL="+r.sourceRoot+t+" */"}));return[n].concat(i).concat([o]).join("\n")}var a;return[n].join("\n")}(e,t);return e[2]?"@media "+e[2]+"{"+n+"}":n})).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var r={},o=0;o=0&&(t._idleTimeoutId=setTimeout((function(){t._onTimeout&&t._onTimeout()}),e))},n(8),e.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(this,n(0))},function(t,e,n){(function(t,e){!function(t,n){"use strict";if(!t.setImmediate){var r,o,i,a,s,c=1,u={},l=!1,f=t.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(t);p=p&&p.setTimeout?p:t,"[object process]"==={}.toString.call(t.process)?r=function(){var t=d(arguments);return e.nextTick(v(h,t)),t}:!function(){if(t.postMessage&&!t.importScripts){var e=!0,n=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=n,e}}()?t.MessageChannel?((i=new MessageChannel).port1.onmessage=function(t){h(t.data)},r=function(){var t=d(arguments);return i.port2.postMessage(t),t}):f&&"onreadystatechange"in f.createElement("script")?(o=f.documentElement,r=function(){var t=d(arguments),e=f.createElement("script");return e.onreadystatechange=function(){h(t),e.onreadystatechange=null,o.removeChild(e),e=null},o.appendChild(e),t}):r=function(){var t=d(arguments);return setTimeout(v(h,t),0),t}:(a="setImmediate$"+Math.random()+"$",s=function(e){e.source===t&&"string"==typeof e.data&&0===e.data.indexOf(a)&&h(+e.data.slice(a.length))},t.addEventListener?t.addEventListener("message",s,!1):t.attachEvent("onmessage",s),r=function(){var e=d(arguments);return t.postMessage(a+e,"*"),e}),p.setImmediate=r,p.clearImmediate=m}function d(t){return u[c]=v.apply(void 0,t),c++}function v(t){var e=[].slice.call(arguments,1);return function(){"function"==typeof t?t.apply(void 0,e):new Function(""+t)()}}function h(t){if(l)setTimeout(v(h,t),0);else{var e=u[t];if(e){l=!0;try{e()}finally{m(t),l=!1}}}}function m(t){delete u[t]}}("undefined"==typeof self?void 0===t?this:t:self)}).call(this,n(0),n(9))},function(t,e){var n,r,o=t.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(t){if(n===setTimeout)return setTimeout(t,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(t){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(t){r=a}}();var c,u=[],l=!1,f=-1;function p(){l&&c&&(l=!1,c.length?u=c.concat(u):f=-1,u.length&&d())}function d(){if(!l){var t=s(p);l=!0;for(var e=u.length;e;){for(c=u,u=[];++f1)for(var n=1;n=0&&(t=e.slice(a),e=e.slice(0,a));var r=e.indexOf("?");return r>=0&&(n=e.slice(r+1),e=e.slice(0,r)),{path:e,query:n,hash:t}}(i.path||""),l=t&&t.path||"/",f=u.path?x(u.path,l,n||i.append):l,y=function(e,t,n){void 0===t&&(t={});var a,r=n||c;try{a=r(e||"")}catch(e){a={}}for(var i in t){var s=t[i];a[i]=Array.isArray(s)?s.map(p):p(s)}return a}(u.query,i.query,a&&a.options.parseQuery),m=i.hash||u.hash;return m&&"#"!==m.charAt(0)&&(m="#"+m),{_normalized:!0,path:f,query:y,hash:m}}var W,q=function(){},K={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,a=this.$route,i=n.resolve(this.to,a,this.append),s=i.location,o=i.route,d=i.href,u={},p=n.options.linkActiveClass,c=n.options.linkExactActiveClass,l=null==p?"router-link-active":p,m=null==c?"router-link-exact-active":c,h=null==this.activeClass?l:this.activeClass,v=null==this.exactActiveClass?m:this.exactActiveClass,b=o.redirectedFrom?y(null,H(o.redirectedFrom),null,n):o;u[v]=g(a,b,this.exactPath),u[h]=this.exact||this.exactPath?u[v]:function(e,t){return 0===e.path.replace(f,"/").indexOf(t.path.replace(f,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(a,b);var _=u[v]?this.ariaCurrentValue:null,T=function(e){J(e)&&(t.replace?n.replace(s,q):n.push(s,q))},w={click:J};Array.isArray(this.event)?this.event.forEach((function(e){w[e]=T})):w[this.event]=T;var k={class:u},x=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:d,route:o,navigate:T,isActive:u[h],isExactActive:u[v]});if(x){if(1===x.length)return x[0];if(x.length>1||!x.length)return 0===x.length?e():e("span",{},x)}if("a"===this.tag)k.on=w,k.attrs={href:d,"aria-current":_};else{var O=function e(t){var n;if(t)for(var a=0;a-1&&(o.params[l]=n.params[l]);return o.path=z(p.path,o.params),d(p,o,s)}if(o.path){o.params={};for(var f=0;f=e.length?n():e[r]?t(e[r],(function(){a(r+1)})):a(r+1)};a(0)}var _e={redirected:2,aborted:4,cancelled:8,duplicated:16};function Te(e,t){return ke(e,t,_e.redirected,'Redirected when going from "'+e.fullPath+'" to "'+function(e){if("string"==typeof e)return e;if("path"in e)return e.path;var t={};return xe.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}(t)+'" via a navigation guard.')}function we(e,t){return ke(e,t,_e.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function ke(e,t,n,a){var r=new Error(a);return r._isRouter=!0,r.from=e,r.to=t,r.type=n,r}var xe=["params","query","hash"];function Oe(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function Ae(e,t){return Oe(e)&&e._isRouter&&(null==t||e.type===t)}function Ce(e){return function(t,n,a){var r=!1,i=0,s=null;Se(e,(function(e,t,n,o){if("function"==typeof e&&void 0===e.cid){r=!0,i++;var d,u=Re((function(t){var r;((r=t).__esModule||$e&&"Module"===r[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:W.extend(t),n.components[o]=t,--i<=0&&a()})),p=Re((function(e){var t="Failed to resolve async component "+o+": "+e;s||(s=Oe(e)?e:new Error(t),a(s))}));try{d=e(u,p)}catch(e){p(e)}if(d)if("function"==typeof d.then)d.then(u,p);else{var c=d.component;c&&"function"==typeof c.then&&c.then(u,p)}}})),r||a()}}function Se(e,t){return Me(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Me(e){return Array.prototype.concat.apply([],e)}var $e="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Re(e){var t=!1;return function(){for(var n=[],a=arguments.length;a--;)n[a]=arguments[a];if(!t)return t=!0,e.apply(this,n)}}var Ie=function(e,t){this.router=e,this.base=function(e){if(!e)if(G){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=h,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Ee(e,t,n,a){var r=Se(e,(function(e,a,r,i){var s=function(e,t){"function"!=typeof e&&(e=W.extend(e));return e.options[t]}(e,t);if(s)return Array.isArray(s)?s.map((function(e){return n(e,a,r,i)})):n(s,a,r,i)}));return Me(a?r.reverse():r)}function De(e,t){if(t)return function(){return e.apply(t,arguments)}}Ie.prototype.listen=function(e){this.cb=e},Ie.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Ie.prototype.onError=function(e){this.errorCbs.push(e)},Ie.prototype.transitionTo=function(e,t,n){var a,r=this;try{a=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var i=this.current;this.confirmTransition(a,(function(){r.updateRoute(a),t&&t(a),r.ensureURL(),r.router.afterHooks.forEach((function(e){e&&e(a,i)})),r.ready||(r.ready=!0,r.readyCbs.forEach((function(e){e(a)})))}),(function(e){n&&n(e),e&&!r.ready&&(Ae(e,_e.redirected)&&i===h||(r.ready=!0,r.readyErrorCbs.forEach((function(t){t(e)}))))}))},Ie.prototype.confirmTransition=function(e,t,n){var a=this,r=this.current;this.pending=e;var i,s,o=function(e){!Ae(e)&&Oe(e)&&(a.errorCbs.length?a.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},d=e.matched.length-1,u=r.matched.length-1;if(g(e,r)&&d===u&&e.matched[d]===r.matched[u])return this.ensureURL(),o(((s=ke(i=r,e,_e.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",s));var p=function(e,t){var n,a=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,a=he&&n;a&&this.listeners.push(se());var r=function(){var n=e.current,r=Ve(e.base);e.current===h&&r===e._startLocation||e.transitionTo(r,(function(e){a&&oe(t,e,n,!0)}))};window.addEventListener("popstate",r),this.listeners.push((function(){window.removeEventListener("popstate",r)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){ve(O(a.base+e.fullPath)),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){be(O(a.base+e.fullPath)),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Ve(this.base)!==this.current.fullPath){var t=O(this.base+this.current.fullPath);e?ve(t):be(t)}},t.prototype.getCurrentLocation=function(){return Ve(this.base)},t}(Ie);function Ve(e){var t=window.location.pathname;return e&&0===t.toLowerCase().indexOf(e.toLowerCase())&&(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Le=function(e){function t(t,n,a){e.call(this,t,n),a&&function(e){var t=Ve(e);if(!/^\/#/.test(t))return window.location.replace(O(e+"/#"+t)),!0}(this.base)||Fe()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=he&&t;n&&this.listeners.push(se());var a=function(){var t=e.current;Fe()&&e.transitionTo(Pe(),(function(a){n&&oe(e.router,a,t,!0),he||Ue(a.fullPath)}))},r=he?"popstate":"hashchange";window.addEventListener(r,a),this.listeners.push((function(){window.removeEventListener(r,a)}))}},t.prototype.push=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){Be(e.fullPath),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,r=this.current;this.transitionTo(e,(function(e){Ue(e.fullPath),oe(a.router,e,r,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Pe()!==t&&(e?Be(t):Ue(t))},t.prototype.getCurrentLocation=function(){return Pe()},t}(Ie);function Fe(){var e=Pe();return"/"===e.charAt(0)||(Ue("/"+e),!1)}function Pe(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Ne(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Be(e){he?ve(Ne(e)):window.location.hash=e}function Ue(e){he?be(Ne(e)):window.location.replace(Ne(e))}var ze=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index+1).concat(e),a.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var a=this.stack[n];this.confirmTransition(a,(function(){var e=t.current;t.index=n,t.updateRoute(a),t.router.afterHooks.forEach((function(t){t&&t(a,e)}))}),(function(e){Ae(e,_e.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Ie),He=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Y(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!he&&!1!==e.fallback,this.fallback&&(t="hash"),G||(t="abstract"),this.mode=t,t){case"history":this.history=new je(this,e.base);break;case"hash":this.history=new Le(this,e.base,this.fallback);break;case"abstract":this.history=new ze(this,e.base);break;default:0}},We={currentRoute:{configurable:!0}};function qe(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}He.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},We.currentRoute.get=function(){return this.history&&this.history.current},He.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof je||n instanceof Le){var a=function(e){n.setupListeners(),function(e){var a=n.current,r=t.options.scrollBehavior;he&&r&&"fullPath"in e&&oe(t,e,a,!1)}(e)};n.transitionTo(n.getCurrentLocation(),a,a)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},He.prototype.beforeEach=function(e){return qe(this.beforeHooks,e)},He.prototype.beforeResolve=function(e){return qe(this.resolveHooks,e)},He.prototype.afterEach=function(e){return qe(this.afterHooks,e)},He.prototype.onReady=function(e,t){this.history.onReady(e,t)},He.prototype.onError=function(e){this.history.onError(e)},He.prototype.push=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.push(e,t,n)}));this.history.push(e,t,n)},He.prototype.replace=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.replace(e,t,n)}));this.history.replace(e,t,n)},He.prototype.go=function(e){this.history.go(e)},He.prototype.back=function(){this.go(-1)},He.prototype.forward=function(){this.go(1)},He.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},He.prototype.resolve=function(e,t,n){var a=H(e,t=t||this.history.current,n,this),r=this.match(a,t),i=r.redirectedFrom||r.fullPath;return{location:a,route:r,href:function(e,t,n){var a="hash"===n?"#"+t:t;return e?O(e+"/"+a):a}(this.history.base,i,this.mode),normalizedTo:a,resolved:r}},He.prototype.getRoutes=function(){return this.matcher.getRoutes()},He.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},He.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(He.prototype,We),He.install=function e(t){if(!e.installed||W!==t){e.installed=!0,W=t;var n=function(e){return void 0!==e},a=function(e,t){var a=e.$options._parentVnode;n(a)&&n(a=a.data)&&n(a=a.registerRouteInstance)&&a(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,a(this,this)},destroyed:function(){a(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",w),t.component("RouterLink",K);var r=t.config.optionMergeStrategies;r.beforeRouteEnter=r.beforeRouteLeave=r.beforeRouteUpdate=r.created}},He.version="3.5.1",He.isNavigationFailure=Ae,He.NavigationFailureType=_e,He.START_LOCATION=h,G&&window.Vue&&window.Vue.use(He);var Ke=He,Je=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"min-h-screen bg-gray-100 px-4 pt-6"},[t("router-view")],1)};Je._withStripped=!0;n(4);function Ge(e,t,n,a,r,i,s,o){var d,u="function"==typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),a&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),s?(d=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),r&&r.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(s)},u._ssrRegister=d):r&&(d=o?function(){r.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:r),d)if(u.functional){u._injectStyles=d;var p=u.render;u.render=function(e,t){return d.call(t),p(e,t)}}else{var c=u.beforeCreate;u.beforeCreate=c?[].concat(c,d):[d]}return{exports:e,options:u}}var Xe=Ge({},Je,[],!1,null,null,null);Xe.options.__file="node_modules/hardhat-docgen/src/App.vue";var Ze=Xe.exports,Ye=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("HeaderBar"),e._v(" "),n("div",{staticClass:"pb-32"},[n("div",{staticClass:"space-y-4"},[n("span",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.source)+"\n ")]),e._v(" "),n("h1",{staticClass:"text-xl"},[e._v("\n "+e._s(e.json.name)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.title)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.author)+"\n ")]),e._v(" "),n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))])]),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.hasOwnProperty("constructor")?n("Member",{attrs:{json:e.json.constructor}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.receive?n("Member",{attrs:{json:e.json.receive}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.fallback?n("Member",{attrs:{json:e.json.fallback}}):e._e()],1),e._v(" "),e.json.events?n("MemberSet",{attrs:{title:"Events",json:e.json.events}}):e._e(),e._v(" "),e.json.stateVariables?n("MemberSet",{attrs:{title:"State Variables",json:e.json.stateVariables}}):e._e(),e._v(" "),e.json.methods?n("MemberSet",{attrs:{title:"Methods",json:e.json.methods}}):e._e()],1),e._v(" "),n("FooterBar")],1)};Ye._withStripped=!0;var Qe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"bg-gray-100 fixed bottom-0 right-0 w-full border-t border-dashed border-gray-300"},[n("div",{staticClass:"w-full text-center py-2 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("button",{staticClass:"py-1 px-2 text-gray-500",on:{click:function(t){return e.openLink(e.repository)}}},[e._v("\n built with "+e._s(e.name)+"\n ")])])])};Qe._withStripped=!0;var et=n(2),tt=Ge({data:function(){return{repository:et.b,name:et.a}},methods:{openLink(e){window.open(e,"_blank")}}},Qe,[],!1,null,null,null);tt.options.__file="node_modules/hardhat-docgen/src/components/FooterBar.vue";var nt=tt.exports,at=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full border-b border-dashed py-2 border-gray-300"},[t("router-link",{staticClass:"py-2 text-gray-500",attrs:{to:"/"}},[this._v("\n <- Go back\n ")])],1)};at._withStripped=!0;var rt=Ge({},at,[],!1,null,null,null);rt.options.__file="node_modules/hardhat-docgen/src/components/HeaderBar.vue";var it=rt.exports,st=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"border-2 border-gray-400 border-dashed w-full p-2"},[n("h3",{staticClass:"text-lg pb-2 mb-2 border-b-2 border-gray-400 border-dashed"},[e._v("\n "+e._s(e.name)+" "+e._s(e.keywords)+" "+e._s(e.inputSignature)+"\n ")]),e._v(" "),n("div",{staticClass:"space-y-3"},[n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))]),e._v(" "),n("MemberSection",{attrs:{name:"Parameters",items:e.inputs}}),e._v(" "),n("MemberSection",{attrs:{name:"Return Values",items:e.outputs}})],1)])};st._withStripped=!0;var ot=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.items.length>0?n("ul",[n("h4",{staticClass:"text-lg"},[e._v("\n "+e._s(e.name)+"\n ")]),e._v(" "),e._l(e.items,(function(t,a){return n("li",{key:a},[n("span",{staticClass:"bg-gray-300"},[e._v(e._s(t.type))]),e._v(" "),n("b",[e._v(e._s(t.name||"_"+a))]),t.desc?n("span",[e._v(": "),n("i",[e._v(e._s(t.desc))])]):e._e()])}))],2):e._e()};ot._withStripped=!0;var dt=Ge({props:{name:{type:String,default:""},items:{type:Array,default:()=>new Array}}},ot,[],!1,null,null,null);dt.options.__file="node_modules/hardhat-docgen/src/components/MemberSection.vue";var ut=Ge({components:{MemberSection:dt.exports},props:{json:{type:Object,default:()=>new Object}},computed:{name:function(){return this.json.name||this.json.type},keywords:function(){let e=[];return this.json.stateMutability&&e.push(this.json.stateMutability),"true"===this.json.anonymous&&e.push("anonymous"),e.join(" ")},params:function(){return this.json.params||{}},returns:function(){return this.json.returns||{}},inputs:function(){return(this.json.inputs||[]).map(e=>({...e,desc:this.params[e.name]}))},inputSignature:function(){return`(${this.inputs.map(e=>e.type).join(",")})`},outputs:function(){return(this.json.outputs||[]).map((e,t)=>({...e,desc:this.returns[e.name||"_"+t]}))},outputSignature:function(){return`(${this.outputs.map(e=>e.type).join(",")})`}}},st,[],!1,null,null,null);ut.options.__file="node_modules/hardhat-docgen/src/components/Member.vue";var pt=ut.exports,ct=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full mt-8"},[n("h2",{staticClass:"text-lg"},[e._v(e._s(e.title))]),e._v(" "),e._l(Object.keys(e.json),(function(t){return n("Member",{key:t,staticClass:"mt-3",attrs:{json:e.json[t]}})}))],2)};ct._withStripped=!0;var lt=Ge({components:{Member:pt},props:{title:{type:String,default:""},json:{type:Object,default:()=>new Object}}},ct,[],!1,null,null,null);lt.options.__file="node_modules/hardhat-docgen/src/components/MemberSet.vue";var ft=Ge({components:{Member:pt,MemberSet:lt.exports,HeaderBar:it,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}}},Ye,[],!1,null,null,null);ft.options.__file="node_modules/hardhat-docgen/src/components/Contract.vue";var yt=ft.exports,mt=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto pb-32"},[t("Branch",{attrs:{json:this.trees,name:"Sources:"}}),this._v(" "),t("FooterBar",{staticClass:"mt-20"})],1)};mt._withStripped=!0;var ht=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._v("\n "+e._s(e.name)+"\n "),Array.isArray(e.json)?n("div",{staticClass:"pl-5"},e._l(e.json,(function(t,a){return n("div",{key:a},[n("router-link",{attrs:{to:t.source+":"+t.name}},[e._v("\n "+e._s(t.name)+"\n ")])],1)})),0):n("div",{staticClass:"pl-5"},e._l(Object.keys(e.json),(function(t){return n("div",{key:t},[n("Branch",{attrs:{json:e.json[t],name:t}})],1)})),0)])};ht._withStripped=!0;var vt=Ge({name:"Branch",props:{name:{type:String,default:null},json:{type:[Object,Array],default:()=>new Object}}},ht,[],!1,null,null,null);vt.options.__file="node_modules/hardhat-docgen/src/components/Branch.vue";var bt=Ge({components:{Branch:vt.exports,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}},computed:{trees:function(){let e={};for(let t in this.json)t.split(/(?<=\/)/).reduce(function(e,n){if(!n.includes(":"))return e[n]=e[n]||{},e[n];{let[a]=n.split(":");e[a]=e[a]||[],e[a].push(this.json[t])}}.bind(this),e);return e}}},mt,[],!1,null,null,null);bt.options.__file="node_modules/hardhat-docgen/src/components/Index.vue";var gt=bt.exports;a.a.use(Ke);const _t={"contracts/Interfaces/IERC20.sol:IERC20":{source:"contracts/Interfaces/IERC20.sol",name:"IERC20",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"_owner",type:"address"},{internalType:"address",name:"_spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_spender",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"_who",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"c_0x1be38b5b(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x1be38b5b",type:"bytes32"}],name:"c_0x1be38b5b",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_from",type:"address"},{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Interfaces/ILockedFund.sol:ILockedFund":{source:"contracts/Interfaces/ILockedFund.sol",name:"ILockedFund",title:"An interface of Locked Fund Contract.",author:"Franklin Richards - powerhousefrank@protonmail.com",methods:{"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"c_0x6defa1ca(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x6defa1ca",type:"bytes32"}],name:"c_0x6defa1ca",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositVested(address,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point)which determines how much will be unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawAndStakeTokensFrom(address)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"}],name:"withdrawAndStakeTokensFrom",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_userAddress:"The address of user tokens will be withdrawn."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Interfaces/IOrigins.sol:IOrigins":{source:"contracts/Interfaces/IOrigins.sol",name:"IOrigins",title:"Interface of the Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",methods:{"c_0x2b1a913c(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x2b1a913c",type:"bytes32"}],name:"c_0x2b1a913c",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/Interfaces/IVestingLogic.sol:IVestingLogic":{source:"contracts/Interfaces/IVestingLogic.sol",name:"IVestingLogic",notice:"TODO",methods:{"c_0xa1e8758b(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xa1e8758b",type:"bytes32"}],name:"c_0xa1e8758b",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0xd266dec3(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xd266dec3",type:"bytes32"}],name:"c_0xd266dec3",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"stakeTokens(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"The amount of tokens to stake."},notice:"Stakes tokens according to the vesting schedule."},"withdrawTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"}],name:"withdrawTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{receiver:"The receiving address."},notice:"Withdraws unlocked tokens from the staking contract and forwards them to an address specified by the token owner."}}},"contracts/Interfaces/IVestingLogic.sol:VestingStorage":{source:"contracts/Interfaces/IVestingLogic.sol",name:"VestingStorage",title:"Vesting Storage Contract (Incomplete).",notice:"This contract is just the required storage fromm vesting for LockedFund.",methods:{"c_0xa1e8758b(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xa1e8758b",type:"bytes32"}],name:"c_0xa1e8758b",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Interfaces/IVestingRegistry.sol:IVestingRegistry":{source:"contracts/Interfaces/IVestingRegistry.sol",name:"IVestingRegistry",notice:"TODO",methods:{"c_0x8a4aab55(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8a4aab55",type:"bytes32"}],name:"c_0x8a4aab55",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"createVesting(address,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"}],name:"createVesting",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount to be staked",_cliff:"the cliff in seconds",_duration:"the total duration in seconds",_tokenOwner:"the owner of the tokens"},notice:"creates Vesting contract"},"getVesting(address)":{constant:!0,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"}],name:"getVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",params:{_tokenOwner:"the owner of the tokens"},notice:"returns vesting contract address for the given token owner"},"stakeTokens(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_vesting",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount of tokens to stake",_vesting:"the address of Vesting contract"},notice:"stakes tokens according to the vesting schedule"}}},"contracts/LockedFund.sol:LockedFund":{source:"contracts/LockedFund.sol",name:"LockedFund",title:"A holding contract for Locked Fund.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"This is not the final form of this contract.",notice:"You can use this contract for timed token release from Locked Fund.",constructor:{inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"},{internalType:"address",name:"_token",type:"address"},{internalType:"address",name:"_vestingRegistry",type:"address"},{internalType:"address[]",name:"_admins",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AdminAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_newAdmin",type:"address"}],name:"AdminAdded",type:"event"},"AdminRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_removedAdmin",type:"address"}],name:"AdminRemoved",type:"event"},"TokenStaked(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"TokenStaked",type:"event"},"VestedDeposited(address,address,uint256,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_cliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_duration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"VestedDeposited",type:"event"},"VestingCreated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"}],name:"VestingCreated",type:"event"},"VestingRegistryUpdated(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vestingRegistry",type:"address"}],name:"VestingRegistryUpdated",type:"event"},"WaitedTSUpdated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"WaitedTSUpdated",type:"event"},"Withdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"Withdrawn",type:"event"}},methods:{"INTERVAL()":{constant:!0,inputs:[],name:"INTERVAL",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"_removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"_removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"Internal function to remove an admin."},"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"adminStatus(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"adminStatus",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the admin status."},return:"_status True if admin, False otherwise.",notice:"The function to check is an address is admin or not."},"c_0x6defa1ca(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x6defa1ca",type:"bytes32"}],name:"c_0x6defa1ca",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8dbef84a(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8dbef84a",type:"bytes32"}],name:"c_0x8dbef84a",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"cliff(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositVested(address,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point)which determines how much will be unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"duration(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"getCliffAndDuration(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getCliffAndDuration",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address whose cliff and duration has to be found."},return:"The cliff of the user vesting/lock.The duration of the user vesting/lock.",notice:"Function to read the cliff and duration of a user."},"getLockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getLockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the locked balance."},return:"_balance The locked balance of the address `_addr`.",notice:"The function to get the locked balance of a user."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the unlocked balance."},return:"_balance The unlocked balance of the address `_addr`.",notice:"The function to get the unlocked balance of a user."},"getVestingDetails()":{constant:!0,inputs:[],name:"getVestingDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Vesting Registry.",notice:"Function to read the vesting registry."},"getWaitedTS()":{constant:!0,inputs:[],name:"getWaitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The waited timestamp.",notice:"Function to read the waited timestamp."},"getWaitedUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getWaitedUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the waited unlocked balance."},return:"_balance The waited unlocked balance of the address `_addr`.",notice:"The function to get the waited unlocked balance of a user."},"isAdmin(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"isAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"lockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"lockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"token()":{constant:!0,inputs:[],name:"token",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"unlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"unlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"vestedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the vested balance."},return:"_balance The vested balance of the address `_addr`.",notice:"The function to get the vested balance of a user."},"vestedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestingRegistry()":{constant:!0,inputs:[],name:"vestingRegistry",outputs:[{internalType:"contract IVestingRegistry",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"waitedTS()":{constant:!0,inputs:[],name:"waitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"waitedUnlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"waitedUnlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawAndStakeTokensFrom(address)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"}],name:"withdrawAndStakeTokensFrom",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_userAddress:"The address of user tokens will be withdrawn."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Openzeppelin/Address.sol:Address":{source:"contracts/Openzeppelin/Address.sol",name:"Address",details:"Collection of functions related to the address type",methods:{"c_0xfd43e276(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xfd43e276",type:"bytes32"}],name:"c_0xfd43e276",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/Openzeppelin/Context.sol:Context":{source:"contracts/Openzeppelin/Context.sol",name:"Context",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},methods:{"c_0xdb7cf3fd(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xdb7cf3fd",type:"bytes32"}],name:"c_0xdb7cf3fd",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/Openzeppelin/ERC20.sol:ERC20":{source:"contracts/Openzeppelin/ERC20.sol",name:"ERC20",details:"Implementation of the {IERC20} interface. * This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20Mintable}. * TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. * We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. * Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-allowance}."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-approve}.\t * Requirements:\t * - `spender` cannot be the zero address."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-balanceOf}."},"c_0x42d820d8(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x42d820d8",type:"bytes32"}],name:"c_0x42d820d8",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0xdb7cf3fd(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xdb7cf3fd",type:"bytes32"}],name:"c_0xdb7cf3fd",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"decreaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically decreases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically increases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-totalSupply}."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transfer}.\t * Requirements:\t * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transferFrom}.\t * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20};\t * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for `sender`'s tokens of at least `amount`."}}},"contracts/Openzeppelin/ERC20Detailed.sol:ERC20Detailed":{source:"contracts/Openzeppelin/ERC20Detailed.sol",name:"ERC20Detailed",details:"Optional functions from the ERC20 standard.",constructor:{inputs:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint8",name:"decimals",type:"uint8"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default.\t * This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Sets `amount` as the allowance of `spender` over the caller's tokens.\t * Returns a boolean value indicating whether the operation succeeded.\t * IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\t * Emits an {Approval} event."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens owned by `account`."},"c_0xc9bbb881(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xc9bbb881",type:"bytes32"}],name:"c_0xc9bbb881",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\t * Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\t * NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the name of the token."},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens in existence."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from the caller's account to `recipient`.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."}}},"contracts/Openzeppelin/IERC20_.sol:IERC20_":{source:"contracts/Openzeppelin/IERC20_.sol",name:"IERC20_",details:"Interface of the ERC20 standard as defined in the EIP. Does not include the optional functions; to access them see {ERC20Detailed}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default.\t * This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Sets `amount` as the allowance of `spender` over the caller's tokens.\t * Returns a boolean value indicating whether the operation succeeded.\t * IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\t * Emits an {Approval} event."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens owned by `account`."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens in existence."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from the caller's account to `recipient`.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."}}},"contracts/Openzeppelin/Ownable.sol:Ownable":{source:"contracts/Openzeppelin/Ownable.sol",name:"Ownable",details:"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. * This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"c_0xd8e745d9(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xd8e745d9",type:"bytes32"}],name:"c_0xd8e745d9",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0xdb7cf3fd(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0xdb7cf3fd",type:"bytes32"}],name:"c_0xdb7cf3fd",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"contracts/Openzeppelin/ReentrancyGuard.sol:ReentrancyGuard":{source:"contracts/Openzeppelin/ReentrancyGuard.sol",name:"ReentrancyGuard",title:"Helps contracts guard against reentrancy attacks.",author:"Remco Bloemen , Eenae ",details:"If you mark a function `nonReentrant`, you should also mark it `external`.",methods:{"c_0x43034809(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x43034809",type:"bytes32"}],name:"c_0x43034809",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/Openzeppelin/SafeMath.sol:SafeMath":{source:"contracts/Openzeppelin/SafeMath.sol",name:"SafeMath",details:"Wrappers over Solidity's arithmetic operations with added overflow checks. * Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. * Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.",methods:{"c_0x4263dba6(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x4263dba6",type:"bytes32"}],name:"c_0x4263dba6",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/OriginsAdmin.sol:OriginsAdmin":{source:"contracts/OriginsAdmin.sol",name:"OriginsAdmin",title:"An owner contract with granular access for multiple parties.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"To add a new role, add the corresponding array and mapping, along with add, remove and get functions.",notice:"You can use this contract for creating multiple owners with different access.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsBase.sol:OriginsBase":{source:"contracts/OriginsBase.sol",name:"OriginsBase",title:"A contract for Origins platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"You can use this contract for creating a sale in the Origins Platform.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"},{internalType:"address payable",name:"_depositAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!1,internalType:"address",name:"_depositToken",type:"address"},{indexed:!0,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"addressVerification(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"addressVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tier for which the address has to be verified."},notice:"Function to verify a single address with a single tier."},"buy(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"buy",outputs:[],payable:!0,stateMutability:"payable",type:"function",details:"If deposit type if RBTC, then _amount can be passed as zero.",params:{_amount:"The amount of token (deposit asset) which will be sent for purchasing.",_tierID:"The Tier ID from which the token has to be bought."},notice:"Function to buy tokens from sale based on tier."},"c_0x2b1a913c(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x2b1a913c",type:"bytes32"}],name:"c_0x2b1a913c",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x4ad0f1fc(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x4ad0f1fc",type:"bytes32"}],name:"c_0x4ad0f1fc",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x7d365384(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x7d365384",type:"bytes32"}],name:"c_0x7d365384",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkSaleEnded(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"checkSaleEnded",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"A return of false does not necessary mean the sale is active. It can also be in inactive state.",params:{_tierID:"The Tier whose info is to be read."},return:"True is sale ended, False otherwise.",notice:"Function to check if a tier sale ended or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"createTier(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint8,uint8,uint8,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"createTier",outputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this should be decoupled.",params:{_depositRate:"Contains the rate of the token w.r.t. the depositing asset.",_depositToken:"Contains the deposit token address if the deposit type is Token.",_remainingTokens:"Contains the remaining tokens for sale.",_saleEnd:"Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens.",_saleEndDurationOrTS:"Contains whether end of sale is by Duration or Timestamp.",_saleStartTS:"Contains the timestamp for the sale to start. Before which no user will be able to buy tokens.",_transferType:"Contains the type of token transfer after a user buys to get the tokens.",_unlockedBP:"Contains the unlock amount in Basis Point for Vesting/Lock.",_unlockedTokenWithdrawTS:"Contains the timestamp for the waited unlocked tokens to be withdrawn.",_verificationType:"Contains the method by which verification happens.",_vestOrLockCliff:"Contains the cliff of the vesting/lock for distribution.",_vestOrLockDuration:"Contains the duration of the vesting/lock for distribution."},return:"_tierID The newly created tier ID.",notice:"Function to create a new tier."},"getDepositAddress()":{constant:!0,inputs:[],name:"getDepositAddress",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"If zero is returned, any of the owners can withdraw the raised funds.",return:"The address of the deposit address.",notice:"Function to read the deposit address."},"getLockDetails()":{constant:!0,inputs:[],name:"getLockDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Locked Fund Contract.",notice:"Function to read the locked fund contract address."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getParticipatingWalletCountPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getParticipatingWalletCountPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Total participation of wallets cannot be determined by this. A user can participate on one round and not on other. In the future maybe a count on that can be created.",params:{_tierID:"The tier ID for which the count has to be checked."},return:"The number of wallets who participated in that Tier.",notice:"Function to read participating wallet count per tier."},"getTierCount()":{constant:!0,inputs:[],name:"getTierCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The number of tiers present in the contract.",notice:"Function to read the tier count."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getTokensBoughtByAddressOnTier(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensBoughtByAddressOnTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"The amount of tokens bought by the address.",notice:"Function to read tokens bought by an address on a particular tier."},"getTokensSoldPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensSoldPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The tier ID for which the sold metrics has to be checked."},return:"The amount of tokens sold on that tier.",notice:"Function to read tokens sold per tier."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"isAddressApproved(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"isAddressApproved",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"True is allowed, False otherwise.",notice:"Function to read address which are approved for sale in a tier."},"multipleAddressAndTierVerification(address[],uint256[])":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"multipleAddressAndTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tiers for which the addresses has to be verified."},notice:"Function to verify multiple address with multiple tiers."},"multipleAddressSingleTierVerification(address[],uint256)":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"multipleAddressSingleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tier for which the addresses has to be verified."},notice:"Function to verify multiple address with a single tier."},"readTierPartA(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartA",outputs:[{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_minAmount The minimum amount which can be deposited._maxAmount The maximum amount which can be deposited._remainingTokens Contains the remaining tokens for sale._saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens._saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens._unlockedTokenWithdrawTS Contains the timestamp for the waited unlocked tokens to be withdrawn._unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock._vestOrLockCliff Contains the cliff of the vesting/lock for distribution._vestOrLockDuration Contains the duration of the vesting/lock for distribution._depositRate Contains the rate of the token w.r.t. the depositing asset.",notice:"Function to read a Tier parameter."},"readTierPartB(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartB",outputs:[{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_depositToken Contains the deposit token address if the deposit type is Token._depositType The type of deposit for the particular sale._verificationType Contains the method by which verification happens._saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp._transferType Contains the type of token transfer after a user buys to get the tokens.",notice:"Function to read a Tier parameter."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."},"setDepositAddress(address)":{constant:!1,inputs:[{internalType:"address payable",name:"_depositAddress",type:"address"}],name:"setDepositAddress",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party.",params:{_depositAddress:"The address of deposit address where all the raised fund will go."},notice:"Function to set the deposit address."},"setLockedFund(address)":{constant:!1,inputs:[{internalType:"address",name:"_lockedFund",type:"address"}],name:"setLockedFund",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_lockedFund:"The address of new the Vesting registry."},notice:"Function to set the Locked Fund Contract Address."},"setTierDeposit(uint256,uint256,address,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"setTierDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_depositRate:"The rate is the, asset * rate = token.",_depositToken:"The token for that particular Tier Sale.",_depositType:"The type of deposit for the particular sale.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Deposit Parameters."},"setTierTime(uint256,uint256,uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"setTierTime",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_saleEnd:"The Tier Sale End Duration or Timestamp.",_saleEndDurationOrTS:"The Tier Sale End Type for the Tier.",_saleStartTS:"The Tier Sale Start Timestamp.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Time Parameters."},"setTierTokenAmount(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"setTierTokenAmount",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_remainingTokens:"The maximum number of tokens allowed to be sold in the tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Amount Parameters."},"setTierTokenLimit(uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"setTierTokenLimit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_maxAmount:"The maximum asset amount allowed to participate in that tier.",_minAmount:"The minimum asset amount required to participate in that tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Limit Parameters."},"setTierVerification(uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"setTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_verificationType:"The type of verification for the particular sale."},notice:"Function to set the Tier Verification Method."},"setTierVestOrLock(uint256,uint256,uint256,uint256,uint256,uint8)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"setTierVestOrLock",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_transferType:"The Tier Transfer Type for the Tier.",_unlockedBP:"The unlocked token amount in BP.",_unlockedTokenWithdrawTS:"The unlocked token withdraw timestamp.",_vestOrLockCliff:"The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff.",_vestOrLockDuration:"The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration."},notice:"Function to set the Tier Vest/Lock Parameters."},"singleAddressMultipleTierVerification(address,uint256[])":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"singleAddressMultipleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tiers for which the address has to be verified."},notice:"Function to verify a single address with multiple tiers."},"withdrawSaleDeposit()":{constant:!1,inputs:[],name:"withdrawSaleDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this could be made to be accessible only to seller, rather than owner.",notice:"The function used by the admin or deposit address to withdraw the sale proceedings."}}},"contracts/OriginsEvents.sol:OriginsEvents":{source:"contracts/OriginsEvents.sol",name:"OriginsEvents",title:"A contract containing all the events of Origins Base.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"You can use this contract for adding events into Origins Base.",events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!1,internalType:"address",name:"_depositToken",type:"address"},{indexed:!0,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedTokenWithdrawTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!0,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x7d365384(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x7d365384",type:"bytes32"}],name:"c_0x7d365384",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsStorage.sol:OriginsStorage":{source:"contracts/OriginsStorage.sol",name:"OriginsStorage",title:"A storage contract for Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"This plays as the harddisk for the Origins Platform.",events:{"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}}},Tt=new Ke({routes:[{path:"/",component:gt,props:()=>({json:_t})},{path:"*",component:yt,props:e=>({json:_t[e.path.slice(1)]})}]});new a.a({el:"#app",router:Tt,mounted(){document.dispatchEvent(new Event("render-event"))},render:e=>e(Ze)})},function(e,t,n){"use strict";function a(e,t){for(var n=[],a={},r=0;rn.parts.length&&(a.parts.length=n.parts.length)}else{var s=[];for(r=0;r=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(i.path||""),p=e&&e.path||"/",d=u.path?C(u.path,p,n||i.append):p,v=function(t,e,n){void 0===e&&(e={});var r,o=n||f;try{r=o(t||"")}catch(t){r={}}for(var i in e){var a=e[i];r[i]=Array.isArray(a)?a.map(l):l(a)}return r}(u.query,i.query,r&&r.options.parseQuery),h=i.hash||u.hash;return h&&"#"!==h.charAt(0)&&(h="#"+h),{_normalized:!0,path:d,query:v,hash:h}}var z,K=function(){},J={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,i=n.resolve(this.to,r,this.append),a=i.location,s=i.route,c=i.href,u={},l=n.options.linkActiveClass,f=n.options.linkExactActiveClass,p=null==l?"router-link-active":l,h=null==f?"router-link-exact-active":f,m=null==this.activeClass?p:this.activeClass,y=null==this.exactActiveClass?h:this.exactActiveClass,g=s.redirectedFrom?v(null,q(s.redirectedFrom),null,n):s;u[y]=_(r,g,this.exactPath),u[m]=this.exact||this.exactPath?u[y]:function(t,e){return 0===t.path.replace(d,"/").indexOf(e.path.replace(d,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,g);var b=u[y]?this.ariaCurrentValue:null,w=function(t){W(t)&&(e.replace?n.replace(a,K):n.push(a,K))},x={click:W};Array.isArray(this.event)?this.event.forEach((function(t){x[t]=w})):x[this.event]=w;var $={class:u},C=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:c,route:s,navigate:w,isActive:u[m],isExactActive:u[y]});if(C){if(1===C.length)return C[0];if(C.length>1||!C.length)return 0===C.length?t():t("span",{},C)}if("a"===this.tag)$.on=x,$.attrs={href:c,"aria-current":b};else{var k=function t(e){var n;if(e)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=V(l.path,s.params),c(l,s,a)}if(s.path){s.params={};for(var d=0;d=t.length?n():t[o]?e(t[o],(function(){r(o+1)})):r(o+1)};r(0)}var bt={redirected:2,aborted:4,cancelled:8,duplicated:16};function wt(t,e){return $t(t,e,bt.redirected,'Redirected when going from "'+t.fullPath+'" to "'+function(t){if("string"==typeof t)return t;if("path"in t)return t.path;var e={};return Ct.forEach((function(n){n in t&&(e[n]=t[n])})),JSON.stringify(e,null,2)}(e)+'" via a navigation guard.')}function xt(t,e){return $t(t,e,bt.cancelled,'Navigation cancelled from "'+t.fullPath+'" to "'+e.fullPath+'" with a new navigation.')}function $t(t,e,n,r){var o=new Error(r);return o._isRouter=!0,o.from=t,o.to=e,o.type=n,o}var Ct=["params","query","hash"];function kt(t){return Object.prototype.toString.call(t).indexOf("Error")>-1}function At(t,e){return kt(t)&&t._isRouter&&(null==e||t.type===e)}function St(t){return function(e,n,r){var o=!1,i=0,a=null;Ot(t,(function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){o=!0,i++;var c,u=Et((function(e){var o;((o=e).__esModule||jt&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:z.extend(e),n.components[s]=e,--i<=0&&r()})),l=Et((function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=kt(t)?t:new Error(e),r(a))}));try{c=t(u,l)}catch(t){l(t)}if(c)if("function"==typeof c.then)c.then(u,l);else{var f=c.component;f&&"function"==typeof f.then&&f.then(u,l)}}})),o||r()}}function Ot(t,e){return Tt(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function Tt(t){return Array.prototype.concat.apply([],t)}var jt="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Et(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Mt=function(t,e){this.router=t,this.base=function(t){if(!t)if(G){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=m,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Rt(t,e,n,r){var o=Ot(t,(function(t,r,o,i){var a=function(t,e){"function"!=typeof t&&(t=z.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,r,o,i)})):n(a,r,o,i)}));return Tt(r?o.reverse():o)}function Lt(t,e){if(e)return function(){return t.apply(e,arguments)}}Mt.prototype.listen=function(t){this.cb=t},Mt.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Mt.prototype.onError=function(t){this.errorCbs.push(t)},Mt.prototype.transitionTo=function(t,e,n){var r,o=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),e&&e(r),o.ensureURL(),o.router.afterHooks.forEach((function(t){t&&t(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(t){t(r)})))}),(function(t){n&&n(t),t&&!o.ready&&(At(t,bt.redirected)&&i===m||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(t)}))))}))},Mt.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current;this.pending=t;var i,a,s=function(t){!At(t)&&kt(t)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},c=t.matched.length-1,u=o.matched.length-1;if(_(t,o)&&c===u&&t.matched[c]===o.matched[u])return this.ensureURL(),s(((a=$t(i=o,t,bt.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var l=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=mt&&n;r&&this.listeners.push(at());var o=function(){var n=t.current,o=Nt(t.base);t.current===m&&o===t._startLocation||t.transitionTo(o,(function(t){r&&st(e,t,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){yt(k(r.base+t.fullPath)),st(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){gt(k(r.base+t.fullPath)),st(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(Nt(this.base)!==this.current.fullPath){var e=k(this.base+this.current.fullPath);t?yt(e):gt(e)}},e.prototype.getCurrentLocation=function(){return Nt(this.base)},e}(Mt);function Nt(t){var e=window.location.pathname;return t&&0===e.toLowerCase().indexOf(t.toLowerCase())&&(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Pt=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=Nt(t);if(!/^\/#/.test(e))return window.location.replace(k(t+"/#"+e)),!0}(this.base)||Dt()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=mt&&e;n&&this.listeners.push(at());var r=function(){var e=t.current;Dt()&&t.transitionTo(Ft(),(function(r){n&&st(t.router,r,e,!0),mt||Ht(r.fullPath)}))},o=mt?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ut(t.fullPath),st(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ht(t.fullPath),st(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Ft()!==e&&(t?Ut(e):Ht(e))},e.prototype.getCurrentLocation=function(){return Ft()},e}(Mt);function Dt(){var t=Ft();return"/"===t.charAt(0)||(Ht("/"+t),!1)}function Ft(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Bt(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Ut(t){mt?yt(Bt(t)):window.location.hash=t}function Ht(t){mt?gt(Bt(t)):window.location.replace(Bt(t))}var Vt=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,t)}))}),(function(t){At(t,bt.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Mt),qt=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Y(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!mt&&!1!==t.fallback,this.fallback&&(e="hash"),G||(e="abstract"),this.mode=e,e){case"history":this.history=new It(this,t.base);break;case"hash":this.history=new Pt(this,t.base,this.fallback);break;case"abstract":this.history=new Vt(this,t.base);break;default:0}},zt={currentRoute:{configurable:!0}};function Kt(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}qt.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},zt.currentRoute.get=function(){return this.history&&this.history.current},qt.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof It||n instanceof Pt){var r=function(t){n.setupListeners(),function(t){var r=n.current,o=e.options.scrollBehavior;mt&&o&&"fullPath"in t&&st(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},qt.prototype.beforeEach=function(t){return Kt(this.beforeHooks,t)},qt.prototype.beforeResolve=function(t){return Kt(this.resolveHooks,t)},qt.prototype.afterEach=function(t){return Kt(this.afterHooks,t)},qt.prototype.onReady=function(t,e){this.history.onReady(t,e)},qt.prototype.onError=function(t){this.history.onError(t)},qt.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.push(t,e,n)}));this.history.push(t,e,n)},qt.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.replace(t,e,n)}));this.history.replace(t,e,n)},qt.prototype.go=function(t){this.history.go(t)},qt.prototype.back=function(){this.go(-1)},qt.prototype.forward=function(){this.go(1)},qt.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},qt.prototype.resolve=function(t,e,n){var r=q(t,e=e||this.history.current,n,this),o=this.match(r,e),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?k(t+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},qt.prototype.getRoutes=function(){return this.matcher.getRoutes()},qt.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},qt.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(qt.prototype,zt),qt.install=function t(e){if(!t.installed||z!==e){t.installed=!0,z=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",x),e.component("RouterLink",J);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},qt.version="3.5.1",qt.isNavigationFailure=At,qt.NavigationFailureType=bt,qt.START_LOCATION=m,G&&window.Vue&&window.Vue.use(qt);var Jt=qt,Wt=function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"min-h-screen bg-gray-100 px-4 pt-6"},[e("router-view")],1)};Wt._withStripped=!0;n(4);function Gt(t,e,n,r,o,i,a,s){var c,u="function"==typeof t?t.options:t;if(e&&(u.render=e,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(c=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),o&&o.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},u._ssrRegister=c):o&&(c=s?function(){o.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:o),c)if(u.functional){u._injectStyles=c;var l=u.render;u.render=function(t,e){return c.call(e),l(t,e)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,c):[c]}return{exports:t,options:u}}var Xt=Gt({},Wt,[],!1,null,null,null);Xt.options.__file="node_modules/hardhat-docgen/src/App.vue";var Zt=Xt.exports,Yt=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("HeaderBar"),t._v(" "),n("div",{staticClass:"pb-32"},[n("div",{staticClass:"space-y-4"},[n("span",{staticClass:"text-lg"},[t._v("\n "+t._s(t.json.source)+"\n ")]),t._v(" "),n("h1",{staticClass:"text-xl"},[t._v("\n "+t._s(t.json.name)+"\n ")]),t._v(" "),n("h2",{staticClass:"text-lg"},[t._v("\n "+t._s(t.json.title)+"\n ")]),t._v(" "),n("h2",{staticClass:"text-lg"},[t._v("\n "+t._s(t.json.author)+"\n ")]),t._v(" "),n("p",[t._v(t._s(t.json.notice))]),t._v(" "),n("p",[t._v(t._s(t.json.details))])]),t._v(" "),n("div",{staticClass:"mt-8"},[t.json.hasOwnProperty("constructor")?n("Member",{attrs:{json:t.json.constructor}}):t._e()],1),t._v(" "),n("div",{staticClass:"mt-8"},[t.json.receive?n("Member",{attrs:{json:t.json.receive}}):t._e()],1),t._v(" "),n("div",{staticClass:"mt-8"},[t.json.fallback?n("Member",{attrs:{json:t.json.fallback}}):t._e()],1),t._v(" "),t.json.events?n("MemberSet",{attrs:{title:"Events",json:t.json.events}}):t._e(),t._v(" "),t.json.stateVariables?n("MemberSet",{attrs:{title:"State Variables",json:t.json.stateVariables}}):t._e(),t._v(" "),t.json.methods?n("MemberSet",{attrs:{title:"Methods",json:t.json.methods}}):t._e()],1),t._v(" "),n("FooterBar")],1)};Yt._withStripped=!0;var Qt=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"bg-gray-100 fixed bottom-0 right-0 w-full border-t border-dashed border-gray-300"},[n("div",{staticClass:"w-full text-center py-2 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("button",{staticClass:"py-1 px-2 text-gray-500",on:{click:function(e){return t.openLink(t.repository)}}},[t._v("\n built with "+t._s(t.name)+"\n ")])])])};Qt._withStripped=!0;var te=n(2),ee=Gt({data:function(){return{repository:te.b,name:te.a}},methods:{openLink(t){window.open(t,"_blank")}}},Qt,[],!1,null,null,null);ee.options.__file="node_modules/hardhat-docgen/src/components/FooterBar.vue";var ne=ee.exports,re=function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"w-full border-b border-dashed py-2 border-gray-300"},[e("router-link",{staticClass:"py-2 text-gray-500",attrs:{to:"/"}},[this._v("\n <- Go back\n ")])],1)};re._withStripped=!0;var oe=Gt({},re,[],!1,null,null,null);oe.options.__file="node_modules/hardhat-docgen/src/components/HeaderBar.vue";var ie=oe.exports,ae=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"border-2 border-gray-400 border-dashed w-full p-2"},[n("h3",{staticClass:"text-lg pb-2 mb-2 border-b-2 border-gray-400 border-dashed"},[t._v("\n "+t._s(t.name)+" "+t._s(t.keywords)+" "+t._s(t.inputSignature)+"\n ")]),t._v(" "),n("div",{staticClass:"space-y-3"},[n("p",[t._v(t._s(t.json.notice))]),t._v(" "),n("p",[t._v(t._s(t.json.details))]),t._v(" "),n("MemberSection",{attrs:{name:"Parameters",items:t.inputs}}),t._v(" "),n("MemberSection",{attrs:{name:"Return Values",items:t.outputs}})],1)])};ae._withStripped=!0;var se=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.items.length>0?n("ul",[n("h4",{staticClass:"text-lg"},[t._v("\n "+t._s(t.name)+"\n ")]),t._v(" "),t._l(t.items,(function(e,r){return n("li",{key:r},[n("span",{staticClass:"bg-gray-300"},[t._v(t._s(e.type))]),t._v(" "),n("b",[t._v(t._s(e.name||"_"+r))]),e.desc?n("span",[t._v(": "),n("i",[t._v(t._s(e.desc))])]):t._e()])}))],2):t._e()};se._withStripped=!0;var ce=Gt({props:{name:{type:String,default:""},items:{type:Array,default:()=>new Array}}},se,[],!1,null,null,null);ce.options.__file="node_modules/hardhat-docgen/src/components/MemberSection.vue";var ue=Gt({components:{MemberSection:ce.exports},props:{json:{type:Object,default:()=>new Object}},computed:{name:function(){return this.json.name||this.json.type},keywords:function(){let t=[];return this.json.stateMutability&&t.push(this.json.stateMutability),"true"===this.json.anonymous&&t.push("anonymous"),t.join(" ")},params:function(){return this.json.params||{}},returns:function(){return this.json.returns||{}},inputs:function(){return(this.json.inputs||[]).map(t=>({...t,desc:this.params[t.name]}))},inputSignature:function(){return`(${this.inputs.map(t=>t.type).join(",")})`},outputs:function(){return(this.json.outputs||[]).map((t,e)=>({...t,desc:this.returns[t.name||"_"+e]}))},outputSignature:function(){return`(${this.outputs.map(t=>t.type).join(",")})`}}},ae,[],!1,null,null,null);ue.options.__file="node_modules/hardhat-docgen/src/components/Member.vue";var le=ue.exports,fe=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"w-full mt-8"},[n("h2",{staticClass:"text-lg"},[t._v(t._s(t.title))]),t._v(" "),t._l(Object.keys(t.json),(function(e){return n("Member",{key:e,staticClass:"mt-3",attrs:{json:t.json[e]}})}))],2)};fe._withStripped=!0;var pe=Gt({components:{Member:le},props:{title:{type:String,default:""},json:{type:Object,default:()=>new Object}}},fe,[],!1,null,null,null);pe.options.__file="node_modules/hardhat-docgen/src/components/MemberSet.vue";var de=Gt({components:{Member:le,MemberSet:pe.exports,HeaderBar:ie,FooterBar:ne},props:{json:{type:Object,default:()=>new Object}}},Yt,[],!1,null,null,null);de.options.__file="node_modules/hardhat-docgen/src/components/Contract.vue";var ve=de.exports,he=function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto pb-32"},[e("Branch",{attrs:{json:this.trees,name:"Sources:"}}),this._v(" "),e("FooterBar",{staticClass:"mt-20"})],1)};he._withStripped=!0;var me=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._v("\n "+t._s(t.name)+"\n "),Array.isArray(t.json)?n("div",{staticClass:"pl-5"},t._l(t.json,(function(e,r){return n("div",{key:r},[n("router-link",{attrs:{to:e.source+":"+e.name}},[t._v("\n "+t._s(e.name)+"\n ")])],1)})),0):n("div",{staticClass:"pl-5"},t._l(Object.keys(t.json),(function(e){return n("div",{key:e},[n("Branch",{attrs:{json:t.json[e],name:e}})],1)})),0)])};me._withStripped=!0;var ye=Gt({name:"Branch",props:{name:{type:String,default:null},json:{type:[Object,Array],default:()=>new Object}}},me,[],!1,null,null,null);ye.options.__file="node_modules/hardhat-docgen/src/components/Branch.vue";var ge=Gt({components:{Branch:ye.exports,FooterBar:ne},props:{json:{type:Object,default:()=>new Object}},computed:{trees:function(){let t={};for(let e in this.json)e.split(/(?<=\/)/).reduce(function(t,n){if(!n.includes(":"))return t[n]=t[n]||{},t[n];{let[r]=n.split(":");t[r]=t[r]||[],t[r].push(this.json[e])}}.bind(this),t);return t}}},he,[],!1,null,null,null);ge.options.__file="node_modules/hardhat-docgen/src/components/Index.vue";var _e=ge.exports;r.a.use(Jt);const be={},we=new Jt({routes:[{path:"/",component:_e,props:()=>({json:be})},{path:"*",component:ve,props:t=>({json:be[t.path.slice(1)]})}]});new r.a({el:"#app",router:we,mounted(){document.dispatchEvent(new Event("render-event"))},render:t=>t(Zt)})},function(t,e,n){"use strict";function r(t,e){for(var n=[],r={},o=0;on.parts.length&&(r.parts.length=n.parts.length)}else{var a=[];for(o=0;o Date: Tue, 15 Jun 2021 17:50:34 +0530 Subject: [PATCH 029/112] CI Updated --- .github/workflows/node.js.yml | 4 ++-- .travis.yml | 21 +++++++++++++++++++++ package.json | 2 +- 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 .travis.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index ead49c0..8d36afa 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -24,5 +24,5 @@ jobs: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm run lint - - run: npm run coverage - - run: cat coverage/lcov.info | coveralls + - run: npm run prettier-check + - run: npm run test diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..b6eafdf --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +language: node_js +os: linux +dist: xenial +node_js: + - "10" + +cache: + directories: + - node_modules + +before_install: + - export NODE_OPTIONS=--max_old_space_size=6144 + +install: + - npm ci + +script: + - npm run coverage + +after_script: + - cat coverage/lcov.info | coveralls \ No newline at end of file diff --git a/package.json b/package.json index 0d67acf..f0bda84 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ }, "husky": { "hooks": { - "pre-commit": "yarn doc && yarn prettier && yarn lint", + "pre-commit": "yarn prettier && yarn lint", "pre-push": "yarn test" } }, From 0063477c9b63d5b271cfedbb4cb335502dce35a9 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 15 Jun 2021 17:57:04 +0530 Subject: [PATCH 030/112] Badge added to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 85224a5..7a8a6f1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Origins +# Origins [![Node.js CI](https://github.com/DistributedCollective/origins/actions/workflows/node.js.yml/badge.svg)](https://github.com/DistributedCollective/origins/actions/workflows/node.js.yml) [![Build Status](https://travis-ci.org/DistributedCollective/origins.svg?branch=main)](https://travis-ci.org/DistributedCollective/origins) [![Coverage Status](https://coveralls.io/repos/github/DistributedCollective/origins/badge.svg?branch=initial)](https://coveralls.io/github/DistributedCollective/origins?branch=initial) The Origins Platform Smart Contracts From c8d2446bb0ef3becc727e53e17d73316286af533 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 16 Jun 2021 14:27:07 +0530 Subject: [PATCH 031/112] Enum parameters updated --- contracts/OriginsAdmin.sol | 2 +- contracts/OriginsBase.sol | 56 +++++++++++++++++++----------------- contracts/OriginsEvents.sol | 16 +++++------ contracts/OriginsStorage.sol | 3 +- 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/contracts/OriginsAdmin.sol b/contracts/OriginsAdmin.sol index 6a6d7b8..232ad12 100644 --- a/contracts/OriginsAdmin.sol +++ b/contracts/OriginsAdmin.sol @@ -81,7 +81,7 @@ contract OriginsAdmin { require(!isOwner[_owners[index]], "OriginsAdmin: Each owner can be added only once."); isOwner[_owners[index]] = true; owners.push(_owners[index]); - emit OwnerAdded(msg.sender, msg.sender); + emit OwnerAdded(msg.sender, _owners[index]); } } diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index ce34c60..f3a2512 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -1,6 +1,8 @@ pragma solidity ^0.5.17; +import "./OriginsAdmin.sol"; import "./OriginsEvents.sol"; +import "./OriginsStorage.sol"; import "./Interfaces/IOrigins.sol"; /** @@ -8,7 +10,7 @@ import "./Interfaces/IOrigins.sol"; * @author Franklin Richards - powerhousefrank@protonmail.com * @notice You can use this contract for creating a sale in the Origins Platform. */ -contract OriginsBase is IOrigins, OriginsEvents { +contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { /* Functions */ /** @@ -69,10 +71,10 @@ contract OriginsBase is IOrigins, OriginsEvents { uint256 _vestOrLockDuration, uint256 _depositRate, address _depositToken, - DepositType _depositType, - VerificationType _verificationType, - SaleEndDurationOrTS _saleEndDurationOrTS, - TransferType _transferType + uint256 _depositType, + uint256 _verificationType, + uint256 _saleEndDurationOrTS, + uint256 _transferType ) external onlyOwner returns (uint256 _tierID) { /// @notice `tierCount` should always start at 1, because else default value zero will result in verification process. tierCount++; @@ -108,7 +110,7 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _tierID The Tier ID which is being updated. * @param _verificationType The type of verification for the particular sale. */ - function setTierVerification(uint256 _tierID, VerificationType _verificationType) external onlyOwner { + function setTierVerification(uint256 _tierID, uint256 _verificationType) external onlyOwner { _setTierVerification(_tierID, _verificationType); } @@ -123,7 +125,7 @@ contract OriginsBase is IOrigins, OriginsEvents { uint256 _tierID, uint256 _depositRate, address _depositToken, - DepositType _depositType + uint256 _depositType ) external onlyOwner { _setTierDeposit(_tierID, _depositRate, _depositToken, _depositType); } @@ -166,7 +168,7 @@ contract OriginsBase is IOrigins, OriginsEvents { uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, - TransferType _transferType + uint256 _transferType ) external onlyOwner { _setTierVestOrLock(_tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedTokenWithdrawTS, _unlockedBP, _transferType); } @@ -182,7 +184,7 @@ contract OriginsBase is IOrigins, OriginsEvents { uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, - SaleEndDurationOrTS _saleEndDurationOrTS + uint256 _saleEndDurationOrTS ) external onlyOwner { _setTierTime(_tierID, _saleStartTS, _saleEnd, _saleEndDurationOrTS); } @@ -279,8 +281,8 @@ contract OriginsBase is IOrigins, OriginsEvents { * @param _tierID The Tier ID which is being updated. * @param _verificationType The type of verification for the particular sale. */ - function _setTierVerification(uint256 _tierID, VerificationType _verificationType) internal { - tiers[_tierID].verificationType = _verificationType; + function _setTierVerification(uint256 _tierID, uint256 _verificationType) internal { + tiers[_tierID].verificationType = VerificationType(_verificationType); emit TierVerificationUpdated(msg.sender, _tierID, _verificationType); } @@ -296,16 +298,16 @@ contract OriginsBase is IOrigins, OriginsEvents { uint256 _tierID, uint256 _depositRate, address _depositToken, - DepositType _depositType + uint256 _depositType ) internal { require(_depositRate > 0, "OriginsBase: Deposit Rate cannot be zero."); - if (_depositType == DepositType.Token) { + if (DepositType(_depositType) == DepositType.Token) { require(_depositToken != address(0), "OriginsBase: Deposit Token Address cannot be zero."); } tiers[_tierID].depositRate = _depositRate; tiers[_tierID].depositToken = IERC20(_depositToken); - tiers[_tierID].depositType = _depositType; + tiers[_tierID].depositType = DepositType(_depositType); emit TierDepositUpdated(msg.sender, _tierID, _depositRate, _depositToken, _depositType); } @@ -385,7 +387,7 @@ contract OriginsBase is IOrigins, OriginsEvents { uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, - TransferType _transferType + uint256 _transferType ) internal { /// @notice The below is mainly for TransferType of Vested and Locked, but should not hinder for other types as well. require(_vestOrLockCliff <= _vestOrLockDuration, "OriginsBase: Cliff has to be <= duration."); @@ -396,7 +398,7 @@ contract OriginsBase is IOrigins, OriginsEvents { /// @notice Zero is also an accepted value, which means the unlock time is not yet decided. tiers[_tierID].unlockedTokenWithdrawTS = _unlockedTokenWithdrawTS; tiers[_tierID].unlockedBP = _unlockedBP; - tiers[_tierID].transferType = _transferType; + tiers[_tierID].transferType = TransferType(_transferType); emit TierVestOrLockUpdated( msg.sender, @@ -420,18 +422,18 @@ contract OriginsBase is IOrigins, OriginsEvents { uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, - SaleEndDurationOrTS _saleEndDurationOrTS + uint256 _saleEndDurationOrTS ) internal { - if (_saleStartTS != 0 && _saleEnd != 0 && _saleEndDurationOrTS == SaleEndDurationOrTS.Duration) { + if (_saleStartTS != 0 && _saleEnd != 0 && SaleEndDurationOrTS(_saleEndDurationOrTS) == SaleEndDurationOrTS.Duration) { require(_saleStartTS.add(_saleEnd) > block.timestamp, "OriginsBase: The sale end duration cannot be past already."); - } else if ((_saleStartTS != 0 || _saleEnd != 0) && _saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp) { + } else if ((_saleStartTS != 0 || _saleEnd != 0) && SaleEndDurationOrTS(_saleEndDurationOrTS) == SaleEndDurationOrTS.Timestamp) { require(_saleStartTS < _saleEnd, "OriginsBase: The sale start TS cannot be after sale end TS."); require(_saleEnd > block.timestamp, "OriginsBase: The sale end time cannot be past already."); } tiers[_tierID].saleStartTS = _saleStartTS; tiers[_tierID].saleEnd = _saleEnd; - tiers[_tierID].saleEndDurationOrTS = _saleEndDurationOrTS; + tiers[_tierID].saleEndDurationOrTS = SaleEndDurationOrTS(_saleEndDurationOrTS); emit TierTimeUpdated(msg.sender, _tierID, _saleStartTS, _saleEnd, _saleEndDurationOrTS); } @@ -642,10 +644,10 @@ contract OriginsBase is IOrigins, OriginsEvents { uint256 amount = tokensSoldPerTier[index].div(tiers[index].depositRate); if (tiers[index].depositType == DepositType.RBTC) { receiver.transfer(amount); - emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.RBTC, amount); + emit ProceedingWithdrawn(msg.sender, receiver, index, uint256(DepositType.RBTC), amount); } else { tiers[index].depositToken.transfer(receiver, amount); - emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.Token, amount); + emit ProceedingWithdrawn(msg.sender, receiver, index, uint256(DepositType.Token), amount); } } } @@ -745,14 +747,14 @@ contract OriginsBase is IOrigins, OriginsEvents { view returns ( address _depositToken, - DepositType _depositType, - VerificationType _verificationType, - SaleEndDurationOrTS _saleEndDurationOrTS, - TransferType _transferType + uint256 _depositType, + uint256 _verificationType, + uint256 _saleEndDurationOrTS, + uint256 _transferType ) { Tier memory tier = tiers[_tierID]; - return (address(tier.depositToken), tier.depositType, tier.verificationType, tier.saleEndDurationOrTS, tier.transferType); + return (address(tier.depositToken), uint256(tier.depositType), uint256(tier.verificationType), uint256(tier.saleEndDurationOrTS), uint256(tier.transferType)); } /** diff --git a/contracts/OriginsEvents.sol b/contracts/OriginsEvents.sol index bbb0b29..3f5caf1 100644 --- a/contracts/OriginsEvents.sol +++ b/contracts/OriginsEvents.sol @@ -1,13 +1,11 @@ pragma solidity ^0.5.17; -import "./OriginsStorage.sol"; - /** * @title A contract containing all the events of Origins Base. * @author Franklin Richards - powerhousefrank@protonmail.com * @notice You can use this contract for adding events into Origins Base. */ -contract OriginsEvents is OriginsStorage { +contract OriginsEvents { /* Events */ /** @@ -71,7 +69,7 @@ contract OriginsEvents is OriginsStorage { uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, - SaleEndDurationOrTS indexed _saleEndDurationOrTS + uint256 indexed _saleEndDurationOrTS ); /** @@ -91,7 +89,7 @@ contract OriginsEvents is OriginsStorage { uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, - TransferType indexed _transferType + uint256 _transferType ); /** @@ -106,8 +104,8 @@ contract OriginsEvents is OriginsStorage { address indexed _initiator, uint256 _tierID, uint256 _depositRate, - address _depositToken, - DepositType indexed _depositType + address indexed _depositToken, + uint256 _depositType ); /** @@ -116,7 +114,7 @@ contract OriginsEvents is OriginsStorage { * @param _tierID The Tier ID which is being updated. * @param _verificationType The type of verification for the particular sale. */ - event TierVerificationUpdated(address indexed _initiator, uint256 _tierID, VerificationType _verificationType); + event TierVerificationUpdated(address indexed _initiator, uint256 _tierID, uint256 _verificationType); /** * @notice Emitted when the Tier Sale Ends. @@ -160,7 +158,7 @@ contract OriginsEvents is OriginsStorage { address indexed _initiator, address indexed _receiver, uint256 _tierID, - DepositType _depositType, + uint256 _depositType, uint256 _amount ); } diff --git a/contracts/OriginsStorage.sol b/contracts/OriginsStorage.sol index 7c79437..fff512a 100644 --- a/contracts/OriginsStorage.sol +++ b/contracts/OriginsStorage.sol @@ -1,6 +1,5 @@ pragma solidity ^0.5.17; -import "./OriginsAdmin.sol"; import "./Interfaces/IERC20.sol"; import "./Openzeppelin/SafeMath.sol"; import "./Interfaces/ILockedFund.sol"; @@ -10,7 +9,7 @@ import "./Interfaces/ILockedFund.sol"; * @author Franklin Richards - powerhousefrank@protonmail.com * @notice This plays as the harddisk for the Origins Platform. */ -contract OriginsStorage is OriginsAdmin { +contract OriginsStorage { using SafeMath for uint256; /* Storage */ From 215f12c7504c336b5c8ffd9460a57d0d35d815a9 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 16 Jun 2021 14:27:22 +0530 Subject: [PATCH 032/112] IOrigins Updated --- contracts/Interfaces/IOrigins.sol | 285 +++++++++++++++++++++++++++++- 1 file changed, 283 insertions(+), 2 deletions(-) diff --git a/contracts/Interfaces/IOrigins.sol b/contracts/Interfaces/IOrigins.sol index fd53117..3c9247d 100644 --- a/contracts/Interfaces/IOrigins.sol +++ b/contracts/Interfaces/IOrigins.sol @@ -5,5 +5,286 @@ pragma solidity ^0.5.17; * @author Franklin Richards - powerhousefrank@protonmail.com */ contract IOrigins { - /// TODO -} + + /* Functions */ + + /* Public & External Functions */ + + /** + * @notice Function to set the deposit address. + * @param _depositAddress The address of deposit address where all the raised fund will go. + * @dev If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party. + */ + function setDepositAddress(address payable _depositAddress) external; + + /** + * @notice Function to set the Locked Fund Contract Address. + * @param _lockedFund The address of new the Vesting registry. + */ + function setLockedFund(address _lockedFund) external; + + /** + * @notice Function to create a new tier. + * @param _remainingTokens Contains the remaining tokens for sale. + * @param _saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * @param _saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * @param _unlockedTokenWithdrawTS Contains the timestamp for the waited unlocked tokens to be withdrawn. + * @param _unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock. + * @param _vestOrLockCliff Contains the cliff of the vesting/lock for distribution. + * @param _vestOrLockDuration Contains the duration of the vesting/lock for distribution. + * @param _depositRate Contains the rate of the token w.r.t. the depositing asset. + * @param _depositToken Contains the deposit token address if the deposit type is Token. + * @param _verificationType Contains the method by which verification happens. + * @param _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. + * @param _transferType Contains the type of token transfer after a user buys to get the tokens. + * @return _tierID The newly created tier ID. + * @dev In the future this should be decoupled. + */ + function createTier( + uint256 _remainingTokens, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _unlockedTokenWithdrawTS, + uint256 _unlockedBP, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _depositRate, + address _depositToken, + uint256 _depositType, + uint256 _verificationType, + uint256 _saleEndDurationOrTS, + uint256 _transferType + ) external returns (uint256 _tierID); + + /** + * @notice Function to set the Tier Verification Method. + * @param _tierID The Tier ID which is being updated. + * @param _verificationType The type of verification for the particular sale. + */ + function setTierVerification(uint256 _tierID, uint256 _verificationType) external; + + /** + * @notice Function to set the Tier Deposit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _depositRate The rate is the, asset * rate = token. + * @param _depositToken The token for that particular Tier Sale. + * @param _depositType The type of deposit for the particular sale. + */ + function setTierDeposit( + uint256 _tierID, + uint256 _depositRate, + address _depositToken, + uint256 _depositType + ) external; + + /** + * @notice Function to set the Tier Token Limit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _minAmount The minimum asset amount required to participate in that tier. + * @param _maxAmount The maximum asset amount allowed to participate in that tier. + */ + function setTierTokenLimit( + uint256 _tierID, + uint256 _minAmount, + uint256 _maxAmount + ) external; + + /** + * @notice Function to set the Tier Token Amount Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _remainingTokens The maximum number of tokens allowed to be sold in the tier. + */ + function setTierTokenAmount(uint256 _tierID, uint256 _remainingTokens) external; + + /** + * @notice Function to set the Tier Vest/Lock Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _vestOrLockCliff The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff. + * @param _vestOrLockDuration The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration. + * @param _unlockedTokenWithdrawTS The unlocked token withdraw timestamp. + * @param _unlockedBP The unlocked token amount in BP. + * @param _transferType The Tier Transfer Type for the Tier. + */ + function setTierVestOrLock( + uint256 _tierID, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _unlockedTokenWithdrawTS, + uint256 _unlockedBP, + uint256 _transferType + ) external; + + /** + * @notice Function to set the Tier Time Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _saleStartTS The Tier Sale Start Timestamp. + * @param _saleEnd The Tier Sale End Duration or Timestamp. + * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. + */ + function setTierTime( + uint256 _tierID, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _saleEndDurationOrTS + ) external; + + /** + * @notice Function to verify a single address with a single tier. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tier for which the address has to be verified. + */ + function addressVerification(address _addressToBeVerified, uint256 _tierID) external; + + /** + * @notice Function to verify a single address with multiple tiers. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tiers for which the address has to be verified. + */ + function singleAddressMultipleTierVerification(address _addressToBeVerified, uint256[] calldata _tierID) external; + + /** + * @notice Function to verify multiple address with a single tier. + * @param _addressToBeVerified The addresses which has to be veriried for the sale. + * @param _tierID The tier for which the addresses has to be verified. + */ + function multipleAddressSingleTierVerification(address[] calldata _addressToBeVerified, uint256 _tierID) external; + + /** + * @notice Function to verify multiple address with multiple tiers. + * @param _addressToBeVerified The addresses which has to be veriried for the sale. + * @param _tierID The tiers for which the addresses has to be verified. + */ + function multipleAddressAndTierVerification(address[] calldata _addressToBeVerified, uint256[] calldata _tierID) external; + + /** + * @notice Function to buy tokens from sale based on tier. + * @param _tierID The Tier ID from which the token has to be bought. + * @param _amount The amount of token (deposit asset) which will be sent for purchasing. + * @dev If deposit type if RBTC, then _amount can be passed as zero. + */ + function buy(uint256 _tierID, uint256 _amount) public payable; + + /** + * @notice The function used by the admin or deposit address to withdraw the sale proceedings. + * @dev In the future this could be made to be accessible only to seller, rather than owner. + */ + function withdrawSaleDeposit() external; + + /* Getter Functions */ + + /** + * @notice Function to read the tier count. + * @return The number of tiers present in the contract. + */ + function getTierCount() public view returns (uint256); + + /** + * @notice Function to read the deposit address. + * @return The address of the deposit address. + * @dev If zero is returned, any of the owners can withdraw the raised funds. + */ + function getDepositAddress() public view returns (address); + + /** + * @notice Function to read the token on sale. + * @return The Token contract address which is being sold in the contract. + */ + function getToken() public view returns (address); + + /** + * @notice Function to read the locked fund contract address. + * @return Address of Locked Fund Contract. + */ + function getLockDetails() public view returns (address); + + /** + * @notice Function to read a Tier parameter. + * @param _tierID The Tier whose info is to be read. + * @return _minAmount The minimum amount which can be deposited. + * @return _maxAmount The maximum amount which can be deposited. + * @return _remainingTokens Contains the remaining tokens for sale. + * @return _saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * @return _saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * @return _unlockedTokenWithdrawTS Contains the timestamp for the waited unlocked tokens to be withdrawn. + * @return _unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock. + * @return _vestOrLockCliff Contains the cliff of the vesting/lock for distribution. + * @return _vestOrLockDuration Contains the duration of the vesting/lock for distribution. + * @return _depositRate Contains the rate of the token w.r.t. the depositing asset. + */ + function readTierPartA(uint256 _tierID) + public + view + returns ( + uint256 _minAmount, + uint256 _maxAmount, + uint256 _remainingTokens, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _unlockedTokenWithdrawTS, + uint256 _unlockedBP, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _depositRate + ); + + /** + * @notice Function to read a Tier parameter. + * @param _tierID The Tier whose info is to be read. + * @return _depositToken Contains the deposit token address if the deposit type is Token. + * @return _depositType The type of deposit for the particular sale. + * @return _verificationType Contains the method by which verification happens. + * @return _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. + * @return _transferType Contains the type of token transfer after a user buys to get the tokens. + */ + function readTierPartB(uint256 _tierID) + public + view + returns ( + address _depositToken, + uint256 _depositType, + uint256 _verificationType, + uint256 _saleEndDurationOrTS, + uint256 _transferType + ); + + /** + * @notice Function to read tokens bought by an address on a particular tier. + * @param _addr The address which has to be checked. + * @param _tierID The tier ID for which the address has to be checked. + * @return The amount of tokens bought by the address. + */ + function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) public view returns (uint256); + + /** + * @notice Function to read participating wallet count per tier. + * @param _tierID The tier ID for which the count has to be checked. + * @return The number of wallets who participated in that Tier. + * @dev Total participation of wallets cannot be determined by this. + * A user can participate on one round and not on other. + * In the future maybe a count on that can be created. + */ + function getParticipatingWalletCountPerTier(uint256 _tierID) public view returns (uint256); + + /** + * @notice Function to read tokens sold per tier. + * @param _tierID The tier ID for which the sold metrics has to be checked. + * @return The amount of tokens sold on that tier. + */ + function getTokensSoldPerTier(uint256 _tierID) public view returns (uint256); + + /** + * @notice Function to check if a tier sale ended or not. + * @param _tierID The Tier whose info is to be read. + * @return True is sale ended, False otherwise. + * @dev A return of false does not necessary mean the sale is active. It can also be in inactive state. + */ + function checkSaleEnded(uint256 _tierID) public view returns (bool _status); + + /** + * @notice Function to read address which are approved for sale in a tier. + * @param _addr The address which has to be checked. + * @param _tierID The tier ID for which the address has to be checked. + * @return True is allowed, False otherwise. + */ + function isAddressApproved(address _addr, uint256 _tierID) public view returns (bool); +} \ No newline at end of file From a183a81a9c6e1895ab653958fe20f9cece0f070c Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 16 Jun 2021 14:27:53 +0530 Subject: [PATCH 033/112] ERC20Detailed now uses ERC20 rather than IERC20_ --- contracts/Openzeppelin/ERC20Detailed.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/Openzeppelin/ERC20Detailed.sol b/contracts/Openzeppelin/ERC20Detailed.sol index 0afdbc5..096ef18 100644 --- a/contracts/Openzeppelin/ERC20Detailed.sol +++ b/contracts/Openzeppelin/ERC20Detailed.sol @@ -1,11 +1,11 @@ pragma solidity ^0.5.0; -import "./IERC20_.sol"; +import "./ERC20.sol"; /** * @dev Optional functions from the ERC20 standard. */ -contract ERC20Detailed is IERC20_ { +contract ERC20Detailed is ERC20 { string private _name; string private _symbol; uint8 private _decimals; From 3b4ca304f078ec43e6a55a4e4e965cbd9f543687 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 16 Jun 2021 14:32:18 +0530 Subject: [PATCH 034/112] package.json updated --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f0bda84..04ffc70 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "husky": { "hooks": { "pre-commit": "yarn prettier && yarn lint", - "pre-push": "yarn test" + "pre-push": "yarn prettier-check && yarn test" } }, "dependencies": { From 33c9b1ee3f25bca0ca1fd0c791b89bdb69d8027e Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 16 Jun 2021 14:32:51 +0530 Subject: [PATCH 035/112] Formatted OriginsBase and IOrigins --- contracts/Interfaces/IOrigins.sol | 3 +-- contracts/OriginsBase.sol | 8 +++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/contracts/Interfaces/IOrigins.sol b/contracts/Interfaces/IOrigins.sol index 3c9247d..80772e1 100644 --- a/contracts/Interfaces/IOrigins.sol +++ b/contracts/Interfaces/IOrigins.sol @@ -5,7 +5,6 @@ pragma solidity ^0.5.17; * @author Franklin Richards - powerhousefrank@protonmail.com */ contract IOrigins { - /* Functions */ /* Public & External Functions */ @@ -287,4 +286,4 @@ contract IOrigins { * @return True is allowed, False otherwise. */ function isAddressApproved(address _addr, uint256 _tierID) public view returns (bool); -} \ No newline at end of file +} diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index f3a2512..a2f11bc 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -754,7 +754,13 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { ) { Tier memory tier = tiers[_tierID]; - return (address(tier.depositToken), uint256(tier.depositType), uint256(tier.verificationType), uint256(tier.saleEndDurationOrTS), uint256(tier.transferType)); + return ( + address(tier.depositToken), + uint256(tier.depositType), + uint256(tier.verificationType), + uint256(tier.saleEndDurationOrTS), + uint256(tier.transferType) + ); } /** From c3aa7478d7b9619c6e04bd86837cc738f3a5edef Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 17 Jun 2021 16:06:16 +0530 Subject: [PATCH 036/112] Setting token address added to constructor --- contracts/OriginsBase.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index a2f11bc..0ae05a6 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -18,7 +18,11 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @param _owners The list of owners to be added to the list. * @param _depositAddress The address of deposit address where all the raised fund will go. (Optional) */ - constructor(address[] memory _owners, address payable _depositAddress) public OriginsAdmin(_owners) { + constructor(address[] memory _owners, address _token, address payable _depositAddress) public OriginsAdmin(_owners) { + require(_token != address(0), "Token Address cannot be zero."); + + token = IERC20(token); + if (_depositAddress != address(0)) { depositAddress = _depositAddress; emit DepositAddressUpdated(msg.sender, address(0), _depositAddress); From bf75384280ed8d4f386553a8beae21e71d7064b2 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 17 Jun 2021 16:07:03 +0530 Subject: [PATCH 037/112] Formatted OriginsBase --- contracts/OriginsBase.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index 0ae05a6..8af3fbe 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -18,7 +18,11 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @param _owners The list of owners to be added to the list. * @param _depositAddress The address of deposit address where all the raised fund will go. (Optional) */ - constructor(address[] memory _owners, address _token, address payable _depositAddress) public OriginsAdmin(_owners) { + constructor( + address[] memory _owners, + address _token, + address payable _depositAddress + ) public OriginsAdmin(_owners) { require(_token != address(0), "Token Address cannot be zero."); token = IERC20(token); From c1f0ba36647f3adbe457d3a013ecafd16858241b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:25:55 +0530 Subject: [PATCH 038/112] Updated brownie config file --- brownie-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brownie-config.yaml b/brownie-config.yaml index b2b79df..cc07a8f 100644 --- a/brownie-config.yaml +++ b/brownie-config.yaml @@ -29,7 +29,7 @@ networks: cmd_settings: port: 443 gas_limit: 6800000 - gas_price: 65000010 # 8000000000 + gas_price: 65100000 # 8000000000 reverting_tx_gas_limit: false default_contract_owner: false From 7177a2417e77dbded9a4c0cfb5f45da919f3bcfb Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:26:25 +0530 Subject: [PATCH 039/112] Locked Fund function visibiltiy updated --- contracts/LockedFund.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/LockedFund.sol b/contracts/LockedFund.sol index 2fad1d9..1f2b315 100644 --- a/contracts/LockedFund.sol +++ b/contracts/LockedFund.sol @@ -288,7 +288,7 @@ contract LockedFund is ILockedFund { * @param _adminToRemove The address of the admin which should be removed. * @dev Only callable by an Admin. */ - function _removeAdmin(address _adminToRemove) public onlyAdmin { + function _removeAdmin(address _adminToRemove) internal { require(isAdmin[_adminToRemove], "LockedFund: Address is not an admin."); isAdmin[_adminToRemove] = false; From d9f265f2a3e34e4f61d32500a90f74fa5bd2a262 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:26:51 +0530 Subject: [PATCH 040/112] Updated the OriginsBase constructor --- contracts/OriginsBase.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index 8af3fbe..996a88b 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -16,6 +16,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { /** * @notice Setup the required parameters. * @param _owners The list of owners to be added to the list. + * @param _token The token address. * @param _depositAddress The address of deposit address where all the raised fund will go. (Optional) */ constructor( @@ -25,7 +26,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { ) public OriginsAdmin(_owners) { require(_token != address(0), "Token Address cannot be zero."); - token = IERC20(token); + token = IERC20(_token); if (_depositAddress != address(0)) { depositAddress = _depositAddress; From 29c2cd577657f207a7eb566f325440cdbd2bd1cf Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:27:22 +0530 Subject: [PATCH 041/112] Deploy JSON removed --- scripts/values/deploy.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 scripts/values/deploy.json diff --git a/scripts/values/deploy.json b/scripts/values/deploy.json deleted file mode 100644 index f73b04a..0000000 --- a/scripts/values/deploy.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "DEPLOYMENT_PARAMETERS_HERE": "" -} \ No newline at end of file From be72089eccaf5f96195e7fd2bf7fc7af21c289e3 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:27:48 +0530 Subject: [PATCH 042/112] Multisig Wallet Contract Added --- contracts/Sovryn/MultiSigWallet.sol | 404 ++++++++++++++++++++++++++++ 1 file changed, 404 insertions(+) create mode 100644 contracts/Sovryn/MultiSigWallet.sol diff --git a/contracts/Sovryn/MultiSigWallet.sol b/contracts/Sovryn/MultiSigWallet.sol new file mode 100644 index 0000000..419e81e --- /dev/null +++ b/contracts/Sovryn/MultiSigWallet.sol @@ -0,0 +1,404 @@ +pragma solidity ^0.5.17; + +/** + * @title Multisignature wallet - Allows multiple parties to agree on + * transactions before execution. + * + * @author Stefan George - + * */ +contract MultiSigWallet { + /* + * Events + */ + event Confirmation(address indexed sender, uint256 indexed transactionId); + event Revocation(address indexed sender, uint256 indexed transactionId); + event Submission(uint256 indexed transactionId); + event Execution(uint256 indexed transactionId); + event ExecutionFailure(uint256 indexed transactionId); + event Deposit(address indexed sender, uint256 value); + event OwnerAddition(address indexed owner); + event OwnerRemoval(address indexed owner); + event RequirementChange(uint256 required); + + /* + * Constants + */ + uint256 public constant MAX_OWNER_COUNT = 50; + + /* + * Storage + */ + mapping(uint256 => Transaction) public transactions; + mapping(uint256 => mapping(address => bool)) public confirmations; + mapping(address => bool) public isOwner; + address[] public owners; + uint256 public required; + uint256 public transactionCount; + + struct Transaction { + address destination; + uint256 value; + bytes data; + bool executed; + } + + /* + * Modifiers + */ + modifier onlyWallet() { + require(msg.sender == address(this)); + _; + } + + modifier ownerDoesNotExist(address owner) { + require(!isOwner[owner]); + _; + } + + modifier ownerExists(address owner) { + require(isOwner[owner]); + _; + } + + modifier transactionExists(uint256 transactionId) { + require(transactions[transactionId].destination != address(0)); + _; + } + + modifier confirmed(uint256 transactionId, address owner) { + require(confirmations[transactionId][owner]); + _; + } + + modifier notConfirmed(uint256 transactionId, address owner) { + require(!confirmations[transactionId][owner]); + _; + } + + modifier notExecuted(uint256 transactionId) { + require(!transactions[transactionId].executed); + _; + } + + modifier notNull(address _address) { + require(_address != address(0)); + _; + } + + modifier validRequirement(uint256 ownerCount, uint256 _required) { + require(ownerCount <= MAX_OWNER_COUNT && _required <= ownerCount && _required != 0 && ownerCount != 0); + _; + } + + /// @notice Fallback function allows to deposit ether. + function() external payable { + if (msg.value > 0) emit Deposit(msg.sender, msg.value); + } + + /* + * Public functions + */ + + /** + * @notice Contract constructor sets initial owners and required number + * of confirmations. + * + * @param _owners List of initial owners. + * @param _required Number of required confirmations. + * */ + constructor(address[] memory _owners, uint256 _required) public validRequirement(_owners.length, _required) { + for (uint256 i = 0; i < _owners.length; i++) { + require(!isOwner[_owners[i]] && _owners[i] != address(0)); + isOwner[_owners[i]] = true; + } + owners = _owners; + required = _required; + } + + /** + * @notice Allows to add a new owner. Transaction has to be sent by wallet. + * @param owner Address of new owner. + * */ + function addOwner(address owner) + public + onlyWallet + ownerDoesNotExist(owner) + notNull(owner) + validRequirement(owners.length + 1, required) + { + isOwner[owner] = true; + owners.push(owner); + emit OwnerAddition(owner); + } + + /** + * @notice Allows to remove an owner. Transaction has to be sent by wallet. + * @param owner Address of owner. + * */ + function removeOwner(address owner) public onlyWallet ownerExists(owner) { + isOwner[owner] = false; + for (uint256 i = 0; i < owners.length - 1; i++) + if (owners[i] == owner) { + owners[i] = owners[owners.length - 1]; + break; + } + owners.length -= 1; + if (required > owners.length) changeRequirement(owners.length); + emit OwnerRemoval(owner); + } + + /** + * @notice Allows to replace an owner with a new owner. Transaction has + * to be sent by wallet. + * + * @param owner Address of owner to be replaced. + * @param newOwner Address of new owner. + * */ + function replaceOwner(address owner, address newOwner) public onlyWallet ownerExists(owner) ownerDoesNotExist(newOwner) { + for (uint256 i = 0; i < owners.length; i++) + if (owners[i] == owner) { + owners[i] = newOwner; + break; + } + isOwner[owner] = false; + isOwner[newOwner] = true; + emit OwnerRemoval(owner); + emit OwnerAddition(newOwner); + } + + /** + * @notice Allows to change the number of required confirmations. + * Transaction has to be sent by wallet. + * + * @param _required Number of required confirmations. + * */ + function changeRequirement(uint256 _required) public onlyWallet validRequirement(owners.length, _required) { + required = _required; + emit RequirementChange(_required); + } + + /** + * @notice Allows an owner to submit and confirm a transaction. + * + * @param destination Transaction target address. + * @param value Transaction ether value. + * @param data Transaction data payload. + * + * @return Returns transaction ID. + * */ + function submitTransaction( + address destination, + uint256 value, + bytes memory data + ) public returns (uint256 transactionId) { + transactionId = addTransaction(destination, value, data); + confirmTransaction(transactionId); + } + + /** + * @notice Allows an owner to confirm a transaction. + * @param transactionId Transaction ID. + * */ + function confirmTransaction(uint256 transactionId) + public + ownerExists(msg.sender) + transactionExists(transactionId) + notConfirmed(transactionId, msg.sender) + { + confirmations[transactionId][msg.sender] = true; + emit Confirmation(msg.sender, transactionId); + executeTransaction(transactionId); + } + + /** + * @notice Allows an owner to revoke a confirmation for a transaction. + * @param transactionId Transaction ID. + * */ + function revokeConfirmation(uint256 transactionId) + public + ownerExists(msg.sender) + confirmed(transactionId, msg.sender) + notExecuted(transactionId) + { + confirmations[transactionId][msg.sender] = false; + emit Revocation(msg.sender, transactionId); + } + + /** + * @notice Allows anyone to execute a confirmed transaction. + * @param transactionId Transaction ID. + * */ + function executeTransaction(uint256 transactionId) + public + ownerExists(msg.sender) + confirmed(transactionId, msg.sender) + notExecuted(transactionId) + { + if (isConfirmed(transactionId)) { + Transaction storage txn = transactions[transactionId]; + txn.executed = true; + if (external_call(txn.destination, txn.value, txn.data.length, txn.data)) emit Execution(transactionId); + else { + emit ExecutionFailure(transactionId); + txn.executed = false; + } + } + } + + /** + * @notice Low level transaction execution. + * + * @dev Call has been separated into its own function in order to + * take advantage of the Solidity's code generator to produce a + * loop that copies tx.data into memory. + * + * @param destination The address of the Smart Contract to call. + * @param value The amout of rBTC to send w/ the transaction. + * @param dataLength The size of the payload. + * @param data The payload. + * + * @return Success or failure. + * */ + function external_call( + address destination, + uint256 value, + uint256 dataLength, + bytes memory data + ) internal returns (bool) { + bool result; + assembly { + let x := mload(0x40) /// "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention) + let d := add(data, 32) /// First 32 bytes are the padded length of data, so exclude that + result := call( + sub(gas, 34710), /// 34710 is the value that solidity is currently emitting + /// It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) + + /// callNewAccountGas (25000, in case the destination address does not exist and needs creating) + destination, + value, + d, + dataLength, /// Size of the input (in bytes) - this is what fixes the padding problem + x, + 0 /// Output is ignored, therefore the output size is zero + ) + } + return result; + } + + /** + * @notice Returns the confirmation status of a transaction. + * @param transactionId Transaction ID. + * @return Confirmation status. + * */ + function isConfirmed(uint256 transactionId) public view returns (bool) { + uint256 count = 0; + for (uint256 i = 0; i < owners.length; i++) { + if (confirmations[transactionId][owners[i]]) count += 1; + if (count == required) return true; + } + + return false; + } + + /* + * Internal functions + */ + + /** + * @notice Adds a new transaction to the transaction mapping, + * if transaction does not exist yet. + * + * @param destination Transaction target address. + * @param value Transaction ether value. + * @param data Transaction data payload. + * + * @return Returns transaction ID. + * */ + function addTransaction( + address destination, + uint256 value, + bytes memory data + ) internal notNull(destination) returns (uint256 transactionId) { + transactionId = transactionCount; + transactions[transactionId] = Transaction({ destination: destination, value: value, data: data, executed: false }); + transactionCount += 1; + emit Submission(transactionId); + } + + /* + * Web3 call functions + */ + + /** + * @notice Get the number of confirmations of a transaction. + * @param transactionId Transaction ID. + * @return Number of confirmations. + * */ + function getConfirmationCount(uint256 transactionId) public view returns (uint256 count) { + for (uint256 i = 0; i < owners.length; i++) if (confirmations[transactionId][owners[i]]) count += 1; + } + + /** + * @notice Get the total number of transactions after filers are applied. + * @param pending Include pending transactions. + * @param executed Include executed transactions. + * @return Total number of transactions after filters are applied. + * */ + function getTransactionCount(bool pending, bool executed) public view returns (uint256 count) { + for (uint256 i = 0; i < transactionCount; i++) + if ((pending && !transactions[i].executed) || (executed && transactions[i].executed)) count += 1; + } + + /** + * @notice Get the list of owners. + * @return List of owner addresses. + * */ + function getOwners() public view returns (address[] memory) { + return owners; + } + + /** + * @notice Get the array with owner addresses, which confirmed transaction. + * @param transactionId Transaction ID. + * @return Returns array of owner addresses. + * */ + function getConfirmations(uint256 transactionId) public view returns (address[] memory _confirmations) { + address[] memory confirmationsTemp = new address[](owners.length); + uint256 count = 0; + uint256 i; + for (i = 0; i < owners.length; i++) + if (confirmations[transactionId][owners[i]]) { + confirmationsTemp[count] = owners[i]; + count += 1; + } + _confirmations = new address[](count); + for (i = 0; i < count; i++) _confirmations[i] = confirmationsTemp[i]; + } + + /** + * @notice Get the list of transaction IDs in defined range. + * + * @param from Index start position of transaction array. + * @param to Index end position of transaction array. + * @param pending Include pending transactions. + * @param executed Include executed transactions. + * + * @return Returns array of transaction IDs. + * */ + function getTransactionIds( + uint256 from, + uint256 to, + bool pending, + bool executed + ) public view returns (uint256[] memory _transactionIds) { + uint256[] memory transactionIdsTemp = new uint256[](transactionCount); + uint256 count = 0; + uint256 i; + for (i = 0; i < transactionCount; i++) + if ((pending && !transactions[i].executed) || (executed && transactions[i].executed)) { + transactionIdsTemp[count] = i; + count += 1; + } + _transactionIds = new uint256[](to - from); + for (i = from; i < to; i++) _transactionIds[i - from] = transactionIdsTemp[i]; + } +} From 776100ac333129bdc6591b9cea9f1e2000dae903 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:28:07 +0530 Subject: [PATCH 043/112] Testnet Contract Address Added --- scripts/values/testnet.json | 63 +++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index c42693a..9833f75 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -1,4 +1,63 @@ { - "FISH" : "", - "NEW_SALE_NAME": "" + "token": "0xF769f619E3b9DBCd552E62dF217D5DC095f6a42b", + "decimal": "18", + "multisigOwners": [ + "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", + "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435", + "0xe1a148735f07bc5fe7cfb60499d325c8380488a8" + ], + "multisig": "0x8f2608FA847A37989Df18E008ed476569AfE21D0", + "initialAdmin": "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", + "originsWhitelisters": [ + "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222" + ], + "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", + "waitedTimestamp": "1624317500", + "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509", + "origins": "0x4083f95624f7118996e3fA8D43B803F9F3aEE097", + "lockedFund": "0xC2C12474e4A2456E40366Bd029f6deE80f9d2Dc1", + "tiers": [ + { + "minimumAmount": "1", + "maximumAmount": "50000000000000000", + "tokensForSale": "11508000", + "saleStartTimestamp": "0", + "saleEnd": "172800", + "unlockedBP": "0", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "100", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "2", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + }, + { + "minimumAmount": "1", + "maximumAmount": "75000000000000000", + "tokensForSale": "20000000", + "saleStartTimestamp": "0", + "saleEnd": "172800", + "unlockedBP": "5000", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "50", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "2", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + } + ], + "toWhitelist": [ + "0x54b8Aef719B63Ef9354b618AC1828b71EE6e496D", + "0xa41f08993b6d4dE3281F31492F7a93D6F403806B", + "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", + "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", + "0x7d20eaa96aDbFe158C222210E7A8c05c44Da9d15", + "0x2bD2201bfe156a71EB0d02837172FFc237218505", + "0xA987a709f4A93eC25738FeC0F8d6189260459ed7" + ], + "whitelisted": [] } \ No newline at end of file From 6a65475ad7d44c51effa37561ef7856e4ebeb681 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:28:32 +0530 Subject: [PATCH 044/112] Token Contracts Added --- contracts/Testhelpers/IApproveAndCall.sol | 21 ++++++++ contracts/Testhelpers/Token.sol | 60 +++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 contracts/Testhelpers/IApproveAndCall.sol create mode 100644 contracts/Testhelpers/Token.sol diff --git a/contracts/Testhelpers/IApproveAndCall.sol b/contracts/Testhelpers/IApproveAndCall.sol new file mode 100644 index 0000000..e25d037 --- /dev/null +++ b/contracts/Testhelpers/IApproveAndCall.sol @@ -0,0 +1,21 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for contract governance/ApprovalReceiver.sol + * @dev Interfaces are used to cast a contract address into a callable instance. + */ +interface IApproveAndCall { + /** + * @notice Receives approval from SOV token. + * @param _sender The sender of SOV.approveAndCall function. + * @param _amount The amount was approved. + * @param _token The address of token. + * @param _data The data will be used for low level call. + * */ + function receiveApproval( + address _sender, + uint256 _amount, + address _token, + bytes calldata _data + ) external; +} \ No newline at end of file diff --git a/contracts/Testhelpers/Token.sol b/contracts/Testhelpers/Token.sol new file mode 100644 index 0000000..5e5c895 --- /dev/null +++ b/contracts/Testhelpers/Token.sol @@ -0,0 +1,60 @@ +pragma solidity ^0.5.17; + +import "../openzeppelin/ERC20Detailed.sol"; +import "../openzeppelin/ERC20.sol"; +import "../openzeppelin/Ownable.sol"; +import "./IApproveAndCall.sol"; + +/** + * @title Token is an ERC-20 token contract. + * + * @notice This contract accounts for all holders' balances. + * + * @dev This contract represents a token with dynamic supply. + * The owner of the token contract can mint/burn tokens to/from any account + * based upon previous governance voting and approval. + * */ +contract Token is ERC20, ERC20Detailed, Ownable { + string constant NAME = "Test Token"; + string constant SYMBOL = "TEST"; + uint8 constant DECIMALS = 18; + + /** + * @notice Constructor called on deployment, initiates the contract. + * @dev On deployment, some amount of tokens will be minted for the owner. + * @param _initialAmount The amount of tokens to be minted on contract creation. + * */ + constructor(uint256 _initialAmount) public ERC20Detailed(NAME, SYMBOL, DECIMALS) { + if (_initialAmount != 0) { + _mint(msg.sender, _initialAmount); + } + } + + /** + * @notice Creates new tokens and sends them to the recipient. + * @dev Don't create more than 2^96/10 tokens before updating the governance first. + * @param _account The recipient address to get the minted tokens. + * @param _amount The amount of tokens to be minted. + * */ + function mint(address _account, uint256 _amount) public onlyOwner { + _mint(_account, _amount); + } + + /** + * @notice Approves and then calls the receiving contract. + * Useful to encapsulate sending tokens to a contract in one call. + * Solidity has no native way to send tokens to contracts. + * ERC-20 tokens require approval to be spent by third parties, such as a contract in this case. + * @param _spender The contract address to spend the tokens. + * @param _amount The amount of tokens to be sent. + * @param _data Parameters for the contract call, such as endpoint signature. + * */ + function approveAndCall( + address _spender, + uint256 _amount, + bytes memory _data + ) public { + approve(_spender, _amount); + IApproveAndCall(_spender).receiveApproval(msg.sender, _amount, address(this), _data); + } +} From 369f94eb3e9061400a8297fcf9057ee3ffe98a06 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:29:24 +0530 Subject: [PATCH 045/112] Locked Contract Deployment Script Added --- scripts/deployLockedFund.py | 137 ++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 scripts/deployLockedFund.py diff --git a/scripts/deployLockedFund.py b/scripts/deployLockedFund.py new file mode 100644 index 0000000..7fcb48f --- /dev/null +++ b/scripts/deployLockedFund.py @@ -0,0 +1,137 @@ +from brownie import * + +import time +import json +import csv +import math + +def main(): + loadConfig() + + balanceBefore = acct.balance() + choice() + balanceAfter = acct.balance() + + print("=============================================================") + print("RSK Before Balance: ", balanceBefore) + print("RSK After Balance: ", balanceAfter) + print("Gas Used: ", balanceBefore - balanceAfter) + print("=============================================================") + +# ========================================================================================================================================= +def loadConfig(): + global values, acct, thisNetwork + thisNetwork = network.show_active() + + if thisNetwork == "development": + acct = accounts[0] + configFile = open('./scripts/values/testnet.json') + elif thisNetwork == "testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/values/testnet.json') + elif thisNetwork == "rsk-testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/values/testnet.json') + elif thisNetwork == "rsk-mainnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/values/mainnet.json') + else: + raise Exception("Network not supported.") + + # Load deployment parameters and contracts addresses + values = json.load(configFile) + +# ========================================================================================================================================= +def choice(): + repeat = True + while(repeat): + print("\nOptions:") + print("1 for Deploying Locked Fund.") + print("2 for Adding Origins as an Admin.") + print("3 for Removing yourself as an Admin.") + print("4 for Updating Vesting Registry.") + print("5 for Updating waited timestamp.") + print("6 to exit.") + selection = int(input("Enter the choice: ")) + if(selection == 1): + deployLockedFund() + elif(selection == 2): + addOriginsAsAdmin() + elif(selection == 3): + removeMyselfAsAdmin() + elif(selection == 4): + updateVestingRegistry() + elif(selection == 5): + updateWaitedTS() + elif(selection == 6): + repeat = False + else: + print("\nSmarter people have written this, enter valid selection ;)\n") + +# == Locked Fund Deployment =============================================================================================================== +def deployLockedFund(): + waitedTS = values['waitedTimestamp'] + if thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + waitedTS = int(time.time()) + (4*24*60*60) + token = values['token'] + vestingRegistry = values['vestingRegistry'] + adminList = [values['multisig'], values['initialAdmin']] + + print("=============================================================") + print("Deployment Parameters for LockedFund") + print("=============================================================") + print("Waited Timestamp: ", waitedTS) + print("Token Address: ", token) + print("Vesting Registry: ", vestingRegistry) + print("Admin List: ", adminList) + print("=============================================================") + + lockedFund = acct.deploy(LockedFund, waitedTS, token, vestingRegistry, adminList) + + values['lockedFund'] = str(lockedFund) + writeToJSON() + +# ========================================================================================================================================= +def addOriginsAsAdmin(): + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + print("Adding Origins as an admin to LockedFund...\n") + lockedFund.addAdmin(values['origins']) + print("Added Origins as", values['origins'], " as an admin of Locked Fund.") + +# ========================================================================================================================================= +def removeMyselfAsAdmin(): + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + print("Removing myself as an admin to LockedFund...\n") + lockedFund.removeAdmin(acct) + print("Removed myself as", acct, " as an admin of Locked Fund.") + +# ========================================================================================================================================= +def updateVestingRegistry(): + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + print("Updating Vesting Registry of LockedFund...\n") + lockedFund.changeVestingRegistry(values['vestingRegistry']) + print("Updated Vesting Registry as", values['vestingRegistry'], " of LockedFund...\n") + +# ========================================================================================================================================= +def updateWaitedTS(): + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + print("Updating Waited Timestamp of LockedFund...\n") + lockedFund.changeVestingRegistry(values['vestingRegistry']) + print("Updated Waited Timestamp as", values['vestingRegistry'], " of LockedFund...\n") + +# ========================================================================================================================================= +def writeToJSON(): + if thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + fileHandle = open('./scripts/values/testnet.json', "w") + elif thisNetwork == "rsk-mainnet": + fileHandle = open('./scripts/values/mainnet.json', "w") + json.dump(values, fileHandle, indent=4) + +# ========================================================================================================================================= +def waitTime(): + print("\nWaiting for 30 seconds for the node to propogate correctly...\n") + time.sleep(15) + print("Just 15 more seconds...\n") + time.sleep(10) + print("5 more seconds I promise...\n") + time.sleep(5) From fefa2064a138ba50617e04157fcd2f11a980647c Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:29:45 +0530 Subject: [PATCH 046/112] Multisig Deployment Script Added --- scripts/deployMultisig.py | 72 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 scripts/deployMultisig.py diff --git a/scripts/deployMultisig.py b/scripts/deployMultisig.py new file mode 100644 index 0000000..de9d48a --- /dev/null +++ b/scripts/deployMultisig.py @@ -0,0 +1,72 @@ +from brownie import * +import json + +def main(): + loadConfig() + + balanceBefore = acct.balance() + # Function Call + deployMultisig() + balanceAfter = acct.balance() + + print("=============================================================") + print("ETH Before Balance: ", balanceBefore) + print("ETH After Balance: ", balanceAfter) + print("Gas Used: ", balanceBefore - balanceAfter) + print("=============================================================") + +# ========================================================================================================================================= +def loadConfig(): + global values, acct, thisNetwork + thisNetwork = network.show_active() + + if thisNetwork == "development": + acct = accounts[0] + configFile = open('./scripts/values/testnet.json') + elif thisNetwork == "testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/values/testnet.json') + elif thisNetwork == "rsk-testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/values/testnet.json') + elif thisNetwork == "rsk-mainnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/values/mainnet.json') + else: + raise Exception("Network not supported") + + # Load values & deployed contracts addresses. + values = json.load(configFile) + +# == Multisig Deployment ================================================================================================================== +def deployMultisig(): + owners = values["multisigOwners"] + requiredConf = 1 + if network.show_active() == "mainnet": + requiredConf = int(len(owners)/2 + 1) + print("=============================================================") + print("Deployment Parameters") + print("=============================================================") + print("Multisig Owners: ", owners) + print("Required Confirmations: ", requiredConf) + print("=============================================================") + + print("Deploying the multisig...\n") + multisig = acct.deploy(MultiSigWallet, owners, requiredConf) + print("=============================================================") + print("Deployed Details") + print("=============================================================") + print("Multisig Address: ", multisig) + print("=============================================================") + + # Updating the JSON Values. + values["multisig"] = str(multisig) + writeToJSON() + +# ========================================================================================================================================= +def writeToJSON(): + if thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + fileHandle = open('./scripts/values/testnet.json', "w") + elif thisNetwork == "rsk-mainnet": + fileHandle = open('./scripts/values/mainnet.json', "w") + json.dump(values, fileHandle, indent=4) From c96eb94aae5114e063d9d98c38f0c8d4d2c0ef9b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:30:50 +0530 Subject: [PATCH 047/112] README updated with UML and Call Graph --- README.md | 12 +- UML.png | Bin 0 -> 242270 bytes callGraph.svg | 1548 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1558 insertions(+), 2 deletions(-) create mode 100644 UML.png create mode 100644 callGraph.svg diff --git a/README.md b/README.md index 7a8a6f1..33d303e 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,10 @@ The Origins Platform Smart Contracts ## Main Contracts -- IOrgins - OriginsAdmin - OriginsStorage - OriginsEvents - OriginsBase -- ILockedFund - LockedFund ### OriginsAdmin @@ -54,6 +52,16 @@ Currently it's functionality is limited to vest tokens and withdraw tokens after For Vesting, it uses the contracts of `Sovryn-smart-contract` repo. The registry used in this case with be `VestingRegistry3`. +## Call Graph + +![Call Graph](callGraph.svg) + +P.S. It is a simple project, isn't it? + +## Call Graph + +![UML Diagram](UML.png) + ## Explanation TODO diff --git a/UML.png b/UML.png new file mode 100644 index 0000000000000000000000000000000000000000..04340d1d1f8e75c036bb28e1e73a29329c9aabeb GIT binary patch literal 242270 zcmcG$bzGF|+BR$~1rssoP*6e;q@_g=qy&+ak{A#v=>`L(22g1!C8R;R8I^7o5Rg(* zT4I2KVR+9G*K%<0ckkzUzu&k1aIGH;XYRT0>pIS(uJKd8E_37{)xll6b{&zuCZ)1# z*FNuEyY{;g?}4ANAef}!U##|5HSLY8@3~kYOzd~bAgmC!2KET!(}pgm@7UYl6XN8& zXJKGv?_g=cVPtJddQp%DUS-xyRnz|OpYPfYFXJ3Dt2toR$A7Xa=zhiC-TLg}_i&#J zCGYPqTc*gQ5iRLd|dIN#JY{w3bozzuSF%FLqZ_>@Ru^+S9m` zWFcn~A|;0z1KYI@R2$zr-ofB;n3e4lLyeEk)8`s@^~JW(!iOIgqGukR>kbKKIlxT6 zn@*eFhnTvbg`dptV(-ReGFHz)Y%=l1lr=e@y5p{ttR9raJJ~A_WyCSBFF7zC^FN;@ z!0JED#Z8Pm_I!8QWn{pSvOD)5o6jkHCh`?L=xQZ*=mU#Mq`ZjSkzAJm%*B^K`1i$y zDAQ&ikaRg(dHm{A(`epnUu~Ul*2&2#*t#toVQ3jV6B5%d{L04Ox|scYSXi(Y){~n? zYxct4t+AzeuL-Upa%^++Une*WzfYz2XR$@^|EvG5e#6=ZOG{1eR^w7-8rPiCoC96cIFD{(LEY-vdBXd_1!_x1$_KWuSks5QfW|%#GN!p*QC~HGX6ZjXY z@8u-l+-@S*6EF8IY8osps9RjPkGc@hxNr1%?b+;+OQH8#RHa+>yGd+N;`C%^RWF@o z;`!uiRK0|aB<5ij3r?G`v`9Lzkh$cMJl;F8>c2nLrHib=IsCxg!Ga@q2i+NcYhMT5 zdZ`tDgWO->az9xlcaZmi&{-x$)k^^hhZ{#d3c>rsgo<0%6vJ6~+cF(Gtr zyf&}tcf^Gk{!wH>O$~u8*NHhZTb+I6u3B6QQr7cIYC9)H?B;!qJ}uUpCiseKwpCIo z)y(nv#=}KWWI54VN+Wt8VJ*=JGqnk^6EKTYz?i!snv z;bCUKd|Abi%2JTDYG}vT!OF1fbZS1RTl=#*IXN9l{N#D6&iUpsIAk)MF>NV%FRbFp zF?A(JU?huc`mTC(q(;8Pu^9`869ykUH~F8Xxzwtie0f?WudQa_$sR#Vs`JCryJz3D z-*u5-p?ja_o*YUmEOFNpQL!ud9dZRM(C)?jg(>! zkJBM1?w}(B8yW57Sj-tEiX2=psXd?WT#?B)Z^G_#&i$b3YutD)IEp;}YH)^kGH(H! zD#DZFzNfEraK5&m|4ekO=eV6lv!+yjUIf>t#0Z-L2b4;;s+L2< zZ0G9Tl$z<}&J};Xi&Y6>b76L`!#Q%DaQ;)ZG*5I-N+{IW1QLZ_Fe|C~@OH6L>a?AI znUQ=Y!<+Z}11}=2mr@M558A7y(K_7h`EDl_ExYnVwJ=ZSjDd%gu<`qA$$^U*lih-b zy)B*@CZE}(#&X&!F1J1Yg0Q>ctgb*_J8^F12*U%adSPp(M2x?z`}&47&ys&s$>(n_ zO8M-2dsouvt_&q!&^sCtzj4n+P)4uqS^P2$W~0q7U)uunm)3RrEl$OIT{Y@g7oF%z z#O8bNqGy&pb%$)1G0QUX=Wo+l`$uiQPUMbe_6*7W7DMLfGRwj2)!aCgHyJgwEaKNV z80E~qu;eITbX%e3T+hIlzTUn8*TQk8zY4z5_H2;O%*~>DdWT&0wYm9R&g+gXEH=IH zcG!EJ_^-uN0XZiqyQkZPFFkq5Mss@Di@qVJP|uCFq@I$LCWPxXm!J1yTX}%v!9A#& ze%e}{2l`d10$fBK30E%M`{)>?Oz(e-QEKzjG0#Er^q5XB$6LdVF}{qmd!=Z`99@~6 zvzItiWc?{V8_+%7wd?*aSt$usXT6yL7ag^(;VrL|$|odRwN8e~?v9d@I+-o_=-@Ml zR`zofR^v|%k~QA#zHzUCU6%U7AsL$cAEaso6@2F^wLYzmD0?oyc#?*=^cJ&8#y*dW zaa$3TkvqRSj&`r07x}DZI$KyQO1GIi6l}MWi`jzl0{`GH^S?f^{hui2CgPv}^}{Ct zx&0$AmjBC-3Z^~>cUQHuolRmI{Tvprutl_M*Bwg4U%PhQIyd)$zsH^t{>O0Dm5wbK zW4EL!ckjBd-pD;%!zPbv@4M`)XJ?2}ftUV3kAM9Fxp2~9tJd3VF~=&$-wz%MCEfK> z9RApK=M>_vv;)r&HQ8g|8cQ^FSsDW6U*18s zS+pj$*tj;SZ<@o##&%IxY5BO8bY^r^Xn1&$WnU4zUP3~G-9%dy4({5AlRvLHeLR$O zXild%%dVyF`p0Od)}F0XW; zZ!pQVb&G$7C_dPwO*;F8d(SR=Klo!;)+Z0jXIuRN(be$^oL>yS2y4oH3{o^;6r&VY ztUUG6iiL64xyg6xhmObDp>6XE^9yr~=Er9T1$(-M8|s}E zYj22=1kft1sv@>wO zyur!1AHRrLw--@8qGol2-)hOTr@(K`uwL?pM~!HO2d!HUhgj^M3X55b+UE5mQ_-3I zJzP_LqGnT;f%#7J(IjF$_eSbQwTpu`u}jaARAKd-e!S%e^lb+Q+v!7M!?5GPZwGZSYQ?} zjYt{?(QaJBB-E#?@#yN@@~=H}CKiP;@kyqY@?4*MQ}UHbk&6HB=p~buY83W)jzwyU zvh=R|95jU*u@O^Fn8kTNz_!q~3P z32^8(mAfqEKVu{!p*m?|Mnsx>yXOr~BZscSarVR0Gv7F?DA*<($nX#U+&>S$NPV+t zMwTay;!8=cNho@_vM>9HAeW5jSgN z4`r44B@c#F!t~eKdx~CNCqWm<&8;^QkIXBxa4Mchdg1Is%8<%OPa0veubGTzcx*V@ z+1e75kchZDXEn-U8i_Gyh@bJ9o0OLqJJ{PFOVel{KDsr(gBLh0 zNOjd7nd!}cZDW+87_DM8Amq5Yp3)p%`Juop@n%Zi;q=#U*T!B-806;OfW_-IsiK#o zC!xm5*cLYs7Q5+cX6EVQ@@+Z?)&J^Ieq$50K+yGgoN9OWprQL*ztw^@b~qr=aI@jr zqpX?J+=f!4J-J*FobwSxcxzM>c>1qc_u*F(VScr)`KN=;5zRmCAV*S{MNJvPC*P`dNP+7Nz zzGc{wdXw+cgx&tb#98_%y_D;-`fjrbKrbYDWy@k97c1j=u|?&Aky6Y};eF0sSsKOaS+^9m`KT|kFUIz-Dr&f14WRAp zQ@3`U(fl_4Sz1&nU0}xx5lgy!W7ef>bs0I;5&r66Z-vO%$o*G_L>;0TjQXCXV`~fc zTx%`=LQ(>>~#XQ->X0-DX=S|?{2YjdZLWSk>9 zTG3bKF%96wXEnp?XwlLxPJbikOcyo5b{;}_H%#2r9~{`4wA4?fB9dqQl3Uq*^YP6& zTmf;yD+25)<78~ICa0s|<~M!Y5hYXnV&&)*O>fLcw^7_XquLu&S-y^v1Us<`c~NzR zG+xO=u*32PPC$QPT}f^CLcDR7PT7FNQ%%_uuTTUp&i4xW6tg-PEOx-1z0d1=RfNg> z!1`Rh3w05W$Ebd=AU1la$uBx=a-$*pt&A6HLh7kF!HraFg$JRcx3*aoc(ucH_9$KW zN0XOpJ^?60c9Zj-wM(m**~7Nt-oI~Lx)$)AG=iYA$*V?!U79Vpt;_{}FNU2VlPl z&%;h{ov%^wyD~q2_b2E2pI-wTq6W7)Us7HiHj9QE#Bk;UX*1Y86LB_y+-P80Q%;j2G7^QXb?7(GM17ep{Fl~ zsqPmcA1=Z<-X7mh$;+akurfz00yD6&@#dHzW^Q>>$*(mr0XO{Z+i}X?n=~v;JluM- zpOQo3<9#Cg3s|puhRc7QXNhvlNpkBPwT$pc)xlGb1}h)=9GUi78aG8C_R$I#ai0Hj zZ^Kan#ye_DtXmm#CLlwDw1jkrwj35&~f74nP+;Q}D zcgQ}e5T+vm0mW?Ae3oCnFOF@-yFaI*qf1qQY4x=!%->d`ifw-&wJ@tv?Dr4vFy-@( z;SuEP>t!U=pW!mj$rVamb0B;&s?zT3lSCXG7iv$RF&G{RCb{ToUgO)qdNc0WqmC5u zaC74tc?}Iyu4{5Hu-GM~rp6Fv9$`ldYixF;S$B4rdvTJn{?a%}(?V->JTTt#aIMwV zS9?RA-aYVpF(cBDnuT{w6cntv)&QX4@@U25tWw=?)%2IP|FzFWx7_hsg@Tekzx^Hh zv11F1x%KOQ5_hLEt31lX!cK*TkCRXy7c-PfS}4~pV)t17She^xCZ=m~mCrw*xOqa~ z6W#Th?7|Bcx8o`o2v#$D80kozD7W?C(C8&mk0^M~zQMtLunt&B>?1|p`rkipXZ2y> z%+V2C`yi>Ss~by1ax@q@Q+l^cVZ8~>+I+W^lpW@N7w z5^Ur=Rq1|tJny1$$6;KR+8xiG+vqeW#xN2<(Iy?DX1MldWrfh%S_zB~I^mUPuDj28 z-TS@4(}xm~r$;>rCe)t@&_t|qf`DjfaWeY*^B<->K3JMx9-%?Rb;*uNyYlt$_4)U7 zm_xB9Mw`0wy~XpEK=4)vqf|HsBE&*^jA z;;kJT%CD&S;H;>n^`KFqP|BhY*m7j#V8`n~Wfa@uLVXT;en?kT$+wqa!-O~ae)@zh zvefo<^F)l-1t!7@*7vGZL+ZP8Il`Lq^`#RNvnsZtJ;52l?xNQcFCNcxM>#TbW)XU)TE7uQNU{|P2v%ePkBkfNz?xF)z;m6uf)biGoMum zmC+IxPCK)6l~4;Xxw(~7wTDKKf6mgL2;k)Rw?TQH8TQ0Q=r4|G4#&%>n(IzilUF!D?=LYw_^$d18U_3{FYjRxZ6En5%My?BmsWoF~dD442|W_kPZj4~+(i=hhsaY-^W0k)>T0y! zG#qOTiGr;{sUO{&-@Gr0Y3HJA*#-t@>Hf;@9DOCSV~Q_$**ONYE4qM5HAk#^Ey~_? zc7Dm-`^MlAo5uO3eVA+tUaOfT5r+gxqKWycJ}o`H@6*#_7MfeF(Ge_NbxZByl=R~7 zl(jDN-cjD_vv%^&?Wr(r--TF`4x|}VAC?<^INdGoaL@T`O8n7)1-Q8E>^9rvuza?1 z(gFM|`Xw`AL!3RU;Er9`UB|;HEp$ySb53W{~6vI%EVs3KpHSnPKawB1yPe&NEi685)h$U9S&Lp*|l^ z#^p4}BO#&JolSe3v!f&82<;acEml3T6-{xjYl^X5#n#2}Kw&kXk$f+M^yT$*f(H~V z_C7>3g?WBr;>_^K2*1br&BX^t8S+ho zwM%{oBBB--o5CKEh<0{$b-Dcb`lF#CEo_>an@Zh$oKm~BXgRQsBoGf z!LG;*B}MTsx*TDM_o^D~$k&x^6hl*8!G#iR_byFoc0G}<=8Q+d!P?HwUvrJ<)5wo4 zni5Qx^g8Z`PdE5~f6V_vI1rUcmh)dO8eemsXq(g1qpkT0>Ky&TU%2v+TP9ZXHQK4G z7qu0;|H#zFhFcTG7V^7w8_b<^=M>f3L#PNxs2nAT=WA z__i|p(4>{hYs(}1)uJRB2;-BFfE0;}=!`n??%6A>i^8QvTJ-l!_LmMAo-R6WN;+|z z^5SWG(DgN=aBChutXNzUzvxEBg=ygluEdPfa9wnhPS_w=Mldy^cYk4Fx6{uunAyx2-%K$aOInKrvsLS$;cO&cTau)=wQ;$u>ajVv3>i@o;1nTjw1iW z*#CfI_6`nYkKh5ci*F^xh`4a)8`ZDW&HG2e5N&jlms{bp#=WE&s=)MS>t+}lCBiJL zX;u>7ynIxF;d-S-?;&ec>}d|kHs1~)cy-26z4^X3F9{0vm)NMbMaMkr^xk=g;3@W$ zFYCX_+G$hnZkBbO(jL z7(!*zZVQ0zbM(|>-*^3#vV>v<_#H?sVoy&x2AJ?b8v|@h=h)Yj>ThuL0Ev<n0DY# z924KP*E}k=`LUQC7a^k_TYZ~o;L zs0D(`TDAO5*UtaJ#%@SIeQ}I{!n;!5P%SWMc=`i&3(!8_cTqgOQ+%hKT*+4&=s)sO zPtT_>btw77yUp3yNbBo6X=qGz>w9S_3|3&YR6ZG_4X>pCui(s=^ciQx#l_EAMo*dy zhrMvjHxGj?UJaCWs&)!X7a>(ZM{srjKVe&*RYQYwp?t)3SO|u;9j{MvbpRIurd~(B z6zpYjw=3N&fJ_m)DH`&e2_R+e$G5$;XMjYoX;hu zwt>CPY^=S^*>agD%l+7R#W+7I5?#}v1=zsds-FUy0^5W0{-y34mve zoY2QtkCwpCWas2uMmx~+X99T3htf%m>Ti9iaCgyxDI?@?ms9xh*W2+AAM#3$F|)d^ z9#vQOuNH^hAmJdJq0v4!IMChRUR__W7^Be=Sy=(hi|_8}_xX9&4uGyinQm5dU#p!| z>iBUcG2Gg&ktk9|h7<*tD~G{@>#0pn=H}FcJsu#T@@aG;-b>|roJdq}u94e_Q!TQj zE8^etI~KR57@;tPk&)e`N}T4%=qNb!H@KoAFUbl5Uea29O8N$#5m#x_5$fk|=!4Jc zOL|JUO09>i_8*F1W-@J~F|yT5AoOuyp8Q9&l=NA-q3$0MEc#jLu*ywSzdqc5VtQ55 zc&7KJ@o%Qr1J(uBw`R6)-+==s${jMC@8DTFt&l1&6@z(qTZAd;p}JstDslli582_% zz0on^@gtMHbIB2L{F)^d#Y5M>Lnbg0AMCq;o{p#TDth?GQUDU@gC~Kg$&3G64yb;( zE+}x}$34;%;scZJzfx_b&Yjz^_WAr0|FMK_Fw^jI>X(N$97PHl=AL%=HPLM^ z{lBSIc$Cc@kdJ;91d^%xBX4OO-EjQ&71=e*s z^E}nG+b!8HrDCIc|CBhYv-P`o(<;R_spOnlCB$o2%3O4YgI2P7dH?pxwjERlz>+LPF8koUM#8-H3-YnH4+if?FwC;KH zKr=qBN}&z4P&b6njuc~JXs$?ZBFWj1%%<&h%#Kg#?#4oIJTiDi)Yww+z)Sfb~dL+E{yp2yP;t;qcGz! zh-SUDAJvZyZTm}PYDV8acx7FAiWBF*5XnW-j9wh{{Qf}Udp+EaV{d-SGhV^ z5yqxZ#l@g<{dMw%=hL;9Yn*-bDjyEIn9hL<$-+}Nf2))~-)#{6Fi^><8?-xQUd{j_ z?xm*fFMj;EjOMnTCskOqUGyQFBZI7)^nYPcVD0u?KrTA&r zj%qIs;)ZK0@kYfXAlr?Yuea%CWPH9=6EU4t5CI~IU@IMTwi8^MEf#Lg=Aw(P{CyeN zACh_lWe%Yc%-1dK9IdkTq~}Blus)3Yy^TRh<(chE;Bu?xWaiZCH-B@_I)`p+ zZRCN|VAKYrj{^gJ{*9J>;TheUFVgUSVksC4kXJ2~o8+|49966MdcH0R$-*%>Smwa< zub)*{J(#ZC;fad0Z!UzV8HS_eG@}}4^jyx(B?dnaZ3Hg{80axDLXn_ZpG^nO&j!{j ziIC>r?P`I6Hq*s+O@TvuO(@i^NCdH<292i#HCvV=HVaIaw?deFt;u_k4gSa6Cmn?@^TT%2nlmF}8< z?ndC%qGh0=L04r^y?-kA8W>-u6XST-Q!L#TChfCRY$hVG#xLCB#Vg`o^wi+HnNgUA zQ`H%CBk^6t#NVB#RKs15U|I>cUIghhZlP$y{~Mb8Fqv1aX60p*j|r?m`N5H zkuY%!LHD)G;^HJ+U<&s1=9kwP+uL(u%zObuGUV~QLfH9U2~D)94jnh5>4c%!r5>5< z{wK*^17BQRu$k^)Uc+K&@*|RB+SaH>$$501` z4mBVe$BzY@K8PHyi(!mweGYZvFM71%@nbW%C5CT2H-}++HdPcCXXK@*NT)K7o%1sq z+mj!WRYie@-DUv00g{2nC{ef1-abT4TxmZ;o?ijKdK2-GT4G&N{kb{CP*NkVL_H>} zq}tdeV4$q59Y^W)%v0St9%Wh9rjQr|H@JEj;9N)N)-7?J{_2P@HFxUaX3pY(+rgkO;z z8DQ5fS~u+EVM0jREUbLaicVWSgA&{Uz6sM)TqlZANui`ar&PAC@Y%V>u{G!?=;+4Q zzSKuOU0XXa9IlOo2FNW{)m&7?Se3(cq=cIEOy6n|7??IC?q)0ZFtNTMyA9a~!-g6z zs(LC)MuoQDhkIo!G-BTK<_w0@YcfHn`dhU*V0cq5JjQ;WGX@C@-Mk7+invoIoZ22- zQ3Q<}%0b7FXD|47P0#U8k&u2XshZ)YH2%tpg*-be5c-yZm*eoqA z5g%OqQfe3WYH^ht68mAu;S~H)@Q6o;dwN&|iuo6Jhck)KM#0k0OX;m1i}g~YyPZ~b zcI5Nr(kHOK($eygTNglmL89&VE+yXc>$h*83Nuy%IB`RJ*}FoR5Z*txhHITN#<;bm zMVRD`&YRmRpu$HEF|JY&s7X0WgVY(uD}yxM7bguCx-CvD$kdIt>6>!>2GH)OLo@_` z!_@Q)bN>n@H)}M=~9qaxb#=!Q7@n|eka8`5%35~IQ?a^4X3aA8 z;kRPCJ37+XC)HhC9E?aWV#d=iN78O;O`%8I3FztefHTiu&hhHw;t?~ATVtyWU-!Kl z@EQ!+we>Pc7MPfoPVvBqp%rs~iBB6Lot&BJ)ivZ6DvQ9XUICY`HGB{3{s#|YVW_Py z9}x2rler!z7(z?g+X4P+k0lOk8n#znehI=vafc~i@G$dJPBgY}y#;F)oFF7+Zg>-M zh<}Z9Z;aqbxg*+YsLJ7b+g*8Te~3of8l2UFYEJ=q;T??cCm{spP*RBunczNtMjPt{ zF;=veAUaRh@1ZtOiB3O;7jxL+jZgwx3Iird@!A3{UTpm@WlDn|YO z^U9Xhng<@noY)vW*Uq%JwH0M%UPhv@wgIqTB@rDrQi3+Yi3~*yza^qeot~Y25ngny zO;aeg@d;`rgcQP-XCWy{Ui}dD!R=}+bC}OO2@SXCd^@|5&BjeaQ%8>STlwA2$mL7P z$YXe5HGyS+@ZcvN&mZEg4^CO)F^T53It=1zWfvHX=R`DkBXu7W68tyEJjyMObtd0`wP;Q?IoVuunI=QzcpjuV=x*McHV7hu z{U$H)7uyR-juoFDeF9>(>%yZJ@X`e@iTvo&&^{8TkO}wR-ASZ6k3Ut4Z$huVsa;15Bwy*W}x831}2q~%H>#<+J;AdjG&YgWg&vkP0 z!CuK6{jJVVlVY38d%;J~)~(cc|2Vvt{pz6e$ow!>nbT^l@G2#mdxZN+<*QeV?_#2& zoak~Qd0Cxjy5WwsTL;)T9OIKl2s5BPaf}!5e$iq z-CQrR2~H({O85%@CB^tdu%>UM{|!s%3L6kxV1QLt>Y8_FU)ayUD08&xo`I5PPtJyf z;utH*wqUd;sJk_}Qa)3QAuDi2j=aAEZPTtpb1(Xe4|Rrw8?HDBw7#BV>mrRX#%_@R zl8&5=t^~&AFLbIL&9&*%LvB--WU=9vs2Rv2AYp+JV!Yi;oqr#w#)pqQU@7ZXlsK*Z zcrbjy+PYif(R=7!oeREIW?!cHb!6l-%m);%P^(2sX7zcz)A!F=`OapOmmj4gFM67- zu!P9_`%T6^TS(X8YwEV^@=%cKD@k$NT#vq&4U2dYQI|T?a9k%xseEyVD74<-w0y9jUcHO zSM4bY<_v7uNJ0bw#^wb?7CcYhI06xlK+goJWEO|v} zW39x+t-R>YM=82g`-AF7d9}>2pFZ8Fi&(BEaRImSMv&+>OpKlT<70Yz-OX%dW~@QF zM)h)EF*{gOzOv#7&NY(^*#}r*s4}-u+FYPXEK~$A|d>P7oJvZ@*N(Y&C(X& z(Nfy61my5b;IoL!_kTpT#bgvIh^7*?#`p^PHtc?EPB#ZZY&L2Bx-jyTTw?cm_t z&{iAi2qfyy5#E^xLiMU=9&p2;ke8w4JZ3HU&#una@Ad!Ay@M%TIh%heYiT->>a4UM zDvIm{vE*2m=Z>8TAIowp^@il=$c5S=KxA9b!3q>qRN2oaEkUcJ0UC#Y@A2g1y!!c39I5FzqQHGCNzt>p$3oS6> z33iV^H&mVoC`Bk3Jp?)WI%Bgho5oS5bBf_3AC$$typ&+oeHGcJ3n6(Ih|GIlJ+jjq)Se2PqKIdK57?1EkQltOsb(sGT@|0`rpu6Wv9H}$Ra1of zuo5qWm$Xmyo#v9mw&r0w;?$6h^X4yN(_BA&B75wuirtf{0CEe68{jy+e1DbhX(FKc zT@dcOU@~ku$vKU%iFE%ML|r@c0sI1CKoBgDv|vq0J$-xva&pRxi_L8pRk`dIh6lmL zSjV{dM*Z5_Oo@qZjqMWl(~c=p7fa&>Jk1=5N>6iGsos0j4!U1-?RND@eaF~3)N?sC zFQ)m|!>uA4fzr}>`qpC+mhLM&rg@BvZmup4$D&)}w=yHO04gqhsISj5*O>R(G|&Hr z+7hg*C;KVWj`*o6nFtmDKEgBpwDsqbZ>&)=4(G8p#ypSaKLG=qSisN7vuKF9^R74UhiE zc(fe@gKI-$I*oZHvg9{zaVQw~6^%hq=HcF7QK_q4aK~`6hu*UxKR-Xr6tmcT0jgYM z<#<-ZrWB7Wfq2apF;M2jboF{n&-hG#{~9uhiojd|`*zRGcz%qrH@HMRP?v-(6qEsQ zP&!eeTm3BoeYj7b+(Qs*oQ&yJkD#mvRUA>*HS7LJcGGm*nVbuZ+4@@rP|tY$_|%Y! zpr=SBWVhi#g{smNIiWsKt%V#{yV&Y=#aY76XVW&I-EB;4;$f`mnc-msMzcKNRYh+D zq8&7e;Ri@@Kx$wvHG)q{c1mrA(;5|My$B!@?x-9=%BJ1|^5^cCf@hkE3WI3PX@vK+ z_PE`3`W^V(1<)2w7S!%N{aVSZsYLPV7R`te+^$a@5q=L!_G8@TKuVT~Ff$X4nN#7@ zaM`g)Rkz{y-Zg|A>UryIP?#n;a0`T)#AZ#@9Ayuv$3!U zjn=I9jn750pq^`1?k%nD3d^lsg-7#JB`?WZ~ihlY5#a)(PJm&P}cJ$WOkB?{DI9ho^R52CSMIB5Ppp2&}1n+>j(f*s*|iSY2^cydHPnghQ`ic&CGOI1FXXD&DLd z7Qez<{z&H-xxo2LJ5aZfDfL00ALTncsnc2j~U*cp~Q+ULzf7?D0ZY!AwNJv7B zYzd3lK*ZOwsQ8#fIsTS%+%}RNb8m?b6D!I_Ij;SQ0_EYV+O_TN zY!S>*c;`zT$QL0zO00}O0h;o>^}wP3i!4f;-YbugQgc+EU-?&$XI(}u`EN%%B;@%Y zN+_Xu>Z4IHZU~6g&oKa<(f;`6g;$dE_46!yUBt=X*j#eodHT&6wYlE*aV5#GtP zVE=EdRL%~6Qqj4O#`|%2G{|+<@MNr3#_%0MsE7rsYzC`bH^t^0+YtVn8g=BGs(Bsp z#y;CAnzd@p+T^!{4Eh2V1ea>`e>z$dZL>!YOtQ~SY+^;A_To6FbB?KY69XVo0r|h| zf&jGpb!e!m$HqUuK2P!n7Njht!D2@o21C!HttD6iKU3XGL@HTgb9{s5!lGOzc84D# zQ}7Rtf2p&#)NAMBI~?XARm^7;OC}wFGKnU(tWDZT4X4;DFui>{1q!-d<_&+C8?W-Q zbpMV#?bx4Pslb+c2!`(;Y$*YGdb?@9txmh>wWM`QZ7;%xqJe3O*>H1pD{s=TIYudH z`{VH;xA*VU*E=FjoRm3v`j-+JI(;-Yg~Gz>wj3$PWKZCQ4*fO4vk3T?OP!zU0(1aF z`APb$au}bwZLm*sq=g}tn&ubrp}&&OMZi?i+{1}pRU^5>e(Q&xY|GF5J0DL%Ul&Rh zz~vw;FdT<4r`m^P8S0}vU}MCJmdh(h;{}W%UciWa7$qB6OYWr|eOOX*1KL0^{yK$y z|1_3I_<+De*E1fDE`Y%GA! zjf636t^6{V2S94^op6rozV}6%`e4ZZOtEn_;wh zo8VB*EA5y*kYG7=r4sTnKW%dxPSM+!@5nV3RQq&OosSQ`4QfhoTTSiHa6&V2X3gA& z2EDraOEIZ&ANs|a8H=%poT&a`*pAuweg$BVnOVRnH`_*chK5Ww9G4t{NHaspK!mY7 zU~7+U<)iAo;X!(`Gqb@STVbuZ6oB@d0C{=?U1$hed>n`gi| zgAD#Boe*}ia=LcSl%8HdTs#<(k62+1KUtd;(Yu|;ICG8~s$gL(Fp<~SNtc!urZw$l zZ=JiHOs;G=wmY1GvvPSELfY;eFW2tPz(bEA1Qiq(h?wjv?z3iLJiN7O9lR5vPS=k* z5sIDUpC@n5SO=L$F27kbFY-H$x1q2ufq!_(ZhqhFyg?)_K|EyK||_fpT~;%Wdj>I`0Jr5TAsuryWd znL@EO@%#oI50@ua8SQFFnBIdv#l3iPQ^mdz`{GI2N#%A`(PC?Iiu58$wa@*0Kuew1 zzWLlLxMK?~7IZmEMuDSmjp!0ID&mB~lEu6=cittCgy#A7J^7S8BR`{ai~ogaQ{u9p z{;WlJ#};LY1dmhgg?vorz$lfC z0hFH|CO=I&4S3ZDoib!^J5DphNDd$k74Zgqnr*AX0YUh0P-Dk~nwd7cE;8>CWN7W? z6?y-HZ6Gz}2xu|T{*m`P#G4YCK-~`UMuZn{Bd33gw~HDyfE}6tPsrB1VAn1x=7q~Q z`~i&(IG3!9p?Ivxj>FjI0@5)N-72F1jj~=*$5yNEFg>Vs`WN6qtVY&L`IPM9G8y!coxa|%&oJ^1d^CMqNZAArO=GYmsrP_17d zoE&bhV**={Bp)~X@DlfMUkLjJeyBA>Zfy=J(a_S4Hd$Bo8esX3gj8n{C_1N|DM-&s zmyaTOJ#s*ZaXSTpip9*ALdoGGtsoLw*Y>V1t;6f+Lw>>Wr^Wf8<+bfo(-vm#HHMQq z;f^KdkRxGDqyQ2%m;n;~f`3Ee*a?>TGL*_ei=L<02$cPe6>$*L6FZ&j;q1Qlc1D&4^NBXKCr$M4Y54B?;!oJH;y}iS1Q;15_V<5L1*8OSqX7zj zx*h30nVdp&^l&Adg)X1V3Ee|VDmq%t9R_4zVyqJ3nA@o7!Np)*vET$#YoL6iEp`J5 zlk~^XR%t?_8^UDJ<^CAl_TdrchMjA28u3@Dmm#=CkPTgrYf;TP6HdScZ%E%c2X2vp z!EVzwV^dRUt<1#|wxO%>U1h+TU% zYoS;haIRINh-k=omXXS(kfl2{ZY`h{bO9arDffI@gG}|AyM9s`5Lwwv@Wft?6^Y zfsl3m?=w0YsbVW9xxYfR?ZJ6=dU|MhSb87PMy3wt(<2go5l<1_YpULeV3H(A&f4jrBu1tT5Gb(keV+r@v3_!

K3h~` zyU>d7adxILf+1vR=*kw4I%W>G*ozs3bT$Iw8^+D>BQT|&Am(?32pvvFLcw`4nPz!@ zNR-VyIYw*SLVuL*s@zV2D)<{^$FO+(F_O-t(5ZC&@bRNWh548!+JP#54i1UI8OMfP z1<25$yg-55NSg9`h(9=oKdNxiZKZ@czG6w%=Yui|Z`^ANMo@?>D|f^3FzRi0Eb&r~ zPX2ZSDo!rBer6jm;sB_;*(PWq@+ z*af89e=x^nj0L2$0ssYBC2ls?S__B1y5QX0nq?hK&j<2#UqdXY$#QsmTSXm0{K)Z5YUHwgM0Ig-$y}vtAf^a?Gw~uxbbTzcdVu zztMyK6YBLdC;}d?kqskKS(%}H3ACmpsWHT-9?sHfoU8kXar#OsI5Kse+L5Z9d2TbD z*p?G)e+_y3XPpP{kAWvyd!#fzUIqf`w%ClrVMDGI0G#gbiEGi%xfMBr0t1f=VANdh zgVyTQy|1Yb!E7k2Qlvt9FrQm2Q+K{`;}YnA#T3zEOKlEj2t$7J&gggV_p;YE!JLm3 zDkLvI2g%^zDAXV6E?rz+M=ODe{Rf5;nzEmpi5JW3)>7~#saTPyG(AbeLgpz%O?)II zNpIfVhZ~fiuTL*9M~dE~qDw$g|8wu)&$9qvbJc{g5kbkl+2&4aJPMTp{yPlU+RMhH z4euZgKX52xs$F|<^PhTKX{gIJ?Gq?`eXt&|` z;M<_%o0B8-rT=uTKC1r<(glRR`fW@liy8jWwyJHZ4RG@zq5lp|W0Uu~!k$&BZN4|32|Dt<@jJdJ0cI>0*WK%F zBEJ%Qrn$k|*>%Dy6u)=YZ0y7(UubFsP^i{EaFup3Ll8k}BQMXN^N!|_#Nnx~4909l zB)I84@4oFWy^M_JGq)H!2?Z$)kc)`w6U;@Rjx_X+|I23<%UUA;tr#1dYfzQE_8 z9xwI|j<4uLf&nYNfOp7PtE<`9ZRnk|9ug}5cesn}4~G0LHx)h~Yb6N3;4Z?zEL3n& zbusa#i1sk4!Jq%3t)ih9T8_)e$fsDICO-~=n&-uDaP;=-)l(bI8(26L&su*g{W$xq zav->1H+>`i+1H>XkBGNR;QDuhA23MLwYm;yYt`uID|$DS+Ldo-p%{z{oYbD}FO^g9 zkH)~kd}qjfcBJ`=P%tuc^qIQA*b?_%8S`>SX$aw!@R8u1J~#Wmpd5)`Ied7=e$n`~ z>yaIcxQW;S9&PoGGUXv(!Y%TLXZIvlV`;GMp%@6~qs&FL!u~e1w!RpJvFMXfihHK6>n=tUNSgr-1it$ZZO2GBk05zv z4tve#)grSX9#`XME6hWe^vXgtP@a`Tj+9gS>uZHvp7%_CS=#0e)`XqHN+g~z59WxD z{pxh@iGm?YM6>}%#NnGlHgmiz!$ZIvbapK|ba3$n7o++lZD+_LofwBzXwMlwhtL0P z;cv6ELfe(e(Fgyy;^a%vs_fzc(+bqZ5BL&~QcnOMFchB~<-1YE3jiOX(64k=W>3{E zF9L|_`B0(*C&-1l^HQ*+A23Vtd>cwZfC#~};E^rlZnu+an#4RF!q+R@xGrki=4@lJ zZGJU}{nUeV*re1;@*oEVnRc{gA?tx@VbU19Lm4O}L4fynu5Zh3HS@RR11aOG(jV3L z)7sMH_!}L5bpf~_3WL&RmMs~Va=S08U37H~%1?&(&{GmJGDNxgVWNTU8TLeV=N>MA z^0&r+U6NheR%3V&dco!jvl&dR8O_*zAODij5V=8RNUP9Z_ z=g@ZBGE875o=!t8YIQT@{tItGs^R+yR!83t+8#Vc+WCITuVt=$ z;bK$Ief9BgD=B<}{wzrn}E@W+zW2cf4eOBE%61-*|UB zxfv?2#_osa3#MI$Y?Nw)ric@~`#FO>)VSVXa`QxVq1R{R?c<1NG8BkT7Yt&a+ zDSAZ`orA*7A7RHNwIE-1twBktSN+*?^oug@=MfyVx96plxzE;EZ{bMRkUbT4ruA0? zOs=J*^rR%rzl=0qSX-!e_aORf|N2>Gf%$+m=f>RJnKscj!Io#mHVXRwx4Jt zPB@~u`||9G7Wk6CH?sJ@1z!eubpUyvE=hsONL5uCf$;RiZP?hfFYQw<--mxai{tp) z0N)n)fO7XH&0qfyKPsg+k#cY_P*v>{lV{y{{p1|0C%a_ma`VZl#voszg8ckwLA!^M z2Z(>DQ(mbkSYJ<^{(Qk$7OmYmHQ?(@Oni9x$Y+hEry^H_td=g<>0~x zWA39g-}Q8`GF8tb>|gfuu!@Oo!Vv}4Xle21fr29F}g}JWIlTOp03q1t#8AD8;d%An$ z{(=+d3w#MXpU{+v)cDqBk6Q=QN;YIN!m#Q-6ppSA4$|Rpdajim=McFTn993q?srl> z-|i}Y_>e@)!)%g2o#YS?cFxJJms_ulx6*d(>+Psi4yosWgFGy z=K7-;n3|i4HrAF&4lHO_iKz4LTRTf_*qbNFYXx^s{{K++)^SmGQP;4AV1Xlu0wO8h zAxf%*bT#OxRHqma&p1TN+e;#+AI|M<8I zNYt7O`$X;0@0&Tt8#Gf&MK@`0PVM(4$u_A|Q`vW_{2TOcNhp#h}S>-F*^qQzCNLM6$_& zE=fi)Gpbozuo8Ld!Y}B90hVAUl6-?ldS)Tt#%9Ox;3wv&I}_uPzV ze^V21)Joti^{m{df2#5^bLmZbx(&55IHAsXeEJP7rKOE@O*O(v8%*AYp|cAMl_g*+ z-4^qIAyR6rM1w}F^wU%SLbPr`YynODa`z8|9(k$AK7I*t3Nrd)TAG}lw4$0&NKS5> zTAsremz!Pc`~sHo;)nExFvT3MT z5n4@RD)s(Y6s$7hc;(Qb_j#CixbBm(TZw>;F_P@v3A`D(IiQu>!h8n}Ek7TYS88TN zlf1n?L)Yt7R(|lM%&DFigWSc1@y47hZu7iLE@GKqr8!C}2cg5bu+Wjhlg=@-9QuLmk>xS zQ90XEJBI+Pn|9r@9>>ei>hP6I2!H|BKh~eIv{K+!7Md;BA)c)64JP z*_p7y`U`!cxqG<_!8`>#=21iQmbNxi4UK)}^zOMHF(S|le9QfJKu%)OC>1<^8816} zshrk!Zvh5YU^H>Ccr7uYeGCj^QDR!sCMF2Zi0-9%X73FwCOz_oyrbTiW^LYzSPNzp z_;+5Jy!M#?2|UU^)!mZ6MX_I$vYArE&+lI%MVQ9cqU5MCzM$X?8)I1@>Ot#vjyXmk6L+qL;JgLOrO$=di>`fFy z@4?b z&-W)?qq{jp{fRbGBrRh*l-8Lhzq26dpu8>QK%>0;JXmA@fN&x$mBZ|Pt0Z956!LlT zgO=TSv225EJMo5^fq|fFbOHXj^>U$8CwdTCBvse!!p8(mc*!oxA+d3!;f&im82SR= z^jPrXa>kt zp~G}_bRG^5h_<$Lj09^Q1QKd|vmPfx)Qr@p`voeQ>V?L!uy(t(BgW)OnMn9bhL$X5Q%)cHCmzk*)Lk5Z_b#_ zrl!tXsPHL$y%WLfbSJWN&I+4SDEl0Rs&~+5lSFcd+pa0;Cf|Id5Wd#|8LJ~W>?)N* z0{nygZ<7);ve@c?oK{-K1K$rPvJ)0jX)ySz!886_i!t(M!2CI-3@@x}o$Vjv!hc>C z6)TkCW7}PF=1{VZztEW$lrg1ddatalF?@KscdfQPIahgqzBj<%A6L28da&d@j%J0k zyd&FN22Dm;9Wa&!+_B8*3&ue7Gi-5?lFOr2C*#=^NS=#6@8t9sO5Xj0!?e z-Jg}K6Js_G7pBNXH`dzuz}V_$JJ(d`E+bQM4>@u#f+@vu+CuLfw`CnSSI6JhiX$U* z{6=hK@d6b*foitAzWpX4gmZ=@~7i+w<((hQH)rtJ*`6P_|( zMB%7cIDbx(Fvu`TJFvlNF!M7RD1yS~n>;v-nxn483tf{jG-k5(ase~K!iXHDOU)<( zvY%p2g@tK%rDicXZ7*x#djBipHoiPte?tx9* zN{=Dbzd*kf9#%)qYh~o){*-8@7XaSPP5M1DU-*8Ra5}oGd@f@DpbATm$AP!@K+4(F zG&_&u{@H(Wb1ZFQ{$fuyBqc=*Yzb=p5Qb-*Sr!I$U}JPQHoo7lu%AI|lhDx{{pc?_ zgG~P)bJ&O|W=!*v0@p>+ay{FVr80m1T=n5qy%+YND^CHz)zwM3IMACNJM!)Uv#j;z zPf*NUe4DJ1X<@aXmy$7$MSeg4KEbn+JaUnnH+vTs%M!^hAI2o1VAAL-?;( zV-NPsU7Sz66nc`a-Fls<7@Nh#)F6a}_ibK6wS`j0ezERuSOjin+O~HzVg&BgaDvxK zkHWb<9T2cKl=a+obdJ6&FW*vdbee^Abh1$gY(RGW@ZqhIOc{JN7BZZr@DAt$i%B^S zj$13fmrn0xU6;s}j($0pZ#H%(2`hATR~mo#uY6k3%&6v)6G*O>DXLUpZEZdO{ym5l zqh!0IkK&)Y%SG{g0#xft0A=_TqLz}HOo+Sj@`bg7E61r@*$kPv4QeR$#4KSlF9)cK zx5v~#S+8crX~Vm=zoqH8*-KO{Xba%^edZZ7nxVYMZ!hW^m?aQX8=mF62ix(86gC(# zqE#u=8ro(huU<+?wio6&Fv-tIq`fg#Q$svsj1Oc8b4$zZ#cz|>h=Yz2_ddb(hD<{b z#6^&~y|z9kb(eh$*bWntk>R{nr!9k$SimB><;`{6kKWR^77G)vz*$3cd%qD&H2yZ;u$YQ zy>B(^F5&0dcWP6%g@WQkvAJ$rDz2cftL>(U&hEDs2~Zk}NWOHI)@uw?8W>QY{^W_c zeIe21yxYVzI#?8J(z4LPLhXK*xTvbHFOv`KR2HArudcdLA%74$y|)BiAMB5MyTAg1gGLM ziRkX7iyOMX5_z!&Jy|{fT`KR91LAfVdCN+x}~6%oo~oKQ&fD}mj^GNiZZuau-e-+ zKS)P17A7WiQ{jaov#c_oO(+yKa{fCrFMtvU981&TjOm*3(1hU{jLZ0z2ab0&brMml zV;X&dp-}Ncn*%b2y^VKn?CWCLaYU6}5tlBl{rGW}Gt%L4rMp@A&JEc4i$$&Hl8V;*rPmrPB?*aheef@@G$-EL56T55nAbr6;g2?|xo*bQ&CTVltvE-~I&BzqR9qR6 zrU-NYFgtV5QkKJpZCExMJ35fC24;wTjN*yrcH;EzY>wigrZ#j9GzBP27)+3P3VX^r z9hVTVq&O)Ra(!ls!pwAOC8UrJ<%%zFO9D@IAbbp_P^8@_2-V);q6V zAF#QoB}qEnr<~%!ZKnd^!@!&im45+HJ8Fn!D=}TK7Cj*JFzwKaaB+Pra~Mvv-CDE( z8gU)2Z{E3N1u9x;W-?s^82N@snM~Zm|nM|fvGQ-h~^6=xZ*@(1`Ddz+@(cB*B$ z+eu)LE%FumF->6sQj3#0Yi0&gFR5rakk^`VaW(BKSXATV3zbe|(}Onl_rPLnbR1{5j~QT!V7hrEf~txS_$WldC9 z&)VLmDDc$1F_NIlfUZ$sMT5FYAYF!yjIL2aQR?#5_1aoHFmvY7iUP#AFBM^B`*#8z zeF(O6MX0t(E%djUcf+3?nw5bXyg%#G+TtH-|F)xroX4%z}8xI@q)izzY6 z6wC!Bief-UdcYHhaql6TM@%3(bi5>~ic5 zz|dqC?dtaQH}a|_jrD0n-W&FWbEX@!JEK>35=@vgAJly$xOdCNaX2jvWA+*2v-2)c41K`h&=M^gig?}Po`U&n;6$R zD-L!mY&^yTa$u#SREH!nnY4e`&fb>G_kUhY89`cUDeWGAjXzzI@%jeg zb%2B-2H-8f!q_v5ii=yEt|O}5+B6ljO8=8HE+Ra&eBlr*F?byQE}rPFVe@aTVT-BP zJNUGyNdcfeo*b4?sEo|xz`&iIouywep5|N1j3_*LUA!TvPs>m_*Z-(bC+>zpKtKl= z0Pxb~2PHplJtCPVL9H@gV>Np4As)6iL5pUH+j)A=JQ?63=5@w*!FB6EeYB%|bukgf z>&N}xnR@by06SZRu&CTUr@YYAYbrOhpr;G4N_EVoox5TVXt!?9D$U;sZJ5UnN zgmEquIs{YVq{nJ{DZo8~HSC+3niv3EU-cmoP{jafl<$3g6RE9V9Vf^N=+~+rR}~bZ zy+yKPlrkx)K?w(+O=HXd4>#x41Q0v3qzn`gcN3W+i^LX~uf`>qwYULDf zrbCVpyPsl)mw`T*f6eOcjhLS8^BygCde++ut_#?#N*S;L!`@ zlU@};*3o`5#N_;Z_2u#%{pc4$@MuJC{qV3c$YEeynigItp7~@$^2?VDqa+tp$WZp% zkuH-fHG5?=3WB57#|p-yV~64~13U>zT|jJN!@z!>r*n`Xqn&$J3Eyc3HC0dz! z4B=-Z6K>|l?kmikOO8I^;9?7f4u0c0(t@4}6|7% z;Bp02-dFETH_=@(Fi19Rk3;M<@6V@?UJOd0S94xk9CDbJMpRb^C+Z6b3FUywZ<8EN z?u2MEi~*%YTPw*I1ymZeqtT;awkeX)Y>4~kR6p{&14QDlp8zCz%*{Y&4ji|1)IB^g z6b2#eKqd>VWdKQcyDLN!?E-3rYwPOZaQN2PXw($J6WHRlnU!tKAk;#JZF(}!c@>I;jhWdot(^3{t{M%#c@>2xo*-|&6= zwrm?uCS}_>!T12QFiS@BG7x`P%j}kjxDB)aJ?I6Zn>iSsm~nrE?}ZVYJ_v2r|RpbE4}b+{+}{>b4xHb2h>6cxZ{Vcms$X0iKEjgY zK#tNy69-hm{%&z9M{MoV(EcZ_^0-h|%B*uh`zUQdvMLr|(zxaU&(-904z{Pyf_EIT z+>atw?rkFll+6dKQ_|mWd;X4*wN>$0^x=ljrHl_+;HB8|?6GHVW^4EAEj&Z-vGj#(9nkPZ2RSX4_Y5q!G9~IL(m+WXj6&_1cqMS%oyV ztWVNQ?bg7A=w}~)ihBXk?FL6+7F(V;*r{3QcsP3y^i=Q_r>9@dDTby$G!t@!n~#py zHf9=rVHiHkI6VIXg`?4IcdN2je5H z$pFXMV{>tFSqoYQmHCl`5MndeTE~}~$G`LHRhgAbwoocH>u~uaKKS`HY7V?P6#|c# z-I;?XmukJgg!3M6|C^kj{S*4a?msENJk@TW3%KmUh~T_&4JcAxfVsb|Ek=)hv`-O^XKdG z;thXiE;6bYz#C=fcun_T#KHv&Qlm7|r6EFz3e#1xu1wAGg@uu&rNr(zSy^1UNzjhe zp6qi4V>zjz+EWI=I=MqV9A6u-3Z>M`Q+$+?VQdjFuSS&s;MkDnrEB=^e z>k8+ubOjv)Ko181ib|uH<>h3aEJve16o}EXW#{J<{V!?`j}*6+04x zqE5QJbDz$TM1pqePYI3Pu*cHV&%x*PeSB$2@J2cl88`Rt7mj3hM>)B*{_EgAuIDfy zTRZwk0|+~s-|Y-q!P0QR6vIQ2+5k`2iDmdPvq%}Z1uiQg(QqwbgtfyCj82BBv}U{l znDg!v(^HVM6?#1^8d~!p>t0rY(dY4651G%g+!bwOf@yPqOUWIbgh}^yGt~5QSga1g zBc;?!FfA_e;Sv`pBhPW%6J&M!Fx@#PqPn?tTxE-isuG6~Df|W^RYD$zSo%uwVp*Fl68&KF;MrWwinAW9YsRb*K&?W%<)rQvBeJ` zu+JF?-QipZ)1P=dA_!^j8!QRv>XnHxN9vjBVoZX`P~`pR!B=_^VTpNMA&=exN`Rf+ zhEBFdrj8R3kTiG0KG0Ery9_(}P6-Y+lq>8X7 zrp@(G0Wf&<#^xwkvDqldaRao@SK<0OVHo7P^auB?y^;+y3tSWD+oSaK`eD2`!*c^G z*a?(Z<@`%7jv`w%!CjqC?CAkrXKucB9}lI@<;WTjU}1e?-Urv+hH4F|uyPdYov#N% zIH(8{u;2EbN=+qrBzfDA$}TPlmTXR7#Yd69YSbE0RLHE#PIh6xdgWK$?tVo@$6X;1pZNgD_0z#5 zBMjoR8ujm=176ujv)wjHLbE+f<5+7QwKhA`TK=I!6n=oV=Y`&0U~0UhZA@-mL;iB> zI`Aklez=>3`d4Z64?~sEU>R4K^O8Fe$p)lviW+0Vl!~3KuQejL1M2IHaT4fw)`?Ne z;cQ(Y;Yf_6`#X?73})M$6*aXtwFPJ#nrZ)qcEMIof3*5bYHBkz9yY5#PaqS}GzI0p zzi0rJ1^aF8BWsQpvTnG9O}Y=iC~F4lSDO2!R%!FFTfe}aBDpCk>gEq*|K?9sS;%y8 zJ@ZWdhRdq6zHC;rxep&MWrye&0i0BC3ZTtJ$d2G zGU|g~a5Xi<>oYeVL>8qT# zv|OC;X?gX8F8+fL-;iKtH}H@d;E7e$a+=HqK#)Xc?U8}!eIh0`FieQuONk@xA1o`( zbD6HZfb!LOd;vmrElN&>rqbBID*=)>`3~~Mb zwGXh+LoTlD?QpZr6}>qA*q+!w%-(-2&q;W|Fb%*q9}~Jn->sr9o1>6yk*sy(TA>K= z8$GtIkg653qPudSU05^5M`FWArZ9REGP1YZ-E3c`-d{fY4sI>GYhkn0$ObyB zD}P)Jl7Hw7XVM%#>*~r|TYDwpekFk!Tz{a*Bb>uW1s}+)3xE=jjot0mEG%-pXILLJ z+lTMpQ z3Fl!z7+je_{J0X|$5yi3UTWaoM(WwEakcI|}T5UOxIQd5Qm{oC9_X(&h+Xf1P0Z@n^$t zEzQ(pWO&EEGu76JOY4mq5U|o;9~SdNI?Nw)Kvcx#Cq&&4f`>uTT1)JEFE+mbrJEhSF6Uv3Rp$ zw-)*Zm?enm8i+%NX=hFeGt%g&83)J-?5y-l1>ftBo{|cN(`P5Jn|3yO zfR~Qs;=0ckah+1Au4(A@UEUt8<&HTkK*!SMXJpV@zsfR*kKoMz1sDM?aBro7qTNyL zuN8>mT6nU6YMVmt7I=qG){v(bptV7vY-mUu7hg5m^f4C3O}}S0ND~mKVkV?K%&!$A z1>C7sAJBjw>IX|#o@pAM`PyXm%fS--kD)lxypf%0-2p*;AOR)>rWgMSrYqNHJx=HK zcgyia=9>a9!XrEgI7Ar^ww(olX*aSd(haZ}*uc-dKyEh7>%6MF=3%l!|7;w%7w9&= zheN{egLZ}$huM_7@?;chrfDyQd`ZdPCS)3_f3vP`Z5{cx6vpueNf^s=xIX)omr?mU zG;o6fjSankFEI}9ar@lRpopVH{1>Xoi+ao*kN*_{Vqrc^AfNaG9_0IwCI-eb=B1VX z3dGwJ^L6tqbdO)q`7JzgBEZ?9J*=0qLfcIRRqNhcG23kPT68|AJ zy8iprDLV?AH|@3-U+k6Ej#4t=#lOuFwU*7wZ}~W}Od{6Q=s1 zP$-gVywGI-o3)K!jHjo!cL6xRhlAv0{01|ljnf)!mYm&318K+fnC7#KumPjxyrD~ZC=U`u` z9Uk^3r|LxyYQPA*3wXt_u)3WBw_fP-@^t*rKxJhVJD-&i7VXyz`pE#eAaxj|qd+XU zsqIqHw=G<(SoeFV+zqf5PxnMY@+=wuazBYb8+;CQO0~i|UAJ$*4a`yEO{;y>Kj5u| z0|eQA5XR^>Vzf`HP`0xhlYkya!Z~q+UIIKf@OP2C+&H7?9ZCC}D1=;>^R){lE~p>z zOE~0-HxWdu4Er&dbo9t}TT8VW{WMhDTq6(`LE3(Qcz@~c-PP59cU)n9 zl@C+Pb-m{z(-xbk1i@xy`KxBEe)#AVZVyy!!~g`_z39AawWU4|q%+ApZ{IpKN7hdm z$Dq@pes^~Lch}}XSIEDL#nYd$?J;XyNr^OE08LJNwB8Z#0*^Xs7zNd&$u|47X#-M} zzaW~XFVF~E03}3{<^j$H!&95yiuK35z;-C#!i)_c+~c?b##}()kyeZkDCjk-i5sJM zQjq4Kx;`l#n$7RQmk5Vw+{|9?bHhYu@>xB(B&vT&jS)N{L=}So6RIUCV5%@a_$~gB zOoOLJH7g?lRb|QD^b{Ex^l;W%PCw_jCv_zDmqFB(19EeM~ry-_7iGWb8UIxv-u45#H)?czRjY`WK5+NCx&&?K?@DAT$iq}0-Ec$1M!i& z<>FfdOUs^#dbGAMu%|T~%^QH`2+AadUCn$NUN(8YBY5P+?}3LjU&rrETQ15YCc_zJ z#7%+GH!(2BIGS^#HzHz78Cj7c6;(sTf1nY3f=`4!H(qTD{O>hoUf(Twr44v&;$7gA zx1P6E%f1v)`MdbICj{B3v3@o!){|#Vd>R;M)fQZkT_){Rz$OeMNzlL0xiq-P00S3? zwP&a)=`+s*gdmO{YFZfDot{xmHFot? z-Rf7zuu05VRqSurM1+J*MCgaGN%~o5J*I;FD@)54Ml@65OyFW=pwi~L$t7>v+O9um z|EIdtquIAv=nL&s2mTn~jM*khz*Cg6dDF@DkmqGeMjm#UE-<3R`_j9J5hTFp}uYS}WP%i@7%o)Q_ zC|e^t!|O!D{g1Bz!V}*v1h9vOM-^s9-l+<6-p}<rJgc-t!dno0^Y4BVkS_ zeCPtZLAXE;{;bi+j~TgSUa>Njc0Mzz<+n6lv;~10T-W+ejF0xZ2@1oLZ_-bp?Lp{u zRk#Q7TqH&t=v4Sog-&oa3M4^b9svf7mH{b=70|~REUa<043FO-uJ|G*bMpz7#8iy&z#1ZgluG~X;)y3(oFX#${T_ow^X4rq@d>f z5!TIC@bcN%So?5mYb8+Jf&JO>>;)cye?6BG!@i(o%UNn zS5*akLe639zDwC?l*g_*P=>w9NY8;D3xFw-B_n&@-Ugjwqv18G)S@L52kl*aBgTmiaNdlfZ*lcaVU=j9}2_%G(;9d!YePs*HX ze*8N|cKZ{xf{okMv0*8^0W+aae&d13#>Z5sgwY zoAWw|#;wx;ILb%(=Y+6;{T?3BzIw9_7#^OL*_T^l`Xr%l7=TYwuqzWrpRO;=iC)oP zVd6tL0n)=UR9@Z}oE{paYsllu{4ugJ7ZPI02tZ4`#}OSnv30Bka~LbGA@YJdk@hmQ z<5sr3N2)uU{oa(~9=h3ywE%!+2TNNoIVYl1~(`V^(Z%GUJ3<-oS|obM~C_=P}Qqx zb$1ix7n=2+bp>(+Y-rju;>L_LA~T4qfo~=!>?;q98yD{QS`2zLFCQ z;Odgl9>Q)hI8KhQKbVWwz7?#g%!f^V7EEQS3r6kmBp>S!b3Aj=c8`P~Y;NRjPlgB4j0W%szhMg2Xv*$J%*{iKze& zEqE?4Dc=B3Aa&<`9qg3qX*Wrn_W#YYk+oT z3wXh+htU=Jm9k%rtb<0C#4C`#*M^q-RQk1t9d=y#vnSOq4~y)1HRm6v+DS1+p7M>( zdm5yhlP08oWw?s5T#%cqR?PB=PmI%kU57E#8PGT|Zv(I9o%S0xpeGI4J41gc>+T$d z{(ex!rgt8>?cTX#Ns2qFz|IlxZ@Dn)5b#h*3Yo(gyff~InZ!9OX1&VP-2f-qx2tsJ zr`gYs-bHq6AsfNgGi_%#>nIiY1V-!D%WH2ze~YYYTFr~1QB3hUm-6QEkYJq@Bi zA6L7G`#TdW2V8a++G4&!sPb|Z&o zTnIjBM=#{W!`+(QNJuo-D>ObXxv!n*$^*oqsHwpVc&w_J*ZT4N;sD6Qt1B#t)&nIc z7;ysb56I@ng&uWj)$8h#x8rL_vtY_MV4M`&1=`pYsyj=4fui90LGxUFc0SSXMlZC1 zldj}>Rh#18Fw#}TCaN6bdh_)85oMjWs~Ib(mS!% zgU3Vv0^irXHeHs@=@E4~xdzNDSK8gNu=JU$Q3KF1Y<9HNs*mYQb=gDq2(Q9Lr6^P> z+kgDy$GNbkkB;oEdT`iV<>qe=%4g}B%GTD{l#~dwAM$Eyz=70!8C+yDHqz?e$$emZ zt4t&KFlMh0BWXm7V;XS?t9N_cEA&QUDE^$xv`3PRrCOVr6 z!uq+BuzuYiwa@4;&8F3@w3M5b-c%5jLIcIjNJXEJ5TyA-x-kzx={dw7;ieq8Z36eb zCC>)RJn}{W+$CZ^>iH7PexSQ4rUR>W+*=rqh>TR80Da5>tX2RY8Z6s7>KjfAf&7p%Q#$cu9yk7;-gY2-k%VmJjt8{x z2mhtzTt|hJNGZpj?N1P0TO0QAc8Fqpa|%;)zCgMuy)P*asUdc#NoY>r^h}`R5VUN1kgChc~GyMP4B=Q zAN3INpRVV_`CeBlsrp;;iW6`!u-@i2WRc=qK%&Z-%PHGFHpNK|~(kgE>dSbCuA2VnFFe`aQ~UW@De zAM!#la_*I^OJ}1iW|{Ox0AN4aXohqp&$O$gJ8#a5fYT-4x4QPZG1*MBJAe}5WKdux z6~&_W&ZGs*x>${JYYhPoEYKo))GzzpANb+1DFk-GrZh}{wwG#a2xbzLZI6Zk2yvf1 z5Qv`X+iZ;)MklhU&4f_)|(kZ#8-b5G==1K}1}aefN&D>Bj)N~p*7OBDqeAB#*NFnY#eSACvy=*M zzhL4J{0W2zc>u0I(r~7XRL-@6kEm48iGy_4N~(u_d)T-R5bKYf^(k1mqFR>u%8AlJn$)*M3>7I zidNzWnrPrLJ|6ZD9u4yOKZ!+6xH~{9Qj4Pvg9O?CE_(yqaX<&>*^tLdg#>t+?%35$ z=9-V?fB>yepsc7k2?o~a4NppQ0H@5cO8?f2KvqcT;!37r%V%7M2wvdWV59Z=6R49Z za-w24MJl08OL!}Thq6}S$$!UrtyhR^IBDQJ@hBt&agPzP_K!8SXHZ%>@_=CpY|3SR(Pt=aGjOEY=|@6Ywum z#wZ$)It>^KF2mNZ+TVD^afB~ABHHD^f4M7&L}Fk7(}}1b_>ZWc(*%7n*@Ts^Inl_s zUcQ9j3LxV{KXc|cGT^cC&#xqLw+!|#9~^7P_y zFfr_eekl$y*AhFkznV-eOly>e_ZTDTgGFKrI--9Jp8e4+MaCH)%$FcLa}vqJA^Ma* zv<~u;M}YtG#K7d?0VF-5GL7yOIm*qSzrdgYKrO|`rSF&O{c@1@D+)vkRtI$J9%-P% zeazkX7L+SF5Y9ZW+R4205Iiv!!AW%cZwU(k@%NuLv_#r`)Q=%|rt4k3{C=pGJVI(S zmTxyc=`BGPy)M`fxS(t{$%@aP(kIg7%y7 zW|YxxJ~@lgc$Ht$c1K_Awo`636zyl$AAX=kf|Jzt5$`OpjD7hM^G{3A737EQhZ2iR z*c_OTXS@yH)r1eblsG8)MqfO0<`vN~*gDbBrzrnu=(A@-AW)Z1xK!`v^cbE_d1l#G z}JOFZr_cn2rLK zy)TF(T^lrGiwL^?vFna|*k{fx5}m9vk_yJ)TTABIUyLOp*?;riK8NhT=E5l*4xX#u z;sToD_V&8V$a|T#1oqTSzLJ-NPjCzKGpNiny$&1TYeac$L5v^lR)K|=9VBbnwMQ;Z zOo6RsdHdu@qeL!u=XZZv-_=sUu%=5`W;@zcDPO1t+jBE(b;oJ#Jjc3@$HBG#=Hu#9 z6sZ_J9!67sF-Hii9!iY=^4Z>Ot`erpZ<~qvsl$chJVDg|Xm8gDfeZZs~-rBBZq@DaOU=#k)@9oQ89vM7Us{V*~GQ9Wnn4^oW($Z09 zxP8}#@g|O)7@TAu1J)kU_h0x^iltG9x!q)Z2nNI%bAcdgsCH_Kn?^oOR39ebvZa?v z(jtyEI`Mb_dZS^|Y8%(VG3u=2e_C+$fNxL3XnQ2}a7S;ROf5VlBC^k`ookB1I5LqB zh3(TJo6X&L9PUH$+26tPvW9_y-3>_kV62u@TOHEj{_9hrN@WN$|Jv&PT+pFnH(E_~ zd3F{P=waUR(%%iHw~$tHM>{&S?o1*pYwNfuh277eXzkHuu^%5Bp~N|HU221n2B^_{ z%|}z&><<;b3t-xS+fJGPk%*^~_Q(FNfHepu4#Ri(LS>(8n>%HrX;6y{2`_G)Y|p<{ zy_@&!SV+BCK2Isxmmbr~3WbNXvS27^I|oEdQqtrWAs`{D9MNIq84Z96P|i7=*tS-M zCJtDB^2$=_wf#T74!*1CG%+|RI5XiQ)cy77NTrV zsSshM;*1HZI)YOv zdNuzS346;1j3-R&@Ua>-bdHV8-M#yV+12#yG5P@<)DeM8f{ePx-Je>F5WxRr!;kbo zwQ;cI+j4w!snekq+weokNJJ;Fu)CC~nc$SQp>nT_kx-PSV)Ya3wUEQ$sQgO=In~W1juh zVhlsl}r7)vK(#Y&E=e;!X@nU76fEKQE}MS)9kp(sj@e-`mCHvt1rK8x$M6 zcK*CUD~n}?k-Po{*XLo36Hk+#ss`c+FhjjGLDdj*?+5^ECxUO<8eu?v^@-2pfi#|H z&j=YbxTzXkugdI!UNoCjhP&Q(BP)z`B?KWAU|+t`IR1aI>%cTin<6jD$QbPJKR!Nw z&DlBg3O4ci&ZtI=YYlo6UF*VWqXQU1oz$5o$yrkS%b=3 zC35gvk6}FWE#ly-O70xBHOX1CBrvWovcc~trHy!=<#fV$g#A4R8Ag`)L_)6STX@z$ zi8}^MUTZhc75A6E+~2}MzSkM_qfDdRY9{m|!o&5}<$)T5v^~g0)k}VU^%@SQ?>t2` zH(xgWG81}*q`9-r(MsTdgM~{S{tH%hNXdWYegW6vU#ElLzO~zhFg5BkDd_ zHpkDqRPUo)W)B8+B|aeutTpLMR}mnEK*R}q$p2jD*pILFcUyoF*|Hth21od&bee^%Nb*A9h_ir#LXe+Ka9y4FuJDz49d-5UdPc102S)cmMgaG9 z@X!Nu)JMWO!Fo|WXk_F)>iMDlnGj~imKa6WCk%yy-#8+0&YgoNNyt^eUM;GRes}Fk zSgxg9aN+(K7HzeTP(+(vVNmA zo~Nqn*3|fXOy#?G&D`7(R+Y5o1Kk+R>EC5^ea|c*z-l&)-YnKE^tja zw%|S@)F3Kpi4mjG!^`U`Sv*5yBc<@p`pg5ddILiXS>lI`72M=J`(i{yKEuvjx_a!7 znmtOLzu-M~1M_tf32)rQr3eY#Fd!n45$@2x5PPu6t~Ve4Q1jY;**v8)A%Ha6#|KC- z4S>aAs0VLpZE>6>`BbBaANiBfAAwQQG=Zzto*`epOprY-X^xn2n3B}+xjPtGcU#tK zQk?tQc&_3TurS%#GS8mzW@6tU3Duo2(_?=#4aQQv`_MFX-=r04J4L9;f=)@9-%1?Z z?+*;NQ4m^MRy8&f8TCd*gv1sG~cMKy|ej1FPFk8j-oC zWOasGZ!jZK+{FC+!u|XDz+6G%jhO51eEN`1WtA}s?=iTj1#ecmTz5qVEOq7Pmr zeB`M*m2K-QO1J6R&MM2NA98aCe^-8T$229c^z{WJZT5w^L8xhg5{vDFc+17f`!vkA zd3hN|{y@Lsii}KsF;9O_h@P%VC&2YsS>z?JC(u0wo=BC$!Mh}gPbL`%#Fdslv$hU; z`7#HKcYE!OnC9>ZI@S=^cNR8FXRY6KsvoN3Fm;e|Adi)&E%m_?-_`bp%=2g7G+j74 zQt8tiWFZdD@6tvj1>AAAjHHy5+`VsMUABnXOvlt0x<2b%p?;l}*JVnKJ#cEr3Q!t` z$1x-jaBV^sQHe}FDG9RFWu@w(qW%E^9NRl(4B~J4iaEg|>`3hB*(WH}u3WnsKiYlv z%p=M(hpC!a@hUUf`WIxd4frS65_W>{H$=ya%QLIIKHV1{yp8;Gtw(6%FxHmho%MW1 z*aIbIf~Jo5+?w%I3=UK~e5lyte}#Og2)wgaXRJ(E-DKs=8O(lpxD8^@Ix|in|2{ex zIRYXovEq6-1fNp7<-J>Q?Nt0G8G|No^^gXMywyglLK-f{n7W-kClYSuKm)_th-lh zTgf!m^782Q_4j@5^ini*bPD*WHb9~3n|;P);^Mnq-9+(ztEw zDz1QxjAEu_LGvYA^W)TEciZX)tJ~|jii&X)!q+U$MmnbV4nrI6NocEw{^o?pf7pWz zbkZ3!xBUL`UM?bX0pyFs#NqaLaQL&6Fn|9oI~gfyknf%1fv!dg>sfg^&+T2zWW+wN zt_QYVsX3X`>bR1y5=&@fPqv1MS!t`CkE&YhJ8+po03<#x=!yfeERBx(Gr}52p-+|- z*7Wbg<&=UEU25^T^kIDij!&czw2IpSOWLNUVg5NPbJsOp2)SQI6h_&tI-ebps@|+! zaNL-E56;Ks_n$5E^&3g?$zS5O!-rag}r3a=TkDNl6sJpD86BXTG~SWXh+jKV+nOai6|0h%*rHu{1je zPNGZ1&ilcSYwm}e*7YRMX6OsZ=|t(<{ABtk1!Sa2%lZnF>t>7AojvO;ms~E2U30@` zY3LQcZledtXsRCG-nKgvB&EEbU>a7~=e(#O(05lu8k*6jBlN;lkg~vGD_J#M+K-)& ztJbi+1K}!VQN#Td`pVlwxlJ44>FJjsE<}=MlfjRJOQEbBGQH&9FVHMijhmX91BI4k zh33V`|Lo~iVF{~+;;o&_7~K!Z-%Ok@JkH}d&hv_Du-_w)l2Qu}UN1GH4)f>ZodN(B&^8#}55po?S1*Q!hZg-97zl`f z(Z<;!IR0N69?Cvn?Wn^DCDJ)shMWH^14^77)9Z#&QDo{ThwEfQA^buL1?}U)^Hly< zYAXv0w^8m!aS>~3Z{LfP4K;R5CGhcH32||`EIU}Q#-g@ZKc8K+qZLHE)oe;CaVMT% zPH>uQPUkVMho|Sv^_nvC64AiU`7*e!DBM*u#mY@57e%}!tq!(!finesI=w{wWB{pQyfoe!JP zcqOYAJ4TusJ{lLvhSor=Mf!D224A8sYDAmLuyYy}Lum`3=3bwJ`_ft>L^@Rkq@*=2 zG`X@{tXi$lq)SzMuZA%F8dN07Y5DTyUKVb8O2f3L$Pf9PY_B3YblWpZ{6Pe5#TMdO z=^#E`l$9asu4Fn%%c?iz zA4hb1L=QgLQmnSpe!g=-psN<~ZVadIW(Dtt%{|8ZE(~7pIbYQ;5XAR3dTc#34!JGD zU$VlHn)^Qd03%a*R*nq| zyEVIQXFv89UhB?f^d?vN{4C*+O<}hDuME2<`Jdh3B>y|HUW!v?v}$y1;Z|mQ?L-te z-s13)JQx7)$l*g<@`$aaA-|zSpTIozUV1({9)@QTgC3;JgLk}`_P=*;$=iX=oa0dGpov!eZc2J_1U=VW*&a?ovFeev7Efx z0{cX6Axc+ZC4IB8W#k9e=iD1p8RZTul(?Zd&;ynz|4@kgxKw-77>qY_Ga^+_uaS{4 zZ?(+Wo%{Z>$XC`FI8||i)=C9N-qPrY7n7j9=^jngq=DzJ4dUiubVAr12J2cdZa-RK ze=-bFE|s(p2>d{NaGYai<`OkcD2~Szhlt9G-ED_5CE&082@tTe&4mXB_#yGF*r88Q0+H?(OZk_*-Ac#aW*+p?YSYzXsJJvc8=pMe!cMj<1Cl__fpsxJXSVdKES##9s8 z#IN>*<#-AA)YJ^;5UD}!8}PE--3q}Su>}_51qB!H(Td?t@jxpBy;FNs-e*C%ee>5$ z<$%Wfss9THl$BM@+8@33?*+AI?JH1) zaw?`Nm9{oFOT>8lzJaQ-q0HzjBz1`tP3eV~Q&SX_;s@KvOZ`__R4Uzz1SZ7TA&j-g zTv*!cGae}u_d6R>Rbpw__H$$Y?*1;fq@?lB!rDxDLGBkF1C!unA84t^y-ASjDyA~ox>(I<=tO0BDeZ<2m9 z>}TFMobGU{uW!U58wBvvngbVZQQS`ZJPG4=vQ|Hb;JT4BF!=ggEFbvaJ23O)WfI1M zXw$)aT*S6@y*R3E@mNBxyd9bgxk{W;!V!n?&T>76oP&XJS&>ZXKsD_Aw(QQv?!YHv zYHeyj8IK=-a1$Ougu932YD;53Bng^mf`JUYHQqka*+~OemJOow@WRKuF3@FqAoQ}D zEsSWo?C9;-|9U$QfR)7Xep3Ee<0S+P9>;0gtvH>cK|8D8&_H_G>VYj=bNi}n=*ooO zkQ!rHaBvrM+HrEmayUxP%-Pmk)*|~NL1knBLgHElRaME@EzdcxH)gB zsOaO&DO=}7vPeKu_JC4wzpDW8uI$p5mgfg(uJ(9b`c%6ZwSMW+Pdxkw?s%F_Xt(}k z-!rp*>y27=66yQTUk1O@=#H{=%DJHNecyQPiJi3nUeAq#G@UO;Z&rNF43bKlhTt?R z@1s>kpjFc|#ab*!s)cZ>*W+h3YA_q#@t(9*R4j{3FAyeNBXW^Eo-SlC}!U_9xfRBF}! zv(UtCVcqV)GK2S~r>7#jRSu=+N~3FREI5<)dj*A3UI}m@iEiZEiG_!hcI|h2b|6BO z){WCDmjtTZDzAcPKQ#(2SL}V2OQc1P>r2GBad<-l?PB<2FU5Ea1qMqjzxVde?3itAUl9r16PY=isW?;=AX?8H98o${ zUG34M@1FgdSw_3$_t@GxQiHFrn!Nm)hesM5oZS7rwFEMO0w3PL^7s@!+7jz+bU0?v z`yh6sPR(j-sm`E7NMwLfFBl{2qW0BBSJbIFxx;kfOKt&~ufqc)6Yi}h&M(J0H38hzRIy7J}&-@P0&L-Zzh^^e%z&z;jikb3W@F_=0W_qSK z9Vq3e7AD@0P_fN9Otr`|qONH^hG8(}>WoBIxtg%K7VcEy&>gk+L2 z$!0`-%yL>O$}yASH(3HJy52jn%&iUO#30&fnY`Rb;7wcM@m2``h2(RAS5tVKSAS?9 zeM|O#agmCJtBwi=^OKXtyXIJ|=@NH^Gvmo0KD2a<8kw*Ba0$#ya?bU>sg0P(7#)F3 zUjz_DLe9C9D7)&d!7nRIW!;DJ!f55X3L#2v+AD#aYo56Q+|{DZLsKs#Eh7=7q8IVW ziZguo_{M@MwD6vwtw`bEjjmOES3s2cDm54de*KlaCxha!4UH+HDyh(L-QhQ~tf`W6t8r-Tps-CxpA+NFs5lt zIWD7D5&X9vno$LEeIlAJHPemGM6W7b<9#c5UcB-l5OB%G#Wt;^)&Os+JuF8XL*A;S z?D`s^ZR(*RlAKK~53J;sq|iCL{m~KG=VIl`l87w#^Xswi@SO-(I56&bjtXQn)cSy6hw>WBKPH*b71(bb?Qn}eth#jsv=*aSQK?hTJW;>cH2o0;nDE+5z`!XN2UgC9Y&oXB92M6%sevDS z|L#Ud{2=oa3ut~yfU-x8yl=jT0p-bQ2Q>E6LX(lgn7LPvzOMi2*Og|9O=ehLp_s-v zXOMdNQ9@tF=-`-TU{Uulq$(D3n!Bhdzu_h(DpAsueaLd!-uKC8!&)@F3|E1BuZ-yWUq;VU)Ap~UTJg{#EjEn z3&Qc=cD9`~6hzdRE48OEEDhlIauZs}&nC3KsuBVfwa$cpm6h!#f0dP84QebD6tgNoayP@a5P=E%W#1_H{Y{txZ?shMAI|Pw{Y=pK?kpw%g3>tM!JRO8|bRR8i)hU zarTrM3<74b%M0oRQXuq>GR7)o3@AjP_>UoYb4;qvV!1MDjunOxYDK+xAzNK7U}m;m z^2V*bJ@3Io;lpYB;e)9#@!D}9EpCwo`Fy~mBhmY+nHQa6zjPhHiN*7V{a{l=n~uQD z&Z8W*D@FfgpP4cga7?v5TN`;lR8|u!*fUgAiP-1e=TE7zV4TJqc1{`=A7cJp$W6r~ zFQq&E{(b0e49sGY{kt~3j_3-&P0VWmC*cWuGE&6lUuI1xGYiQ~d3v793Gnhlo#p?- z!7ewI=dqMqZ>38lpW~EaWVbE`$pPw7xs+VZ7=oA-`{C<(2AJ2`q~2`Isq6$tl~V(o zEs!nhxF5RyTUe3XwbkP%)*}HJp-WjTN=BpKkf}nOb8#pG&aG1L*r4mWSB-vM z*w}C@Y#Zb%Jt)fRKB>8J{ktezUm10reU9T%eQu^Lj$OO9`+_x`(V4j@cGOrHK=0Iu zh;ku~Q(ZDH&x;?ub+{e3iyD)gN>D*m*<&L)262Yydu1FvpO|#M0ks!QNFn7I(@`&;+9xC3Px_y*2 z&i`HKz_~|~NcLA!qW!0!qTo4yL4%)2LgG>YiT1`wEb`t3i1b<~dvo$;lPkob&2IEB zKYu=~WJc4Gukg^4w<}L<{OB7cy6y1%{!vi=!|d=ix=QyYo_VAXEu#8jl8PH%Z~WHG zFJ`12cp{P#_JtFg`KX>6Hhb%LdHag=Bkz|eOtBHqjBWU=;y3JDZvR3gr$40GQ9)(Y zsjxV!RdAz?s)jF9^Y-suaold+R$Fup{@s`zok!gQHI*=1_i6(^Jv4MAs!J%a@cYI>+&NkHSviDzv=KtsAHMe5c0aiyLC)&!47E zIiTtHHTc&@Ma8ZrD220~oa2|iQD8ku;YD00j4@+cXysN9zi8=fI1m0@!Ls28yVOMgK6cL$X zZL1U-(OX{9rQNF=>-kI6eS9jX;J-cs#mCakb^HgqP;Wi=$Hc6$-n3cmQQl$*RV951 zF1+t(tR^OYQ0IO20`(3c{{o9Au;W!93eg0Qx5B=ptZ&FyCAn~-H^;diiTHFU*)hE@ zoEE&uIOz7u^!h8|oa4yhg7pFgwPiFE2L@OK2DY@b-c7Qxb-BUub{VOmwRQX5yKJZ9 z&vEm@oPlD~$VL|9W>aF34q}sOofcWAc=8o>{fK@0To*B;y7MSm17q%D2+onmI~Iy&Ll{~*}0=Y|~) z(SkI=IIrUizfMhmw=gN&ERlSH5R#BEPYzFeEWvX-%Yji*#?`y2R!9K>309WL8P!SY zTtzxvX9?p`l`in8a$KW(%PTR=`b3Xkei{kC|m*X7=n( zydQ;UW7E*xr@A!S`$I{+`}bg1I$_>~xu#>2S;l~AA#4y&z?+>AHYK2AF^hfw1`uW< zJ9iI_YDs6rJD|K3MA)6RO-w#1WqS`(W587Fa1}Y(bjyuPiO&fbZyWH+^2g^IKc-{KE)9;q*`ROsiyJO+Z)ZjFWdl5W}aQ)b>VzIpA4bxp* zq1K3GU8a$!Z5g@kBlL+_QW=BIVks<)6*W^=8)UilruTsUw2XdSuxDir$<5V%Qm@gE zt!-dvc>itYc$PX7D78%Bnp|3<_4+7B0s!&~uwqBN$3CBov<4x8naVQ3E)>~limcF(S$-|G}>UbzmK>-xd3Y72bjkw1K z3%|cZP7@yW6Cd7MH%%P4uyCZ6f1~|kX(%8>?)&|_ki>B5u4LA;&u_A@MoyG=IFV|; z*F(WKCXDgs4Gt*P{D-aaE2A#Uz=E4}CdGhLO-TIEH?ON7+ro;R`yUDahe$MB`;nPR z-!|g(lnc;k+_u1xW&(?|sVf$iXx9|;g{q-834@(lqIIV@`CrHpaaH@pUl3Q2ztK0r zN0cQ}FIVQSgNE#CUAIlqqq`1|-4xk0UEARKUCbtc(fzx(B0UNwg0 z#93K{-;BE3IhbMr!Q|M?wp;A)?0a6JqGGIlUvh#pYeI1V2QdrzpQsm&$1rmPTNK8( zj)LZ7v)=X;qTPZuN~K-z?2BXYNpThdKF26B;YCUL<_#G{?I=${t@E*61#1-T`+LVovk&>6wzsap z#N=XDcDAXBpY2M8GFGOVAUb-8u1h)p@9e_1 zAkFHJ;<7D?8#ifgHb2r2M1LwShD4RSM+B!+h!dGR+zz21V&P>xrcmO#M?Aq^Wx4XR z6yylLY1H%0ucwjT07l|7W}xI)!zczl55OVM=TjE#7)w`fl!c=SrMwk;lHzKe`#B}0 z>WBN*!c_!EO&suXtP@c9zI3LW@)@L=>nB<3iMs|$+`|?Le5WNDuS$<+{{>0mGD|l4 z+^*Y&%H=B!@3un2bU@X2_;g}YPsM*NF!LP2f$0Cuftc#S&)GkmiCW9mTx=3S#4DH6 zctz6g;XwKvF3!~anSVKqsk=`~p&pS3*=SGGm7K=+&BdD_RKtM=u7B-dYkL8k&qRgwLZ|U1Bu#w1j@T?0W?HRcj;1@e;Em|6tEZAXn|wo!={M6B(U;&wm!`ot)*3D~<+072uzWi(TjzSqtZzxNNmn_0Bi5am6&MoYtwwv^IUG>D*;ondO8v@uN>Na zZB)=vTA!aX7n~aW8R8VFLg*?@Xc81SDumCaI*pS%Z?Rfv0{;q>Ebu_U@QR93g8KjX z1Nh#iG&aUTA~y9=R~)Ft~X9&vZ}xx7BPEPySusq z-iQTEf-e>p7A8cFyDE%fSTf4DWdNxL;VtlldAh5X`}hU|_`Qw+T@I%lghJseA2_zP zD}m)0)F;$yL0C-hQ1u(?^n2Ml^}E5+XoM0PP^*q`95hj5TGS&fJwE@4Tdu#E*bfh8 zzi(~QU_3>?85RHZRwZ+~j&4^sl5EPrfIRpN-;9@NtNrAe2Roh6O=eTBV$rIa8ZvsL zz$XdhlRG=A5bCFSdNyJA>P3MHugJNwn*Tpi4NKQ=a<-0B5)ppdg3iy3@+DPfL2fi# z)NYTTV!j^3pt^$mH=Bj+;25owYMep~z=-QjEy^Nf zlv`-T&VYZEoAW2JcpdJ)RS+W&)PU}x(jfsXG> z^%u54#ZzX#+>n8U?b{<^Fcw_DjRL zngqQ9U=+OZ@~}FBg8QQgdo_Ffqh1k>t@d9vdyIW$m?NNyzBFH;{Rg-wjh?P8X?uRsKF8Vcgv>QSdw?g1Hl| z^`00bh;`u14TJE0=~NhQr_%VIr(Yp0jVvL-A|rD{^obnzt8XJ)i;^Ru+eo)KQ^6M+ zNT{VsMPlfP?NsQFjMIgVhv=rz`ug1U=!^wMnVAb&9 z;AfRPXL#j^y>I5VcBssF@PKG1>6V8yt#wpKl(l%?`}yrJzrL)td)$Rpj% z%z_8P!N{P|phde>_t%e)cx*FlMm1qRXvanJIc1xGf{c&F&vs?iTt1|yzwKn>nzZU&uM$9P84M2(Ck9Uyd|)rG&^p>S!$F}aj_s>JhKDq2EWFHUZ(kN} z?Xh@ZOZ2+-5@pQYm5rW?@oLL?ZLzR>3J;vW*BLPj#Ybb$rL7?6ed4E9-{KS0&@|YwG1$uoKH$~7La|RGLv2FgxG(Bwk zqiQ(<6i4nXGiLkAddo+Tvis_Ic3@P>jLY-;kz#h-)6`!5b0e@{9n4R;7&tDGBOGhc zXk6J|l?0w7CvAR^w;n!Z@2vsXIC%61QC9J9WDFPJ;4%g&=6n6)E%pg`7`N4g77IHZ z6xscz+qlAd3vv=zXe(iC8!tk^+PXAEB<2XbwlZzfmwHCVISD9zE(^UQ{sj6DfvTpa z@P%Rvdp59n>M2lUtL&KCV>Au+5d#;@i~@nb1vor#rEyelMAto z-6Dp8QwYv%@#;TOdVNQ&@}vKyZVys*T%1Il$B$`(p3oSZSgjCoQBfHiAFnVF zhK^^_`MJ{s;--X1Ab1-Cs8V2&TUvn2t21+Kq~U(v)Q->NT8tKF^}JIT>t5S|q6YD( zQy8e7lEVYI*E(GALT>JM3&$F>ZP2?O%6$nr$9PsydI>x4!`E=aX}1J^zfaaDsz2D;Dt~Z%(JZ!g}da4X+ z0KxmG!S{C4QqNz4o@Xy0XgsD~oP!eOe(j=YPmZ%6&Ohu^r5!2a=E94g6Jv#JFYK2jux2wJ~c17z}W-(oCXTZoEG5TA)l6zF3W30>gxVn8;rRYoYCm;v4#82rYpiH$!GK#O4|CVXV`~?ut8NEnKI&f}5kJ3j7 z9P+i}ZE*v&gu_jud0K5!<|b!kWyGVnhCy%h73Km>r{nhtPktt_B!zQr?J(T2d&+du zu=Y$KIFUA2jBerhJ_LFrhL5N){S3PcbcwirlxxO%0@t_)`g{$zvU+5T@}=9TK(!}% zb@$?GBiiu+P+_LjCHae5E4b{qj(8bmsiqBX%I3zAhgqY|n2-~qhfbMJ@GiJKS681J zEHng>k9;yTRDn>Tcyr`3Mai9~1~h;>iJ$(R&cHQ*@|M2&#x^VpFfXlbGrnazv``_Qw$K-Z?g^Q-2%uY^9NccXr6X!1PaYjdIz)0AQxg8_W z$ReZg1OY+&&zwNe)whjkM=UxLHs1?v1Mpq6`wjetLOt)aR(U1B69IRsed9C!JU7-x zL;HC41{1Wxz-KyDkrQ$oT^9%VfN24Yb>)J#f`SwMnfLwA;6GJ$0H6JvRaLB7RNJ5g zkwf;ZoDskU2G!}!L=f^LTuQx8+6i&DddKni_9@YIZ$5_+J6c!q zUyLWm_Z1G5&KoLEgFw-L_B8Go3Xos@!BMWQ0SFcj#Wjj&vhraX8g@UpC@2J|u1Kha z-o)*{Q0e;Y!^8~UR_q15pm#rh2v=SgDuMGR=i~lxG=%87!O(*yz$6^z|KKJcsVhvc z7P*H9^6&j06H#COatHI<{~*Q!0`0`#Biu>WFyP}s8*@w>cwhfcJe5t!DGm1XY0urS ziRv40fi@ZXFE`Sn$=LTGtm`iY8>nTPF)oBQ5#!(%zY=ihp4`d!Rqz_wVe`~62H8X* zZrGC5PWz=5{?)sFuJoR@gM;Lhny9btr$6jfB*K+qHr@^2}i zkc{^=1liU(seq|OP#(aEQG-}ifqxdYjau*jH$}8{n!fLrmQuqfFw-`W=8k-LS-i>h zs3&ER9sRvfjCXqkG4K34ywOeb9n)~&O_-pe=-Y>jCy|tfc57$#p_KOft*XyDhCZuiBG5#HW&#G=KaH_frGK+6=+#)EZep04&X8h)^!oQXb>{h0E7 z3a|)(u0SEW^iz-oI<ebAx0KuM(Gj2zb!5UODY0-+*P7V_Tk{~!&9894-^SBFT?^rJ2cUgM#_sG&@IRK; z?^SS5j>*y>h$$An#{a4f@(T-Otc!}+6iVJc3r2R6fp4oC{ebnBZru3dYBu8AlAV$l zBoPD^FN{||JaSxs)+%TefaVH|9iAukQ*ac7h38Q({@yLKol9Z8!4vNSEhDX2Di9^Q-6hMF4Le|wp zImep$Q^2KKTGGktaKUBVjnnhE9I!fiR&G(ue2mxC5reFvT?#FT2#$M7UyOJ>czGqR zRbf$>3wy4tzXKeSOl#De3_vy9`|Yg#!PR0T@!)Y8EjrQaE$B>YY}~o=FiW&oTIMom zdsJQN=M!@aJ*pMrH1wmqFsTwp@9?r`N=!buh5$H({{Vqo$#)VDLxqnG7YNvSgsk71Lz1UHMNie@23U1oUxd3C|85^F-l~50`SY4) z6ivb;m^b>puLvBqVZ`P_TR5UJkTZBgkt2WF(J_dU_YAmmwNB?I@^b-C`i|Qu2!%z5 z#ugXrH_h34fO_?UQY=xW_UY1K-F#bIu|)E4LZ#g~5G=IzT%psUHiN-9ez!5C z>`xXL=4n-hn_yZ=3f^!%egW5BP*rMSI{d-=hJMdsIFnBuDz{i4jHp|>?sT)dab8tx?i;8`ti2NK|+H^0iwG` zJ1X7;G=_G~KYfO^QhnMyUZV75JnW-W0ec>1EInfO2=0dCFM1Q9w)|{b-rV^fWRo|; zZ}j3n!F#*}1}ke{>|@D3+Y8557OOdOgwOKnIFrWH%-s8*QC}XEA8s8Aab4w1el&k3 zklX~i27np`T!@Vk){;wdV%Frap!KoH)wDaHHP54Ic4`YZS2-0XKG8CbAvzqXQD-$* zUe)lqurP)?(*K=l77AKbVIW?sT~hL$#{QYNckPMcQy86$OZooMj%iFqN;c#nD5lUz zCtL{aR_A-t_qUwT=`Q%OXa1dOICbEZEPgDKmjRDI_0!#vVhcp;FA$l7Y!J&>iq!AjI}p^#29j7rmzv`){a@NG#bp zUO{kPRi}Ten~^Nf5c_L>J|hbY952u|D^bvN5VH#xFAH?7H=HR~ZHo(=GeoFDe=Hek zuLbl5uIZ`YC%vt10zHTE@f*nJ_iRVFHk|R&k{W`r+f>Q^0p{=g5x_h>^Q=I(`X zoIJD&efC&@)_O4)2OM-z*M5DpBpX0Wi|p?1=cM>ZA1*nFjxae8>V;CqtUL(eJGDAB zA5e2&7dyyo*~sBuE}Wn`XcTkV=&<_WNf{Ln$|uaNfVMbra`XuS%l-8$&aRNBBXB%m z+yuFDq`-&Ea+MmW)8lSIM5|$rtLts@N3{9J2|~nid%GBFr1RM33VC`TptRjh$^|=| zbeh~Z3cPC+7x7oXj&2g>Jv`HJWj$0}VEn$CrXl72a$oj`i0TtL{94Pg9IlZPod;xD z>%rZJWei}f5uLOI&VuK(yL)v!Z`MtfCbx{>>)`^c{o(q?zsTuZU_F6CeL>ZD^*k!7 z?xs)b+-=-CK<@1|e>Vd}enw=C)9jFQ&#!L*SfdNj6?i@rM{akz`CZs`LN@z#EpdT? znWE53cLNxJcZ=uIsqwIUcm4&HdK6b_eFM{ss?OXszTv{7_>1)1Xd}oFC?b2hU4#hN zdghoC^@qse>6Zqkn@K z*zV;X#51x+^#ryt6s1$doA^Q_!AQLhQk$gs1{!8W3)-n;vLKEJ;cesLmkLya@_wXX zg%h5N^rVrQ3p$HMcL(=$o_wKYdc87bv5y-F$L6T|OX-)(#o!5C0xlfaO>OXjA?_&6 z0i@`&$eJ*mLLxnb+k7?NY6g^Rd?F&n@<`r#@aem65Ce?*{dVKWb>J{D8OTgGG8$x~ z+u7JyJqaNKc#zkj_97ZLbVFu zUw}rAiVBmLBRBstP+sKxCZT({18%c{nUWj=CW_wvQ0NGP3&D>%+4X_Rf*v&A_h5#0 zL|rC+ML@{L4Gn>YSCY~o47+|BnABt{&n({?mxhDpa6;s(bxH@t+Zqf%laHx6au#^g z?OSE6-j4dfjw2Ni5MnZ277~`SkM#))Zk0e-BM~mDDIP=+;_>JlE-_W}lYC=y{9;1Sg5!e3$)1|w0piA+aTb;Jn|{U9m%LC|L5W7Q#17MM6AMD_94@Al={7a5i_ zrJ_~;R4>rLb)mx*uqvA42iN;#y@I0~;pgYt6V&n+@sw@g_GPNZwhkwDxK}s~Ot^i_ zOZtTWPB5y`I_WaiW!tKQYA;NX%d!60Uas$z97bRWa*ql?8GWo@&sQz;@pe?zQr^|w zfElV73!#F@7iro=m2dV<}LgWN`|%^|94zpAoQVi6Rh9~6@Rz4 z^MNZ7+D#$YrAX7f@&mws{^IZA?zTcvA;WcjSEzpqRDXcgkxi;XO!bIJD%gts4&yw) zw37YesFt0fr~gtNwYfk49gGS`z6aBj5fZn4ns4{zw9tgk*-xL}2*xpxACAaAtojqP zVd8)=RAZYA&`9Fwcz;(&dKuyj_zY&p|IIDsDEwo)atc&u3_EF6YvF~tcIvFAH^ z4M?Ue#|L&XLY`IZv%Nu|l)XD%4?^*N`u|qEjbxU=m9OTkj4(mjos2>-5IPyYNg<&NZ$^6F)6`Nq6=h#$3dULR+{gXpb0V;+KwVD) z*2+|>Ssi6kkGS1v`h59Whvs8w5v^#FvY@%4i-VcJebov?v6-l{EYI*kGSlnZ%yc_P(*5ToZ9X`gXKJR**hq|p}D!eNp!OU^#jSP zPia%qDn1~cujfVtK^yuXY5SkSCy4myGX1(aG)_L!<;EGd<8Eh% z%?7WphF7O;tGy0j)sD35nTud`<}Uh?TbAgde1@myxMiVLYGI9_nHuV2nF;1qIl16T$$b%92Zmog}fE#`AIspIA-UY1xy&$m-$0lvBf-V!SzK)KN;g=P|O20M-#+^j*E1K}I={D;xQc@;E z^syGK=6f>FQK-CqrkaMXWv0LD?P%rQN-BYln_Jg#IV)UxfFucM(65__vL7D(cE*;e zXNOK6iq%Oo`=FRCO4B2QzcFHyQGHzF;x4khw1?J8a9n2P2m)1FV5-N-y(4q%gFg{dG0~ytEoqQF!+MC=Rqe&Nwj_>k8@KuydS@IGH{ZZx&gUPJG{J@LyWFN}BXP zTKTPxl}+MLC8 zegTMu7~?1>^AyK{W7uOOuSqm_?_+sv4I&9Lc)c~*Jn%Xz$@{+~p{BaJJ{3*P*(F+- z+!wOI_`BM3z0Obh4Ir_j9x=qQEfiZ@mySc48wd*(dQj?-!xy>=*@5%O)xA3yUR1P~ zKTMdb)z&#Rby;rra|rY@6&Kc}rin^Quyk-Ch%=3(XF|fOq4(Vj91#Y5HYt_bnVd$u zN2B@OY;0T9^MpZ9wGsUd+kg5S61>!iBO^*9Y%0LK+KToZihpbClnO`UAeyj>Wdn@_F{pO#k! zXDvOvWDEz<&_f#1Jq7=onG))UbMINMz<+dSdv^RUx{9wl&0VP%>I4L4H=DE>?G#fCEMwyK{caGoF99u>U;b$=(IWcKiogJ7aXhl)Ap4hU9fR_#CD@SkV0$!hZFZFdI_b-HekzkgkDJHj8s-S5x?IGNCuc9r&$@1_9S7U z<1-#X&{X`9XH2~q7qQ2}{jcwi)lz&e8W8~yZ+hiqaop!p&JoNfd`V=pb4L3AwU4P? zodfB=Y*YMNyV_#^V5%L52}LBWV@isb`KSe zwShmPPIfZ1;6Zxh%jnfL;`o1e;@1~LQ5ja-OlbQ?zP5_b{<1H@tb{rEfHsYJlD)~a?e(&Bq!mY-Uc|1!+ zAqp`|B^_p|=w7D}J+}!K<_UR^(nxKGhHc^O~8dcFZewjic{HU z7J@VQ#tpi?>16$CPTE>(^T{~99~b;JYo)E^3+Xy>&iTTs*_|Kw6<%@oc@twa!_H$G z+Z!oe-Fn{hv|#%WZ>huuVhWF@z_{QYqsZGc-Y2h#(H3`0VAM@4JnTc-CY`Pq_ z4BI-~H!HPAnpVzjV3X5LLw*#9Hb#=GLu@9WmfJ0-pC+xZpO%}elV&EJVs;j5Q2tF! z?Il!l2ch0uuJt5mv$ie@rynBsOyRYNRz4vmA8A?RvJ@LOSt{IOlxv^n{2u3braM3RDHM{l6A(v`ColgQ4S z1e;ZOQEW-ZWB13XM(`J}c2d+Tu5XMCZB4xe?w_Zh>)^FZ29^cLd%U`G-E9G>y{pJf zWLBS$V|X-%FTfTT^&?L7I2E_@xRJ8ToAX0wTEEBO!x+WrNAKxu1FzTwH&aE&<3Adk z8)urbp3WIuMYp`Izl8MICvvGRB`7&Ea=1SiqfY)t)Md2@j#mypvedH^f;#*HCI$-)~pK6%dH%!*z%nA&~4ySL;cU-d{cwI7q&c8?bwI-0n>Qf%#el zyFFRWVDVfWXCKwYT=!5svI!FO`*w4kIPG3sLnW4O>vq=)-@QiRSt!-t`h;~QP@{tw zNtECtq9_f$MR)s~uDyj@LHN=$9!rK;E+4<~jd3q!G?dT6@;hzVYNho`r5PA8tJz99 zT043Aj^6$TH#unh7roON*B>?eP4pz>Ij1Xf+`c-8N|rxUZbI=mC{ z;;HQqv_2z~fsx|;kdTmyZ|?$qd_E1Hkt3kunD_S|2n?*Q`mk}AYISmRPD6Y9Y8VkEEZYH^V_Y&b}Nl$)u<%hT*pI3)$!ZQz^8Qy68Go+4gM)HJj4N3}P zotDmM={!SRE~aH;S$8mudJkXt+)#}FmybA<;s%UNOj>QRg#iI>j#acvNGP#5@K+py z7_b%X(TeC3K13CxM1MW`-xDqM6R4E4dS+4*9uMBUj(hh=&|-^kdz&jg-J0FpW~)E9 z-pf0c&zk_QYpl;pxIqJViZW|G1Fu%Y;IAhv;^JHQEKd(=IH_hOuG|loeGU_u-ox!9 znfjWV@|>KdF4!5FhLqwYcIz`%OB5cB(}G6a5>6NTs#M1-o$XPva>$iS5f;_pmC-ms znL_z4s=4j7n+$3~bmo_5DL>e(HBGSDFeG?=e3_%gmM>!f%fO?8FC5&l=PlBqYo>X_ zA@LCdjEsr)nN0X?Js{h?ndLg&brp;f3%kUjBXd!ACjxQ`k$dTx7bYgnU`AbCU3GoE z6MHJfBU{|~oKnM)xzVa!;~GgH@1Kb_ZA#NgdDo*k28XaW;PmJp9_+F@qHd9E^7r3* zP9MTTQ5{l@E*bV3<^Ip_Zl1`fa*6SS8Y34_K3kSl4W{W_-Pr4uo44otfMjYITeVcORR$a2BVCJD7m)0}!z8AV`@v1eSmVK+!6&va}VDBQIf0>Dg zmsus98Z5G^#!?tYNl_#k{vb!t%Ruehi2Wfy&8q$OB(*PPSauDm1)VXrhkmMjzUxIM zSj8nfp|iwk<2gBd>LAS1WT&Raaoku3b-s#9(-k@oIUjrXO8 zBlmn4271C5Ua!x*Yl$qBWb$LN&M|HgS(0(^+3v38r0-k)6fs1o7`;Du3y6Kf3wvYKyYZ{Wu~)^)$_kHmFGX$bCZE+}U-o-_ zKLRzpZM6Yv8FSxFh`*XGk#~rzhA=EN%uOgMiKfa2ZuOoqZn5~iQWiw3-_lSlA`ROo z)6I=bc&Yc-JnP8Qbo0+y))|}gff0+_{kj=h`c(I5Jn58&E2JV8!XF0o;60nZO(S4* zx<+@{=w~flifK0T`U%K=z4P?t)zvMtR5>`XdRAgDLb$l%tI|acKJ+8UAZf(09=>wW8=dG+rx_XxB zH5y-ShT0_R=)-6irmqF7i*O|SCJpS$#IrT%NUrl#!pSMkc9i?|^2f+Sk^r3KpOF+jiTLL-yP@v2u6UKU_GZY zE+q9xPEotV{VwRUe0ukpV8nokq0wz}-f)zB@E&3c|i!aUmh^05D9{ zRrNjHTKe$mlXdVHk(~thH3rr58On#H{J6aRlaps+VghQurL*)^p0OYf3$h4GmFZ}w zx?!Gav)wcJI4icv1#2;Gf(3Ik@PaY@LIj5K)-4N-LU(h4ifv!IAM+XIIovT+TGy-)~vj77YF}z#LE6z;#~Y&PBbx zRnHo)42Bn8uYTGICrsboq9!GR(8KOqFJ-Nhg)Ag9-%XQ{uf6itrOray-1sp9ALKeE z^l`cD-bPtSfYrc1UX3_XnoixQ5Pk(Qi_T!**C>)NyfWG7x6)`NYjtx2(E5bLw`RH; z{8QI@(iMe>~|@|uGa?=6~O%6H!DAtCrG(} zfBRUhoR>E7_X2eOhLB!RQ1aGca;izBJL6F4WC=w5uO_}7kfq>$@Yn)Li|Y8~*X&a( zQ=GdIo1Gg|g8w|Kw(i%?uNpd(_Z{(y3in?5v0EIlsMiY)R(M_=Ovrk|tJ)%i!Mhp9 zxx0B^)6h7X1;9a4jPKxs4BJF)@$@!gBtrD#Z1pUdMBqTp-?e_`Q~xt%240rI!Og8D zeGLr_dZTD{wRkcM9#!Yik2r+ZWpbBrg=;faY;i9S)#6!>R<;x%Parn%eVJf_QEgrS zs}?RxNUa=zl>iyNZ%t9YeV!ybJGb)>E^?5o6UUqwz@MVPn88BAbc7s=#KTA3_;#kS zhyNZ`0=o`8loKrq{Lb8fh@W-&i_+c)4)8n4kAG)QtF8$y@@89KzvK&sv57iS4UO~A z1(Tn}2%-H4u>%kDYse$dPzjzlM_PNjXa5R28;WuCn&)5mZ@ccjyOVw=hFwSe_75#5@(jfELfn6RpJ zuFbfBTiP3$)OxwE!>L56C?|sb17@LhkR94N?aUf+3IgUN7=N$6baBwzdI^$g)rYPb zzk3NcZA&U+A9oa%7F~un=@ixZZMlrh`DD!xmZ8bvXc-)>em-EW82QlL?Y8=wACtSk zqczhnsE1)z9x@O$_2s3^P!tQ5mL{V(3RRt}aI6>mbI~ty)RZ+f6cb$@Z-jU^SlV!n zEWUJiGmV6+gwEo;fh&JSXI?HQqvHaq`1))IC)aQQ`%^)HDGqER7r0Efp3$iYQw*Jn zK64BmAN=U^u^BKJ`}n#jPV5A|=tY(NpU?}NQS{_o*IM6gHn+y72dT2-)*Fnune?H| z+Aob)X?(-k%uuXpzC}Oc>{A&$XDQ@rJ5n|UxFt>y+h(&-(fp}w$YEoMDo{i;*H9ZG z{y)CnI;_gBX&c`N2!ev3bV&)4A|S%1OHe6A5GfH9Q0dqpjdVy!i?pDENOwz0NjE4+ zNq6(j-rUdqKJRz@zTbZyhg|!*)>^Y>&N=6twG!z{&Bsz;2cN%yEG=hvIy(wg9&0ZR zjYtZqR})oSY)xMrH=ZwERc9YUo^w0l2Rk@A*m+dCu5Hf8bfY^LR+9=B?r+n{eaf>Z zJv5Y^T$DcEZ{%azBQJ~`$(sTgn1Rmql+$0LeU8ib{a0k~DLF{VVPgbez*vmWC3_dW ziV1oVZOuCYB$Z25N6QNV+=tw+LT|QM`i9MQr^6Xd*XFf_ijQVyeDbiHN4{usT8s`B z%-=TUd%8GCtfRY=x0G*O97-lwujTrq{n2A;{i=#L0{vfgZy789sXoj%w6?C0e@pxA z<$(2{jlc8r!oowL+unpH;c`gR>6zC;7UMy$I*6XrxE=C=U?a*XJd(5e&qj!PIjU%& zu1;b22eM<4C>UvVO ze|RoRg!y^f;z_1TV?egYW#ijxX6GBE`*g_HbWHhD`l7D=9TidxBuP`cF>1iFxY!>P zGe?M%;aw-G(wVxyPX{*!wvC(AsOz#zMeRSe`ZIDnTqp_%XZeUck3TM zEz1p74RYy#4vu7xUd(Js*Ra@~_3|oAaf7TctP6Z*kgDh9e_*c*sXfa#dba z0-hA#&rDpe%&#OTmw&b5b3uZgL;kwpt(!M5lQF-zfj$3XtSo)=<^}qd)vn~i0~R7P z0vMLMw7TA;)2nX;7GyY?Y^Tvny5vX7t%)VuB3JM$F`r+{R?BQ?AMtxvXlVO~25;Ji z=vCg^+T4V_feGK&`F_GB#ZQOwhPvZ%n?)R#M^)gMV|n@T0Xn4Xvkkbbpkc7&?il@( z7Im?|28X+htgNoqv(ef?3QCpy4wfo67^#M;-9qAph%ZwRepIHDdOOtG`h9fNvh`gE zFd#4TP!iSrfM!}^zdmM#3rxB*w+9DR@1r5-^kp3#J<%HLjTzRz18%&?Qe|8SN1yNO zZMGe_%YoyDrQ*XZRgyhxsg*Mgwwfd3n3_auAjy{hd)gcZw?pYGx0HsB%sQ{4mJfru z7E9ldEZ`4?Y(vf@%CjsdCWnWn2*@}(-fkBNwg!~Tpb!GLFw@k#oc#Cqqr`06qVZnM zpwJ88TPmI6V`Hh#)0$9G%{SAztKNp)4Mc_FJzHk|6K_I^DWa|fG%_xP%xUlD*}YFv zu(|6on_IH-&c^RAJb~;<$c1c!01|xJDRi{vh^BJ-(bJ!Ki_K>lVIql%teKkMgA<=F zAIlg&lzQ0U7r`b3FD)?nISR8@Ye0cQocZa8PTNG%yb`vG^0|2Lq#_a21n_GJ#0&Mf z#OC7V$7)fxQJJ3LE7_D^30$9>TXtoam}u&=vw%cZuUuo#pESVpAg%GS_h>ul714wM zB)5RBoByWY9Vw;Z7u6Pp;Q0ll=hcMN%P)PO2&hj7IBxdrlxZ1CgugSzs&56Kysex zRC$N?m+t$gd=k$yTouRueX{gYTi*b7UU?lC=Z{TQ!raBq(t3*VNOw3?HT1)W52}>x z?MB8<&;X@lfA49^$ajC4q0Z#PgO$X=zT+~xz_aJSq4|qtS3kO_*p@`Wm!edLz`~ez zf194xzH^gpFYm@lEPoS^_Dv*b-~{Au^A1CUg)jGjwSu5&q)*JCXQ200uz4(X^r=^h z;r5P%;q&KRVDXWh`p!`qDW+r>KHM~Wm%kB6Jjr5QY*0_!`;}yi7>umf*MKE?V8#o{ zn}kI45~D*M!p_mwMyp^zUgV1iET6JUN8!m%KJI|VSJZ?ojLN8_Ucq+0yLMpb-DY;?I(1Hlm@W^j@xP3y4WV%d*y>A5#Vz#mFBTH+Mi)W*dNug^?!SbzbUWwi zM|--vV}e#7r!E)P4pJ?+EvG4O83Je|ACL^h(O7xeTi>>D<$7A_?uF-6Za;lY3It^W zvikNCwb}`Ki;qEOgd*O)cMi1lh|Ei;n{RD*+d}Qo&Q>EG2KV@g|5?JpRZ~9C0!1HW z&;=lG;o|GAo*w3$SB8y2e2bMd)?dzb_Z|0~eE1;g1BJhethU5Bt>u|)?P49ERyFmN zLfh{$UzyCRa>eUrzqaPI(LNv}y{LHbGxf{j+cYOl`0fV$Wxm;I2dlq?0UslgF&y%; za=I(MpTr6oQ;yMS3Y)#de+@jF@+uIey=O5d*2l?t?~m4B!n=8MM3MLJ2hF*e9DBax zO#g?vz+|)@5rt*{lhL+yCA*aDXnnItCv+k;Y&@@5eeC4V;`QnERcJ&BObss=rYf?X z&jLgj7S_<s3^dB_f%Q!V%TU5VUWHF_}I(ezY5$H6*`T}&E;8y%XeMj9;KtnS}`GWoi=Xy z=CP@s=tL?hX%+$v+csBM<9kZwM3hf*U-X@PP`rkEEcd1*to*;y$q#1C>XhKf1Y(Rs zc$^r%vGXbeYtoCrjE9Vq_s*9xE~bcORYBGU{EwgM`Q}zV`%mt%<_PAbKrIwTm2Rev113`xT;Ee}mrvq-EHWeVF_~HJ5Gq3zL{ekCvdSUXY}K z#56;^C+%8zn_=$UOKW@9@avpURh7C zDa|6`{j033dnNUky@T6ZRV3(!l4Z)**AeD9qh)VK(-bbZja6tQA1b_{-;y953Ki2D z3K^g4$#8P6;6#afqAL~xDQ$B!dIxRP>uzRA$kUMpo8%~knDeCOFQipaT5Z?zU5eMT zF#mAx{}H|Rqq5RR3LFE?EJn5iKbdMmA_`G^X(T#VF)yf~5VO$k{yBF;rbSX>+C6=L2|7~DgX(l^+KaFNO3 zX`2et(u=@X6c-54i@l!AH(th2*PDNH@`p@ej$76!$o9gEQVeH4aQXj}$(h~w1*r6! znb$hn5Ud&wmPp>y@{mV%(;>Dnpx>RquXTN|U-vFL*R})CW9eYKKjxOfT~cISd2n_8 z&M;7g@+olNYE@N6n#I`Yc6>a|orybvBtUq!#|!;vS$n$i>J8Vhl2UniBP3_aF{{b8 zoOw5@ogMMuiuQ6<^jKS_fl@Zowyzn?Whg0Iel}v~YwKXHP{=b6UAGCW- zMU%ocYw@$4Q~*WkPnXpLP$RL$p@MNAaG-TBPDWS0ejTivs5@&KaUMl^4gvubInUIZ zCSULB*~qMNg|6zecP$=dMTDoPL?@ zd{RcnZM`ALP7Md0gp4eDLKUPv-z>FE{!GP#d)W#h&T-|p1Ps?CG5Z&fzlMW`S?~3w z6O5*pjHWG4!&*a9$!23s90Hb^I;U{Ck8b*E`t6iVN~@W+sQI4TzTUbwZ!Sv{xvM$1 zS*t|-SJ0D2m#~t~c{NatDa#QY4H=DmBHLq*=+Kl{E! zGPL9Zpvx;ZRaG1!MfjhRy<+7Zyu8Ht7qUfpm%-@dZm$D3f`X|o;W!(3n@k-nx$R- z$@}c3^iYet4^IbH*TK7^6=@yO-Chd!M51A0PR072rz!F4hR>%HxcvWbQdNXlS`j@M z;qKJ;72EOA6d6!?F7(BaZj~%Ji`lQUG?^jyLnrfZLbzV#Z#`Ilym1GIMp#%+;&|6v z^2$kUv=VD3>6>t)dauRXPTNZ_p#V@v_hu4}IjLDYP~{V!!bsJq#;{cHVuDmJ-QLSK zn;b=hMwzlyDM%BpO!tF5(OiXEk3s!D%hj^d(k1uHY6^aNWS7@vhL)`dn|LMK(JZm7K}FT+EOm|p1y&cDG!Vm`*gIB6_;K) zXt6Ca$VFGc&)weeu$7lW&v|Uht{blY;X4Bs$V%-nt}0W|hva~EAtAyxdfDU=*`8di z9^$31y9ITC8~3g0fXHcuQO!WJP^iV9q^ zY%=^YmvsgnF!>nJO}m0kJ|CtG>D?)~=q0yVX?9<9AQlu1U zfg|PMwESRh0fBc-Q^F!5;eErVOLjx%KkY`W(7(r@@wVjXV0kD4Z=T4px%1}UIW~#e z=?pPJ!N_Aes3k{IyN=IVGN?IX0Rlo`kWFD7{#&;gsww#l8f{x!+b2)1Xk`c^k^235 z9eCBYBBIe9(hp|JP-#=SiSt>a)5h_KUJ;2l>pdSLBjrwr5R!&yBzvIwJp4or>}dUT z*$HF$%srL&yFiB2MKI7q@QEARVz2fSKo#6ek?WlET1ka~i>%Ts;G6`|A zPmp9qsVG-7l$$HAJx_#iJY8knlb+OW=A0g_3zGfMwY0R1!lFV$FJ@PY5?>(Nu}RAB zdM77-t~&qk5gRe~91+oazS2Jv%FD}}0TU{TjUUKgv5o2sDpf=wEKk4k!O*!6P#gMn zrdR%ZG2g`~qi!ve-*xY2Br4tBb-*rq7fo6NHG}X=kRVl@$N1nl0#PBxtzWnzgcsyk zxU46(=wU3p%)^m~)<3lnCVAm9ArnXuRg6%>==3ejjxDZ`XBn|Dm0?rgfjzuFzzq+n zF!9W4p{`-5kEE6W%Y(hz!kl?7cQl9u7KCND+qfl}ZH`MIDaa)H^K8Kzast$z__et! z3ApZ8?=tc1AO&wQKH(k1T4lgI@mVv}egds}0quw+_MP*CJKtSc6L7Ob$(%+`+L~<1 z5pj8Wo*Ce49j_h3_8~icisJPa=V88CDtZ;a*I?U{7o1`KG^vf^=2U=eCF$Capwjum ziHZ~fsKtP50U^a>Ijs<}9qK^2bXz=utk55c#_|(M`AOVNqppo)V~An4fNCE2_}wcU zlc%IGwSn>kAgSd1uE}M(d3~syba)muD^DIIP)iwOCHWh&q`2oBPT?TuiMkvydyoA= zI876*$hp8dA`_FKgO2Ur1kS4O`=3(sO%!RH>YW+GLMZ8I8GN4An;Om7nIq~lJALkw z)l|l#L^qhVlJyjUy!+|-NxJkC`+|Dk0?`W^P1m_GY& z?-yvGyfM#ZLXmf8ZS>{+_m_ZwlkBOf#c;VM6E}!P)Rh~tstT*O~OwQ-- z6v;W6rQ|2seJIIcnRqEeh4z4P64Ec3d&vilya+r#KA~c);Kv#)K>TX;Us)o zc0}}Vx0PlDJTc6~*3x8?W99ghzYN=!7_*(N)!)smW^Mf-cmPw!;xT)5n&owmR+n_p zjt4y~+`It7B=FV*9hPwuUl1e>bf>76mTx?sc{B>_UsUg){qDvk7*Hytr|X0Y##oY0 z*K4E21J`v_GNhU?HZ6H6k^;OF@PRNE7Si0+j<@!^#sYL|t6bk_RV~nik$n`mRM^Rd ztc_Sk=z5}q3xZqk8|SDaV}f@hEH7&3iHZo}aG-NJVNd-W7s4cL5l1D*|OP1W{-J=Xy$UGzJ6MbmYk&;4~fvieQ6Eo)=&ER%Q!*r>u z9Tu*6>cSp~>-<%P=03?01$Pydxh5JBn#>EQ8m(itKeh9dfr&6zuZX|8By10Qba-k6 zmL90EtiXs6kJ(rkgI0b@VFLIt5yop!P|E+d$wVoK6OUm9D_L4Q9Opj~A$*+8{?~ut zczJp!d>Mhr-l(x!o&AuKMFM^Z%9uX_ zdtjgGVP2u$8dQ1>W9Ap2ZaV`ks0g7*5(`@tmolZiGz#vZ34n3+8OB@MM14Ko{oyCE zKhYImtu6$Fx*fXb@UIJ=mt<_hm%FtPUGnFdw)&%DVq}FV=N8+ zFo}DK4u?|4QbOMkmVhOsg8jw)5Y6}UaVfY-qTFv{%zo0b%lq0j17jGuPgAkmT>=pW zc;p-BC3&V4Btr6Tx|sc{@Texb!Yla~vyNpvAld*64@&b~MzmkFHhuj(h$aCy;TP(K zk-aE-y0!^y;!eK1kiiDRnEYIss&7uXCoz0JCBy(UIg_8n57l6~(OrM^-+yNR0lva# zw!uUU?I|TQ!XAE|)icx~`dmx7ld#l4#%fD#E3aih(D|5QfCp>tUDn{pxP26p0SSy8 z2fgfFroTD}e;?Vyicc{1l8Vg#%*|(PqEgwPPZx}ACc7ez3!<6^6q7(LX40hshoc7khRf?KLJ-M ze1BCsrpFo9?<0UU<1slV9$;rAzx-j@b6Dd4!rl&Z#fh0Kkj z+#Z%SmfFGj5FbjibO-kPh}haL^WwfJm?$P?>QW1<5S&(_6(OXafr`R3Ud9~P+=q;v z5FcTe+vvYnlzj$s_))A>9wpg>fx>es0ePapzrg&AVNqXQ9rb!I%PT@ycKcCy%ScZw z*IlSociHcCdWx9^x1uf5RxuT(1zl{9G3|_rld^@uS&aepwi8p0CP6yPPx*~ zs96O8|5OJna$85O4XmfbKN%@me?2?^IWl2@j#546*WFrO55f7+JBj#n-a&sImRxKIRL+2*hp)@SeBD@` z0tbKyUIjv!%?%^A)i;Z5utEm46dCDaRp_Zh8#Yndb?*-82ye90n~Qq)jlY&c0s>JO zV1wJEkHCTXrh6q^s1%6@Gc$ienLGLYTkon31XCr984wvz`gi^k7gj`p87QcI_&eo{ z0vj<%$#V`Fqid*pS_Vgl%NV?-oG6O_cI(Zu`&E35wK1aMp-Kph=o9^|4wvn@8wt2$ zXsa1*dW|9$@6Vh%y%D;RXP{Xi4xt!pbh!QygCC zs~dw}{3gJdyG3IVaKK^+Fr(qt#8k5ajLn6F!ET%V?33Y>F6HCtc7-*Ib>Vh zubA$dLNBdKD0Idi7uk{ve5iYhqb07}OXDSZMV%CKq0JRagaAJ1GCIo$9l>g+N>^U1 zu*kAfTyFKVCK8oE`?}?87{~K&hV3U^($ME?^0JRtT30LlB(E&chB?^-Q0nqask|vx zwFUMP%*NHi;-&>g0yaWrp<;}Yr6bDNI#37b43k_yTd)B?@7>dw14!OF!aAz`fQT_9 z0n!Ccn*n0za@hOi0hwo)mV2}}lK1=V?K22Q5<(ZEt&V_7C6xPF*r6V(7T+5Dw4L4( z;COa*b4ynNFllu!QpUPbhfFaAtjlUDb@ZelsWe2&KBIAdBDr7HE(&G zRG(m@S^pl*jkKjNKcIW{DI72EOZ)f3UZ?j5}$HwwK@Y;s}e0Fl$(!fut24%`A$TC(*WLNas)kTUS zzxoJs5_CJ|{@vA{IO6zR!%FH$(cpKN#y&yBZUKZq(Y*RIYYsnu{@l!=MP#bKPK%hF zwuA(^Y3z;IUF#|E+j#$#Q%JHs6mMC#Ol*sZhmA*nnfV1ZshZz`*Iu-5dlg4X9k*l` zV~Mo99>Y;^36mF+OgaNi-pfNMmmQ9H36qBJLozY+^X;J&WOB`yer?-G*XY4+E#p9X zxB;s4&kR~di@{`->Q81LYWj4RQZL93&|Q|x?D=DmZ^648`JdnPiH?|a0o4*3+IPu< z`8zHN!Hy;f^~Mv&Cr22eR~@bIkg89jR7+JTw;8W}QulCzTIUiYO_e5(Jsrc6bsRF8 zU}|mZWqVv@UHbq_a}m_qIE3^&ReK7Q1i%HDI6%qa_mHpBW99C#8k;G|@XnlPo*A*{ zY`+U7Q%TLpnTCz*asqT(fYzn;USVMrdaW`m&Q{0RJKuCcf@bTwd4Gjgpr$sZcFZQN z$+Mpm_wDcf(TGY6r_B#CPZqcmjNz zs9CV3)$@obQhNyC#J1#;x!`gkC;JGXqMpgoO}wl$sKfKB6kp1I^J>|&$=Wqte}_o{ z>sFIIcZ;2Q%6h_nCR^6484gL4$hh)79%+BRWNtYO{(UWA}Om z@ujNZK;iCJ8hNSVZzR^RUnCGRMzI96)WnoX)`yD(KAO-lz#*f4anB^ zwg!fP@qQ&PG~m?nUJ=AfFM4LO9XCGSk581SF4QjWV38S?ldA%~4O@IfE!@apYWhh6 zd6oH%5LC#cxF_bu$5v}RBqA>}8%3xO)peLF9c){m=DU9_k5Mo@&(RV* zyEK3A_&5ofqzKxdP)r14Z@f<0S=qRYLyicIg!}_iU+{rI<@GgXAM?|8(52itf8{DZK~D=7~ZgI|>@;#5^H`ii?_L23Tz z{_p6p+Jn{laXWVT&`T$Ob8w+G!IADpT6DN637YM?@b_o?GquBN$dUz*jm0~Z$h))< z>GTtOVjUvN z$%s5#d@(d}Wy9@c$Iaj0d{GBTK43(kaN~e?14z97l#pd_4yxm0SaxMBkr~l{6 z6(B{l~L^h|nu#B}*e5!_W=DL{2; zic4F^WUTDZh(+;Chvf6G^^qi_X(|6qBm3}6Lkv_E5CpVz@D{b!lBMbt1jWDKi|is7 z5M|r|d#AfDfjI!x*4MQ4*05Alesj)PQRATKE#6!=Hd}KM(N_75x`sauktDddk(%-f z8+q{))o#f$zV-t-+INkwD6VrL?~CMblAhHZs2nAIBLI4%X5px4ywIZJ9jj#pQ$FdR z1^7@EclTi;C*R200-5TMzUi=rG=Oim1-J zS-?lR>wt;{-hFp>NhZ<=@c*ya<<%LI ze+-o5>;`hk>zu0;H(FGMMx*EL@v&PAUS_dfpbQJ?0e$HnGDMP^_2HZtIY=uKNQk z)yv7s1Gk;&)&ui0&!7j1qS4y6?N|18^skXO=u<2ehM|A$Qq*(U zESNH`2|DZwu%v{RCvsUb2z9bfQtP57eI^4oGA%0Dc&}(%Wk}DdLs(1FaJ+^ERk`b= zkmD;wWO7Xy?i|1#yGhV3y+U7*l8=DYrfGC+y~~a-!CT(*sVuiN6G3V9tHQuFqZMXQ z*$U(Ooz&T_eElmQ(X61(bP?^2Uyv`XKD^&01UFc06NkN5 zzyMVpt-S08w;X}KqXl`P*K4#?M$rFvj+3=9F63Z5)7_hGltN%;PJF0h+4bWz%!CJe zH$LLFooyKcoZ`9|Za3jmt&dM<*;KrN$JnDjd-lzX`ROio<(DtR{x^bky!;U@c6K|MWo9 z=j4c_bwfb{j+2MXydE$@btT9$Br{piZ)TLg{|gxND@RacQPOc#qn;>A#`pwkHW zVziMwd|DxNyM#MEzsnt+Yz-~8{gZ5|^&{2b7qWYODLm24g311R_z~pv@Q~fZ_jEw0 zUPiq@xa)vkQ1s^gIx@pTx-;qT*fOtjbasEnD@e$9YgnN zKD@?x@0Zr!z*gu)=^_Y{wKYCKmMr3`e-+^Muoww8_>P$k&jM8-o2T7mZ1FNcxsYB?+Rx=WxAMeeg7RPs1^tsD> zc&jL#)_&U;9gU$9p{e$RKr@Tc^t)>ev2peZx2#McaHsrd);^QA97NzG;F?Kk1cA!~ zg!ph3xks{$ID=q?HG55N<=^2M_bHe1XMRS@(ujQ;wEa&1vU(K9MtBTG`S-&4-k-|O z{az}Dev^rC1!+)HQ~(g{e)72$YuXNU(>gk@qIpmDdsJ@EOgn^qg|5ocQX5qf|LPN} za9WXq&Y}Fsd^tH?w?C1Zw6ylQPC|l9t>dY1FRytx-;D)Yx~1>**or=0gAt9HYS_jd zw49gE1~k-;mDBk6=&1`Zo>41CI~-QoKe&+$XZ1pXTq$Z++=TL-N5`2=Y0qjUuaW!U zbXF6Ax5bnyRr&46nD5*@iWjnoiu|Lc!)4OH7zr5EG&(O(FLD;=Ju3|n-SF+Qb5x7_dpOcx6=yNhYOQ)JW;D*=}~ z{BW{YW}pFpE*S@dsxc66->@Y4X22JfczyQx^o8=*Eb8OSfgMGeE4R!{1{I55{)l3& zKDy~^1`4O5mjfS59(}X>+pX`Gz>VZ${Zo`{6%A<30i9%=r>d_sl(w&LR%qH8ck=x- zT%MkuyLcURu*~wC#v|k7O$S^2Y{4bBD6rqWeRYGaDR4|<8H_#we6#yL6jVSDhT*%q zn11TT1DOo;9>;ID*Xs5ac(9XqRqhN9O$PSNab-r71(4to9kz%&S)UyDCAw^P%do2? z>>o^p;Q2SyGO4XXLlY>x?uJ7H2!nV<&Suz!>8*Xczo1)=irOcp8=i$ePZpcSK_BSj z2?)eZ)4l(jg3K;K0D4M-D1Rol$={f2ybycKioG1Q5Ecs!xk#6NlaC9>Z`Y=Lxpa1^ zOp&)1_YXHhhOm~GeXrizRsH$zIPPAMV6ZhHfVv;)jDQ5Dyqm=2?{UCvekf~xYfa0{T0beOovZ{d^1bNSi=2*u6d*R_N!2v$0e)W+b4|!{vy`s11afjuox5s?)Ov zLA1h2khUf|-*BF3%QfP(&sfaoPnWt%b*sy|JI#QQ{2q;vd9w$$TR6+mfyBvS8`190 z#Iu+ET&ifpp9RBDI(7~rYDJSgT|B_>%(5N;-9v_UQrf77rb2`}Deyhe?hlkAdO%k$ z;$vF+GO})=FaV@W1XC*d08jOuyTyN%bNeP{IYFp_ru-Di$FLRv2A+oXqz@3SrWRbX z*~lZyRvdQrY@iiDH6bnO&90CNLX`)=0+bwW$vdR^{O9RC{Dd9~;{N;GH#&<;k=ilJ5MFI;{I}z34+20aW>1`Y% zgN-jLB+lO$3~{O%{}z(x$e%d@R}iKESUZ;lfnZPW56JFK64EB?L(I9sNIyqi zwq`+BBXJR-VaMP3Fu3>y^v?Y=q>c{`ha?U9ca5cJ=~O9eYJi=5yGVBjL{NJbOs1j?upbl*65NbT9x|`@DZe#&lL$cp#YEG zRI>7l_iK%Ws*DWy9=8btau*8KRYOXQ^ z1f1jwa{!-cb&VXs&ISgzG_Ru;Cxeo#gotc4+ffTSb?9J;72gObLXq~b>fZ}T3}OKX z2F~Ic+};2};GiIpm5J&&q`v?WgWgMMP|i@~PaB_iB9 z9vS1MN?8K&yC~rwBi^ufT`(B?!gId={V@ZNZ(R%==-mjAQ(PcWf0>LF>0ec%zKW{*_U#89vT7t* z26^LGfA(GI5D<0R{tnv57z{LI*QO0STZme>@6TGBPHP_DSw4D0mk*Sq(OK&_Xd&vI z(RU6*t^E!Ryj*p_b1?Ta?ep3^67?~(as3aK&Fsv**l>#%kHxK?O3BHYJQ|F6OUEf< zdvR-7m!nb~+9;?2C+c5je#@Z3q}{UY{e3oZc4;jB9xF*4WE+TH+2N@#AXtG|hGkVX zl3IDQ8;paIl>FiNCpC285mDi_2FM;tI2p;Vy$^%fxwqV)(*~IMh1(2UFUKpWOb_9p z76XH5iDQQ@ID%lmo;Wdr56S^<0SMLhh{?f%Wy}s;&O`SL@Ib z4y}RS0wA+Ig{PsP%AO>{DM-i1#tP-eDiP4&2<;eAQ8QJhJqgQqKx9}weN1Wx_ zZ>rmGvkXTbd~_BtY>WY&{f#WZie0Mv@6w%&cN}Kg$h$jQ*PRcR;J}$;1*f){+DmLi ztQq&r6zZBYMMd^W;QF?50hYA&R&PE-f|eKW1muG`;)MA%+0T;&uAo+qf0y|*1m?e` z{gkDpAj4ED;pTdi>K^sV&c{iX1;D4Tp_PA0H8>Nhx!1EQl16`M-bv z?WWoHSGdVpTm{eW`m0j5s_T(5wYFzh1cQAw`1_MAPMVK-!Ew??93j~(w@UK9*T^fj zyrJS>zpBi|&gES5{QiCVaACz)gR5=bc|k_Y3w}Nj7WWBF# zU@f{G()tNyWrz9p%@BqaRZWUFa3k}t zwufJ;BtM39E<@5oqG^yI5-Di&T)6Mz#d~q;rB6Hxl3iwe8M%rEs%YxMuJ6^!Atv!1E!RW7Zd^D; z?2hZGT5jj7Zrl&G{AW_Vf;_Ocd1Au+%SKCG~a^^b=+ANPVPFd|5a5Mx?=2V5Hh`uKdl^| zOiFz=SUK0rc(82TvH1R$mAVbxXZ2!To%ga#8*sKw5%OVb|h)oyhJ494#dJ^0t_F@UgadImC^77B&Ubp|HFWW1fW+wUtcAN=UuHyz& z+0_mgZnh+FL=HBj-(k7`YV?tjLGt3zMk2Flj!sJw^>ziV=p%pe$JztmYzT-$M0@qv z)!RPk`b=P9iLqfO&1Pr#^X6o58sX}jxPZm3qo_1O#D4nRaw%obJp2>Ub-6HaVV|D) zq0%)itb!<*G|4L$$-PJrN!W!cOkJtfd1awlh+QdDdy`H77R}QPH!~v^o6F+pL|bD zRirTCz9?UijN`d)%()yYxlaKv?V^1rPqzM}>+^4iyfc#*cBF-jy^i3wl28E;j?5EZ zC)$EqKTcXLE;P}%Iqj1XZWqVDua>mAd^MrUr90RbOPpk7XT|e-1ibHchO(}WONd&w zj$S%se!`t&1x{ zygMB$n2&zf%Cr`Yt&v7pK!DFI2{&G#XDG7!J@ndFJ=9kTBSR$OAGheJJ(Mg%ta3So zy7KMwYN9Q2(sDyHKA?`W8<(Epzn(-wLG#jy6udC=!2nLlj)x?HgK}5zHS8VAfmZrZ zGWb-bQk3D}vA+{xJgd8slvrm9vtg(Rp7rjaB$tmS+;=n(&eB(vDjh9x=FimRGykgd zd_O32I>WI7V$;Ti0o|cwHHK#laPZ-}2-rX+X*#-AD~;scxDGxnQ!A$i(D^ppDLPf< z9+NJ-l8D52;#zyDRM~$&hOaL8%!B^umzK#Dwr$n*zCZAeP9h~;?)@G`EnV5uS>=3T z(f#LH8lmXbe`nQw(zV3tcY2Nj#U#TgkC*(+VhR+957+#U18vM1uE6WuKeBUdc#59A zPfezUB}()^4+ekydUH3UwvV;N2)9P!yLck`#1^YA!r`OBjpHi2S7+uyL~2=LH<~^@ z{tV_7@85Z?`FQ1*Y|wxJj8O6WFBAu%p(6T~U{iB^l4_AEr{4;rsPo2!Z~d=VD($W) zcenk8Z4zE1*7!N@emAbWu@ZcJUaA}8>9;;>fLRc9SC{MezLhgEEWrv3pjx6)7fJBO9!KRU_d~ zMe$Ur?YhRL0$O$Q&>Hq@Lq87;RF>JW>hLdSn&BGYAf6a?_f96Z3EJI({lVJs$raVn z0ZZo~u26Ppr_n2pHaU~ldVaxP_{p9hQ z)l5qMk0PwBxUr?B{&XU}BZIw9_703E8}Fn$tUdKlPnTx7@8D!??c~ZuMxl?grM-1%)5A}bkxd#szERNOPY8_>0~WmB05zp(+*mp>4_36%7=_@yQ{Txf5C^A zB)AVJqAmCQ{tp-V!4R0@$SiG%vC3mQu-gp}0Z#Vy=5n;%)-bL&KiXtFJAZ~-Cda_b z{LjqQs_n;gJOjPoadAd_Oy=@3jK8L)2AS0K#|bvvjZ&~IEfDxHl4RG~Ubzm(&siSL zeD@-0yS@GA&L3`d8akIVZd|<8Rx9JU=4?sZY_QQ0YMjwHuQzkD!@|iB`igr_&pMW{ z(W`}b`5{F?XTe9N_$*j2lRMATZm&mzp%(;c_>df%ve6N9JD80KY?4KmUKp&!;@DZv zejZ=)&DA9=Az}1;+RZDI^f#a^Q9~?#>sIrSF6-5gn}0Ky_Km)%FxctoF%2|{SWccq zaqUr(rKG$)hvTVT{5Ex6Q{M%;JpZa141A5;-ewAG9_>($iE;3G>W%*(qbiWW%+iwb zt$5Ts9N^kphKHru1#Il>I)0P~9NZowqPo%C-*3IOP%2XA*WDeeoFH;T(_@zzJ;*RC z8}0Q-3)pvjx#J8qYl}4-=O61D$uFN8a_>9ivn%|m>=(e_yZ3vcho>a=9CutoJ3UBN zUoAHNw&;zZi}(vihs&w!pB`v!Z`GWSmna}4vV=a-&P=1%4J=%Rg*Va@~4)^Gy ztfFGw58jvkU%AQsFGC!UjaB^qXMWyQ#y2jhu0LBpg!)QBlM4iJgpf}5 z1G{TP7f`0>N&EzA8yZ?BPS|wBU7Z8JeBtLI^nN}*zMT2ZeC!OJ0Zun+!euDmn7Frd zq0i=xCsFPf$)!i=ID>W(Y&Nk1ky!|bdxMN4FBA#DoNQzuPJK5p#(3U~R=Wv#qu0A} zA4|Th!*7xyJaeNWHY78MHl>}p-p_nYpyVbeXG=|zBDXf6##_QIMtQeB8(8@L{*9v^ z`eQ1JE6jOak*e<-vA3kE+Zt1)+xIAL+=#0WNyV;Qpxu3Lz8twWMd#^Bq!cq56JhhL zE6KH_bpRETI%OHwtivtGwZg_{;rvpo&>Vf|4bpDm5g@5nMMYyf zUlIje+yUjp@!aR_qRh;106bhOOtQa*j!IX4<;3*x!!io0*C@Xci3}>hnk@B5S@7J6 zZTWGdg#hhAM~P9@PG)4VWs(F9WOK}VI3mN^ZmY`^{k$q6k!#%9Si&eK7E2>P=f^== zT0R>>dySW~C+`BzLQk`wD=PKtvT}}Iux5HX>lB3uzRTVpb(PM-df%Qk4+W#Qts65+ z>2s>gc}_d#xw)H$bS*97x9)UN%fE~CwqG7qO!i}X-N>t7AR6?<_HX|h7WVm4@yw%h zb@&Ls-6=EE89Q*pLH9Li3kJL(oC-7lSveUG8B{Do$F?xV2Qscy@@0~QCQ6h)!`YZ$ zylfDAZL)feGG2(Hh$SfW&Q!U5x;h8nHfp7#IQLVS!rX1fZv+ISYf(`z3LVDEn1qTO zeXl%kV<#rOn@U|&Ml19+z_fF2Fqiwy*)8pgU2JtYH1{e8gG810i$S?On^|Q!IjqbI z>p!!yl#G#QQA@*e>1Dyl*z2`c^*(acN?d*4Xwn~z?naOhv^zW7r`ACQ%g&4BhSvA= zyAu4Bj<3Jc@jqvIK=`5wLg}P%y0B0^(NN#O1Bg(DtsALKAwlQ})xrMb0^y0_WlV&^ z-=fufNUKs-lZqLm7&H6p*=8L>!^nt;S3Muey-C#Tw=d4j+`+?hG+?a!kM6gn<1k!Ozm|_a8)*GPiV|XkWQFnJQ3OVV`6z zRV%2ob+n^TMMZT>glM8*UP6}g=k*Ue?d=Cs7r0o%CwZ$JI=j1jhlkI&*rD`2Mr7sb z^S@D=7_%L2YwOZHYBhpWrmBztO~FL#ePZF>@|d8Yzyk_z?vPhs)XLm@~=Wf5bZD@eTa`?mZ<( zjV|#X5j$`=tMLcFklk;D!XehVCE=dk?~KGCI;QptBJJ@aPw=)^E@pb8r zvq~9aMX{^^=R-7>9)9ZvQ@xwbDRwYfcsGEe;`qGYLLkXzMkbGsv(>3F%IG24DGUCg zLQYqkt^gH^L9Y&-OA+SXSyv#Y&ysLV&obUHr8dO|FevA2Z*RV6kw!R|mJJ~m-wQ%) zjkdKpgF?x5fSO4Lsl2!NNF3BkoQ{wVWV8tP+u;-_md2MN^JhdHQ?5&A@6WocT*Oa% z2yZ;}N)Zqudi0QdjFA&DE@Rp|FzWOGjcgE|tbg{3so&y2MDOy>E5kpU$o{G!uYqXq z*}pCw?sPcpQQW0z{?LYlN7>T;>&*TmGP1RiBC<)iMD~5W_MfigJIShi&+iF}GYJR@ z<;wW}AL8CJD9>%%8U%s`LU6YPmjsvK4hilqAp{8SZh_zs2qZvocMHK?g1fuByKAqP z>~qh#U*GPo`ns$7->zMo{XWln)|_k1F~*$B)x7~eve66PvOqZ)moZvhlTMV(uhNNX z$ii|T+gtE(D_aS#V|v=hW7kgVN2!>S>+?~S6#uM(RDtxAH%a#BxqZoBn2X^T zpLoq329i|BBDjtv!iXG~gjbw@-XF<fr<~%h`Az&6gmPc`8PF zZjIaEg7v??{;w)zfD!AOu|hLacp8!rf-ddsZMI#8;o`ER^kHSm_QkB+XL*GKCO16B z|8LL#9I>4}HN8D=ob$157D*qjeP4-N`UepN^XiSh3G?48V68>s`41d=NqWaCl~c~#?NUjsNd zIuTL)`y#VIW>F5$Djh(32;MfJLo%==aSwTnY@hoA#A!2O1%lr& zpiAmGdDYgFiBwHANVs}>UMO6R=Du=sCFX#dmQDKG)Z3!NAvapi(Ql+5nQmx*wqsa|FFi4%YV$epB8mDjV7O?IWHleVX5%FrGV57RPxO?yt_ zbz)_`1ILEtoF)h}T zSu>gBm=ALFu~CABL941v0B=oWF(713oN;^Gn#4!A;(vPj(Go9}Jn#MLev*J~MqNSZ zEIiDG$w$$~S_L(yY_;O{{NdrqBV=N8W@K}x3v8>pqv9(bnZ7V4 zg{NYb9VPE2H#p(LNbaCp0xKXq$3iFKj3?)Nc7Ps5(!##d_k@7+#knE(6~@BlSlr_t zR!rE&bvV__KxX@65P+`Sa~_&gh<&k{+MNB~d|rDpl1Z5E>%nxCVs7i?LOstydzLs^ zDyd%+9nITTEzP{KWrv;M*;xWopP$U>ysut;HJ#kHovotFy8Clah&u^j31ErT@(q46 zwe*;E{A4DNjb2)kfJY_y+(YWI>O=aD<~0gFQ`5I8h2PcvCA_?g!S-nn>i zbj<(O{3T-#1wGW_%VvRC`aC2^b?&yg5*)Gu{t4={UrhyfQ+;?|){g?HvY|L8AJZul z0)*$Q1cdns2_NG*%4tGV2r2@YIMuk{bRr{f$xuqmm>tn3IZO5I%^<&ejXgfjj)T)Z zRoW9AOkfwBkdRSgkgtGk8XXrW{p?F^lTk}x*Y^eSd=JN{*jQ%GdN-H7UnTg8T7+L^ z1RCrA1fUuvmpAVRb0I6yu*Cz0O}t%=T3}L>2 z@1VpNRQjEML9MMWSo4`flT=(Dq0ieM`m@-(_OZXT3nL;YYFN%I z2xx?Y!a4qZW8Gwo41p8@5I&4kUs@a-IRp>LS70Mq;|}~2d5Dc4se9AiGg1~($ND8hZ_)& zAfbvS3VB~BWD}#s!WB%wUJQ0KrBP;^SgU9!EbeOeot4nhEmvC5H?76Rz2U6v2DgI< zr+(=DY3eQt#!G()cz$;2jzZz}@N8B+7mHE%RY{q0peT~nfppr;>?}Qu_u`0LHd9!6 zIou86(;$i}shIu+ch-2DjN$hND-D&F?4Ej%^t|3{BU-86YeHaE&)(Z@%4CXzZu2Ae zL$Y);(NeQE8CKlXOvv)GEUQHoIX-(gLFLE(-Jh%-UpHO;;ud~>aBG7{@7|zO{rl!; z%lj|xAe#hrbgbLw{JGBwfwu$(s2#i0cp#toIX-7)mad)%q;7e&t$e&w`)o)JoMw`s zs61yympi&bJaGeh=x2sK#JPB+eHzWSXhv%Z*{(u*wElMh@_Vqh!IjB8u~0aq!@FKC9%}byQv9W zLgisK`=+<>LjZcH*Wn_!@dmmyVIld@H1-L)4vXul*4i4UJQw}W@M7~5VUdR>iyEhc z@nXH?QDwbb^p-$lN`S)nzhT-j-QUK5cOrthz{@x7263)S1PG;Xdj2i(1fUC)>bjNU zv2Keyp45ls^jPFp9{JxwC7Cz>D=IPkH!6`!o^NhAEFI8RE4rO+HwuhV!%Uvxnz>pD zm$9@=uU66g6IfPuA}$Uu9ltK#vKM?c+1Qw>emiggsqPLM1^i7`mP)q&pi(b}qlxp< z3*iAdV0*oo1EB1;givv5s><36bK#&y5hDl8+;JTZgbjEPVMR0tT>-#6cGmaR#12~M ze-W*9>49?Y86EzN9M;EGpz$WheOo!Yo-dJ~Erz`}QLDyWbIWn^<+!CAjCL?`p#hA(?r06 z^3-pR<@Fx#&HjIY4qg%Pu4U9^_wkNh_4E-E?VyaZ&UqE~x8iIH5f`64uZ7MB7!2yO zn1-(CYO(>~xw}{V(0^2Hyr_CU=EIbx#fehX*DcAy^hvR2e7q1&R+c69Rha1{VOrH2 zXzbPFDoQDeWOqez_Fa*eXrp>{Zx2XI45gYg-bIO`_72a@>#nYqKRKvwD(G#zzy97A zA0vMn@=^hu(we&SD(k{lR!$&JqocEs#IS~_EA7N{a~qx@Gz1~#(31&)Ic>NMizqL^ z?w0=o3d}0+u!v1W@*0N`?Eion&i(*Jf8vx^)@kZ*pjA`r>|vR@-}`=mP32Zf3^gce zlb3wC3lyHuxG4YTxj}5Arn2Sj)GjE~({&0Q-P7G^@xnS;T>P|_(80mU^~|)6?)7W@#=&Ns(pOHPM#i~PE7~P&F?c@W4omC&-m?l32u;KH_ zb3|oM^0UNNZu;)-vYso&Trcp z$F8ns=Z9rB5O+~mCm8!R2Chp|k-iDI<7DUw35Kb#(koK!VAA)EnFs^_4a@64f5M-U z@Iu81Tz49-w6`h$=^=Omk0&mX{Gx`Ey94RzmB(Te=bx7QR?@vau>e%7mbHgFtNt`G z)*z|8yq0GuZt4ACm%HJfcksEXrXnA~M^8<~0HOi`;X%BN%gM45=-U zt_l>GFUr0Mj5d@wK%KL~zl)*2Cf&QUcKS^V^$Ef#t+(Dvg7Xl@R^Wqi_X7Rjy>GOd zR6C&>!O)ZjYRR!%R`k&4M4jv$s$5)M92TYuctY&vsQQ*g_SWBUafah1f5we3EAawm zX{HhvRMQ28X0KlTC^e43#%5o~;^KN|(4m@6H~Na5Jr)oCVhN5a^e69?1t7|H=~!6} z%6?uPPwN}7W>jzx#Cv+W1)!2jCs;SzixKVNV>^WA%E(<13d{>puz&%7iR@+=Vb21O zoSh4VE#e5D+QqE5AZ8@;JkVpsEv55;BK4ES3Iw&ZmSXs#3)Tun9yx_h*sqgkD&V$~ zKDfCR{}OTZd#Afep8p!^)64VI-bgn!NER1dHN5!Z#S*~D4ysEbLw)l}tMd%xU!Od{ ztL_?iv4b{kt;ZF8tkND{N`KXSS?%@unsEXsf0QD#YlhGLrKee+w>7DDf|Q7r$m zGwDZxq)ulqlLxNd#aFC~v`VEXeaM0foo)P<+_qt>I8&m0dEz96y&Xhr zdm_k({c9vemXg{6%9*(=PY%Ie`lmg-|hOrpvRlbYQL=l3y^hLEaI1>R*{<<%Ip)?H#MN zL8fAzb4ly4;!6zLx_Z_i%UC-~dGMWHsWW{!I)cVb7uT4XdjLZWUq6pd3{o%|L&V}CfFoagj$Cb1s`V|>t^le|{ zMG%zzck~KAzEw9!+Qb(#v;-oPbu=0j6nCJ&gW;oiPVmVPZz8y-KG8B8$70kVYhD{3c20{X7Pmi`FVt(~2buno{H9E5 zuEW^2?+d~N7f-k#9AhzYSlFLf4sUM+5aecTC6_Dn_4(N{gl3;6oxsO zDO|(*VnCIad`L}sef@urLMi!!sC;;+ezp{VdDubylpNIig!uR=KEmi{z;;DRee>Q6 z{xRd7!i zk|3VAn6y9Y-0xrqKL}qSn{}5$qQx3Z<;t7n3C&laazYZqwLpq=9ANKvS^{-vvQ+5E z|G&{y(DY&Hi1_Qe+S;}v0RCiokAXx^{zN%G!Up}Oq=b6Gy|hx3*lu&smC8PaKsfjj zeP~gij$pdDsKxK#kA?wWYLFk)Ta6C0eoQZepfnLR^K@p8;OjI|%cLxcZ$v#JuGxj_?!vaND8S*0qT@?s9;Yk#Ku8Q4KA~gY~@KaY3 zdU^RW2_M@fR%l;5vKEH;+sq@KT1C1jyqj954ItsZr8rGTQ-^~Ka+Z=R*Q~SDiHO%) z5kX@$`Vrulseq!T6Go`kR^~M+fG_^yFDZ~SrVp#AqVh9U{{X^&LgLfH;`PnxR-3u< z)>^qi@6U+d^1qD4p!PrEdMF1DY3SxFBV-Q5&4S({SC}X@cSRaW$Hc z0yZ>AHHUKRKuBc>P0@6WYxjOq-QG?|O+A$*^BRdf$A9l-Z(kG`gx4bMs`ON8MAJQ( zdVbjU<{U;!%CFqvtDm3k`R?zuwDtrtYHE|+NmFINxXdgn%s)Vddcnn|vGtsM(oOtD z?ijNuA>b!hI(QaYE)eCGJLM=?S+6_gM!TdK>pz;$;)ZNNkLo_|j<=}u&H}TZcK)Zv5tKuFu$)e;cFfG!K`Bsb_e zNr(I>dZkFgh`T22GRc)_dwyfbx1QiWUIx4v$X<6Ca+#oxrp*ve4ll1@V>eS_=-Y)uRPuB<{1iugkqa57+)uXA+^yaI&4iaK-P0gS zYCx|m=|mDac7_4bX3pkjbac740UXy*gH3mb#J^%#h3NkTN|5a3o?*#Zz8-G=!qwkz zFYIl9X<8yfLcIb(x~Y|H>RuHuEfo62^Q4w`tK^^Xj_;IsR0kSB-$D$)Mz#^VzR0{k&K z!ul>|0R-@&9FNI1GyUQH6rCZ(b#V7AZ`zu^sHW!chzO(@1eCn5U+*?(pZ?|f(+MZW z=C;OVfJr>Oo6|Cb^(kC>uF}HZVCt8zeP{>)Kd>Su!H$ILdoEn>-ZwD&0thMVizyOuIKZ*%uS7p`gkXvWuQh8*4($PP|#*_+3ebgT|l# zD>i3UPq3{I#QZjksIX%E$&!hIoiTh_q(hrVDr~nA&7h^~gVfgc6bQV(z%8V$t@xpV z2&90G2i2modZlHvadI^ailmfCdsz8Qxf!M9`ttJX!2>1(P;cAD#_%h#5McqbroDb0 zxd)6A%epVVJqHm9!zZ@%)WKoE3LPE&LkXTtrjL(LcekW1KhyxG(-T$Wh3i=GG59d- zT*Vc-H6EQYFOCP8Sxo4*j(-B)F zb8(g8d)MaP%is`9khn7;wbU$-OKNKHl!5rbW4#z()!f7AgpJfEn{qUGi$=%We}74An^ zbXo3?4PWXM`Am&Pk$`s7`v^?o74LOpah-haU8K!g0y{idgw620WuheOK1F=&Pf*-N zB~W(T2s@u(o1Ht62>THeHFRJoFQYe7<-+>)CQe+cB@ifMCBU!=oTd57l@Us+IMda3 z)P7`=5^6cKwHIchPte{5fC98a81rF&ZN-aG+hyF;zj6uImH1}e*KVBk%Y7-`#`QZ% z%$|DKQ(k1boRtTwnXd2D9v&V;<`^MuaBy&|?odh8EnapxuHQgL8YEGmrz<+x&o1)A z^a24WtRJa1oJpC{V*p?e?;Ia_Uf%LEl(C_q+??APD=t~t-#$L=D6i7f6u~&d7E2V_k9Omk$R~rv?S*b&<;JOgA z>r*ed}*c~UBd2WoP8f}`uE@RxvUvZNzLH0P+(5N$g4@f@YV0KWj&XA_%AIpjtEmCsnv z2X&9;ww?~j^B}v(>oGF+)VWww{M}EZ21!}X^Q`UOaU>xosW+?Pe86Nx>_ zvgLC?T(D45X8vMQc#*@&Uf34H^QP0Lr=Wm>n)>?Fz}5);VJ)HWdcViQY~2Gn=P%Lg z{aQw983M`}2}z1(J@=!e%*zq1HzRxLKEBWY=OQGUY5JGV~+Y> z*iN`S8$tHD-fzuxe+dfRXImD+&~hP~)fAluFCe))^Tp9=`!age zH1UBOG6hG{%8dGFY3R0c$wo)tk>fpRp?}8t`31HOeEGAVyr{>4xWcaS@=YUYX)m}z zEP++n!!7?E?5QO3lyC z_sN6a&4ILr`{)_$O_%TUR9J^)G}8Q-8$1CZT6OF;b_;xb8^JLLmD0dZZtmvVc>x}8 znhs(~N)D%tT z4E-XKDX7-BR+vc6nzP}Pu{dQ(kl#@Hxl6or2MsAHMkl07ebOG{glpV0|5^YtE6Xu^ zH8kVYNr%|>`O%HrJoPMYr+bI%46?%#YwbC3pOaWxQI=ts%%tQqO!ba>G>A)fSBDYv zFp-LgJUCzI%p~!-odUNK*pr!A*S3t%d^&$WK}L_>#{5;{;}fXS*EZB9ODf0$OJb87 z!ThT0_u-r_BwbJv!lH(< zi8&3!QAD?F_D+56Dm-X5uDeD=7O1}mzG*Bu2**T(1@BrxL`%TY@*BMPron|;4d!bP zzY!AO&A8{gOk^~hgWz^E$LrJQQQH;LIKb>L3G!TNDI;bKlkxTEq~KGI)X&*%fVX?c z`UHXuc>vB`>mYp;EUvEskD=0bl+hzK%^P}n+-+X8x)xd!=#=xt!t5yz8a<71%+G2INCb&C&w5i4=dqtI5?8@^wSF^ zIc;o>HGyDFwv{3eu-!_=m56Bg|=`G;07_qc>p%ZJK-{M7G`E7#7k^F zFro-n$IOaRv($)$KjudwZboLJL=U01<^Fz+oAc_VYT-2uc!+jDH1oH|U}3|Z?%nuH z<9G{HSb=1b;nsgFx>0DH#CJrG&O8}b0d}HR`2PF&lZjVxr$bn2lr`shdjYeS_{_ON zCMJm6CqMyq+&kMr7#jW4C;$2yRW~&-FEFc3#zQUcBqr|CKQ zAWQpz6{FaLbVd4^fF+ap&!F%D%V3f&wZ|V_Q_8CQ(xZ7$R2v`>hJx}G#Xrr9s@dPa zK0mL;T0k0SWFKV8?_pd$q>0Q#Ugy{E$UbaZaX{TUZ4&QDU23PAdECe>I`#ycjq`4lyk?HMFMQ8P#OV86dqrV>vAid)5Y!KAzK=~ zi>P6JAsu21D(Y+|1sG4~=FYc%MF1R*+gz->HgS5aPI5b0*5Q~e z32)usRntW|H+`NiW4q4sZ4Y;P<2C;T8#IaGU>x&|{gM|##sDs9bx8CO>=W_;y$+K) z%+^T{oy0R^Np~7zM&0y70bhavAFoc9T@(sTEG)=R*Nb>7d#;}bdwb{;5dmGpLB5g} zR?9i@q+yG^V;tZ(_t)T0jP@5E9+dND01Ka$nb=`e8v~Ld_xdZZ)v+~;WIPsoCKhIK zFgyJ<*A{F0M6H&YZW7A%qi;lb4+UNtxLBY)c8rRT=bJk+bQ z23HOnX3LGB63e5=;iqKQ3a1)c!IiCt2faHx?Iq?cGM(o&vD1g0Y0dTCrxD7;VAQ0D zWzAOZ0NF~g+}vFK=*X$Cz_dT1E8$H^a24`+iGh|;KM^kJfraI~-pDU+FAWVE%^G?v zh1vETA?e}$TKwfBfL-$HMYoV z>?oV?Cb&w9C;FfDvR9q?jvh@e2IKuc`M{IKbrDg=tsxn?QcHaISJU`-WUX=Q?bS$- z(Qf!<7vee`O`)9lClvBuKf1Me9AA+FeQ0Ji{_)Tg)}4(IeRu!>>+s1}P4udcDpg%b z^GTCi%LAT@0-i|CZ92Pt>k6ni%ABl{3JdGxNXr$k2CltYeDhEUgAa|OI{{%~#{i(R zEonmsI!?5aQPz)t9I@BJbHEl2Oo4iO*K=PYMDIWFQ=>zTo9A9!*z;GdcGr#H;^zRl9*eze)lk<=?~Lu$DMPv4*^E@Mp*(wp_iN6+o47tGBQ6zF>d#3D_%b(KRzx3ZL1-` z1hl@+*jT{K&Tizop89va0Yt>t7XV`Dp+E2=ZM5Hu17_qf2{1cLr~%jGe(2$~#;{@s zLq7*Ik3}dwqOFB_v|sipEz|9Mh|@d;>~UZgq8Jtv96| zBULDv@DrYz%lNWUDPVTiyGejW8 ziqgyN&8ojPfccbMC3x3UHC0@Qc61mIEFPfqCX(R+h#yC@+sA9q2;<{kifop0DJhkk z6JEXLb3uIzxM8x0mZ|ERnwqYlqybUTq5i>u^<(EZq4V=J;IR1n+$rEQEs#Z2m!2TH z2hw_FRF;n*a~miBW-Eyi@8vD+NCbTqiqHtW_as-)V~25yGqki@=C;34=~h>@@wsd# zLB&vQA;_Ik`4o;9+vhyCh2_~I*Hc{FwOM`$(RWBFqhkRCaffY!-#*4=DtJJh|5CMl zp8|+`5Q2P52^O4mHRmzmU0BJ7tg}@@0Suyv_3!uni`E=3?HyLy^?`K}^lI1NU+14} z$QhIHz?92FR_D7?b|k_sTTXFyClb^mCMCX_6>Igf&3iA%?-*fAFdvn z^LX}+g}d2oN@Ev}PR{)n_87*4S5~%c@S9hUhxICu(^{TSLE`b5WIEC*UP?|kH9csB z<2)sacDfw@by);RR;YKPLdp#Rl)k`pH1ki{$+kTyUwMUl&)z}3JTxGoUFX2?emRD7 zK0dr?*%8il{&8`*C@&Z~T)n^}Hi4Lb-PLf$3M#oKE87pxsr0V=?Oobgk;x||-fwaw zV`Bfe?k9qayn=smjnG?YIl-nK9|{dIe{_5BTKR~7qDS9Rq^c4lyJ z{7l8`mFvDBuJ9+=e~YP)puq`v<+bao!e@SZVB5IEgJ8_ANGfHF2Cu=>Gm*e)clKa{ z%lWy9JI4Cu>0m?1x@8U}1v=wnX+%wZQ}K^reHp-Z;yOCy1t}43vv?U*1{$-7hyK=NQ16Q5VtGWmG02}YYeDRV2t)!%nQD59g3yYUn zan&{48*4gk7M{09|7%%;`UaFW6E-T!qa`mz;HRcFfv-A-P#jDO8|mr_#s}jB=z+5V z1bSj36Z6rtp{nZXvmIQrj@DM17mI4Mz;=23gZ4ljc#@A&tdu$q1FeGbyG~x!7be;d zXxvL;-n>{Xb6%S^J15oK6nJ_U2qB@KdjuO3CMQC>ZV%7+!Xzbt?oiKfju6LS429km z73=U9pad;)a(b2LMrV9uNCy2R5UF<5Ky~r1RHgeZ=u0bKNAGPsN#={^@^r@rO;leQ z$qTg9KtG%|=Ic2)pKGP;-_}oXW9ZiF{Z~3lL1C!?<_|O|Q3qEe(^(Uro_#^>j*TJ5 z>sqtFP8pi5wjsX*RSa-+3S8&Rc2Fy&rX;rjWzoBReZz?~Y6x*}Z|gL*xj;mBYlS940rr{Iv*sI5?^P)s>sW@QbUc|uFYvSy9aDJpdtxb8eN^Cc)zmSf=x)f7$-T6$+@64ShJkpm~#{%zp4Z#nfk z-z@^iqP4*~gQgiAj5kR7!S_QJm6fKuGS#`ds$X z>N#+40+z}79i(Fn(vA!T_=x-2t7P&)X;E2Ol}mh>N_TmlL#vsfKzvV&(}4ba@`bA0+~Qw!^P)&D7B23Hm0#zY4d`*? zzsd+ToeU6uk<;iL(XUZqPWzKB=(&bH;_Iz}9LU^gI*k!C4hW6DG~QiLo~M(}U$#7hQv$zx(HqsL5 zq{K;qi>sRX1I_EPNS;sZQ)V~6e_!?|(%$yMy!^T@D=nRuZM+W*Nhj;?%DK6dLIv{* zv2SjSdt;SMKPc8(r()eD;>7-6Xt!JhyfYuK*;vvR<^&fU{@vzg53v!l8i$31UvO|9 z6q`8L5f!fTIPGW1i`o#T!!t8e^YKlD5gH3v%_}=XmJRI3nm>pcwN3+P2Uc%~8kal4 zIoj4fjM_#)eS`MZVPctuqgr3o?oaxg1+2M%FltN$#AlPft;J(m$(vt6x zXl4ct!a&E1_`5cs1FpMg3pO<;&=cqVTDMn402&fDKmREqJ|QQEi_90Mpz=H4rz(UT zSWB;8MoE^aOB)lZsMzG-TcSNy2dmuDsG8;Pz3ms9rsV`)*IF-mTI>nvBhdX%Hgy7? zsef$hSH@o;(3jWqze~mGsfv$E@x&#IlwD*O+4bobyVL%SvjJSeQ%oXGb9LX+re3J0z|=KpO3I0dd^6J9t4@cqKV6Pox<28G4KR*BgipBFd9_Z3_?CnuAE-O&n|eoI z`xAMvvEk%Ti!bfcO7=Ci+o^_m4nkk(jtp}1?sNL}3{(T4(PGEZXMkHnjyS3tRbw3E z2}l56Wh~J@R7+4zS+6*GZ^IQJ6nuDY6d&R#o?wl88t8vSz6ia%zY!)Uk4jGmEq3i^ zyow(`#`*aT_siac(JI{1WTArj*NhD`q1S`#V7`}?Q;KR&sH>pc<5DlEM1j(S$~ zhZtK62$f4tG*#TzFD53{*H%vl7D1!t|G8Vw6Y0rgw;nW!z_qOL0K*?<6h&Ft;mMM* z93*xr8JYDk-@(77z_&z?SR0DRMm*Gm`@n{p+TxT=(th^aU|1F)wijzp$qkXa1L9v` zzDaRM1?#T%jgda{V886;UL{aLf-XV@F_8MGWQn4H6@v5r{-zjsCGJFqo<5mE;9SOPqlyAaR1g!VQ4IIEq;i)t-odY;5 zw6`vB07Sv=v8pIze`Bx$$BIz-E*lCOqUaW1=-ZiEOc^b-oO-%GgY3uk2hFB($ny~3 zWd(3SJo-5~1b7)(CcDeoJ`ijj`~TCvH*ALoZHF`3kO{%EFW<#PuLhw)l0*FQZ4MxQ zAHQ2QXsP2*zL|NnfT6n5E#I39F-HF-_K{)g(I5w*CZgEb%Lq#kk5j#($M!v_1`$6X z&HwEgJB+%$TzQI%19|X#AU440KZ*@Ftq715|5{WjyRKs8jIdF&BOximcF$|7l22-1 zC*s|R2%jJOnsx9?sBanYMfFYw$dI>CqYK$TbTQLYF`9oVmlFf?RPX3JR?B!VSTbeR{5ooBov^1vmzl{M&=-RzFY0AzQr5sAjvqiiWTMTJrIInG z#sXf_r;}4^g*h)YVW1Wu{i$a!0Lp+`q=$4PM9)&{cmg~Ba+lo5U>r!tW2Vd($JuF- zk?kk!$=bUo{J_%&1G8_!WeES zIIfyG*mw3y2e|?|r}j5X*k0+ECsd^R(vWsML=QbGs&ZiP|HkED3g>y)+$_|;kL0m( zcbyx^Keas~(dW)n)24d}EZ^=sh5BR>S5-FWetyuCz5NZmhTS~C5DirLcuq$BX+T$z zdhPypzsd&oAxcW2QX?5*6klOhHMI@Uhj%%hlVboz()=zj*RFSE0D^^`QTF%m*sPH{ zwW`xIA%k;3yblU84s7omE7EI3SFbDzd`ezLrCEavdj?6F@Syv@ z*9`>_A=NdiX~G&B?%A?fcDTxm+?zWHq(4|0C72?6woZl8tL;|AuP5|kfbrJzRG~Ut zE=yQQ!0)J&3Fd3xzyUv9I{Ng?$d-tm#-G{h%%13|MfgwV6&1EpQf)v=#>PIKl$6BK z_0%YJv?zI-A-G@w9Qc(8;=6DHn%iz}wMwUQ<`7H42fI<49iYlA*#e=!G91aEV;Wq; zfpNpYAbWo=uylO1qBZD48Z$(ey!Fjl=E+=7)8ZKzbhHv(WvBh-?~H;fW>${Eav1NX zN20v7VrC}9`pJhTW!69R^vHXox#T0Sm7EnIZV-zDSvCuyl=D2c@Wks_dBGk9divr6 zmJBdvp_vQ}%E8y40SMr-yHC&J?^qHjUC>tMw9!kQ(Sr)u>(gnDLPh*8h$GNC{_1+( z$^J*GVTF7S6I;f_i6SjA&gj@s`MY<)ts-&lPty1$SXq}TabP7X(38}#rG(?Ryl|%M0BS`X=x27^Rw~(O- zQUEso|A#i?l<5D{g<(KizBOC@T^L>L6r{{Fo>0LWw+roudw;CE_^-S3^;+hy?mox@ zT4+e!={1AFcb>&{e+l+g^#6uREx&AN{H0xA$k#?d^bz$y5B{;EhMh!KQsael(2lvt zJQn!_c)QQeut0!AJ*2R0LtXF_l=~DcLW8*0{B11i!j<>}3wvk)ra=2@;2aGU;vE5= zIZr>o z$7Y2<&uEBlnH_~Rc`oOd{-3k~0V{Wzl|(0TYrPS{o=d|XBbnrT#>`_Ju?Gs`A<9lb zjjp~fsXDrV_~)O4X^_1#Xy5+nkQ{29f;3{#(IKU5F6?fI8qAefg~|l8zR!zYQc>|s z&9^QEP11e6p*B}y5q~8B#8Jyfh6(55k5dL*A@v+QnCvi^CZ(h%1?c<6r#v46j6eq+ zRFhPTXX(bqOCGS2Injw(M?k0(7pIeu0ItTbJ1!ZWoovX+fGq|Fmk@`aqIlk_XL{}m zrY5<+DvE^k=H|8%X@`zU8sUAUwY09H=<&4!c<3r*6T4du#C|a9%YY!`KYJ^CiJy|6N9yjtN9Q!Jc3Ghk8bP?qp6JZob8w^3 zTE@Hd)#JB86yOe&`9E&rX#fG!TYu^7G{C`m0#23%&zk}GXy*Y$3eX1(dZ6*~acx!( z8XvklJDY}VF0*7FmfBHj%%=2VncoNBi<#l;g4q+d^9cWd*lyEsw^xnk$ezFn{NUp=A&|jnn@CA<&-n)c@gqDwBcocNuGcbBg9vM=p^KY1o zwe?xdL@%*?*Q!4oX9BqdQn3ZT>8@Wj$*sDq0W53Y7TzxasTp**0j*%ZucAEiLb~#5 zRhS%{xqzo57q<=Tz)o*VFS1}I%myMmU@kgu0Kp$~goTD&0Lc@4&gMgN90mP+XHZ~;#PP$6`i z{*wPxVbEb4%>S9=AG2Sl&EGLWy%3dNP6W_d8~!i=>2&p3urZj`6X_lIah66{SuwUy zjrHD0w0`?JQ_}HSD=o?kXyKa-*>VT(;W4ot%mKj-B#L}B&IX^1vDUdF%`-TH@azrE z!awWJ#q(J`t{Z{LIbgi+_=U8)UP_cxtgSZ#UK!!vyz(%!@ciUm(Jb_jnQ*y1L2 z>s^84YO>n%ZV|93ODvnYk2Ht&u+R7c>O!-7MotZAg_UG2E{y{YH{ZD9-bD|iLlR6d z2Bk*xS`g*l;{4fPOYO|`yN-nN>$MQCn}TVKGC1U@h(8woIK!XTcx{$xKzlpzRp|R$B%uoq%0cC1sc`k<7*roYu?_c z_gQCtP265Bvkz7{d>vB;r*(@YxlD|v1FOsC=R<{B*+n{iWMrn|Z6}JAc4N3{SF$i3 zs$O%Q*b4cv?_o29zQija9dPsWH!XO@*4CbsnWQ5j^?wf0)%El?pdt#rJeyD<7ats9 zgZ;f?gE0Rd)=wpf6AwE3vp=+DW3CCpVjri&L{a92ao2#r*A8OmsNLZoDul()ik4u> z6_rpyC&}^}+IHwC;^58@Nt5|P*84em&HJ+DUPrUv7BA7s$|bM;EGEMGS4@M@UJhTb z+8+Au{$MIn9mx!9MpUUd$MWagZ^|#olWZ-WK<46NzcFjz-M!-nt0XEm7u~Z}*7)Fo z8>1Ko9iJ&xYCO;{wsm_8t}|O}_7Kz8jd>6I{qFLJI69ix#=xjZclYeWIH-oM&Yx7#x=Hygct7wh;s;!#py_7!b z!PdwFE3*s2@AS&LsRR0TQD0wke>Ng9Ru-BzHWcxo@z1UKtqEZ|0Z$Ozug~|IM_*E{ zU&toTiELkWwt!>$`^r~hL1BE;L9gjI%|+f^-@-(LEgyk6jVYG7TC z{Eu5-y&F0W<_y;RvqmDeBr_qfm!!Kx4w7e$B)jsf5CXwcb^0dl;nfC#&6F#}M8?A2 z^+cXbT$z5dHD!{_^b zGz<+b3P0;^y9-GpY|ojs7*PI}=80#|mh@{;qeC2}GhL3H1HkUfrte zN);KTO3<<|-nRwgTQjh-rsw1&5*f@JBC@iCJtrIo^L>b9!DV6Q?G1IeEtf}M)(4U= zPfgtCwsEk^a@82MvXWrH2nvP%wMFc#A71vC82;v>CyBl{1zqb$QV$w?9=60_ohk>6 zj7Xepw%|#hYm>WAgIm9{v2F}yV_9H4o*!=S+_1AGaXVyW8cLLXrZhH_yKMN$;!>JE zpdAJG>WHqSQ6}rTNI=8JL1U=LYaE>RY}uh5`}VdyKP!ZW*|w16*YAVqxe602r=1P0 zQ8G7edgT+#%{H7}`aY_K9!5ew_NWlUF7Y?7gV~YbVI=|eAFJ9cBvit_h{@WMJ4x}5 z3Hg-5zHiCD2dLdw5io!M`>k6HD~(4J1=n9gVwd^h1OZ`zm?;G|lQJ@{3$Z80n7J8I z`)N^awCWj{0@C>&%#$|K{nOyFMMBbs#rK2zomTvZewe4)Pl{LCv01*8<7FsvU%!aa z<99nBpRMLvU&ki(P{zZst*lER@l!Bkg4xEwi54G{TFd0&85u$_Eb-4(I@##!5rUWJ zl#s|RceqO6;t~_HpR=_s0_?nA#jBb2ETW>L{W&w|r_U-a{T#MFzy~?(tb-BU0Y3m`3&rE#X}lbHlTj zP!99I4PQ#K_Mi!;d3jL_G{U`o5OxrG&XmwI`0MPTu~;ZN$NEQ;0Ft4^QBUeGBqhnb z07m^ljAxJ8E;=uKNcs#h+r$KKw~&vRs3t2@Y>~s4n_M%1Oc9~_Xn+$xrecAsk(qYa zZl9S|4D)a&j$xv@>TXds%&N5#t*`z@pgcI9yl4o}6)G#`XYUWK_JLo!EdstE%_ z=Aw}l#oFG?$i2HR3GplE>mU5Cd($YZt0#2L4iiJU3O)<-WwdRr=;jtCG-5Q(eS2Mt z&6Euds0JStUD)YhsJU%d!~Fb0`Ocwa~3P@~PpwV6qA)8xJ0|3=lQl#M_6`CA`j0iM|k`>B0|jV?}UxexYxqhV`(wjn6Gx zWVpaXClmb+qDa`q;!1H^Fl+RVzkuMlD=7E4o?(M z_~IR(xGX=flLU>~^4~JjMN*lOiB^w$j*h@}1Q&C2Qdu%RD`SY@ujuG7$jJ|+lM<|q zR6*x93Gax{@zS4<9(Qrpe+soGj^6tU=J+&ET-H@Tsvqi(Bhm%fOjGo{`8bDmrYi!QcM`;>T8=OvL-;@%~#R&2P_yT+E5 z()Yb@R=c`{*4Nt;U=9pI-sF({AI!alSC(71H!R(aq%=rNOLv!qBGQO7NJ)1}m(txJ zNGpwWN_U5JDBbm~8{PZt^PK05^PYE%Z;baJQ0{BZHRt@roGXl#btswb%`R;^s^lep zA#qo7qsx(USH!XIhgPzHeU%s~xrWx>Lh0A?1a=W2>-CqwTXC_Oh%aw|5Gs%yrgg9pxqf8nKql)%+3BFDhRXe!8 zsFsVPPk4Cj+HEn-q4_3h!Ll9g!Ek_0dH8V9mn3Rp^kcRT>%?c59644>7M4#g?+Pm_ z@}l~a$!2Eb*Vcu!$T>JT2*;ZW8Eh{OKQFggz>9_vK1Wo`#g*5otDjUbR_R=5T*%8K zG43Zq*aEAw#atJKthbvAL|?wdmGqiP|1k_@oGL8W)9a4A_`%b=va-LlsYGncx+xWv z)+jz~q((lHMH~@4WK5Et2Q{9+ZQZ&#yeF<$fd7e@mH;eYZ@s-qEtnBPUe2cL*XGY} zjrp*>EKiWd`8zOaFgf9)`Ei#!h8%^~bIDAXn#Y?4R#ToWJw>OK*w*?*doA{u8;e40 zwN>}b_lixsSPBwZP8BhA*~$sMeXQg$pYU?{wyBYV-im8H#U$LdV;JxWApR z&{JLYq`H#PPhC&X)kw}}Z7&AOp*z zungSq;;%G&T~9&6kYHhWZKdlY^*V!wncJ#Q;v|sqX7wX9ZXOg6+a{XsaCl&i>FFmA zlFD4p_sN)$&50W^eZ*nS@e~s9pmt4uElOK8=$uJga{s*PdEqhFzt z&Rq?pCM90nhpQv2@AKDkJsp zh=ipI3Zi;Ak^-)>Qc>^kmL-9j_b?Pe-E+m9OLLnb47_H=0uUm{{8DNHQs+j(Jj{xw#0 zd4I&{PHLx>r}=5uX+`6v6fKC*nXgrF7U|i!GB&J~{7$l68OZu`_)?as9fIhU9s0Y` zrN$`u(fJ8l77(++t~;kasUN5Q>Y+*YbYgEFa8)%`Ut<#!CnqEz_A_yCRMyla%)Si5 z{Dk3Rvv$T9D71FpswPnL)9l*q!Je@l5u+7w&yFYxF{iL*OXPiGkGp8y(1Z# zrZ~Qw5|2aqI=T22TU(E;fw3{}!>`XZe44=>2@JgR9#L+KWi%=OPFn!8J(P(U4m&ml zt^O7r10&GbachLe)U39)cCHF^8(^1#MoTcWloF$SEka>Y`pbPfke0JtR1bMBu2}{k z_d*D7UO zi~+Sb&aADSo$Rbb_}Jg$-JT`A;F!p8vgUWkdMPKR7)^U{oLFm<)jRu0`Wj|x>ck|B{GHc^?E8n zApt{9!~yiuD0s9@`i_xWST@n{w~J0YFwoFq;^LXPG>;z}8ynlrB4bgWP$MC93DuFd zH^d6M9FyBBUHf1}Ts8DpP>T5nb@q<-jua@qA0Nj(^Ik^=VTXto%6I=6a3ya5VEvcNZb;r_rIxhU`w5p%!)F(+wjD^{4!@5Z-GGyxZK_$viIBdR;>}YU+Zr`WN7=_!H#Y_%3R#O-FIC$>?Y^ zKZrlzmZ0(=Kh;M%b*AutFY={R${&%Yw71FW^m0+}u5x&(&#|Y!pkp5|W|Iz_G{uPX z>W^y__;?%A8q{jy!p*q8wvzJqBxxb?&h`GG#0nO^;GOa7*QmjulWS-&?tLiUZd4H(9BhBlZ7q!j zyRbI~?h~~k2Q@iMCADF?(ENcJk@8`K3yxHzCmFK3BcB{w5%j|v06ZI(DHs@@Y;ApQ zuwB8-eRTlE{f3Cy+Q&u}21d|0Ny`5CNdfC$kw+S>PLpzcE|9aA6E#IH@Sp|G^70w9 z8+Ifn!Y~nWv=pNfqga0%ec*jvE0-v-^|Z&28{C z_xt}S!@Ksjwr%T8MagPNrYfGLnTsM zj7on{t1-<4KH$~UpR6L6ynL7Yqy;g4K2605Ix~HkExjS z(mG(NY-nnJfvR_PmQUp;>L-`rf_8P9>*kF6{5a?r_1m{#b0M`2S_4?O(5(=mA0@Z7 z>8I^^u{*5=-kC~BR(C&Ec`egDe`x25D^=WrSfB;AFG-dL#{b$?kS2@iAj*5zpU%yK zKqxW~2n#@Vy<1-eVvWQ1p4yp;T=(e;OX6g^n$CKs(q$Uf{mU0;7kC?Qv_fhl$o~^0 zL_|Lo7h&0(qT?uD@13E7i63m~rFEa+Q zU%)0s6lQA|t^Jgc=UoGys;Zjux-Nvwu@eD;&R4y}D_yGlkTBY$7JiL{jsPbg$WCRqKI z#tEI}jpUq&`|m6O>)V;ZMzVdd*=^v;iy8F>d2?$%HsCn z_ZDV?Aq#srjB#y=9B!8<@B9}dUKSrqgFJohGMAU>gWNprvNtsr3QN^44N6lETj=#C zrqfBGvmZ`&7-fI1s45L3@A4#Qa^g^aR=DE1Oh5Kq6w*W|mn4D}iX#c^0z zEMt0dUW|$rR$3qC@6#_ujQ6HMmYxCa}0j8 z`|j_52?;T2L6_Ot>KT4QU@;+}N<$DGA3xT>tEQpxynDSLg4xLf9)?;rvbWf>rBLabm+9PGbTR%FrD zp}F_of6P7wPe@W7U(xY8h^3lY`7DwSfoS1d$_IKZC~5Tx#KAS#6J9y>adC0aI7oI# zpX$_WagSReTRSX{t!WPEpwcXLRPegkoy}S|IqYXB8Lc&eM{zwpQBcveObj2bC6tRd zo(#;_M>A`3R#ve4m@i4wV~3H8<<-(tN<*p}GRM~R)@gr(Q=GQJEx|~nOd*#+wsdXB7v_yK4q`cLIjpV+4b*N3% zA#Aw39ASL!>lT^k<2^F0;<`IUqU|>s(hn#&Q*^k22$Hk#a7MQi*OxBK`mnjLNLxo# zCo1!ghpAjuklr03b0Whqo7LLBd0Z&0y+xajo56|(T-#r7Z_=A7SmkAFBPRX((Z@lG zW9-n7#w;d;lA*@)Lpb~PF5fusW_w(Zh>){ML2H5dU=8B#HA*eGg!Nxe9x`c}>7V&84&IdFi)}~W+Z@NxR z25&>`ZjMJ)or{WQp?_^F>=Jm-UIk%USxoei3eAP92zfsGxx5_mtlZ_KOhA)V7uPf+nVdFkRdkfmk4Gqycs2E%xWE%A0DDBxt!5{sNI8 zdNfa_v$EdpOb)i4Sh}87i9<0xPT+Dmw6XEm*3q*RS2T`AST(}pBnI&nxIjqYPU($f zU}OJoWMoA1ED%GB*JG=Xf(&g1p6VH_2$FL-NI&_RbT(Jhy*RXviHU?N$X=uo18IVQ zZ5Gp*hI3>!IJc=*5 zjbL)Onc4I~r0_&uj=#ADx1{*8cQn-%7{Eh)1~u-sC+N10t9)2tWZ%Q6KEVFesu~b% za@mTG0XsvO_a6aDR`9~3wWS;aL>}BXr`@Y^o2#FRTeOSc|G_1uk(I3;Pk|6%yTN(m zkiDcfZTk52QZ1P}gCB>B^n-C`+YGtg8y2t`)$YuS+DdAOdMro0Q2-&i5g(hZ7m3aO zi!=V*ZZm92THv`d9TZC($ev}76_adY)Jx&NUF1DENf#dUXCM%6D%gCqYOr2U!h48g z%?hm;FE4{A!bq4I>v6iP0mjB7JnAYnBp5tcHA}8daoOiisOw}-=QUDFN>2jTjC>!TwB%%%%EajWjRbJ;S;sS9-z~k*=%weO;n>pL`4j4* zlx~Nc0FoVY4A>mscNp0puHx^Uer{@)ycCD946x8p6!)ppVd`Ldg94>d$@LzChN&u~ zE-_gl-}c?!5JwviW#~pn3uhgF^H?AyEeWHMgGIRV5f^(+0dGWTD}SoBpuNk`vxZcx zxwWyLCiZm6)Q74aS8_;ZEK__OrNKh#)mfR(`i=Oeqrhb|np8oVv43_p*Ei$#A$$oJf(b~_9zroQh0Vpr$GZ@Kkh)r&F@dwsEXbIAf?fB5ZEcZbf^7c9LV}f8@LKCxt^(_V!x_b z*aD{mjyj&a2X2Z(%W_lry6^hxHLpF_OE-M67Fn z$#cfaYOq3s&;oF&k`yqId30}T)xqzz`Sl&pFPf8x;C%ieCbmf82 zI2@&JKIHaIo%G^KWT5o_Y06uYc$bf zC&>v^)J`l%`!8u|H>SZOsOI615syAh`@EgS^Vk>lve_PblKkieh7{%))G(}D2%jzXAg5FhqlH^aB@Qc-i6D~+e>M##Oh!@A z($KKGoYs^8a7Nn!UHKUAUq$|arSiqbI3pdCmX|O3ZoZF)8RHvO6RV>uE(tU}A5TmMN8{pJ&c|0Ku$7t=fY zm?xUY3BmkJa;t+Z+UEpv`)5t*AKy8&`a|>Avj^wQwPl~T_!-84M{*Px854_{i_Z=+ z&#v0JpkKY}&iK;k#t{;lKD&gIdQ((tw-lxfwQi4u#7*+3cPV6UUY=A?weT|+LCa|# zcm}z*x3_(w>Z63g@(KqTeLYCSx7XI-dhUi#vuIDv)>eMX&OXVK96TNKw*z3GkAL>n zD*|cBpI`uZkm4=i^GF&)Jt$*dl^ehdJZ@DfYqyXzCI6iXhh%3j!i*-uyuVaf&E_jP z4RE44=IAep;G0_8xj^R> ztcvzBa>D>m%bkKHcasQB?$y*&`R@@m-=fJi-%yG9Q^gv=nN-P>E{2F$%R;)W&d2#) zzf^VI(~HI>KnDvwM{rb(lQrrqZ)gkhw{91Bvk8gD*KZGK?Nk`@{uz7y; z53or|wU+_1+r6fF(`ELd>S;#`9Ci)7ZdW+tmui+3u)AOwq4xT4y0UtGpr4Jq^n5eB zH7crpZS9y2)&4XiBZ)yV<&`(`mvWbvgR&oE7}PMNaB)+HC#-t=s!b-~t3kim4pM0# zx<}QkItc?Tf=&5h+CxJK&#M`T{`S4S^3Y?Qc|22^CcwiF75ad(_Nw&_4a3Cr^n3ca zp`oBt9>yUPpP;b^vp=6N9FroIV!4yxK`Fv%>P(gxpPr^RHg4EZ!Y!RD0j-(Y8maW# zH$AHV=;XA%Zlf4a4FH2}OSq__iiVWE6hLna+K;YOvM&LZ#-v~C`127~C62@k48#V4b7)@6gQ}zr+YJvhCB7@q7Pag(H#3aWD3+~Usl62k}gCSUJR$uxJ zAqxtm$NlJ1`z#Gf?Ki8WF|F0DkOHd3nH&rN~*Tw2~!{G4&rz`a&eF{Tcd>IEU8$}1UZ%!-Q5 zhm`nC&Q${b5~`%wVoK((Y7cA8h#t{&rIYcLwSQ-n2W;s7IppM2gi%8p_?{NsLMME~ zsh0>MLPEC3MTTk(Kmv_d1Y|r*qt(_Jo$UYNr=g_wPm3-G%qDi2bNC;k0+GmX-GT0J z(zjzWQXfXT1)fQkT8tAMDtT-G&Cn_$EPCX#6ye74%e@oVa|&qDl}}8rt&QqWiE6zr z;w_{%Y`-Sa0SH)7W8A(y9vK$K04QDcV%PR|k{>@*i$5EJ2`BKPH(bmkFCp%;?HKwC zz)m?j8UeeAe5nEi8UI%Zn43GutP?C^g8v%odtcv*skj6`KO@j>-gH%AkX)uU-My>- z3Vvof-wBGOmz-PiXN8m$>QH>)YHyn7kHMcpnS;)75vT~-qdEu@9b$j z0xHL_cJX7mdxf*!3^a0b?OhtnLh|IM@JVx-|6WRI3^i%nOBG!L$-U^dv@zH6#P6{* zxlIir51BePB9THbUXv7Q7;v~9&6SWs{&i4#VWCAOAvLOU5bt5CR+A^G+}W?UCf17@ zl;zGV;oRg<3TXlY{8#=(MTPa2cJQ#ED_vjbg7GyE@W=ws+B^QTWdxn659 z)rB|S3ISTc4{4;6fO|2J68tTXe};p-pRY1zt>2(a2^7!|z|-`R z#9$hiC~SoApyzijX!ch%HX%SIj}(65a`m&iL=Qvs^dl{XbaHpW2dA4$m#8OCgt}1s zz0E5JK@xx{i4zm+%7`}LUf1KRa!Y4;j0SmN^SP*{srLv8b zR=t_$t=Tai4LsWRL&6KHk=@x1z!Av3&P32|^DO!d3ncHGD{ji0xmq$7O$l{if=>DN zZQu@zWFO}xx7P-=$pxgVepGw@EiNuE0NpqtF|nu7!Tbv~Y{d6k zkC>uy9$@$kx;p!qIM3-HYcA$^s-`|kTSKbyBIb*y$78wpSRF#4h8lT%;J*X2;U9^) zt&~IL-B!ZQ-LBXr{+;U+FSD@CS+QYso!6|j2zp*g(itKoT`o|mOB5UX-hWm2XI#$1 zfFwFSx#4@f?j%>9AU2xE#VGm!B1|Hq2rdz=7mFbA@y#fucT!#X`+GYrm_1i}*yMH= zk}19@E~j>gj6emvpqv(Y&owSsp0kkyJT=oHMOkjT_$|Dm!NnyXBKB5l*W+0l9HR5h zfJY7t6Vp7w<7-?M;4LmGq(1;FJz6<3Xf6{G7K=#h>k?W@2B9Iz-Oj5s+svog;_FY= zcN1`UOjOEF5U?EIR7Ttdn^0pCQEXOw0%gK~ z?c&ZJ3(T;Bzl@>kwnp>%)*Bix9cdW0tF)ix-`wog*TmSNPBG~u3A#Bxk=xjyU51BV zLZ@(>x&E$@NjpYGdG)NpW1{7b<2N#jp(Mp3BU{>Q>YJZ;nfao!)aN&=2N5CPR||sf zYh1ppdhZeGZJXQPG?~DrA7|mJ$FM%wiHdMTN#T>0Yj@*{xc8*CwFR+?rgs2IDkqQh zDLcF20`@k3H2;h3D#gfhwQoq_{$s_-?PiwazT7sgI}r^G6t8bTh_APaRh@$*&PZh% zYMrq)RKpwEOv>UfV)`QJRI79V0tI)D86bJ&w=4Ge$Zd0%>1#Q?lii2Mw4>QD-YEF0 zd`@w^d~*2Au6^w!HZ*o%$ErIjjkoas1ZP~ji?F~DAbjr6`D7Js_kdy(1oVV+#B7P+ zhl~|Vb$xvdSy@)kk5i8Ry^5Bix!mWuQS*A&?8sumy(dj95?>M%ZTMF{vXjx+U_Fk0n~KQn!DBC>L$%ox^4&6u^}^R zQc=^@AeSpOt)7O zcI|Rx7X>xeKdfT@R!7L>*)tU^o$8d7B4(}Lc;@d_<@A9T4Q^*dy3oV}yH0ax&(|Zd zbSbjtmEbO!ayP349Ti6PxUqFz_?e;-T^{x8l~q>S*?$powB*kvFyJuiMZ|>$=B35b z=mUT{n3?$tE4*o}k({q!D~h{ipg{8kU=}+$Mn<&G3()`_y)HlbS~|To5DTtkEzv zO$wE#ubBoY@#^%8aQZ*-2=7IMoXxz0y?M-1HTPRNHd|ONEh0HAIh%KG?9Mh|uUA__ z!VBH-kmlfsN40NWQ@n}v5D9el!(!I#9v(hEws`-3ki@9cO2@cVH#axeehC;H`Udh$ z0%UU4jRyyA&R3x2%FzSjUOGs?l9(Kv4m@J_N3WoRA+w37f8Be{*2*aHbsQ@-CO9NkM#rHzjfuG4lO&jhbkiNg(!75)+ zy~q|=`Xq`@$Z)^^NPvj3UGUmgIyx?5t%@OO2|73i-Gdv!{QC^k-#kP`KSZDhbTZk1 zxa#W4KfhXZa$-q*${eXq#mWv{P#_Z)*1+Ln_bpMQBaF~xXh8I0|MmY)B?GOtBGyk& zh9MIqv~Ymfwr2#XRyK#Th22~uTF?+r;I@=uhyPr&=x&@_M*{r1w>aDr8PK9y?roM` zV=K2r^z@mngZ^KMFcA$XAxFGsW@I+@SR9htfa(ln!2d_Ri|{6={G@*5Er?uy4i{)u zAeOTz?%O~`92fUX{e*r~fg#Kkg44C$TD*xk#jnZRoTKG2_S@^0jJ98v6W|;P6N|;% zz?_a!lV`-`r7Iv{BS~*O<>ctBMs2j~j`NEwoB*q!48_l1)D~Fnd)OH+u9*DIhZqO3 zkP3XQ)U|fJ?A}AMl9!c`uk~;;>{a7sbhJutsQgx;8rQ7=CVsrR5zRZh4^MPcm@`&k zshW$@*=ZJmHD{m%RoBB~E0(^cQF>HFWNVX7&~X>Nq{X7c`0m!8GZ5OOE8?oNGq%xH zu&BX?)i-M+Wkc(K?M(!wpz94LH9_Y4AV*=)kU->7S(1<&6w1%k4G>^Gp7n*>x10LO zE4+(-r#YGS*s@!y`LAET*e7iP(s^rUzV4IbbLXO~yeD1krUO|=@8bUlk_IcE z2n7<-%}S&^FuACyb?DWUo%JOOj)fvn5f!-lPZF_NH*GU*IPnYhG`5VJ#{qUj^ix$b zypKqRL_<2j1(&%6n{$^ZN6K};kmhzZ(D#eEd9|mlvQnw0uCOk<{pPAmSr;L&1hh__ z5e|{zH!$2qED3exrO+)3UlZ8gFr`IjpaU0Lo&G!t0(a5Fd!Nv9RgD!n=Nol1knXie zrnDe2jFfF31%(BlLmln9`MQUXmDQGdJ`&U@(3Pn%-V6%gWqc0PLI7P$LbaYl zoEMA~VDQ(?x#a(r;ci~^357=1w{R7HO!JIM<>qsZFSq4ihbmZJ8cS?MG&=jG^J^iz zy%JNG7ZA$(Log+x1j_$&4r_Pcjr@knVcbH|oF4m;^ot{X07=i(irK5yI zLP^P=5&^5LDZfpVv4BTiUcOvvSqwoQ?ffnDKvlnPdtdtbvjU+1efllx+P;{E7i*R^ zV(C6dcOt<3OY`&9t@?#QR%LfNk|-`j)QKjQf{17({D38nLimmo_vGA`Q_BT_fz860 z*4e=9p|9V+vv`*dpi7~W{el;ER5g2KZwP>b009(X)19ZQnwmfZ7;TWI2RS^6lh^B( zJ0va0<0*Y`+GiaV+fP6aebZIfR!U32>aY|RM!;LK*F}Z_-b92WuKD;`n-`^&)D)P) zqLbZ_ds75lc;?h#3z5D1!9+_)=wNJ23K?7L+k+pU`nC|0eC|Jc5f%q~>1_{)V$K&} zRH7(JnPn-RdHF;P)Et|1LHjr9CrTfW8>E{Vb8KN?e+loql0a;wZwP^b?PE1;)nbL` zjleVVH{d16eMD7@)6#F3u*b^Ks;cf0cmX=N&$$QG!az=PcJ4n-0eYefB(&oQ0H`{G1!xtsvaNp)ct{QNi}b^F!Jy%9&rKhn{CuUqu8P$_Eg~q_}e>QGEXfameM06H~ohi zStqLxtv)F3zUgDUx7@)lGWd2R2T9uH#C$2)dRz6*FPk)A9PZSRkw-U?sYo0(yO>DjMeb`g#0>Kvu1h=6&@p3it4@w(e_`}oN_ zyl2#Kw#%)$U*1+#6biXu!&Kw1I|&2KgzH6NifypqIj*6qGeLI+>ge?%z+G*V)FE5MaaW;SY)ffYLMuOhG zFc>G00%mTwl_i9i0|H5H(8T7eY6iaZ!_6;mjXHM( z14q(=sH=>K6Oa@)dOp@8pxf6v?InOIJV}y>ucj(T>V~eDSbz=<=}m!Ag6Z#pzSqHC zNlOzyL?=OZ9a?H>^zdkcSNC}yJ_+}CR@#pUV`b-fPgc6r&T6#@wX!BHRTfCgYRyX# zR-_Jd0A}d0M*8&qgM!GG@Lua@Am|Y9jcI780D3~Sjc$r&DgTWD&F(f-y(9D9*p?0u zdmhX??l%;$S6c_R1+)!vLl=(KeTAy0^M!{rb*VHfdUwQKO>5v=0$oeQ^p!+?Iv}^| ze?Aw&(AfOTN?dbCzT{9q5Qa(TbD*_90<1;R$<$FKXP=x&n6ILO8PQz=%@3s4{@0C>wZLOX$$xMpsi8q=Lyw=gh1?N zTp}TCAr2GyErDk1(**kaKY)R8CFtl+mXnr}kPsjyY$?&T`bF>TcDQO)V+~d%Vx+#% zP#gAxYG9v6N(#Kc&%4Q)!4x>aWcooJFKkICJ5>FDVZl9W!sD2E`49iCaaaihD@K5W zU!&C`3Nxon0nB}%e!i`XX3ToY@yBn=dM7Gb3Ny)Stws;U@^ey8J)A&PX%w?N;_5~3 zBjy3gPuPEHf4uafB!5L?Zi$xm?9{9GVCWG%hp1p29n3&URz_AP{Lf0T`kOm#(Oy8-L{XUM4;uiJLpt@VoXbbvM>G5yU#A++)m zkiVC6=vXRK(7=q&(P`0u>iJS@fbbmT@PI>D*OMFVcj14DHQ4iMTJLD>wJ=v)tWI!9 zT{tP>e<37RKDxzby0ZE@$-bLAqvCw@JEcV4Tk6|?d&|Qny_Qb+qIL!rBIJP?UIPib zC1^DN&IIr+nsoBy`~o$sLJyOoMGts2&n4ON-{`@`SpS86$MZ2F-DI8DKwHvUJ+g!* zrEFf?!L?V%fI)T(L$bXjN+tt%br>_}Z|Y+{!URx)M!hjufFX2re0e|m*hNqQF|<~C z`v6_C{LL)yxHB`PxkstuZnfxL8AWKblzQijB^n&)hOrH!^ZDOO!BcTQI#R|(L!{4A zFFX4CMfLPBTo(Z@Z0?bE_0fm5zi#n!+u5$#oEhKEPmkN)`f5nL4^PF;9sx=!f{Bmz zvu7XPZEQZwLqQn?yDIgmsM_L~ldG-XvO0dgYINgjs(QEKi7Na_Irn?~nXu<0v_SGb zUEMdO z{65c@37(yc?~BHn{_RX{=KG?ccV%T!qGoPq#<=);uXm;+z5mS|EKS3IN0rptyk?nu zx7=biob_olGwMthi$0O2|K=J`1ez3i`HYH}H^|j^`q7 zg$81wL_c(##pJ-jVN%bS&;6_f<-Nu=p3`VXedymr(ivbi+a4?pOZ&cGhoi~DX=j}| ziQ8->=Pg1T#Y*7M;M*a~O60{1|A4oCWTM)o?;E7lXc`3W%VXNhSjmej zNJ`(v4zrp5N$3!`FotkH6JlNwa$aK_(6@>R|0yOysCzAbFs+fx$tt4Or9+zR;d}o% zNe(*;G%1mJuvvx9)#1S2#DwoMgK2`*!Th$tg|{2LZM;eMwdzSa2W@^qP>I&Ff$=!z zweN98vr{o`TnmkEXe>VA5(X_y1GJCA^yA=jUVTqMK!A*v;tY1=9CX|%tDLKD!;b$( zuJn=uSsNu=@Hbr$qbE6!>cOt8+|r;>-HM&A zd?$Qc>^H;w&8cv@_Bt2vjwqMpygjiG{<}#$x(fNFR%@-sZ6N;|EI z^Yh&*=EJJN0tz;!AqRuq6!;V;o73G=V`C{Gl4w>xO%U<`T^5s7_G3s;jIlt1LVMun z7nc5}{&DjtfVVPxyAe+`B(?PoVU<;)2?$+G4p-edDuJ4Fn34MYcz61LHJM2W?0Emw`&VE*PSV8j2(zG$ziA(^~a z5}xz2llhFiLS^9Rt4%A3mI`0HpM~h(=?4lkSA6Id{KGln!N30eB&_Y)5FP}jK>?hP zA;CB(t!<+W3~6xu)C)oU7PDZ|$Fz~_K(5kh=3qg7DLVIM?B6xxk zydd(F)PjylpeQ>#HTI$8uwHw9w|AoznMo47$$>CnV_bf>PGDq|oFs&t=(irjN#vp? z)_P47*cTXJd9Wr$_6qjx0U9R>5w{6eums>;AZLS(q1apJ5>zx!4lRWC!E^Wz_ zwts6^1sCyKZtiCjrLAn~<1B12A#REbuQ_73(y8#mt7b$=h+gD1QAiq`Q?b__tqo$I zs%ps!*J~X7>Pg^u>5;8)wgnjoS7&@LJbddYoN zTupVJ|L~$FI5>oG2ft0Lf4BqpwK8s>_vw)Xsfu0U#2E+t;-P>>lQgsTSCB28O}6aHE$-3kqF3-8yC9zurTIUUm@en=MU}*9;ph9xbZXM8gJRJSGtyC603WCqaDnbOOiT7MR;r9VcLNu<6#7QVtmX z%mLJ=RWhJ+waEXYEq;(;0;7k+y0rzLvURd1OVbgye*Ac+Ff`O>Zrs>;sSAj@}}$#Vv0g@$<~=P`&#-=Z}m5 zG%o)nOWXb^;DJbWn#q9k^E`ij09KsbGB!YF6Yn1WLc0l4{o-OAZ~9D0G;Y_vnC6cS z$dap{dW`T7M#2P1;r)H=bX8M6LGb7UNdcg5UlDTh`x`hNwd3_=p2ziXMHftPIXA)? z3B6}8CG~>fK>3zRa!X4l7#I)w8Ns6z&aLT?LgjKWuzY=uH>T+cj8h@HB*xj5m1ukP zQ%~@w$oM2!mWXh_$f{SvA+tRKa+5E5!$5*|+E8JvCx8^kr=TYW*1_FFq?3rh&fC1E zI6*pweam>$h10*~^z z1m}ofmkkh`|8laq`z-+|UN!H&5>W#;Dmf?9Z!Gcils-L>=~!qh+?&(XhGR|(bDu57 z91gh43lw&*IA=2kT9 ziVbygDwqLQ7>qJ8wfXn2(2{oy_{iTB|832r~2nQuOG0c|V0Gg65gQR!jEdGMG~E=Wb9}Sg)JlF! zaG5@6`eLm*MTr12sfh}cEEN?TO)=ndaSr`6<`*^s_T+>YUpAdefzfDKcw4I`^CxN*KX8)yZNL$H1p+#(SR;As z&5LFyyP1oN&u#Jvzc=_CxS})&!P~W}@H}WaI0E_VceH__e;1r65@zgR%Zvh-qsM^P z5sJx^yKokP5~eQ|wAMZS+9r#JdYoWJG(22?dAw{ZhjbETdYdWo7h>41>o@_ZXAyWc zfVKK_tCC_Od+W^1+`s@bV3V6(zVN1nn3ZzFjG**Xg8Q{(+WYX`^@)gnc7S)H6*YEi-_#SnOIkt0LQ;0ufC`T6O&5C0Xn004( zR}SloHFh*9Wd5QlC@2YzX|g1BWsM6b7YWV({^$MO0fRpb8U?}*v*deiYwI3H6^-M5 z0_?CSK9YYtgz2|Q2W}0}(OyhkVl2gSV~Z9L|0hvL;$O`mklxQLc>YM&_Vi)N%jbXD z9-Stc=wjtAnKIc#_;5ubrY6wE z|Hp5T4a|p(GLM^wMCrr&43&YeO5+hXL@<T#Qf$|ER9s6|<(&lEZQ+RPMbP>>w|Mj2lAa+_( zd#OhAV|phb<&o=#N{VJSQfq_ZDKH}gLJJo!Ex_LOG8!yG5`1TjVfB*bg<8jooIeQl zI-!}_gB5;loqCv}mmWUYgoM&}XHBsmACEJcAFayv0k4OaR`TqOV?`P3EdcV)6sQoE zX=eO0nA+#ICT)#uoy^S51#k~m3Stl&5^z7qutEhLlqSS#WMYyI_@ThrGAyC1&=08| z4x2*;+L1sB(}pbC%FeQ?uN4HQkv=g0bnwG6hlxeWa$42OTJJsZE#r;oHM+i;Dg%#A z=fuTTcwCJfd_aN~OT_}X|JLs6^I7Vk+wLJH2|m!^9hBGqEew2 z3@*&wNEA^%=TsHI0`Bd6vb0bVZVDV2Pz4i@;1OuM!|l@u%TiZ#CUsGZwi#AWk^mHdsG3pI0A>r)%Q&Dogj}W7p$XST+>1QS2oUf^V zua%dkPv0*1&hmI7f(;;Iz*Bd&=p<#0@o3-H zW^?A72k{)X?bb;8lP6qSERs^UJjQ)jHE80+CMM38oTP8Jui3ThVt}nLWW?6?lZJ-9 z^AoVxM6D>FjqOuZM5L0>?e`vst5b(fqu^j}`Z}U7g1YQJA_W|f7FzGuP5nyefizW;eD_qz1^|GiB*Dcy@`ivp+?g)T?NmMddpZF}ElNwNQB-IIYkU|1Huk)Xr1 zDsk998QNWJ0-&?q1_lPqH;2y1 z*_>_mfX5mPTr^$%I%>Mr#DE9npMe1CC$Ns;c_H(7hao0@tcu z1)vEIEjlq*VR~$APuXh^WgCB=caF}X2C_D%WM107mUt{_$TZDHV4I3vg*dU0O-9~# z_gj|*mZrJqQzq6k64GmUOwIyEazKobeEG8Cbz2A{BhJSUR*sv>K%#$mjA-l*n@fN; zT<4(3YA~4Q78UA&CpVlAxGgAYS#r$n-?b>RghT;3xf3K?fSj?Me>#b$vyEafABJc) zE)~RY#YOJy&c?*+y{cH{aPBspIR>`giKg4S5Y_84W^Eog&($TUj_&ULWb4PWxwhS; zaL_M5CqQAa>5~DM%$C#c`9k|D30-@$2!>u4bfOKYfFPo+9o1YL$Y1GRJlY=HYmpgU;4H?c5Fg=wd zT+eg+^a?oI&xJoaXHZa3JV-NLwjG_HzZlM@t3tCMJXk^KPZvG_f`-rGL6akuxPnHd`e1CX0dQA~eTT{#Hy|Me(N{?ODP`v9F z#0Q=`6nmhaWsuDoB~m&Ao`DInPO#d7-E591OTag=S~ zjr?IRAA$Kn$n2f!?dj|`FvO~cfZcLQD_u^?Ay6n05fk`Nb_49Itx}hsAd{KBd^rYY zLBXEV4qv$R*6fH1=%(`@ZS(c&8OPnx9>Ui)848YAeRcM1Z!mn8Q%F*6_jIl0h8X~V zBU0^jz7UAE0~6oZBSSBBIalXElAD=NO+7?~50B2|vxkNaw%{6GpZkV{NSK!B)QyE% zoc{=&o3GzWfP=Bm0+#k>0_=Uq+v`WqN0G|{(;T)`k#jdAhq&XP^#7WEj;!N0n6^=Y zgXkYG4WR9%yp`q)uxJGo&}d-n`RsYV`o|8+_{_O}H_yvwyBQ3gwx|ap*q_JFG+fLI z-)T$Jd$Ne~8p`bHc^>$x%Xr;hAas*n+^egVLextdWLqc4n!qrOEUdqe!*Bb8H3t`rztwaNLeKESa@}xCS#wFPI0rf7g#2UJF63k(X?o^ z7oUG`ru!Nfd8e2Zg{g035%r?@ahN-?#q!Mu=YIgq8AeCSiJjI?}p^8 z+(6_LjTK`s;BL5@+VkS|{?iz`T-gY1e)ty%4v6m5$} zn4GLG!kD{RC!5*C8X(eizTegg60f|RIbU~MV2|?SGP^Y@&^!&L2)cohH6k=1YtZMK zjheiPz6Vs0{xaDmn(Sh-(eU4zU`A6V6 z+2I(2W>Nr7&@_uVV+p;UMGEk=-TZCV*{#To%U9Lxi!x0&8Yt0yu)~+AjUi`I8?$ zs%RM5Yy_S)SjvyI=s_k|@4@x4aGO0Wl%l9!+0yhOCh*Y7APRnZz1F*tXJ!Ki8$6eq zu~|x)R!w^hgEy6Q_T!_(C5L~R76t^MPO{SM|JX`2F;Hc*H4t@nCOVwMG);mp#7>D9 zr1Deoyfo{da?t+d%9@q4DzFmaEB*HMYX$nMkpk`n61 zCmRlZmlngWq}Hi5?XV5|4?7l z1lZug*l+&ddSH@@ic2RjzQ5SZ<|hZnt4`i7T_dS38a9dX6;k0__$ad+oTGi$y@d@N z#fstmJ)z$qeNwE0yL*_CnAqLngFEm4Rx!P9zHAXYUf6jEx)X!Xf!Gz0y-Q z=7!l27*^){r>LN0sq=D`;RQA0qqi%fl&n%l+S}PoDnmy4P~cWJ<&$%q>dLQGYj?Am zO3TUGMa6xfwkwB(ylJ$N`a2LraRUMb2j1n2JhbF7hwn z%pRG2lhv_b`DnVAHuh8bdf!SZ)7ez&jM#tcx2XsCOfYjU$Lec2<2q+1VzL-ix}Q5C z+`m?%{>T~Yh5k0RYA{(tsr4OGq>w`3r;Ji+l3SX`O6Ae7U~;xCBQ2c(Mq+|JcP1-n z090#ea2$HzJs-wXcDlWqn=4i;Tnj`tv($tG9dD<^?uQwW|7%cQb5+#_nGw(CE+w;3 zN{Yu^S3z1-6c{HDmKr_kkRRI%6&At#gY)oGp_D}zxzU3qP28ahsA>E$WvE8ccneSV zx;YSU%4>K+kC!K>FKnYLp8Ug>NMwF5o(VaCDx$s*SS^{}cE^b&Dx zAY)lEEP}RN0XH6ffUdS%M|GFZC9eG*bhp;1#jJtI5GC`oN% zwcHe0VYoIbOpzI+-W&DCngD4b_--CuBtHSTi+iH-u;WdpQL0*{b!NGpPf`)O)(3bM z6qsu4z24A-?e3=TSs)?B!J#tF)O|G2Tshy{*_(Zx!)-WSIzY^x8v*DHk;@r=7eXTQ)yKbg5KLaMK0O(XCP(MA)2%?wMN1yv+>*D-) z)|j13PEVcj`=P=+ygSi~*|3DY0vd@iQIgqO`mQ`;UNW-6C<+djyCzIb z1u7tnOYHpqV19{jADHOe%1PZSM-J*O_nT*CX68K>Q#>5p7W#Ty!Dc8avFAUlZJA^N zT}iYq z1Ia)08Jd6A3c&f?r8*U%_32ptHs|WnmTq^|6|)@y?+li($H;Rk*&lMv?#sd~Cf53m zbK8Zk611U&2(oF|M8tMF+V-uwWa8n&331Ka!(X|ufx-}2tPH=3viW2P zRKs8kc%5&iaLT~J`b3}W)H!xU5_I-CNy@+zA$Q}IaHUUA8^(z48_6zVNmA1po}Ufv zPVMy_F2@MCDH_&u7$iLyE5}X+zQ+zYhahrVP$LP{N);(??eBvSBjVyZTv6>q(1Fc= z43_vVhM+nx6&G3JZ53%XoRY4&IS-Jsk>fT)cPu-GV{i|ZZ8-$QKJ17;Q`(5|V~ZHV zu!K2u9-QrFf_sg!J8Czn94Lg@5m7+4Gr^!meO#2aLAjj&GH`GAYhbzSo(-tFa7y7{ z7Ug6WYm_>DQ7vH9tN}*r;msLEa%wZES19B}rvax12+2lmImVt(xGDV1r=qkAJCK-) zEJs|uF7Qemc>V6Rl5Zg%d^E6=yI-1y-?Uykui`@6LoJ3X$&M4id}yUld0>KKOMmC| zHP7s+yai&_j(=ir83DijEQD46R&4q-F(w1*p!p)2K9VeQ*ze&^(859`^;=}NuE6v{ zi}XMusq=<6<7y;^L9?D-dsMq5PPi%J=c%7uP0erlh|&C0H)E;SM2l_GR1 zl}!_{FSb8bng-PHr8a*DnaIoctf6WF%0roiUn+?wmyq6|=;iQz&CxL(KRnmKf!se& z$SMA@?1&Eg;?1HR|1QYyfCRR(B&`vS%!|I2fn4dbU ze!jfaB36(v_$=(%Y22IVcJbo}7{FVpd52TF7nkLiBL=-U%j%*?`28n%60EFfJ~yuM z{E06fPk`~y3CJPYq%LArbnQM%cK1orvcV$)3sLyGB5cm%cbI#y*kFTmC9I#}DFkl0 z86lk{YdU|Oc9Z)ZF5d-e^C!|7qT>}=@h zCiNI5NbKi=qv@@A{6!U96I`t{CXL_y2Ad;xeyCRdG)UtN(6cmh_Ka;jQei;|Ke($Y-9RVIH5rl{(F7&DH% zqQViIg2%+;nVFwQWCW$)s*o3wxMnP*T@Z(|nyQv!+Xx9ss*%(R5fG9$EiEbFAqoqp zR8&kOab(r+uf(nHW$>H#xBfg3MIQC`Jzn$62|7Hy%+DXVyD9SYw5YE)ciTB%TWHp* zS`C0j93JK;CDrke?e!^?gp=tZrnkSlZdA(Dqh8lxncr!6@Q#3Yuqv0}}eRPN%9we;6o0miWr zzj*CuH-|HPTu9M+*uZ%o3m|)LH(z7_%FaBrP9BbfU_0sLriX>W!aZPyV~~)%l1bwk zQVv_JtGh!bngVur_)*rkZ{bmj*-l>7qpF~S&^>!5Dv!aykfdyKb1q0CSeRFprh7hB z>PCKaHjQ4v8GzT}z0faLX{|=w5BZ{Y-QrWL;@KHe_hvp*l#=^Q6|hUfNYqw{-sgKa zKS9&8q($M>O>EY~@1s>-k%t#w!~!kJd`{haq6KGWW{cP$qqX)-pU2w#zkC*TyGS}C z=8{$YJV)>`)wASP$`}KK%tvAx;fLE*1~n-1qqROnU0tHyNMEpKYrVyXNg4ddZExmv z@^VW`N_gybWbx#;8B(Tnp+49|DNy}d00F3H?C)bd|FERn1KkB~F3MZ!TjCS_$>8SD zgLDoioBg83qG{c+82(!Arb}c)LpL`!Ix@1_pFizo-8Tk3@$umu95kO<8fikQ(QkI2 zj*g17YZ(tDVld}(=DqDM(au|PjE+86Q7LY{J;s)uE^~mdBusxw2W;wyuLBGz=ol;A z4jwumGKSN5yE&+Q9K#VoD2^Ns2$^NMc9dLGhiG30aj99tZap~R%i@xi z7E$ds?>3iimc($dK-|l=o!0pF4K%(v=r?$s zfUwBhUn9?py*ck95v&olPUg3pCuFpG5FzltLwiLLDP{Ei=?8^0yp;+BPR?s3)8E51 zu?sc!AFJPaa54S-P6IRas&^D|ZLZmifDwUNCe=qrP60*cpASDI!y_Xq_$FGOR)KxX8(D$04_BDwgZxmDLr|icyEEg8%Owz8@Tnn3}o* z@d$RSSQA+fg@FO36i0^$t@brZj zUZun0UVEV0_Ou_5(;8J>`sQX;g#TkcND!og$$-lcA;TmU&Xa&&1el64Cn*WpW&NOO zHTWUwNf-FsuUyXwQgVCuGw~SzAD0H5e~n{G`9#b zmb^M%he*u7eS2eX$C!;puHSt9iyoRZLsW6JOqrJdUA?c+*g^~3egE>a4}V~-J+xP> z0J3!~WM;FK-uzxxeKRta!T*-&yRu)<*co+9X8Nt5hBM4oWcGttSJ z{rCEMza_hJ(_kcr0PTn{t@mzgJd)h6#B!{rp;?}iicEQ8kP1(H!?^0gf1VWT=sd7c zA#tPHxjR$VR7impzHxHUk|u0B)p_e}FF;2J)-CR=$||)Y%qWL!ZW2XD^H;$nwVC}0 zlR4WKBI09vH8)!NXovAQTG2@^qGr| zgrm%woI?L8c;#{lcGA(ioJMV4vcvXasgL0$hbws)!DxRD-qp3<*O$O~<3*cq=y;I> zpWyGyOEblcRC+3$q2HfAJx3>qTiH(C+e(4WY7ZALee&e}lb4cW>Nz>H2@Kd+CZo3G z3)03H%JLCLW|2?7ybjqV((9I4TQUPXY$O0(s)BbjZ2*5dc4*Ug1RGTZqe|p zw`yV&<_@WnFj;3wro`{YUZGfH*O(^M^vTy5HG&LS)Kbhb_$_8{@zg18v6bg?8)P4> zu31uZIWsU-X&`xi>yOtKXOa%YgJ&33@7L!W;UA&dPh!;*Y?Q&USP%ce6!~jY5G;>GI%ZpRv4~d*u?f*c zr=~z^_gsC}%*^YH6I%|;;i8{nj@PH2mcKoPh2N+ZwdfVc;f0IeA4!**N zPDyl=MrfG4Jl|*0@_uuFTfv4dW{uY4{s(e2UPw!RatKvN*?pSjMdOlqg->%5BS}u4 z4gcym0oW6m{m)_PAE@HBl~jE2Sgy;`((;m6t1QjTo?(SEw-Grs89Nw4`%hIHvl=1t zw^MSz(Ib;XMj@8R;JaB?a+6Xg=p<|-4*i-KgZ{09Of{DGtc?k=l8QY}orXxqUF zPz|DRFq6HK0(9&1jL=SY6cDDRwo1OVgKQU%6a4-An4=^Fh#HSoY2=$f8Ab6=MoG-b zbUY=pd_1cCNXR1sf45WUc0kJKxbzE?N;sR-kq<5}Rj8UigPR+iH|jTK;z?!jkGTK2 zOHhBRk>gAup{BaR{|k%%r#6t*_8J%vQb6VhpyU>SlGNG6v;OiUH4M6^;zj^)ET0ZH1SLpTLOBS z`T5!NWat_jEE*dv9p=BHZe80{{K4ohCM#gVA#!c%L7@V&kI#H_lb)VFQPahOpk~>A z_6ZKscVS|*qWsv;8io$3zt)AQ_A_-E5><6q&gOsfUSP?~&sty(BW!fIKXamy_lS2X zzEs%*v;82gPRtnKTkvl&hf)RiBXuo*hWzBZM&Ub_oD<+}EWbw}=shgf*2V|^gZ1CG z&bUMH76A1UN8BvUMy1n~D1Q!EKDlFo4vpeh-?|{O`7ZFZ$|A{AR|1 zn-1+zoj}jqhp3-G5sQKxWb?@vOrKK~*!<~)^X@`h&YuDJxl^N`Tv?LdT z@`K(@dNWw>$2aS7X}A5|yc0)e)X80I%d4)w-PUZp}0ujUj9z~$3<{? z({ol8eGdG%6$Dn1zqdrVOkraHj?l(yYjGaVn$r-VOml?KJYf7JDwc&0zH-Ne;)hCHx5-7{)q@>0%#zY zFfk47&-)?IUXZVN`&2K$GZ;#UiuTvNeMv8o!VysGR#&o3sZUWj`k+MHLeR zMJoc<8{z9#+R^thxBbjd&D-wfQm~Z8yXEQMAv|7b%>T(FvQ@QBbK{$PC@Ni$8^Sfu zM9&P&^?~1chN~;z)XVPs%c#Y~5Lt9B%*^y~Tx=z%X$?XoEjGH?P2)uF`Cda>$~vCUSj6Ed8WwpbzVU_Ci!!P1?HwdMxE@!EAAl{UZ%5JHm^&ZheMM_4;M7@#Kbm` zx`S57Vnk-x`445uO;+wxd~IdIj$=t8U(vzL!woLO>em{Zsy*F{XvDBUhjH2cX#&>s z#ab;i9RWFifEeoX_9Vs_i_*&Q!wa>7eqF0XO2(AkZnJHP;pj~?rHL4WR#Iz_qWspi znEzz*GbD8KcX*FfYC$0>bhGSB{_vJunDHSQ^n-joL=KwRKj*4Q@H}UNqRtP(%nlp8 zqJ{7XK3u%=vI4Vd+U{;DYHDEjL(+K5#)c6HG+}AEPJK@{QoejyF(+3}adn+_9OmKdL0{G9cEiAJ>_M!0cP28W1DCE8v%vrj-X`P*&%|_vM*r&~M z=%N`HM+;R`eatbtw5^freFt~of-?O(sk7UC&b*D44+={MVhMp>AC6R89SY5;QI#p;SCXA(&YppJd`4j@+Jy%~oBRy~RWd>WP`SSgs7i|=T>xuli(euBG-NOo zZxa5m^XWKLj@XF$TeioS5FG7lM@A_KhX=4bEI`u?hsngSHeVISrV$0M$tTWT9QVs9 zP6;FV%gTmH$?I&acY&AMxj&Cg8gRK3*fToH3p1~pL?V#CdW&G@KDt_*|Jv_Dzg4?Z znnFJFlQR#kv{xZz<-@#NrB2PMtSnzpOD2CMu%}c9>{HB;2v*%&(LZhWxY(WH-$edH zZ)bXbBIx>f2A~xUETDD!-f#?PSrptkn|VNs_2NG$L-7KH#X0~V`|y2OfcS?uN5HPp zsjGP1FN}gMQiR@KzSpHX>wwDJ{0N^SVYfg$R%7p+4!@xZI2b8wKy9lZKZ42zb`Aw_ zx#MUUMhUOBDiT?>qjDXg%0-PG*!W*`wja(XA} zCr_U;C@S)^=$Hw+XX~ry0*;10oDQ@zEO)?YPTMJsFkAjke+sQiCd_=Oc6&0CaK4w- zp%lA!eOBzEVC25BrvA7LFfuv>#ba@@+P|oX(>o+YapJY~9H!mev$fULjRM`VIzUGB z&Wk=LqqQ2jVDh>lWYP5;OgZ^-OOG}k`T_&MHFJRI3Y%WCm|l%saaY_3&%J@pyaM7Kkv1G*OFjCMvr?Cxv#Dxj5_mVu|)@>%)Tl?`17Q5P3W@V1?{!Y(4{8 z@G^dECMZb4*H-~dLVO_vW@qZ7ljkX-H$0Bv#%mC`iv)X+#-L{1h~zd+(Hn$C5QW z&~IkylxddX;i!Izi)wA9OCfN`Kinyk5k=g53V*Gc(vXAVF2R4Mk^CYZ>lFn~^kcx7 zU%)XjFYsuFyj}r?U7!jGdzaGBO;g-`F0O_^aQ?7R#~IMcU;t_rJxgm4k8jlJ3xbQsO;o2}*qT3gjyQw)Th`haqI{0C6(!)C?auYEG0 z7fJnfu{CbIG59g|v*99IAD}Ag>iBL?$LDaF3Q>uF;v!N};$`2)KIz4ptvtwD(baaWEuWfD<~Tl9@gL4opoQ5L7-moN^?BTYvZamQYnSmv=vM z$uS&%a+hIRJDTQj7MGF#{~_+SJ3 zz=W>xv7;yZ$G_Lr#jEp>n~IM(di^o!-bLwkt706-FgwI1oR1W1%N=%SU=k}H{rUI< z6)@ld$od6+%tR0~>4*t>`BDbvL%mRj@9pI!y2xM(m$hSO$UCuT1O(E*KgKlyyDxd) zfM8afQ~Yg$Hm?OD5>p8VHsXKopO`imYU+<41Esnm1?yo|Rr2lai1Zl=?<%}5=%NVM z>*~#G?Qd{`5u##ZSYFEouGl`gIiHtKadtA1j!|@dH{|Lzve0lA{rTtRWuRl@Q6>L- z5RD8LWgsj^YTxu`fYZ(haqbO>K9(bR>C?AYrXbsqGvYlBPGT%TU7O2)*$E2kRT}?% zIk;%Dhtb8wae%vA{YL;)Q|5PPptOJ^^tS39&z1T#kW@?Qq4m=Y(8aO54hzp(wIsiJ zz-U5?B!wmk1W@JXDyOt9wa;$_I`QE}fH!~2>qIcnb1{;6yKpeMD1Tm<$r)f!_U#e_ zcC>e-6_PC`hJhNKUyy--MjATy;X|lyE$bZRty$6f&W`WV3Z6jB3l4aiox<4Z7TS6m zP>ixTWfV|MN5 zUcUths?%jMxn*kw%FafE%kj*Q$)@$=fY!nb0eFnx^nGa_0#rN>Xh$bZT5E=oDAVj7 zapMOZ6Epk1`RS6Y+48JC}r@+2WY7s zv9T@13>}SPje7MjstHWLd~e@ca*06!z%J?)V#hX56h>r{iuXeQSDP%|S0oFRF*(uJ=O5l}N^&oPa#^78z)r%J0g34+7|8+?ws{F<8d zvXQeRXpm(divvkr(28N@%-)Ur9VlJCLA<-PXN2#p8l4}zza0p)7)BuVGBXx^=T zwSfg4F#q%m`kxD+^o$+K`0ol=r3Mh?hiC6XpQ84fn${vdFX7BM0T^?5_>BDIbgQ$R zTS-n}tkn;nFDNaI>QwZz3|P+b2<-ulA?g8#zKKUo9#MkPGSxy#)lKZ$G zR5VifM^SL8$1q1!HBHj>gGYZ=c#h9=y)dh(685!SNc%;5AicNMEUjY!lkh9a9E@XR zByne&r-85JH=74ZuPGr|?Ofu^k7_&CoF{D#7pJ zn&0f;u~9pv*lO6`^^m}8sg$1w)DR*sdL58B^~A^L)zt8ic^~@aLP-Tvt)jTrd7jly zm!^gK#W8|mkvYnCpwP}K7H~3SVTC7h1){FW73PyDZFCAB+}{TVA|XNxQ+@#VR-BOaslWJ%mSDi|5aGKMhKf-Qvs5u zvx7E|>y-Vd0sps=JH=)L(zCnOtVjLwQ3AqnnMz5ie7ky0A2I`2Ph(rOyPkjAq3GtV z^7YAxNQf^i78{HI8@T@XzO28>V;$}1nz~SOLEK_wwp~+*O~!@!6DFibN%o&)cgJ40uhnf2gb;x^_?v}b<4dc zjE0boY>l*7ZuR(HN+Lq=gyC^re$5yov$89qA5vK=`9=%dZCB9?t6106A61BYTj98% zBoEG}gF55^+=-6(f%!QEAFv^XnE!eDr_LBvl8{+Sq2aLO^^?)Ew{JDSYWl5f#${&* zC9-gGaIhjZR8wGKKbN57JXuL*?<4a|XS7<>YqT>jm}$J=$%lr1RKi?3p5jgYw4}J%2UT+#Zf3?((tIo!dL%0gUM-R=#WEz3 zg<`x2y|S`6S_fYnjT2ho#nH9>Nao)D+zh;Qi?@f=FoNtYz<`^rz4Br}T5yznBwhRQ znx}3|z`#kLtZ+a2u6lLlT(j(+2h5TQ zxw_)^R}uc{mMky79+bi}sFi)-e>zz#7|X3BFR0Ss(mpHlK2%2H$(}nGpBxXD z=?h}t^cEaX!)&qC5&{BFQFSEU=N|PP9U8)Nx z3P?);E6T6_1j7#V(0vR6DfK#rl9zA#fSbeIWy*OSL)DT36-ywkZA|97k3s!+l4_;G zSi30I(u_AFRg(1i;HejczBfy)k%!uePq_(KtT$-Z+0-mlSd!E91|kW=8YJg6H3Soa z<@vlav;_fJOm?atxqM)~ps|&nYbCR_)m?g1=W)Wg7a9BZwUM~Q0k1=5N-CoP98`j} zWs#5D>eYz|lP2rWo$jdO&0sVvJI?le%`eAO?SV|IhJ$UDl_R21yE%ap_Sq&p10cc*EdUTMk z+uIZGKkqX;^=il`9St~p9BEbt3}tt9n0;R>6v8!pYXic$u~6&H;OBaGlgh)N z9sTXik{+94tybPKgKsT1tZjFW*^V%@P8>PtoV(Fv{9lH}W0Mpzd7U%+{U&*Sd!GHu zHyQK)P$xMosrs2hoI7xzaeqbEq1Jwk%Lx73A$2a+Os__2>~&$(1oi&=tMGh={{kGH zh#65|Vm1?WJ}&w*Q0wNY+v0ydAB;x`9yKhKW(%&;H_7C1He|4b8UGt$#d7%Y0zgHP zSJq5H7W9fM%5ucS&hA(RC(`4Dl>RN)(c!W+#2Y*}_l(-``&vtqriRn^a}@+hadBpy zF^=cYH+IU%Tn`KmF@C_4y@-x(q1a4p*o9D#{Pt7v^?&Vs$!4?Mf#~7!yTX31i9a9s z>G;6JsvSa}l87-fp9w^vxF;F%^9|fb;c=?LREew^b1ls=6-jTqqVZ+aA!l3+2fy>jzSPGUrpf zI?(kKW0C-RQ}B=%eWo3zN>r@gHm0Xn=0|wWd}jc;ZSw1DT1`8P4JD~@V}v{&eZ&3k>&IH|)GiUf>$m#8R!8;J3b4a$|vBE5TWYg!6vp`t1pzO(m*j6$yEZ#btTpHLysLqBsXANBV)P04c=t8MVl(0?b= zN()SRa!S^{>2!*>2qYmfF~5NAgbu^SIk(vg|3da)mD& zsb$kS)VlKV%74(T&exCOk`-nvOTo@q3H(2l>jnfGF8zz9oF|MWZZD!Kt{`CwL!T|NeHrPR`a?~xcv*Hyv zMCn?Bbh>u2g4bH@U_qR`L(^Ft z%|p7(kv@I$>+v_m{7LY1qF9qj_}-`|nkAZ8`)0q<_u^PuwN7De z{r8AMAdT;7fR31q`ZdMSbCb-?B(y+}J27K@X!)kzz)8Lkr`XIqjbR4%&*%5=NGnz9LZ{ArM3J3{NX-A-vxzBFjC^6dEWkDLEWym~X7T+Hcf8 zWeu?Nqeb6u01#WHj)BE{4m1YW0Jjwl+Buf)?8}?I27U5kNTAuwEZhV0XkHV?Ei7O zGEa;Kcj%!K#OsQyDS!6irL+k-Z?}~eO|7?p;dCr%LyBOcK|xNN1N=E)ob||nNO3v* z&5&$!Nf~tNx5SbHfRN8?hk!$!ju{Y8UiX5U<)5g~Ye|XXD;)4Ye%Pq|-cnxd*#*}B zVIC5YaO9@L83qT&1(5iOqisH0_@>nGiX3#@D?ZiLMW1_XL$voE!`bH7J(@&xt4R6{ zm2CW?7<2}vmHEB6)OfbwhZQPDo9bd)==e-7>+&qaPYx|9teXwkpMkg6Yg1nqN%ytN zG|enYgXrbiTz%9g6AIH?*vql?#P?42Tuz^+wI`K73m39U2SFL1PlBXUwXxF`p(~2I zB@ufy`i0?z%sM}=g(((h#gkXW_ejpN$=`GNiwq7Y0~tO8_gW`wA$x)hPCr&^n7CNa zZ(LGk_HuadewTp3wh9+5J%*fY&!sn&6nM#?r&*L#j zNweZz>ir(nfoi~8y9;cgbB*{Bu6pIv&WiykK&ic6l=3~hM1@)Q7J79!l`(UJ$o97ph7wZSbZYzbXQsM5QX;Hn^ z&qf1e!SX+!>Ec4=Q&nbI^1MlFAP##Yx+}`1bAapjJ~8^%K%mIF-c?sUw8VkI8ZKCErjx+vpx@j8y-xO`PVf~K?miLm3$!t%%ydVuBP%$MaoGMy zWafdsCPFA%Jc`M1By&Us$(%u~e_4uZbm7=ZDX*4O5?A8DHf*Z$)yw)ItY5W@TR+)J z3g+j&*S=|{vci}43CqBI{E}1uZ*MQcY?2Ra0t3}jo@hW~HcWSvPU36Lx;34zp!q^P zw`L@;_5V2O~vFY z_6;0WFf@F`ia7xFjMZG6w`A2$?0jF%53r;}aLt^p>G?urC<2vti$=H-Y1L$can)dV zSfSinO|@xvf1e2ef(qdo-XKlOR#$g{6A$nV33Um$?OPr<6G93VIFr|2_<9oyBsVpk z0Fe!rVvq~sg{|6Ser~B6n%&46WaVZADj&dKD5DL!g1itB1mYO7*kc^)+uQ|SDNWs< zL?W-z{Ow+NTnu!GT_y1UO z+XtACmzQ&-AUx>Lw1xKO_=UJm@B2RSCSzf3d@td!{Sue5Gg&N^^gak8*DmR@zl%=Q z0Pc8>kF_A}CJL2Pj)i#!@UpY4MVU{9GepuQx+Q$&(I?OWT`VY~Af41SU*WsfUBnsE ziHA!p%lp|cOqX90vfWb;;YTf?6owoNT7_|Tc>20IQ5?a_;H#tU)AU2H-h;k?jg5PM znxhh$7T771)xmT#O@B?OPuryLL3a+AnBg#zxt=F&y(qdrTm9N@w`PC-*X>~^amwo0 zUCIPSvOd1}1PLV;7MlGG7KhI@n_%Pirk_ZQOMP&*9#Pbsnah;vI>xA{7m(pWAH6CA zjt$L%l$;yPCjzRKuN@`sCmXTtfsH+CzVPuHn~~W)Lvr6jK8w%(W0SM`-kI}j#8Np>aYi!S*uPKGIho~@}+m=re5LBEc|MH zGdK1*w0EFf$l}7XQpC;W9ix7s%Z!tG#vCEf(V63kYtbF%%?n{j_YJk;+Rq9ypg+}A zSAWr)sR0J`Kru9*?_EEtZ3RJ!x3gn3a^0V}_pzc@W=45#U5~Kt2EnkD3@rCu`(Xj7 zm(x#}r}P?JMp8AI^*{MI>6~Y&#)WRrf2GnY5I%C(Lhnh4U%UY&pfa=PzWRNgoF}=( zbTGMF5xZ zb?Wg!?I3!(H&Vghg8)1wMiv89_~`UPEV?*tYWHf74thstXcFw6&6oeR@Je_8v+%|Z zBZxK5SzniEqo15qZ>6UvCqFBVp%S{IG?O3z6TJBZHXvAf9TCv%iRKA9^0;tA^qjZh znFUxb=vu}Uo}u(YLIU?)orb{s#4j-W$pStSkwg2RCDa_-#Q`Um&J6Yg2zDP+%r(-! zp|G^m0BLd^q$;TzUYpZ=d()z(l@E1wjXp7GM%n#|Ogpo4&2QDF$IRtAHFv_NsyJ7A zC(2A)-0KT3KT_EmyCXt#mdk^lDZJ2P#6~LSzrr3}A|)b<(-|s?a8hQ#t$jkOMHAcQp)T>cA=))*vN}QoYddJm zL+bo?QD^2y>x|H_BOWHeX61cz;TI?$_yJ>^{NxIt6#qXcWmG$BGAnX{8&wc&*~Jnd z5(@8#(yrHt<49ZgpO6E#=aWiau;9>h4p*fQ7E_d4VCLp!&m-F+D*Wda=4Cg( z6vFmT5xf93?zb$%?sR_i^2O!TEh5m<13H4#ifH>0q=v)R)&?X(^6MHbygV)1Ev-Jg zn)e36TmQ=VrL3qp1 z>QG+Ky^pUE3r81 zU01wYx>0B$89bFl5D-L5`VJ^@P?J6~2c63P)sMgjo6a}rCGy-fA~xL0Z}*gWXwbUt z@S@NE3#=aPX2D_EaZlGBSg*PH4VhxQje|q+3>X$|R+dLGzDWbE$6=9G3pWxxeZ+rH zAC{)HF@G^Xu+lZO8)c~#tC-vr4x0abXv7|rS`7|wy4t^zsnS zKA7Q^n@wSpC6#calqlGq*WA93vmSc{ISl3BLfTTL!sNOe@d3~c5KoXa3VU+V zA&;K`{TyG%n?7dJrvEXM_RpqSb;&sg)K~+zEs*LSzgQw6Nex*v`5p3ty|>Xm$*D5} z1F^7=dQwco*l?JSOzm#XPEfeqOMWE5`k3=u(yjp!TL^Cr<@9uBxje1$$F@IbP5`NRJ6n>Bm z81ZS?!EF_j(cFiQ_{?GDl_mKkU8w%*(Ov}u%ZvH2LtVjKU_{#!4K8EBI$`?~=$HL(7e@Avb zn>N$AM+e#${~p(d)4?tu*~@GEZN8~s#H%UfGK7M#rgGbzv{Gdi5UE2xG;B73i4-~& zxz&dznKAmf?jc!;u2ARUen->?_jikIpfch@>VPAwSwFTi$&A9XLu88Po_x;(()GV9b*hx zJg|(8+=&F-(aB`?I~e^Z`p+EGg^GP(mnuhub(*hj)!7Bmm`*TqIa$<8G}NU3_A1E% z@hus_Wgax3{V7n+gb9o_7fG*s_ShS(r=b;cG9$^!blVK2SR;Xr05|}fsPd1#>VgSw z2R|#M3gmdey^?PC0w&@J=nKe?cLE?S^uyJy^K%WdDu` zCR7beYeKurUv{=J4ZrtnC&CMf#?238|> z0#rZ~Uti;vj#qeJsW+L3oM80zl`&&7ZfXGg5PfHM5!kI8i-2_fU$l;qUI3%C%!xT^ zz>D!)@opP#^MBk4`|30o_`#u)05X1WK262^HZ-3Ts7qQO=PCpVn~FR~~hyaQ-CLHI}0OKS0-JW5*c zO>pG@Tn8u6ORLuOC&YZKB$jUj0GcNjNeTPXNsRJUQ^2#TqXx$!tB<4L#ewd0NXy`p z1~Zq=XcFDs*=iiDp)_7F8PzLAf|~9jn(8ZMIVaS6s2nuqS&(J{#eI&^_yCvAZ>q|wc9?6V4**_&VITh+GH%EOIrWlbm1Jg(h9G#MUjqW>zYGmCg?7KLL* z1x}mT1JIO!6u+5{(j`0t!TXnq>y?`g?Dzq|N{#M3HrI+LvuC?Ywv(xoJejl1PSU$4 zmrILzy1m#}zyJt*-4?dC&~W9TBYxV&cowE#P1M)tko>E&r616tqKKv+Hqy2>4Us%7 ze}HxyKy)qBmnQ+f`~&uEIsUW@lW=x9KEiEs_lU?yXx1Ywfn;WuPAFJo7)AIR7-C)D zz6C^a_(a9~5s`;FRhm5l623#!KdJX~2xkDX5ib89E6-H7Kb4^PsM8&rvMnUrsNOet zb5BDmYFlsv+8wl7u zmvi4~Bq44AuTC?$iMs{{V9`{*s<&s21j4&LpYV@l_gV9Yg7OsAoTzo^5hu~7e?=54 zw%`jA!DrVmwepc7CdR$Ywu&1cYZHuuHjq`Q|)91=Wc z^{a*-jHdZk3dE&3MsQJF96t+rx)_RGT+%=CYm&G|8j&6d9L~n3)u|kR+p2&A=uhv1 zbgY~;V0X0}Yw|$Uzd{*KmLMYlKqiN6ukEE6)Mb=5)Q-LSpac0QUtPl!r=e&pIAR81l=TX+5GXDr5PIWR)L7>9IgWuC+SSzIN3p7mT=e zylqrRI_S{bnk@DiN_}lSEb-9K#r!IV-5+HMqP$e^Of;&QJUrh}9XebH6Kq+^M)c{i z^Eyq~JHd$18lbrH2#Z(in4Wt@TlDcG+e&tUo*hN;;vc?+#K{)FvV>`VPh)a&KMOvOj6~@?25`Lk`*(3xo=pLYj95p6*YCC2Hz*`6bv|pA7DoPc zLRuX_vtU-$ihgSG4_@XL3hpeuyhI1Al)q~(%s!%(jXup z-JOz3Bi#tn(jlEv(k;@`-OmQSuKPac{9inL0DiDz_RN~K)|@JCb*TU_bPe=;^KABa zy##EFrc8VKY{(1(czG0T=2m~~u8`i2)|`N9-?=)jL*SkukkO+bvpZWgKl)EmvJ;>2 zxm8or^XS_QiXkyuh>`jC5*K@W@Eioa5A9)LB^<7gP>QEf2Y+g>#ChC#jQ)uZ!ODXAoCDwT~ zaYz4?I*_J0DWVW~U7Z+aBT@FI*I4KmxG){bYLq0Y(~L{}3&6ESo5jGYkKE=g0@Ie4 zNMiThO!_x4zu~FyzVp3uP9+(Ig-&2eYAZYJNX`iJ_Wz1Rys_#~9S zI`h>At)CYl`f+}HgUTw=-#VXk@nAU$sfemTQs6k+R*@*6N0i#w*!(o;v@%r}%-2kA zhMwd~85jQfiR>?|R&u_rATBEZ?T=r+QGrY>r;lI|zUzeDEq% zI=_|m96il4OP094?8Xbz(Ka?PNKV|+(exk)7@yjM7LdtVUL@CX18qgd18Crei1m3Q z?m-TiJBNQu01fUAV%|m{{I9I?s(~N_+ocvd8ar`l7|LqvwBPzaZXj0`cVayuAwE2bhB^c`M1 z_OR^X;}khW_Z$q!+(ef`Ftc?K?W58A>^wyLNdQs5@;Wv81T7)#Z4|5 z0~weoj&w0Ud@SvFBaU0XFsa<*!ph3=sejSc!jwVBc>a8SW2zH$;;C=}c{6@C(Q+{F zORE00B_d*11?r#7P(9E}{MUMS1YSI^s~zG89!}otV}&y-ysWJARE}X;xrvrU(x$7F z?l26F&8e4?3yI2?|IrfnexT8M#-4ti);tEO zFo^b@&sXYBjF0+4!>-N86vQ*lQ^m%ilA}WQYLn8EGgDuD`fuesSY3Erhy9tVn>3fE z1GYtFtQcB#Gp6-+I958~8$7PQ@xAl5215mus(GjuB zc^%fTV#zs3D@^*ln95232x3Co?B1-~_HIx25Hdm1ts*Q_Lr;wE8LTq^4w^mgiM0_V z_uUJpIl(*oUKqTywjTTUmG-qga60(s^W4t;XZNME-WID-G9I9cj9o3*eKU5QnD6!8 zBn|#p*88mXS@w%}Psu}2f4Qy?xkGR~Wbt3e`qj~F z_ZuW6M{NE_p4AUj)Pf8?9&;e*>Y_~Hu#K>|lX`=U&03Sni>gu&7`&Dscj+hDoHVeQ zE@zY;m+ry*5E8?USb9-SLB9F}6sE6LfV>|{ErM5QUCio7A-^`29Z)no#wVSA3yNW% zYD}bQRm2^qF6KRsu)~vme)#|=_6#JvI6la7h6rV9xp=lEhgt*SXF8ZXB^P!JDo#4O zURV(%0}pFVAp;YPss~oC(#T?NdYGVO>2ru*Yh9tdm@Ufa~zjEQyCkJ;l<|hkw$#7%seixiP1*iyiAYtQXoed z92|F_5;5I||9d0cZOUSNRzS}CJtCu}Y$k+fms@CEvhh1yvq1QzQShtqf=c%G7pRXI zFZ989h82Dpt}08p1mHW!DnS2F>9@Ij{;E=?uc>f5>4_@yufWkWKqBh{lpFZbip@IT zLBtUd{*3o1B|qiNFi?D_MStvd0cWY^BZr(ds8XoE&Qe>XB+2?U+yBw|(DLyT@D=lqe2S@J^p8nu3WCgt- zKptNSU+E?(pY?5HU00rxE4zJ(7DR{Mi%}5N9T>#Q{|fPUHb-UH%!Bxa#>)0rc>IIQ zNH@S~Kxy1Y*Fi;g0^LS&k*;0b0t3yCD*&WS!k>=MS z`uNLd-AxHs7Ch>kLgBfWL)#GV+A*U3HW~fx#z+?g+;XJ5%IaPYI|V^NF~<<^unV$%gZE z{?{$%6y=an@FmMk%I!bjM`qUsdcwrY4HEsSTxq}cOCM`zT7iBJXLnA@CHvUfyIe(Y zIJtH}qDW$SC_WMfBz&cvAc#F08)@lHlv=23_f*~ z3gqpT#&wJ$p(OoWSSi`0SIy-s{n^>-9fe4F)N*)Fp*kOV4E=sNOQ5t_3=*}a+`1Wz zigaWARTji2oprR@yxBm=UESYTgp!s#Kj3Rj+rvQKNBhwKc~GpKYTbs}0IJnXP4nbs z^{gg0n!$SOnK=FC*{Kq(_!|Y>jvwUt<>kTt;w@CNqU=hp{jy|a*iGH2(f;;;(2(^e zHA?uhlu(Jbj@lEuR5%&Mo&4{K1ZvvmXMp`oSM-VPCuq#2un)X*8QvQqz5N!TNdfc? z(o5y*B0`$=C z?)PuD+bgFOX2a#-M6_tg8Ndo^Yjstj1huY01;#Y$rgzsp-=z$YC=+k#BS z!ln?;>HG2gHoT?(#H6fZeBrCj1Lj_r&YCE^u5m>bPRAf=z+DwVQShg^iv9A(+tCnm zvKnrrjF@~Ubys^hbKnf%GC4X*v3F3k>{|VIpN1J~19p2^qcd5=k{H*4S zXK={UV!}T65#{CAG-)5+A?(730l6xpzAnlB4_dFKmN}YcLlNEDw+f20L%XJa0PX_h zcz}kLl)P+oxkuiTO9j>fYs1QuQ@lRJP7E*Nr>uYx3KXuUq)Bo`kX!`vh5$`xwPEUU1zaH@^OPUB z`iK;!aBCX1G>ewa3vl$eAOoTB_va6hhvfT-WPGAid-gh&k#!HzhPyw^C>o)p&5|`F zSQKy(UvnQ`9NN=xG3|RkD(djK(Ynu-VOZ%IFe{BQhD1!!OA@cd?!bL-h-}r7Ehf+!CBYoUq1p2NyX>Cd@;643f9pHJLqBe)eMQ!5B1-mC&1BX*dzoNRJW;$M zo0#27S-v47C-H$1J!NV^jjncQRZFdBvdK(J%(GCN!vy}2r2oZrfY+Y*==i{_E|Pt| za_L}m)gNyKY?CmmC-;@>-wA^$m0H3QCiCMH8D!%ba*4^7 z>n}?H=m4153)EM7Ci7UcC$3~?No|Oqs2nU_18pdna2-H9S*SF7p3vxQgN5H%>T&)` z;D%YESkNp8X`*7G@%+67k#ecFX_ek9Di1#uh%%4?q8H2U54==VPRxV< zuU)F#9qMH#kK-YyQ*-Bk_bUg8z+(xH;$G03n70lFNJ<%Aplq%#{*frSJV+GMkUeOU zU_SJw63#{ek=TDMp%}4*f}i(_n|y)Ut-pC=Wfd?6&VGIsFt*RCDz;4I&6Zy#iy$>jl?w4&jx9&x2P|9J z9n_f)SlhKc84@SBBB*_WHF=5Ur8P=L#3H*GgSsH`J~)?Rpu zZ_7mKN=s(9!qgwnRr{QOf|2uju;-6|R8|cTTbMwrli<(Z@OwCa@6K-r91)m>_hyc- ztoM@s*_r>H?g7G&k=LM$`&7h;nGP|$@%d=ZwXi#gWHF27q>8Ri3`pdvFHzLrj`w|1 z_8ZSdd9isn$6(N+3*wfcHjDuf7`}7<5|WYn8oRfoTrnvM8HoAr4}1JWm;l2hB7NX> z`svQDW8xnTMCShEK3&X0qWjxeh^ip8_`sLYKeP|TnI7}D}1L=mxKA+`0=iC52Ju|bPBZh2h!gSuiN8sq!*OwUbR7&W* zZo9dKh2Qbd|E4gE>B9~ds~swafWm%#aC9{y6N!Qp8L3$nx&O&-)4whIz8e6C?T&Q` zupPf-^N-jY`6>9S`Vz}=Cw69T%3@{=N}}5^g~!bAZ~rlNcMTImdJlAz;a^`*WTblX zOus4&iFSO6oV43P0eu?=2jwnFO+kRJ&%VT5XaBC4TpLqvG58q_M>BAg&czE95yk51-!qeV>Is^L?};p5X}{KZ0V_&QTIJ14hKg zsB#%kBzpX}Fc!dW9ib{qKvelIN<1MQJO(}oQZl)3$ecD=wjE{}>_l_=Ip1Aj(zgM#peEHW?qZ>L7Z zKR&+uCR5?#gVO`}Ah`{b1md4Be)=i)5C!cYyvG1S`c+8PH6=4~|H|+uR-j|p6i$0^ zy&}y>h4Fj6#suMP&@YmR_GWT`&zjDzprOsOFfJ;5>_p5hGT*QxgIb#OziR16&OXzB zmzzhLT%wriu)r(k9b_5v2|}~t`#3f*prDQ4i(9v$8jI-(sS|vl#-XV3sE+Vxx3bbd zz1UwkN7MV_=}Q&T1C z|HCFg4Ii?D`R0}_QRYb z&$VPfW`LOtpuc?4s_IrLU?uZ?$5{s4lL`r^CN(_Jlo21HDts<#oVXzVtTZ%8`Zow* z;AXLQO+N$#A7C4k`@oB`i2bks3IS2r1MkW6X)^j9Bj6T>+0MqxyEx1w66a@fb|7nv-1eSuJLF zAfpIo7;#$td^7K_(Bq3k;@ew3V9S~M(h@#n^PaxBz+hUwHZWL|zW$-7{_w8>riO9e z+`%B6(sXxsV69*jOH!!t?f%iT?*p)!!#>3Pq;lq{G+s*RSAoD=6Q^ACDe+<>P_Adn z9fhl z#57Ify)*z##)AXb20@{zUnB0Hv!4h`PwMFXb!~pO%gg{w)Acw*I+Q>a%v9Mt)q&lC z#w7-?s~qGq0xXw@S^mYv)I^d$hYqOFELDBDjAqFiK$VWlP6Ua?$@WBx*--H>1BIhy zH0s}wVGbLw$SwgmXuB{Qz}l-JYYY3~1HMt|uLm3?ehfIAl^r|*{=RWjGr-&Hb^Azz z)3|zR%Gu6T*i%o%!as`}3l`TtP9?BHRrQfQ@>k7|_z6v2J!PTsKKLYG&Yn3EXIB^< zHHP)AE_%OWe#G)_+SYaopR={HcFGxPC~&*RqWd+R6uY^Xz5q;_(|9yS^u4b6yO|tc zv$EAJhTPl;L=(4OUT#PsVJyEe=)<-mV8=|4id-a{<2Z%|?7?s;-#CJ+#C(rZwq!yMNr6r+^u>BEraq5Kidl z5VSOYFE2Zr6|%M;_U(awK$)D#z4N#U*_C{z+kd>!E{fhgv;z45$% z@Yxse)I2a}cw@cV^UOCNW;fgn`XHYi$ zKLPH4ukZsKcQ)tjaA-oYkLGufja;sV53 z2?-`0Ez7gLi7R->2LbjdH$3Li&1J^*`I58aVC)fpjKTOAV?5)F*R8=JA=q(Q)>;tZ z*#p#whMeSaCAEk)HFBwDeAD^ECIZebE^Ej2)uz#Qr-kNCG?i`NG?`dJz z8kN|Y3dO7eiw%yd9bu=%W{>2|TQ)<|!4}0}V3Lx<;kxntHp276Bp{FWhb7V{(tQKX z>X0`bl(MO>FyEkH1!Fw4>KOfay^40Aj?Q+yUY~_}o2EO3p;V~9`(tP|esFKTud`fC z_x1kLtp+puCNEe)R1i~{s# z`0q66<&*|q9!;DI8A10ev{Azs4qlddVMnf}&s9;!RsLEQ2WGLXIRpCAfWm3#T=d+}Wr7m4~p?V^aP;Z3Rx&+m){OU7qViE39 z6^f0E8?Sdb3_^nBKvgt9UhkiYOy%%-3x;QY!Jv*>@k7aOWP?;xPpGg|S&tzN^7b|* z7sqVV$z`{CPM(Q>x{c=iEGR}FekJ02XsenLVF3z(X8b4KJcSI#mlj_F0|Wb*Rc^T19!Dvc@9#%NM@tvGP6s;vCMw7_p1xKU#9s#vQ%Y6f|OH!B+=&!>m*lo^rR zzlP6hrU0U-2q`C-eS{+?wwO@+N3*K7^Wk(jFTpnvC3TdMVu)9q+veJFJ~qr2Ep`NA9TWgSM#7i}w3QgO9@6g4~JnGp!NBoPe6dj2J!iu3g?cOW>uR78vk1dUl4UK~IgELBcVBUxIu3JIub)I^|(+DE&aUY$5hhm4IyL`2*loCqB;`H z2Uc#`p7zI|{1&+HmsYs{vD6A1rjEg5f39@>vU#Un3ln5tC3!P!4PDe*bTtn~ZzDbnNaOxbCF=~YZ#bxz$nxEtY`Obyj^Hal(+Q3s6C7QL_I6ZPE*j@rJss#!$z z_FdN2*5aUl;;oN8I?fWY;&FZoa54Q>?}c*FcbTFSD^DSV${CUNHxh%;Yhb}~@4{}) zLKYTC>Ha`D^Fmv9f3}8(e=&vy5*0@S7gZ7Oxt8Zy$ z1y(k52`EIKEA#b;JYD;(#JdaEbh?n0t3A<&d`c_tnJN$FLr}T9flqt~Q?qKQm+x?H zENRCM5;oc`@7o_MQ!a_ z?c`$GZv%lEh)me}w%*h5t<&3VjnvT4sI^*t&@WIh)1NiW zXE)RN=pmtWwtk?Z|BQy?Tl8|Fz{bYfU1+)#xk~EmQz;kzYTSMvAlC*Jg@1nYQQ;0N zL+|1TBcaidlVJ+~M66cKNWN4+;V^tJk|}n%ryDOGxsj3k&?l}2ARmq?_-0yJ+Vj#P z?i-H2;-|6r_}%lPH^2nV0R1yQ{AAr^ql@T30>6RRDZh6-0gaLqXMkXAc$Z<%U`9iG z!Q{^ol=6;1b<(FL<(h~{NZa%Ee5Y;74t5&{9DjBYZI=%X9sJZhGb=VodFSAe6$Z|E zGjN!tS7E1gO+Jub>1y8rKBSe8>-Qv=@P6sLOzJ3GEmY2RBIfP&Hy6AhG2 zLVbTds8%5shCU!2_M%v=qs5EXX6{ND`6HDYXE_7iEYIsU5k;GxD8GZT*R)B=S}X59 zd3oO5mdiDrP7Xx#&z9D?W*iiS(T8X{=q2SVoSI_)I`N}q@)-V#22s#-L&7Yc`s&39 z#meq3yWQ)IC7-hLdD5yP0!{Qa;(8ZB)CT9>-tZR{SM-OcHsL(9s2`vxi{U|xsTRe& z867Zk!{z@xN@O^WTVXK@rZEuLx!U7Y5Zwllu3qnV`H6jw!skG#bGyJFPa4V|u*E#m zi~&I)wN3U^27@8~`1sgx=u>>WlXCtW=>yi4`1bcfQ##t(#ok-a_~i2hxHwOkZ5Nk} zjoc5R<&mb4E7lvBXec-|ljwehaeV&Kp`xOP z@zsbRTpFH3<>yi?<5rvW@oZXP?;Qc_|3is9wj6Q3D#tC=YSJU2v_PT6n56FJcgK&r z4xXu}?HwIt-&(N|5D;*JlD9RedZ;WT%Hedr-moz+z~_fC>+yK=##7sA*S!s8p9-=B zK5-_ms5h3%=ON7+-JPE4Fmfqohuf71YKgpX?!Te^piPFV2)QPHSGP`1h8B4t?P=(J zXQQtXI&p~Tj>GNt&KTSqQG_ARuR68z4(kyCyib)2Q5;uRSXek48>}MzN8^t##U&+wFo1_c*^F`?0tKh=<~P<{LN(Jx4qO#mHe8$_ z*OCsArznM?C#50yEDByaf>0#d6N9DvnHinyv&fshM$=~k1gF>gIy$v)#Y@g$z(>_b z@~o-$;-C5$<5g)@Uq%XFMa0C!*byfcd7Hko{?HAN5S9Y|Z`J;iK%Tbe(BU-_s{QDs z5up?jWfTn1)fV;{2T8EYYl(0a)CyZ8LKU>&?G*Ih9Dxw+xQtaFp-j*WZe@v_VQ9D! zj}RLlfx{OSX)Qk^W!gUoc&5KL@EP)!n@NxRrMW!gdYRreCHK`kFhP=(l(N}fuj}CR z!TQdRir2r<+w$d-C3Uq^Sl*d<+u2E3SO7c1g3FZ8kOkYvc`}XmP>I-@da5sc5qEwl zF_dRg%+;Rf?0qhVHx!sDsLIjHLgGbC{Ss7+)_qIqvNMU$D=d6-Xb2$^EV{AgCBm1f zfekKwGC`_t8?K>>A=-Bz6SvE6uWT^yV|nwir`3OB6S21B*7VIt4 zO%{BMgQ!jsB$TLW^yh4B9^p4qx9{De2{#6mA9P1Py*qpJ?eZAwn~)XX^hHj2`BKZR zs$2aB1^Mq$;dIJq-irNxqh+EqUBCZTdYr3um8-4$Z?|dPH-GUsTcslv#KpID&#iKtX z|J3a6WTdJJcZIbsOR~$^!wOGcy4f+*93^A%?WLD?4y#NSdncmOiyZQ&-HLs8w;8J% zxHt-F(yM)_;tieXzF#axf3^VNg_WFvgtnsV&uUZc$;aZ?s ze7xlo8N0HwDACZmB%)}1OfkB$whl8h#|{pDhGE=C&k|k;>zcP*uHOqGmtO=@?i~*s zZ2s8NmXz#Ux^upa7KmDo1Vb5tm(FZOj&gcZ5;?=DU#k!8kAx5J){oW^{EbML|bnceKE>+d!FVsWjn~_jMe2kyK6)E7cab4TqSUbR$@vl3tKMn{A+UN;(SL>==C`OkWr=8W76+vc}cFP-jC$57=#WfQFpd;h}R{86*x*{@H7d018vxf=#jnsqB%C{^Fy$x z9LGKUw)hNk(PxouK-VwBWZ4`N36;|njD4Wn!CxCso!|!R> z5|iE-i=BU{_@wyi_OjSSGFrqDM#Zt?X=h{9^_z!AmqsuL$&u6 zM}|6WicYw@G&F1PE(66G4a01YO1fo zc(~S5g+dSpXlqky4u^>^(C=v zFzG3$@7-K>Amha;B!9rc(}ooIwlyws$at+^WPELnQCxv5uDo4#9)yFL768o*vAMtl z+3ij-Zr}L%Xw+k+{hZk$6D5H3XI%QlzkdMv$zHRpEd_O8k^w*fCX6UUDb*JcR=f~7i{$2*fl-1-sT|NLnn9{t^C zuO3O1Ytm&JoZQo?!v8hp-Uf!(s z?a$-E*B$x_DZ|UOBNbtZlBC;-X_ln$AUXxZPEDj^?y;UPB=w05Kv+nD+7eWkN45rd(MO%!4fl z%|_Qa$oa`%du?uMc^@qMz*l86GGI;<1_u2WK4}jU0l>sffL_qiQN}X@&h$^877B*r zvqX>rDY<=Cq5At-U)l5%u;z{omsxj)Lh=TY>T*@Nt&E#mJ^Ti48OPLa@S>3~E@H`? zf258+MDl2n_cqLUgi2VNbkx=~ACM9*_)U?HU@Vt3PWz|NBv2dmi#i@|I7=+Cg5UC9 zWAp2JepfpmT{&F)#?+zTM!sm5ZGLK?>bg4FVs+enGO>A|aql@(nO9kj{WbmLv8}Bw zQ!cRiBX7Mhk3{p_DHb+t^c4x2Y<~&JF>cH@ZRoDtg%J7B%=ZxUPKnfSPr6@Z7bnM; z$Jog4M567j!OK+NP$Cg0dz%s`cu#DHg{S|`pFJYb(yOuyY%+v!UOBjYx8dACz=|9J zc@=M9dN(NNeP{HwXWr76twrx}EY__Nkx}ISeA3>yzvwJ0qE@IK%71eZzcoI*q8{`BZ#?Zn1QWTK z1cRZswy1AzWiHXR15i6ca4xPAy1MlxWv-DEMyhq|UYQ-Y7Yuw&XK#b^TWmRKhe;Do z6XVR(YaIKbx;EHeqUCRlH=+hEbp#EIgBgsUcNz>#$X?S&-B$g>2qf%ZfkAo$!x~r7 zy#SFZJMWH+C{h^~lhClHaosL@e?S#BVPlfP-*1WOWzno`zQ+dHBh(=4D@5!Ap=&}q{iKsMG(>T}?I3q7)nU6tZ_!|A zxgbO0xcN+?i~srPW_(3Y*dV@LI4#(DpC1jkuqg%s<9n?I>4mLN-v?`&{aLjIfMnR) z2SGsOfn?8onC>hVLo?8IKxI`)VBkNZx+;e!A66STA@p7lZl=e5ETvf(6r9H8C} z43>ZvMXh|vmlEyjx-zS&sFJFcg~miU*stNC@X5@i*tIVab*Kl&x2k1I;Dim)h0i04 z{h`piBrL`31hZs}TNK&*&{`e?xohKyLFFX*acPx75TDX$6+rmKJh=NV$g& z<#%yH(_w#TUGu+hIW|Rg*NwS&u6)Wvb|9=zQ`MOy;;pY7({`~*gXvJ3|33W8-_Ebo z>33o0W>nag7~H!SB69K!y6O!u5PKxba^YPx3tU2z5n2le*@PI@@>57LI`!bJ$&vId z?i~^H;KL_J6ObAardFWfwLZib-s?2XV$IydoQ2jK9!^cfz;Fnoj)@T*@x>{Z?qNex zgWl|@cj!4@L;q7F{$>$J-I=92$}v12bRz?AR;ilYi(tj)_4R-M1)F~B#OUA!K947! z4OxTgFx&|qjieJn3m};gmJ$6%%*T)rvNF!^A!=$oug>%vp2U`8SxWC^Lg}A(27xrt z8O|_E&U)si1AqzfR$gXVnoYL@*9i#c}Rff$Rb(MfWaRugn$cmsqo_ z6Ai!arPi*qU702CYpmYuOZNM-x#)5tZ;kJR$vKuLbvHMJk$4LM7`lcSqCCDg=({A1 z(=7aPW#tGH9~&$fbRICDAzRp$6~ovVJMV)MdQ#HBf54QOm_jX(qvZ`s*Fh1`D{_3< zpZl7tvaW#k1KqDYeQMLh0mtjBAL^9k@mgXy&j+WSbvO6P9@Co?_AuA(kkIyiFoPry z%v0Ko`xWqvN@=64oyrlicL#c=E9x-IGf1vnL3^*V!dea#eXy-XuRngH06%Zw231>G zxn4;b2L_4`0qB>`RK1;W+0L(WF9LqWSv(MT{<$Grr_)zsb@xvHrcwFALI&8E$ri>tvC{zdhHtJDL8-3&Nr92h+cyItx(w+|`18}1-ZKyws zK88z5s#NuWTO|&9Ux5~I=45${uUOaB>9HFm0s>t7BYJ{cD;hHweX|+(0qZI#&+Ub= zsI+u@o1Yg7p*BA12)fO4Z8_B4Cr6?@ylW{y*bKaE(IjQ?;LpUjERaNwlBI9qah`w^EbpEDs31$%l z$;1S@=y=+d&ZX$0Rd_4mUR3Iz3Eq;E^^ZV=x@h4-byrqpV2=r- zae~OWLIcjqXEC!xrfA!Rh8b`qg%MRU7 z*dy@NF<40kdL@{mRI&0V#UOs8qaXdV`C4}*es@>b;3qEaR)lOq!E_6_nThSBa)g9w zC*zqE@DS*E8=s4+uHL~~K|R1}cT`_N$3a0Mu8>&Y zGs;3Cw49PAH~Puwtz_f|Um+B{q(j0TGOX*oxxX2XDJ(=G_U261T<90B0f^pVEo#0} zYUyYA*N70tj`H7I4|f)uGn5oKoJI27EQp9Ym;IPdu&s}^9G5kHI`;l^Z(pTpV%1o? z=4D$>|A2gj@H>-3SVgO@P{R&E0)Q!?9)?}nm?GeCCHI}PAFm-?&WmPZK}kaVal#NH zx#bMQ87-)l7(_^4!=QSYDo>*&&Gb_I0EGb!ST1P+_eD1IubUixsIW2AvqH`_+*H=W zr@4%Hj|a@+7~j@wStj(T-S$O0=~Ce+@>f*0@%*&+p)_a5^a1R=fK4P*7e>NbnN+&n z8*7lt-uR{Xqu6RU$KAy$yulY3pZl@a+ue84{mBD~^kf!fpQ?s?8$1~{E{~Ud%Sas2 z&`9g*pU{rV(4*!Q>0zDV1s+!PxMw)uwXFo$gvHz>&YL8FO-NhV zAGYx9H<5#cycdckbY)yY;3@Fv6DXjrx)4`GCQTkudojm%G27t8HX<)M?609E>_z6u zxPnhI31tALgidbbUhe>8QmLl!>P3=HZ*%!H^tdfLmC8FOOrRsvH%C}9{s#UiZi&%doFX@B_Ms0fC=cZW%| z!+cC#ku;rL-R8ss_{{lGGGaCmo=lb9LnB33R^C?UX1`L}Ou}q6FpRRySm9XO&kKuYociO{M^VQp%NSf<`$_7Uz z^&{<_v%0!=`_=E{LJJKPyiJ^(btZ#J$BB%z_=w*#1m-h^F5_t30Q42j`)=)IE5~&z zQwV2k1wQ6IV_P+l=HM#th(piY%77}b|t;&Ih*(> zM1%P-++>MV6KE1VE#r7g0RPk)CP+%EY#g}JMOKzt)feYM7ei?=xMnnJcf7pUZRZdy zF&px}Z9vPat_%h4qoeNcrr^|A*M+aQ2kq}n z-Xf{ll_2I*CMj+4)9f$s7~S1)926@Gk*H#!+nAc?%4fm;%4m0L_Lt#Ae9SKw4y>eC z&(jIc);hQ5%-g6RAOrGAUmtMrG7W02FR5kUYC^8)O337^qHD(&`65&i&@M1Ov|Gda z+r|Eb4jb>)bD;xDQ6$&pK$ca8^hQ0w&?v9Yjd#REYt(ZstJC}w}i zlq0bra6S*yD-sqGvbIykMw$^50|+OHYV4cK>q8kFk63`|IsY={#unRCMBxmEKb`0{ zJ17}5&ELS@t z9zkrVtL&0Vf5Q;~Yk1AY6z2F>6Igy;pW}UZ6BdJFdzRF5zBBcLcFRe3uCUry@tobl zj@lE9*kBy9poI@C7JgxBUjBbpeYfs{a?%&xjb^1U^xcuO^y}B30Xj}kKi6v9(^IN_ z$$Mjm$@hZx)6OQ)@Md{R<>fTi^K>Vwo{dt-2LH*9 zK&kAFlwpeV%D6SXeLsR^GXBO7>ho)x@dAa!ED^YJ<3AUBd}Q*a!~5m`uc0QN=EC0RpQuZ{}ij~erx{}tF3F+ ztQ_a?4IxeT|?J}na`pU3H4jXaCzJOzrJ$c}FEc>-dBKq1X$`aR7OtZ?46RO&3BjnBi z4BQk!0xh8|?^_Rkh>zY-Y}yES0df+(MrTnbHeX_IN#M?F zD*DR-hYCwyAKCl%RK|!8v#(Y83WS$7;c1q1Wi_MY(F;6^!N1ulSbwQToR=vcRs$}_ zZVJczAIdM*Bn(tAvhKB>DO#&{4mS+5gkO23Z{fg7GHhYAL)GHj26L ze^-kM3p3{ra#R<#{9c39l{P^6cW_(hI)5d&uBPK!^F40~Lq)xw4(R;^tQ!4UZSgE(k4oO zn(i$dS41di9$sG8oyo3W&Ov!O*G~YDdz2IHOwYJTt%?e-FL%)Y-8D@ZnZ^?l=k#y- z=wyN&SUurye&6CYd$P;6jBzAffkg%~h-IH=&!US|;*k~G>!TF&;W;FVu2eI{&ACLS zYv~_)o2r^*{-s%b0ieocGTad$WFf~Lk3(E*soEGTL z9!j=~E?f9|j2`HNRe8D0U~O8u+4sqA$9F^+-3S3_g*F-D-KJp$@6(J4i|7#!@e=(sTr4%iS@Ovt z9>Dvs7l@Tp9A>(_G zxW@dyDdn4}!O6WpAMbz(uMs7oGmT#E(8kzFCXXpPI9LwDSS@7nXJP zl6gJ=91YGrjp8x?&e?0w(u5B`Lg;1m6WUqKq$>E=FWNoq>xZhv;y4vhQ#2`xA@Aa) z!AMEeKk0ui3utSb0n$f2EBy)zXrC|Cwb;&mkWUtH%1VHTjuWhp)jRRjw0crsvDl1z0UBT?d%k^P#`@zLJ_!FR%;=!-x|x}a(Kt$vpdT)I+{3FLywF=yEU;x z7d$ukonN^i3dUIN3BZ#?e}cRtmi#y%Kt@xc;zIbe-@kaam|OsG=v;o_3wSg8NFiD8w6o;kNieMxwtbB4|Di=& z7hmOw0WgSC>}0(b-WEXInyY1kNm#7jA_f`y-H{CCn|wk=1kR&lsAtvt(=1>r0RJXR zRWOMvE4}ZE=z<(2Jo8I7DleFcB|dUESl`? zW_G$MIM{ea-;j-${zswr%9-l_PoY-^3cV5YR5tol=y;e=eE5sUp7jX&LtSSAZ@A+a zV^rpSv0@ScS2U7VT5c9l-a!i3hx~s)hZ)O=X-6ZqjXaV4biOu};TueC6*AJm9f<26 z#Dl-mU9)SW708{b3ZBh2OePuT-d{mGkKkt&G0YEXH6Q@^U^Y(6>LoHh>(0iM=f-!R z(XzH@bvkn>oA8_r#sI^!o%*uz_SyN9C%#XlM1@q>ZuBOQ^uJt z@v1EmbuF=>20p|yN1S6?cu+RgnUO4edbsTAA4aM@< zk@!m&tI_11_1FL?zdx%T039wygS(&?F2EV`W6l=AD&KKdPLX0<+|9x7s%SuS@;F|H zAiOUFu5C|fgDae_&+?`_=j&I6stv7Seu8dw9WtV=l2CyY*^&K#KA$&l4GL`0&eA~*t4D%RABAK0HC=%}EIMkh$bn}OlAe(!WWDhJW9=`avfSFRVN?Z4 zX{A9LL|UXI1nKVX4oT_mP(YOK?(PN&0qG8D5$W#!<_+pv>-pY2#@^%IfBcEpJ@Yuv zBc|=H_iHvuOlq8rpI?&$$uyL6WVu@{4ieF#gn7&H`iZ0;Z~u}WoYlQu!~dbIm5n8Yug8K0CWVid#rsfOI`RkNxTop zY{_Kq_YO$7wx0+?Q>f?^3s9Dqd3L_r*=$Z8n17GpI_Uk1geMstp`XLC5XOy|id(2% zkm|0l<;bh!PUbnKy)%c#F!hEBOe4`tekb1(?FFK7QW=JjjL^4?2jgn=0QmBfGt9W2 z%reCnE{&n~chb7pf#=&mN1C+G?ah1z+?Y?f7ScEou}sL{HZsYoPfPJz#}|wB(Czi} z{h_KX>H_cfe|Fe!T@t-;Ii9qb^{XDo4Su~|>1Wor^Qhy;?;_45o4tGg3~dN0F*E)ixCugg{psBd_}BTV%OQB} z5qN3_yiW0ab%Ivyda9|BMB?%8lj_g`z`HP=+pGr0Ob2Y>oc-il9v{;-yIhW5|ia(@b~#rJqiUr$G? z*_~apubbn0#y4{%mENSp=}I#hnNPa>RJ46vJ#v!DkFjo;oNce)4QLQ`6W6p65=Ip_ z_xrl?@olGn)KnZx@d1+Qxd!%;`R0h(3(x3;?19ak)P2&8jp@hm5TP+lphEsHlGxCj ziSwi9GX?qv<`%<0n}ZYrUoZYH-0UlWZnVl!;sTMdsx*@1|R@ z9tuC`2^hUfLY`Q|BMl3&vsiJ`r20E6sTqifD$D6(=1nhLgC1Ap0hHGbx4++%y6FXh zzm(xth7d|f!~MmN7bLf8^{>NMK&^h+s%bPO^^aOT8sS#0&K~%0wfZ95|5>e0COK$C zJSp>r?Z>^ASqGO8Y(}fyg=^3X;txLa=ratxXh{Kg95uE%cx3gKn$_UBu0f|gQZ3X= ztdWU+nj!zD@KY1K*s2n!#f9Zbe_tzl!Mh$e?Dj_O8}ZqDuSoCFH*?;THxEGWh9-zw z4iidzu1*Q3P$i-8{17tQRB|a^P9C6(bI)ORncZwWMzpf%0l|y6$JEoitA5fZPKAu$ zv=dul$z}p`R7q=n{*3rk=m#xb1I&Ht)^K9ar{E!QK&p94^>SVvwmI6rF%D+vvddHH z*`U~S@xQz{W^Xt@n}`U=vrd$??p#nkSTtSmi1ks)#c!X#{`rfL_auzfLSH=58MH8T z-?Yd{X^2bl@D^B*UL4l)tyMC(I(ijbs=VFwtEiYyNv@b-zX(3ZS&?t&2x#x~9La8e zZxmrgbgz)xV&*`K`%KA}M}Oqzd7`sM?Pp{s8u44Lx`52kTwgp-25qbG5Rfom0qG0e z%2L!*(;%-VVtMjSC7=J!fbjKRa>y_4Aa2ry^5sh--<1J5S#<3Vp8v@8u&=(Fx~6th zRLK`c8QBzODHTg*P$wx%H3QO3b}V-uT>CBDA4(v%%y*>7s0rNg;L&HUuig1+9C(b@ zD8Ae()pMJR-d@hp#`C33BTnkb$HWsR@NC)u zE1aFPJS-Zi<(hV;@ZRT4>LMcHU0_$q(XVK~yI-6UbgIw#cgbZ3^B#bH7Qg#3<#d$q z7fO$B--en!9L5*%8T5fj*naagCi`a#%;kpyO2;t z(R{NQ`r$lLB(S&Vk9o|0_7L&^zC=xMgXutqGd3CVA}>vvb~_xh`1-=)Obp=G?28N1`dPA0pC)WA68K^85{?d^p|9ibW zD7jn^+Tsp85)G{7IWtHFB_`hPHIfrPzJZ^r68VPO z{MP#gykL69!0i z9YCvk8o*e=!3~Y(cEjX=A{y$(M;gE%F%&Gg+Rz!gg}lKep35-4c+|O2akF+W@_}!B zyWCe~jIchVPEn3DeN>vNHJhVga~-$#}{{hWnAmWT<== zQjGkh*P26uHrCN!n!wJzPdKBH_U-OGhE#A?tbawwLDSOPhW*15og(U~$ zmO2a-H{0*xTJt_#01#zSvmUly-tMDkd2Ef+O>!?IVIDe*RSCtre_3_&54M_s$QO= z5yo}>r5g|VXKRkP@Xp4RcHU&YTRDE^a4nV%uRE(Y^pD!fzjiFmsJ_rLm_gPDQ6L;5 zrH0hF5_dH&!T*$>|E_W6TAq3s*b81h5w+z+lr2GYEcB$w6X3Sf)oC2L<~AzJkD|J9<8k(VdCbC6Qyyey#N z08W`^cWx;n;>Fhh{*)d=l+HF6aS6uI`lTkpL}@Wh?dt=X)=U1t!UFt_J!ycA;Qwz0@LSZk4Ub-F9~_HC+YiLPKt6~>IxRDs*awi( z&-c_}6%{UdRJ-#H`6y@E&Eb47&`Ek{FSc~oOUS=h=4&PYy@Bp`z;Te3Ecv3DYii_S z{(9{&BV&1a+Hy%wTT+M^Ky|F*TXN?4SepHj(kLsoHqf;u1>Cum`;Kc<<#T#EZ zNrvhj=@6guxYXBI?DrB#>hO5ar2U#81LZr%3<-W(@S#@n7m!rN9O>=ucid=hGd5yT!Hn1yEdq3uo&z4;aSa6r-(9)*P}K)6u$TK%)Zvuo4*sC5dfMF~LNqQnekJj-dW(OA0s- zi#v9>*f)EEMu0^w@wjTo+vu#a?=$&MFyR$V>AEOrVm|ed7wnTsPg1F~r5@|KWYgiN zFNYGe*?;V=J!pcv;d>$xYqP)sSpcu`!TZ2W;yEYVqV720Hb6#{Z`+}cvci+ zBnBF;hc`+wd!WX(+Md}1ZlhLHj6j9OsY#2$>cTPDD=OO}^sj~fpm}ra&iZwbM3}?@ zuMZ+82YP50&X1B`>jNx4^4Z&)0Avdpm>h4a+~`Dv_aeW&D9!A*8M8 zXG>-L^!ME~w7{C*CckX!pQq=j>0`hX-vNh$($f*r%zF)NZ`#Ynb$$ZB<<2P<8t8o#@ZqojFrPjz%UvV`kX$~qR9i2Rq+OEiw1mBPXu%eOS{_7G zR4&9U_2u6J);oxY2oMYRKO}kl*0#=_JGhRPEmFsYQ?gc>t-!`km3P_$7m9;fTkG{` zE^}Uu!jdmW;Z8?{)wxcELqEJoe#g|s2do?yu9ZZF}`vwNl z@5(4OPG5IU_zM=l#WqXKH}NFS3Sgxh%}I=_W1!B13RY*}IovbRFEJeZ65w~Vp;Ti% zh7jRHTA*0Tr~8j6=P!lnL-*FujkSI;fzpu)A{R8*d4~M_IN)jM`PE5bp&Bb`u%==N z2Fy{J>6Zmqn8d80mo*$5C%_aJ0G?9j51J zr{yGPC>aB?5a4B;F9lI}g|4r?SK$ewV8JV3DLe}3WpWblDt}h1q5!N8&+2uj4+A>n zJJvG>PZF@6c%-)CPyVu=L{?Du?N}^}5@tc_)QUgS^KB06AJ~MeM0KEGG%&!4XE8v= zkzHL;V$tQl-yop7bTe<7@N(}>SklYgXBBZ zBfgi;CbZL!#zA?cTPcLkR)R1mmCUWN@MP}|g<9GetWF>E&c9ZA1)F5$iw6)2bob5w zQlOxRUn8lU_Ekn<(e#^TB_ZgqMS4GyTB>6JkgDnw$sCnqh*`UGXIUXshQY9()2to) z{`1RMJ7g2ZM%ripHwJ1Gr>div4u7QX#Sd#EmajhXB5JvoO6Lz|F+K=@!WWv{Yc>25 zotD-JdJBQ9=o>K*Gp(*228_4sc7jdXE^y%fq|9V7%R&v+YOf>4Iw1rO9br|f0>ux? zd};Q-Z(|^*A7F}lc|Ky)ZiYvR=q8A2*85I*_ai<#+>EFr~ii~?x z2yX=ODL&ebA5VgNPcBxbR#5{|=4D(Pi1na}=!zJKQka>_PB&G)(t+m=akh~oHdqQ`AYHz9YG%05n*nAwf-#pw@=wmM->xSxp zhOUrjFR8%UeQ4+mE_>($@K_2I@D+XtT8jkcTRppuU>WdiO3?dt)TcMNJkQ4RV!7@i z)>tojT3tTaoQ@u@DzxP1@5&IVc9liQA0vqh%lVDgfnxSS$?>WY!8QBOqA5m>q_cN6 zpbo{hMXz-Ru^8{(Rezd(Qf-wmIMI{$4U>mqm3g+=;{=duhni_@P8Ov=Fwvnlfs?jc z4(IZfWe>DldCrZifBbM$g$jO8n7Xt+U$YC)>bZbngZ4FEmp6bK1;%8r8(u03@xV+O++4>WHf;Nd0he>jS35=G1}L2P_A)4KIqY`JLt) z-{xx7d-(<5ANNDdt&=}keQjf?!DG-Azq`NLfDvqEQzw6~1|HFNQ+>yz_769zyk)J- z_S+uZjvVkCP>g0_l!tIi>J(B?SP3!F4u?DH>O!1fLexsk4 zLWYY%j}Q?N0Ii4k5wwDx9t5=Y-CdN_x@*r#o1H&!=y*X|HSMn*<3LqG3s&wg#tgKl zr2fXx5omMn16wV|`v;Z>X?z8t@`GcaB!A|L+Cc>|uF5)X{rQ4EI8II)bhztfVPWAK z{Qskb_0fZ6u6RVL7q9#&Nvm2%)N6LH0QDw!rm(2jZu}7ZM@0yN;mOTDih(H|aA^ci zd9t%zO4EA`JGhXQ6z?nOqVyT7d+WTwLQ+w%<7k%rNW!2YavRA?k&8dwn)?o?|_N ze84140muGvCcHIs-XR03I z@jtOt;;ng%g*mLDXRkMu79_Uz+3gAvy_EvO)(~D?6^IJx-iFTN>irej+-I%~wd+qvo+9~V=$Wl*2 zm@h}*NqyEI5BFA>tfZjl;N!M-pKP+~i*~fZrhm36n&&sVGCXcY{ zRBkw-U{_{5a|+`&Etqm6YR3GQ`UB9Zt`3tkGcyyBko@fWWT$-EhVl$_TtUx~QnKNR zQv^N#Lq4trgvOufej^>#<{OAU+!2%%lBiLrX3)t%oU|w?Z&u;1%=S8Q5PHL2NmUuE>BkOyY*nhEd)B zA85nDTf=Ktv6{p8k#bI2iEqU!@8alwodH|4XOi+$GL~a+N#d9IU&cc4BD)uLbRt9T zs%{OhqUy)x_SmGS9F>>{z$vrTktp=Q(GIMimKJioj)Z1g5vRI?6%J2iO=DyD zOXzH=r(f$g-81t}UPp{5SG%8MX%5nit~X=8&ej0|)n{%Og1Ur?zsx2m&@#U-+S>GE z8NML23i6MhLBwh*Ry(1;HS)IO(lnT>Y3bV4PlHZ)gYQwX8Y>E3NQj$wbJ#H%Gqb1t z5yVAn|Eo6&2t*d)Yf!jjd;`7*3ML1w>W~Mw-I^NZGDFY`$RFs;5Xw9mdFBl!G00kg z5p+uj6Pi6ffchWI((|wYKTH}8s{4Jr_j^s{teD_CA=xzK>Y;t+bDTwBGlF>$N4UE|EMjYEItyo#z?Gg^&Nea3*RA z^|cmOE@r}gfN#+`awHbtLOPc)%|Ky;BK6zw>|QS`=keh^wYQ&vuyD}Fk7e3)RMNo@ zSuLrRJ`!F%Q5tIHQ+6HCSCWB4Tx!1b8x*kY3`GdEo1HFS8FRlXA|qekoO;KntcyAb zGLB-euQP4AAfzUtepffgI>68RVV1)gt;}C|2#QwLe1L0i?Qt1WF13+XSE=3;dhqs) z9<)}r6(f&}y#*i;1O(orrB*PL(o3=H$f#fTtPY(Ga5;EUO=lqk&2!VWDkBs**-!5C z99<|Txa-LM9p0mnjmHQV#Xh5>ejr*!Ti$PR7#yLcl7#C(4SZe+UgYBH$Mp4^3Wimu zrLRp1;&rvZgDYI!i81Xa6yJx*bM! zG*~nc^(Y-N5I?t%!POrxK*fxe{W+(p$^$RLwG_{$eSk&~JCGkvi}kHEnHd0*@+^KH zh$VP#wtgX%iE(QAENd4g6agu2Edy!*&2J5@UK|9zE)A`0JrWN z|HtQNks;VJp4kk(`ED%qt{jWbYWZPwLudYPasQ{%Jmon1>MAQMxzhi2*FqsuFR?HF zxe;p$%3pEqAn&GI=B3N;iqZ~fX;HGK7z8N05obIxps<i1PhCZV6&ABfHWqk2dZf&_=Vhv zPZe9)?jVvvKQ?cKjMZ5c`If~z4x`od=Zlcd;GFks5yml`e(h7^CHgrOWo0ZbPA|XU z8V54jZ?(WO1VIF#ssoEI3Z^p+j|N*d`;A0 z(hal1Qh~x~dmV6hy9*k!yDT0+j88q5g06z<4LQoF{fTndZ#|Ym)V7KF_^6SI8ZNfY zJDKJE^1iOLp=iZ&U*TIQKsf#`>4JMoMVAlsg~O8ETLFttpZXGx(be&O0mxUo70rqn ztJ0|t+kkS~Ls)&QWMD?mP~!Eh!p82%4$~VvcW*g`O|9Jh9f;A10b% z7$cPgof>-V?=GQ!h?CS|r*r4>`%ZM2ZqgfLUFCGJAtM7w%WB2Zi{ocSIHV-+DJANb z<37>L({k%fT@H)+fvYBwL&IkvgY4@I@`B{O6zIqP0a%u^ao?hM8+G>}g`zO;!$oJ! z$dzQ|9rW|O$C&HP6)q=1UtTZ!iN{zq34C~e1xEuYQvdxTjj_UwQJjAzf$3ryk7PY^ zU{1jbKAG$JI)TX3zR-d-*#F@4f0etd&9Wo-%Kb5n2r%uyUbMGYJoN13E)_};1V+W# zZhU#Em4iFtrwQV!su#83q_GJJ8|*f8n=(9Zwiz_b8~0BvA=RRC^Po~@N!T16rw9Tz z%jP!@yLC_|2{aGzAC{nZ{I$eDpN$ZLQ>_h#7A>PYOO7@?J51SFSNou~61Gvb$2(kv z4MK7e#LfbB+eilQs1fu}KW1Q?`sGcwFbgd#j2Na2XRz*@+KW`Vfqt)gs_rDA2wO)tdpbZ4!Fz>Fk8 zY;J#)U9v|Q>2|Ml(gq%5fk#Q_TtElX^AO}CEx`*Fa+LbB&b#J{MGvyS>)^fKU!HyK ziTMR6^)|`o43R*@fI0_E$nWOl?rw=N@Q)wcI=e%WSLPWoB_8DT2 z9A<;0Yvp_mgFw|s55}C<20<)HhNLnPq)=l-P4Y*1+6L=Lf~%wJTRs2Itp#Jk_>KD!B$7u%n(U%^gP6OI)ikF>P_2$7nGP60QW+=*vS4H@&p`kVI*QU zXCO#HfnUZ)$r&;j_l53aC_6|o277TUZ}mlBNl8jY1xlR*ids3vr@7|^a=%H~F}*>+ ziAV9AZM9zn`JIBtej`j&6m8QTo6_=0AS^DC4nb6|dlcpmbrK(HLOP zp5#jkFbH52LT|$X7(3uzCDG(C;+DR6fw0s87jI<(`PK&`x1ZXPcr#7= zmHJFKnl4g6aU9cmC*Y|hiw%Ba<3r+67+IS{Oc3P*v@wsacLj=l|0!I{D%(0sKBqmQ z5L~ej=9W`0IE}?ro$<9pxTBO&f3J$w{y>2P&*j^>!l#@|Hj2CbHc7p99`{qBFKH_} zgyYtGVtn*JIIX<-xZZ9!F8Y5%7(BhGo@{bko3?Cz;G|6Cb}MywiVTu>hd}u02PGW~ z=<@1(r4v*np?NrEjf`v$1V7sW>V<%(vcLlp5CAKc;HVZTop_z|%d`Q}Hrk$yPKK7j zoFkvUTbM3Ik zU69SDes`T45!^(Z3Jx$&+wjAy_WKQ7i(s`sy;edl=}@j`foGD-M)p{IXz>2s@1o~y z5)?hmAWS3?NG1}7stV~#&#ANL8t#=Wq`s8X^L6)7)`Q-8Fgr#NBqon|>xhi+*rJvi znN%p+xttGtjIp7L_+n#XU}u^Y{h+~hhyx^xww_OMm$U;OU~Qrp53RDu4smD@GSQG7 zgWj59y zaiq7S)|4)RP_x?PLLZAxK(HZn$w9`}%1na0FR<|#m$YKt z=pwA|G#HylVYB~k+qsmK2J=Q#GiH%yP~n`N)QC8(ZEzVt++ zpPA~lR*9Qn63oaTdxSr^GMHKk{2xR1DPzDPp-@s`3}luIMfIHE0irhrH(C21$m6ec zLeMxf^IxGy=V0C@BaOfE`oJGU6v{7bn|Oow=?CZ%CnX)B5X#$&5xlCpZ@^2X1s7@O z={}aHMQ*m)$e(Uks8#`4Pe%SP;37bPBe-;h-63im?Z3;2zy2=dV=mU%$_TptZONLS zTFoitxE?MZ3)Kq6g1s|(Wsb2W5aTcX(A|}iOr%gOmfQs0walq3Rb%)xoz4SvVk$G+(o^Zl(X(wfdan zk^uF~23KNvyD}}mBQq6D)YfqoCT8Y^Tsm5FBJzn?kkG2|tV_AJ2oYSVvTnEMkPPBK z-@jg*d_jiPez5YQDSo4R*U5*Qbke{_f_|p;D-Rm`t-eA(k;AS(VJdB&|K@r&JUm+( z*ArCmpeyL#`)>pm4<$y1aU6hdEK^rOY8_01;0Bd=@0(EZc ztyVwFR%vWZ%u%px*Dc4yN6&X5PLyRS_g76;+{~bpPQ3W*o`Lb*aYm>IU0P&L!h>r+ zkU*Ihg~ZyFXZ@z;_5*p7R7O_-pzZe-9j29-{kY@bkpiK};;h@J^=XwPL zKufn{fqK03)F>ux++_I*6c+t9iK37I;E9@Ut}(8QOuZOFi(mORLo7EQ`|-Z{3tC9^ zy{<$F^wGBh{q)~?aKt*ObX&Jm``uQt`|V3U(V`KMgJ3!mq|o;Z339an%k^Y%q*y_K z&-bdMtzmN8{hz6}onZ_)Tb}n(N@YycKoGKz7(}iFz)YA*+0VqG^knjJ?YhBppg{G# zyc706>BDh_Gu3$~EWUKw4;A)DgJcwvMB8ZBz=-5ydo?_E@Ct?GdcO7JLOU|xAIgwc%wF~oqjy_)SZNC!QE(ZG2~$+XT_vIzCRC5k6&|+brhDHg!}qsk~m*0 zf%bRXs=uJYndrHWF`31+{j;g%L&RnC3i3!NC zRwWLX%X(HW6q>Z}TPIHutDhGO-Hj?wLe)`FKvP*4@$E=1G8hd6Yb+sx^k3x|mc+k} ze5$2IlS94bvb|K}U97~EsscuDm~cU9J?JkJ)z45*fb?wEp(mww-eVr(pfB)3x%(V7 zO?U7zJnZ?=MpVQh$9KgUvP5X z!q5JWbN?0-DHeg4D6$;ddzd$^dbpm^T7>sP>{nAJAM?F|BH{tpjsnt@2Zt)lq&o2A zLBT5WDu56~ukU}pZm|9O>LRreB!5>jvCEz79_1-f9IMng`k#A?GkueP0Y6Ga^+q}< z1skN%j;+g5Oh|#4l!B!)HA>Epf|p8((lB>J}pqs z;c-;v+{Q!yF`p^6O5a=nMm2SWYR6!f!n6^~cE!tNM8z%kWuU3;b@9VGgmsX4AqxE- z1_HAPxK~=vELfG}2fW>*-#?!b4yHv@CVV-R(-`oi0fL6I&37+|C0 z>cW(Lss{CNTT`mu%B$)kWkLkXw%YK)xTu4lLyez3gD3h*DunEPnO}_Td)XZcKgnSk zJZKt9-UQ0?CSC5k^4tO)vi#*TLFBeEIVq_gSXJ}gKgFN9x2!s#2jq$wd=|;V6-$BP z#qkz}{_1$PZ*aS!!nr!&Zi9c@be(DzJ`UMWllC&-IT172uK2$6!e?2qoiGJbA4fG_ zrGL!A)w00xQk?gt8w_%B2%%li+YGfiytGk1n0 zk77{8Mxa5^3xv?)pbf2mP7K3su1ca@Qfjlf@$YpYIQhK5Nu zJUmaqLwYJIlm<3g73Q5v0Us~Z=pscZVohnhaG?$0sL>wlnV96NYIOfR&mHc7198I) z79ZK(8TROXJoF1dG!iMm6Q#UVu$ zGbp0keu@MTrq~enJ2PdMGcOV7QQB{YDi)3(nUzej+In4&%DD{|ax8#;%gL;RrOc4# z4?@ksMA$3|qe^|u((|rt-lva_6OPzi`I0D!U=nW1XF%w^zy}v6Gz!J}Yd}%xkiW3j zO$cT5zM?Kj-fBx=U!wXCPTcc;r2IPplr~2bE*cabrLg;FU z!95GPAchSlxWF&)CVF?aZ((U!yvf6wh_L3gvbb622Tb&v*e(|?I}(nYrGzn9RYh7p zeN8f0t0kX-h{twWlw)uctJ+&^tSZ0QmuJ&3e2+-;8^_(rhn$eZ8I?u4WpXY#O0ztkZ?N6wxssO zgQ!6u_WYRSKt3LMZ)XZGEUpgK!MAn&;rOs>1mA>~YG})Skj-lPy<#W?4>pQ6ejJbp zG^1%Ni2?cJ45QdOC3?0~BMnX%HLNe>&M-vs?Fw;AWa8b@=?3qU3O-VAI5l_N0x1Xy zYw~_yu{XtNTP?3N+~D>vEO$b;(^ zpKdgDcY=Od1f@;zd(cXZMZ_+^+sX`_;`vg=HiUHQZP+{5nZB&M>-kUtkAlWcG@4;_ z3oHX6se$Mgz!i0x&G^s9+v$(HuwVsQRk5KH57}K0*hFKVAPCfySQ#0B8}eww>eZ03 z#s=ot*3H>K^lk$`I1B+-D+<)=|5}F-CEZUc7a)U$d~hHk*R~SD$b!;7z$4yIx@zA| z6W?^;(IZTt+mh?eps?!#LUnPmB?OPv*G82p1B`xoQm=_eutRXBZ#O78x8`qZ6*tab zVsGLJ06ASr`#B`-EVSsZ+7ivCjYH6%#^lW*mQdK=xQSlTz}C*xT+k4<1f<112c%(*>R^grju zeNOCvlhyf{<4f+XoDJ?O2g~_6dKwxk5RNu3>i!=&NpqC;v**hJ`1G^ZLXCS%up{WS z&Z!4h>)#TNI~_Yu4N#H{Z}(73lT3kn?83%$1mO(P_Ts}?CxB2Cg$!8}mB&n5$}w0Z z5^q~Qb2T>}<7dt9>nm!av2?!NLD&akQgQmDUYRBCk%PH4iGiw0pGsT#(%<|0o&uj3 z(ts4&Gg8S%Kzp{7)1h4ZR{nb)biQHwiZ=}qumTUfWhURcY3i{+8vud&Hs24As-KBG zZ7lld=U#Qd=^hzT4)WuQ->!$`pTz!Ts-U)8I4Icql8FfC&oEc*%k~dTSyiDJZ8@uK~jXb&~f##F@Rnmk}pC$1A`^ z!g>38rYG6~>b_!344YS_?PLKlyVHB>2Ikz%AuEtY7Ms8T6nIyC>;s#V)iQs+WL*qA z%K=n2{^wtW+B=&&!bOB@pukb5C}2oVrv4E8zdGNn^LCkUcYCQ#5Y_t^L&&B*Ni2Et zCF^fxY}E=eq*%-r+QgzKhK*|g{uh^w;g)jqm@8|}huq{4Y&b4YuIJnK5lAf9c)*{= z{iFg9uLShB5e^Tqk|=oblLUDbix{jvOG>MaW6R`fk4>emR`Kcie!@N79j<(NH;m<( zT2chqXZ@tZcA1b1K~945A_VPh>UkAyZL=&g4G>wNg4@ZwyMR}CC#PmRH$01E$q4x~TB?;Ly^ZabB;a*NPM#K~c{pmsyh2JXd*CQVX0N zS?jh<%VcMekg#Q8oa9pvPM7T&5gG{xOWRkD*O$aqYdbsjZZ0tuaM|wjz7h;{2_5QK zv!{9nNS2mZN=N)xml;fBV#4|+NYYA3YjgvoxratMnF)QdqCf) z-zf!6^n6N7@na^AZS(fafcufo&r&DqL@pE1BBBys@KH@w+OXFuB(NiW_>Q2IX)x?o zYC2Wp^EQj_rEqk#MPdFT?xsG}y?gh*Q=CJSDwCyc{tBD-IC);ruCU|iyE*HM5tIO) zp>LwOS_~LzY)Ig~c*~xh^d#YYcj@D^VG_QVRrw?+yz&VaJI0po*W6W3H`gLfP=z*p z`z&-mv;C$xj#>=x45CX(3Dpgyx*lJ8 zQ;5y35EtjLjg;!a)*)svEAX9&hf|!%aPW8}`}yS_+t>0)=@sR|%WBRMs;P<9u_GcU z<&tAtpIB6Vl5uH@kp5>-aLW_ETbG?q|Mbfx*1ZAtDgcm0Zqk1ykC zi#^^9(#=QgA!G_)jecU$eat^PEvRu4*XHRg4nNWD=AF;RqfyyCW`$&5b{~wMd3eV| zQq#PFjLvB-y4?j*H1TLeO^J^VW>(x{mX^^#@Lk3{8!{_B&@bV@P*Lk~qgwZT*`btQ zS9dcI4T}9JF~1;l`yebFGP#)G@tJU2DRnuy9C=k~L-AhSYisK%`zhMWRYf&94Eci= zAI1ncc=%EDU?N(zV@dEhYYyQ)xn#m*2b0={?@x1enEJ#>f^zX~wK=5obJFW44x)0Q zqrqm~-);=v;S&^|5d)h!wUqzVpf)~BFDZ+C(D8X@^usmI8`f(_4e#$vj7~sXpnz1> ze>{f@O`0J@J6)Gk^S0i=KqV`S3uFU5&NtutVM5akW~CzwB|jwjW7volWFW6gz9O?B z&Bq+}eEKzbBy_sZlkI+!Eb!IW8n4vn7ul8bKO=`h{JTq@?Bm;r&cJ zi#oFj{b#R^qO)SZh@__S9;`@7icGN?g{~+5EY%B0;PL31pFioLZ>y|$jwEPo$~T#e zh=pDWOUiZ>UIdHGPp`$@)7$HNg)ym0NoKjkG`Urf#VEFZ9;Cm2BlU>uteIJe89bNh z^l6IoKwJpd2Oi!mCN}E#khKct((cbqLH&$VjfNrB|EOAJCj(|ngqIhC=jPI5RaaPx zzV@8vzz1bcy>i`6lB@R1!2nNB5>Z%VUYFq08eX_N`*6bWFwJ#MjBg9v8u5!D zcNKRzIVs;p^G&;A_D57XAzj*(cwnIovY6O1cwfBZ+)a+xps z{H*5zW$cR9=xXzgTMV+O+y>9p;m0D4dWIg5;35dPoEChk(8cHiE9+eB>e38)R$^u>?Gl1fY59;M7Nlgl?1ni z=Q3-C4257y$~5^6CW)h3w20uk6YGaM7zc@9?iRT1kB;rj-d-GnBr*PvaEP2G-Z-1N zfU~yFsnJdC==%6Gxuw`nxgTpw-N2jv+#Acy(Oe%{6W(i>>?EieuySWl${W8=8&vnW zk_pIRAR}K*md`v_YRX=gylU~8(d*=1G9zUL@3UzA7}ey>PY7!W>Cvt(SMAtb^w?Uf zwST~K#*+y~i9%jZ{F)vYF5z4No<%>0&1ErRN?HLCQ#_Vo@d-<0`rE6r+ufBW$a7`8 zR-!`~r&^rXy)(QV>v6Tgke$@1p2kZQj#kJ)|52y5(z|$0KNtIWz40L~|Gxg@tcb8+qZZTO68cZpj zX#B;HlEOmbllXRFO;$~Ke)Y zjP~VV1|{2BvoVnsk_2(>+o@OSLM}@337-nJj?0J=S8h6q*&YAXVt8C+ zZ|~`dH4^U6UM*O*+Vm*%L=610D0}v!O?bEShOQ(Fq9H# zU%1Iiab=UiUT|7x=aI=>pBH_sFM}xBcTao?DBmJ=b zBL|i7kGPkJnP=v5A$8k0j<0#c?t{PexYqV4`JG}g)lH>%0{|DVM-G%*0<()0U!brT zE3!jikC$6^7GZgz<=|QxrQ;~rQz$}0X1Kqauk2Ops?GDj7y2OOtnbfn>tit*xHYY8 zj3sZOgiMuRV&oK>I9#%DOo2zZWMyT6q@h@&o`PHH^@q%TnXjkoK6qZTea>HONy`b)!EtE zsI;hPH}Bwa%6y``8wc#FI2A4JljNr&C^|%uh*qCfUSm!$*QSq-a<4SdT{N35nx^uD<1Ekd1T-RWhkNIrXoPAu4AX zmz~$ur8T*2Q07m_w0^h!w2FPkn&#t8AsUjZNaJ%R`Mt9s^m{4k%y5~KUWra(b{1ySKg}e^$3I8HUp>4!fz3QteShGiN=;kOEYcbGa&76O(Lmy>piDVg z7V5|Ef$XwW!oy>JYq~8%fUV^mEzOTCobh71uAR zH~Yu-Is&Ip-egIgOf2<`F0~q$+$ZL>Rs*`i&ABKHTF0kaY7<+O_ z(F`{z9#VKbjzZ&2j))2ol2^i_di*{w&y_p7fTm}1QrP(2`5_%H7Bh7;eR8JTW5j^q zK{Hx9$?dUxN^)JjXlX9y1TIee$+m~RZ`X!#BBUz6VK%#SnQu-KA0NAY^Ars4`WCIp zoKe_iA56~o#;2>dyPF0KaMn`cE%Xlf{8?Nyd~YZnk5Xbk-4>J_h=_6$A>A;fxR-Or zBg17_8YeN0(!(E8soK9dKX*|to4-eSYNG#&;?i!?$FQ|5O+v$Ta0jx+9^Q_3T*O~E ztMLcU3TAiKzhp}$pN%Bs#C{V5Qr_o6aM*36P1h-+=IUABTd1)gaXn`j2tY2>>i_{& z1~9fOeG|LmYI)7T5OdMrm2)*)Kh^7rUdDQr0W!E>usKqYyPuI~n@!MFL@)Q)zZR=h z6}7hMR8~?NZFHFcaL6z$wpO9@hA?%U7;MKfy{NU!QnKw#KrMt4tq1{>0(MH zZ_jI|w~pgo&UJT}aoBHu872{-_fK2;;e$53^!W;gtwkz5SMRczl=k`ewkowjWoGkJ?|tlG9q`ONZ3~K>i{<#RiT%`Fahms>o5|t(}Uii&y8yRkyL1|EZ8fMhg zJo%}*@@u;&uN&Y93mu*Hm6fka-&U?&{k0lmMi;0sof|IOq3_>+GX-__?b`;Zce`@4 z#N|c^dwVA*1IOq$80PCwGy;%2#>O7H2KX&$IJ*swzOOJ8wOyCzku27DWvIK4pS|e# zA82lx@H~ zIocZ=>WjC(`pAZL@7@==v>|{52ln6yNYN6`i}`ZXC5s-;#w#lR3JNy3LYTU+lq6uI zq7f&eGzABMO8J8f)~klqs+h}w79R~T$A;{294VQqw3+%JWo!rB)`lkx4Jp#RrJqN& zxKaWzynGP5LqWUjgBFp6pNoT$cmUQMf}c0HitaEO&+)c@!Mh?8wm?qJA?<=&AWnJw z;DJ_T7Kv+JX$#z}8k)hrkCJmkg7YvACFL>@3^bZ+rSYLN%rQ#uk0HD?q| zGppoPT*u8-^MwFQ8CF}e`?(M(>|$ELql2Hgl&8dpq|)^|GuT5onExy)MZvwuo5XTm z{CRqP;b8>`h$LPyQoeXi@Oxq*S_G;fjP#rB8N%UAky zRU1;>=i4vfY_t2lQVgU!8B{;(0V!S+9@wyI(mUoYZd`Dy>$BwJmI0%$FNE zm z!<}b9Hma}lsr0hQFcrAaGg?-6c6w~iPpU;h{g(T5ZG!u~-y6a8&belf&zED<)e7MR zG%EX5qax$-3H~3WCYbrLkfs#%%`jQ4-!NPhZ0-#!4du$gf-TwiTqGI}FP=Lps&P_t zO3(n$bk~K{e4dcSIP9QMZSCy~dQ0%+@AUt}*jEQcxpm#6q9BS0N=pdRDJd=89ZG|g zv~+{g($d|X(gFe!64FBn2nf>M9ltX(c(3=q@ArMb`47RFd7kH-z1LoA?R}or1nMd) zyT{P?ovmv7aqK_53n_`@qaU+;PB|7LPAANPN*Le&{P*f&-Tt`KghX?Gr?C%f6WrCU zy?$n#rr~x{JoNX(NgU;V7Goe*^PVgELi`*>J4k*vMtG;Am=U!-n?Av_KF^FJI+5%@{Pb43nz|4892hdn=T%C?zLY z1Fu#T+aAGWk|`F7DG84cdE5K49o{=%L1hr`6={nDZXQZFoJva#7a@eI~GS=gw?G-a$^oa>3c zzsOJtR(i7oeh$gM1+Y&(=}gNwqYRbxsJ^rZ9QB@d?;|@Elm}`?g#vG zh1jdAb+Hpinzd&}rzhS*lh!Yp_8HK*fr8K~WG#i|f z%?B`wbwn?2xJ2WFf(~3?SM0E?!=_u-D1s)8yG9eAlfUOBhM#`Mf55hU{MEr}0m?Rc)4h_L#6@amP8S>;oR}2#{(Y&!4P@tl zKmHq>TRpITclhAFXk?`R$x$wr9SuXDYQ6KdF0(DvH#6N^&a3|$x0i>asem<^|^t* zS(*(OtDRzr77rScN)b_>pLa&f#DovsttJ^d$lme=ghXR7QJz9}BlVu#s;$J};=3CI z3i#w>BUyr8)VR<3mrpm*Buv934!$3o`fr#l-*J{_jTfNTWY8V1z(97_-(`^@B`8N$LJ~E$u&}$V zyzwXd@~MNpibRj?hrJ(R3u0M;(iwY81FD>*ySu9|nCm?*Go!5l@3q#SddH`vB%$I~ z-gjZ~DnkNc)(X#eTbcTQLnRR;QtuDQ56ndN01>}nD= z``cuIs>>sG>E@Rl#KbfLU_(wJT%1GSV{fTVJmQQ}x;W6shsso5EzQi&c(*s{fns)$ zy;Z5znumM!sl=XUB_oqn*y3$G?{fuC1Rc z3>K)=_f5P|SpdCK)&uFrfKff!U++(|^SZ^cdp@+I{CbS$99@`TfyKk_0r}_faD~g) zw^WNYjtQsZz;-y6iEpFL2@(2?v+H3o28aS8=i?n!S48Q9#RtLnWUR++tQX5Sj7qZ0O?%>fh6Ig_h6V2r3u^B^i-vI;_w@P`w$Ndqbih9ST!|u1^GMWWmW1gVjgKZ(Y4a+ z(nVb%tn!H=wb=I=_g03L=-eJ?MS8Oavf1UO+1>S~AcJP6=XVT#_0DtME5?MTve)jQ zY;HQ|AWU<4;ij48lrZ_xuy6oS0r^4+Xs!K{}uP6LXs}3V@r(`62VK zd-pZ(7rKwnZQF+}el9yLiKAoXE@SvF!gHMHD6>8#So4Ak|`y-v_M0L2PKbDuaLy%B>vai7IkAh?7Pod zobaG*vEnRXiz)W+$3}RZR;}!Bl1WZ2NE(~O?``R7<;W03N(2HJk7SdEy6Iwl`2rP3eG7<#c*g#1p5 zudO1d>IgoaMVYb(!f+akBp~D7>~H&v2$6`*tw+3Q85uqWT$IFgZB+01ah1zL_coxT z&Jd$%6_?tIZJWl zsn=7zTN7idHMQd+!admI4C)8HO9N9N$J%aA1oI^e8--?oIOld;w(=OgIITqBRBI-b z65QM4f;)gIDxs5@Vz_J;yAuxT!*xBC_Fbm76H zn42u;uFV5Y;=a@r4!o=G2j7x4S&GN%1oQ!ab=kw70zj{%5&Hhvm};fcIsm@Ai{%F+ z27bP|mx;c5F=_$U-U+os{V2DZBf?>&@7Ge3!Nd|~`v55Y%JO0lP2|nWF>O}d{XIl7 zje)Q;k%JAXF6bB2Y%6rHbzygz`pj-^JnXJF{#~I8iOY&ou%%Hca*(#cvA42=y0u>knVMDsrK+pObx+nExpGxw10~A?Ql$DdC zXJu73gkXYF`7by`ep>{<)}4qJW*@)4sCa%k^{^(_oOayu`$GzUpeDc^|71l)Hjx7; z-4^;wh{0cw>LH90R>^MXVmG*}Ew<}}#|*~P|3GmsFD`}#8CBJZtmybB zW?3+5H)VPCn4-YTQz_8kxjFQ0@g9|Pnk@Dr1L0XukJQM>;MJ?bAq3Clbl8;xB>Fre z-H1_u;QhxMji1Mvv*-YMLZqa_dzBc5UuX-vI1TsB^yOi<0ENXUaB-PZQw<1Hi8eQG z?KL{HDx2J>bcSv&UPHT~5P}&{gEBEyMaC>N|c}m%cKi^C5@8|bq?x@cR*P3 zNd;j^nB<$qz2kF-# zk5H>$t`<{g(NO`xngX{#Bq1cc2WG#`4i)@(isVIyOR4@5&UMy1K7Fsu2oB)f8*|`yP;Qj`;uz^Df%rMUw>jzq}E^%^gO12C^wr!UlO@EB4LuMBIL$B`%() z9UL0sF#qlFC7y}m73dCmcsXgcyGJkoYdHd2|iwX})79H|!Z7z&`R^#Tkk8z6Z-&*mLShsZ_@z9u6z-wDZ z0l;lQcnD|K*UQ|`6`~tl*b^*fF;Tu=oSUllc6{(sP-HLNo2r)wZ17ez?T1(#u2-$k zWoC6=Qy(=US>8hG%WP$6oU>gY_mMCzZFJb=BF#8(RWEdLrD@hd+>g@$f@U9}rsLiv zB`GU}ub|EO`#W_r=M~VbOx2qj8)GqdbpKdcU2TKNB|x{Dv|hCBo`R?N-YTFb{S1Wq zDWIYt*h9~A9F&!LQxsLA4b04*RD3|Cl4!As7jQ58%3-(nW@qjLnDs+L$HPzhp&DBP zFXrJrg)uAxFZB46#F*;#krBw`WO6aSt1Ew%nsl2#AKr7=>M)dX?roYMP&73)ZG~3B z75DM5gL3nDBM2=$YQA`d3NdQZJJRt?NuRn#&#gNw=}1l8OA(~McFX~QeWJ6c@4@=z zDN7~5LYI7O98UEyF%O)G=kCVFAL!h4LK2j0N>BI3)?SlWRQzPFz7+e^t8!v=81wj~ z7D%`R56X`KpiEcsZt|B&;{4bROek@&-0gV;Y}P5?-)Ve~ZRLLOZS8yMRJf8x;*Yw+ zJ7?rW_WF#|;`ZH4HLkq7lbKoa6zQ>)(i{rR;Waf>T$gbm!hl$O8&zL00J4>6)*)N< zESOf}F8%^Kex3I`h|Ms6!>yfNS>SH~4XpH36SKj5joD9K4iKZMCX8yEA6?PWybZ+a zMTJjiLw!HMVkL)7!QA+oL5ur^$0#fjRXhT>>Zg*d$QmdOpoo-t@Yf`sE0X|FO}Q{C zM!$d0En|{Z%1@t_0+}TsKnBY zDsQuOycr`xxma+5KG`mtGBZDr4}^t0=(-qUHF13{f=CpU3S+BnFKGUW2TzWjwiRnT zLS7j=$|!cJ8O4+_!VqzUQOv=}g$YrOOz=;wvMs0KZ9KMzJz-sWk05U!b#(fo=DJ|?U7 z97WhPuU=chnt}C6(0kSH9a55o0UogOp$h2KaSDeG;1Dh|xbAMgl14_5^-s|%_bHK~c(!79NcdZf~ zj<*yU$YP5U9>$)@zZ5}qQ{Ys#=tWK=Th(;rvBjh^3C5rVARNvm|Vz9!S4R0PXP#*$bjlAj4I?RoQ8pm2*NF=Nx zX9J8d=7>f1S;)lBp})3!9R&=_W~CW1dKQF=vXEd5)Cv3*bYfv) z|DyO&6qdJIJ(RB{D$k3-;I8^Su^)kOV#bK^SV>$wJ1{UPHkO06P>6Kvw&5dLP)zUkd0Wy#BYqImS;$-jBKWdFa? z2`ugJylg_|#=XXm`t48E8vF`|2|O6n_u90&uYRxSrKcjg4$izaH8nOfn_DZCk_w8# zd)}`Y35_z)*J}m1+I%nO&XgI!a|mY_1Tu5SaHY*|ZndjkbC zO$ca>(H@r&SFuR|fqnWk4u%M`FemU*Uqb@4_FTH_0MQCK{?lLK@f z-6x*nhmNg)=hbV!ryDp|q_)qy8yEANHk*ahVA-0WI%^Bwt#R5_SD^+}8tyYrH5bQc zzzOEBSd!8ny^8-#4$~rx?xkwn;n{AV7D!ywaWKi3SF&q7Vx&;@wceng2E(_|5UnR> zJ`S6zBrGicoPrkWP|ofEIj6o3WP+kAYUvxf#%BRc6^C*oek;kVj+5A5XC96D8~v z9ux}D#ktA`1YrF5vG&>@m1yI5w+}bbIg?h4J6Ks=EnfKia=m&maltfjPlw|!j~fhq zzrLr$oBtArmv>Vm+Yt%aMWSVaC69I3XvosYaSM=~2Mr=#yQ+;5rc9uj9elCX3hiFN97*g)Es zVi{-`YAK8pl*$X$ULiv^JIb+Fu*>)Wz^>2b{JeLM#k#G#W1C!+%UHt>t+#aUk_iZ0 zKgNrubMbSQA;`YLVf6}M+iPo!)r~Kb&n#9HI8>`%9OSO91OR$QV(MX69~`fZ-sORY z=Wt++?7SSGuvzyW^Ydz9B3X)nM3Sq1GCk%l;nieB3ol;iVI}B+4$KEIH#qG zMKR`%XN9Kmy___P!V6$%D-{7Jh8FNdY`)LPV4WVWo>JiHdILz+K!$_dV*1p*wqS5T z7v>jQgVXL#0$ShXDR`hpnms5An#QJwVOi?e8jPNbJh82{*t0j6k1b zwq4TcwwR7v3Yi9&q)KJ~p{5ssM{=N3<1(k<0FPcn>>;nZ)vC$~VDv6zy5@K3LyPwK}gsg048=<8L0w}yoU0`K zH4bQ9n3!a5uJdWfcuLJ-WM-N@;{G1xp`;$jyWIotq~{=M_RiLUS1#ml+Egad%kN{EZ|H%o1g1a$(P zUezkaFF|IKBOOF&h0rD>_~pkBr8K#I3Q4K>x%R2a`^hfp+v&^RF+9}<%yy4P)9tf3 z;+@l}Hi#2C4}}yN!MNGn_YeFocT!j{T)Ys0ce}~EZ z`~5Yz@H_LwzU-j!!g-~QXwxc@v$9;fajIFR0*O@Y{8XKcq9g~ghKF{ypd=kQu*ez) z0MQSu>1rl#fc~tt_Y&yO(Z@geH%j$Vw*AB#unOe9KONijW93Ksq|+1$f}n0Yy~|L= zSdlvRg(?^*TMe;nh4cf$117%%H#>i4lPjYqbdNq*nGuXqlwJ%641_@1*5P5+ql>ku z5Nv4*ZVHD#mrn%#N({rx3?*il83D!Yj})K+{(OyZ{t2pV?MHBEb~2A=(~}7!nTnvnT({dLPp2_ptBx$L^Sb1(>o-ppq+KU+>fruUw; zBY;PsMZAr$8mov-f`pxl#Zo}f!t$qw3Kl|wb3zg8@MTlIk{+-CGq(#=DT7- zne=96BpZozA9O|6Gdou}2!F*L%UBp1)FtFm;|tURfZRIkC7!bayb{mWlK2Qb^*2QY zn|}wo2xZ{^OJbfY^#j62PPFak*PJsPH8$#OS1~Rm8)OlK#r(*gxj;#ZkNWXEE&_G- z>&4o#gHzC3_E)xmVxM>@R|7Le8cqy(A=S{90+y*g)I-&z-;7K{JB+)S=Ece{0{G)x z*JImP@EooBV)O#3KWF0ua(10VIgrRm*&V8FU)%|&Y)vH_WNhvql!cbM&{wLsQ=txG zD-E4_`9FB4)Uo`(6kl89ckfChQQ?~`NOe6tn5)AOPXx#L%}_lHse+*)RW{;~@SS#=!gFXS9^)}o=p_H!B_Yzr+1 zPcCm;j8lC4QN!E}iuLc`JH}MwVsU6#fgsEP@G5Eu5QJ~S!ah#yX=7xs>eKY2ZNRsYNzt>&FNLe1HN%AAUT;OqVCQ*O`h zJ;Fe2sFk7Ld4K|^i3Ht%-S6z8PJ67!IDQsgMa6JzOnWOqG{o!;R1n>Zcr#veg#xXw zP~a|rUZW6ja@m#iUI@)t&A8?HZ zzM#44-(EB!_job=FyKau0&X)Gylg(z$LYuTkKx(#ALSfObMpP6(wEiaq@q6R~RiP;8|JG z0HNZ?k4f-w0HF#>@AI?Ipo+_y!czo~>Vy30xLQ;b^oI8_K&3RT{qE}#fIg~UeT*XV z5R>dPu%6|+PE_>+R=r$G+5o^V(8VGWyb}US?PjugPjoO2L?;gPY%o7{l2N3fD%Wdw zmQ=8^vfi9x*h-MYA62|9G6!xRnAGy*$=dbQeF39qNsG2s+I9BQ+_wNl?d=zZ*3dZx zCjf5&0ua{!p!md-ir&JfrY27yEmbx;mZeknXv0^o%>AO?Wf~VBUm0ou%PQyoR6Cvx zOYr+&-o1{_$OB@v=tC@WxkI3ZC$iE!S7a23?QAE=OnP{elwR{>yt`WnIKU0}l|0b_ z3zVS}9ud*0K7sn&)VtT5vt^k(r~G_`uJ9%@*iQ)k&HZ3Qouh|-(qNR6eBwFU;+Ovh z;dr;IDjLP7d3ri#UTnCrQQ3OOSwcvpcTszA3!Zz)GhO$V)@p3>>7QOU*4DmdsM8hv zSXbxPmps|&+ZRc93bdD_zX=y}K)57oP~=@ed6p96M|=%-9rxWve!W%8N|s>sTr&jVK$rVt@yKxr<|zRHlJ1Ry%gMI4-L z6De^A4b2afCEJ#qVG(>Fy8+i}9xY5sIR-}!RadbQJ?nqZzS`g9IMbZhi~^W|+Nh2B z`MIUn(s3Ib2h*;*H6N>Pd7+mj-Gx&kh+q`UZ%V{~CrYRFAD-=0R)Iyfq#4`f!Lf@j zhDQH(*tbM@J+(v>^mAxeRf4$^3@=!7+MVj?nWUQ(cHSb6Ase}}2BF4#>2pzOj1Tto zYykHh#8Yl!2&|wmOBFRW37PRqFew}1&ktA{Al=4+e?U(H)UR%pm1X`Q#&?^GjDXzeU#;rRz(ZD0EF2KhAe33LBmcX{QEummjg#@(^1IF>fJ5W zy^o_`vr94Pv!3cazbts6n8hZSfC>L{?N;&$iv)m&hoQ@&tI(e5!u<;PHUQZJ3KLLu zr)OZ_M7(Q&#&q}5l8}p@UW}tNC+Ay#^b8E5Ka>g|P*NIQ#q)aLU1_wQ zcWLH*ZmxkW0(}lIEHAiRTh?l8Ibl)HJnBE4%x#(Nb;c=uJAX%8Hmb(~1Y31i7U6UB zd#Pu-E!@DF{jna536YSVY=yWSiUi{?wu};^iU2Z!2+lcwf!2MWQ(cnu^W-Q)9*sR; zK0h4=G?ulsC`f`=F6QWnxSHY7(cn!4#K$=B4T*q2az#a(NrYCP11g#n7{%~inLHEi zcOas$*y#!^<1!drVlrBru${L4v%hbs0*TpiAugmMF6^W47!aE(EVcP)5Ie_I#b-_L zE58IvgZ@xMRaF=SoBqkc^6smQl_y<*sb@^MV(L2yZdO7{_3Cl+e%peP;R_Uc>x6#0 z1@xYHzUMw}ZuSP=V4$b>#$yr(5hy7og1Nqm^77ZS7__8T27al^5ZqfDDUy`yZ_QI| z2cGvgD@YH5f`h>m&WvJq(ey;;9HA-*Q zaN1jiPEr{#+GHUAD=3~KR9gLc3x2D( z=5ozhJd;1xiZwW>E8mS5-VXxbt^d}{r&`VTPa7}nwV_b~K@Ri{A^ZOq$D_F_Yzw^h za!qQ`oA-6#xM%7Ff=^hExFHh-ycSA+NSn)`bw z-Gi`&1aR_OVt@FZ8GjfRN{!_k+Q$|17`o{ZkYA7MwDu;UgY*W>IK92!T3cV{T|=yN zhFwgmbg7eU$M4>tw|s*@CHl)xNX5`6{ufwL++<@PUE{ zoIBsM8yhzd)^#DXi6=eiL`1^@3C;Po=#3%1)zyKZ2JjMWv|k@Db&v&}F*#>IS?#C) z<^W_>r~}be)t%&hYU+DPd>R`GEc8_n?DQJYs_lK7E;)778z^wU1!+`mZE*32LsN z(+{zLCy#c$=Ss-zba?)$wGG}(gQ;?-k^p{p*5$Uhs#7-4M4_@Sf*1e}+rk6Ugr*eT zypJA%r4@Ph;p;TH}l;z!g~j*lmu zpIKyffOB~M%igsc4OnA_mtUagUz3- zZc6lY_ecYg_^V}hmN_sUW8n200ul9VFqF+}0f)V&f&z!O-obL{lNE2`6U3jZtM)&i z@137g5Ii~=9(qU}g%yeWpggvoy(v!*@wa-bi<+LVpFk?#gM`*5NAl!}oFt=X1?U#k ztg}yZ_VhAJepVW6Ffxp3w>ec=!4hb0XlRkedq;|AH={bym5mFkV zn0(Pl&Kek~o~EP*1cg7_ACwgpI}W0w3~+HPONx}uq4e;h3s9OJtgjmB6N5ryEP){X z{`1$b`_GOeK!aCrTtLqPL^R)cGFT-z*b{-%D>;%E4vRbOkwl^gp6gijH@WZ(cJ6DQ~ZT zq#Ki`Vmm3g%a|xP-O5@s#ogB?QO9&z|AxIQ=spM`MAIvCnP;H=>h!=(Afey|!}pJm zWAB2{B9Q=HAr2c#N}0|!-X*GRIB9tt2Rl9+O~_h6@iQn1@b^TIp?3o}k)+aZ+!Gds zzzsw|KnJj);l$mjud<|^gA^;<_hqq%BBznJ92!ynXE*C#=H_&mC_asi3|+uvNzLKJ zLql;Po-1E}{N<8%W+y(J&PkW7iJud;mSUTm^S}Z;H2u84j58L5v{BE#kxPrF}=^K!^PdSmneM*5E(E z@vs`@hg3@t2z+#mIHB; zo}LZGhvbRS{u5z9(_}%KTUvC1FZN9R?%bEY*zJ7K)>f9;2dtj79&qQ9*@!sgAEu;^ zx0aM7uae{9-orIUc}4-HsO*I+YUku&Ky;k^qw5wiJ1_lVmVo#z+*Xu4{U}U zl@xtY2R%*Aw!$wgx*13^kowjzF>+B+;BOG6PBv=DfPXN!UH}V*&joQnTb&ZHhrW2B z4qP&_vhB08`g#0;e;a_77~yVub0K(ciBcL>a;sSA=~fhny~W#m+&wS`03PI&%V>-> z*ACFWLK|k^TCkWizWPrCj#@oDv7J0~*d97f(<4+mBZ1|YC6NcWNbT2%W-u<`xJM_`m&$YtH_+=8~m;CXhQS@x%WQpF^U*2B4D9M&ECl;&wW7z{f zaJJW?YK*Z`a;Shlr7ui#y!_vi%x{15_MWW<5bYaX7m~OrvZZj>0g(9FZ~5a{3b38d z4|VC6EfODP@%)8yMMYOZSZr4M}@>7x}C^a30q_{zXp^pTT7%8`sL z%iXCLxPG(&sj3@zKQr);ZwWRh+nmK(sbTY4OA~a0#u(QD>X@TIP-1>DHm+U)=3Tb&ep{C0j|WxKCc(#e@%VOI;}Re|_jai|!zhwR5?&d$zF)ocG`e=H{YC*lIO)Q~;29{-enUxz-n*oxt}0PakHae^6pyWA@DAA|@7FPI0k6B$P0T$3bTJ8Wy(B zwVUL|j?DuD@%4NBU&jg~x_$H2KI(k)zFi_`9={TUDiS6Q&h|bUWdUKIQ@;b@@2Aj@ z@=Q7GpmT8(R(c}10S3_ONZUm^gQARsRDdbHa76Y47>Sb)T8lsrt&adYMmmbt+}xTR zHQg0I-FS_^_Y$-@jZYksU6I~Ky^p}On&N51=uEgPpe}tj2#h&sLYCpNS{TUKfACU7 zq!;Z@0;w6gr!72_sd18JvEPVkv|cwXg@Mgf2C!nqpyq?>-i<2GFQ)3LA%9ZB>{(!# zfI-~q$hqCwQA}2wtmdESn0OslxI7QcuBtNpT3bC>c0msdBHXvYc1`vNzM{I?@$uiT z0!h^5+7-Y|x!%%fOcv2Zz3ZxJg7Eu!(ZvHd$w(W+eW*T;5ZXR?SLFF`q@zYZjlI}& z?l{EIIQak;b_vlCNr`if;UOkka_xW&{Kb1{VgI&0+t>@8%RvN)z68>UmkFekzfFUKE0{|cW+&j6+ zAAnu0iR&qv=kd|QEPq79=f!nHQrNdO_h8g-zV^=uxB=jb`ZejF8KsxET6qpgyF~69 zL6f{Ze=Otbhs7IzGX*ve{sCEpB(|qriV|4(48D$Uj-0IzoiwD#e1LU^JVX)x(;3I% z<{T3&O$5@=NU97?4KvVT59)54-G%B%-204?JVA_aQWXshroa#t zm+e;=!!9l?#AY3K^9swmN7Fh z1}HB93d=l+&qM5G&PQwcYO4QW7A&6kDE<>e9;DQtU$t43a(L{HV^Oj)v$K=QCPS5D z;5s5>N$tseG8~8x%Ecp{);|o1bA2`#mzVz^yzkBbKdC zgM4ne3XHFVIR+b(bf*{F%0FHA|NdY|$gl*8l;a}T?0kKd7?M;Q7 zk4-B;JB9b;+xQ$fK=6E~xwj7ZYb$zi5nGucbm>;Qmu+?WA5+ojrvR#O8~I<3vXMTh zpA&$`Z{N7(c@!>FG|oY1h!;{F;j{Za)+|x;Lm_Uuy4URt;jO?x759!Sxv^Q)I z*?OU^T%Vnmht^E;H$pBIR?F#E7&4bQ191)8oT%vL{7A^F8}Wkxx^TB!T<_G_kjYhv+cnT4rQcR zBGBpcWwho$iD8SgZNhfoIXT^5r7M(XL-_)nR5da{ng=q@-tsQVa5tO5DY4l$m?8zL z^lD2ZIp@ysYSx>inUmR^V1#mWW46`V(a2*#yy|<%drELB0E-`Vs9&~zj*3o#$;SvR z*FbbOSq&IT4ysh+s{vM&dnxs9N~TW)a{ovb&fz2!Mt%y$Gcz+Ep^d1)H>|6Sx*dl> z>z*pa2#l_Z=DTWrz4nCpH-CHrKoU6|ACF`ey?&h#M5xT;Hfe=(qlmd-tr^p-u~ssf!Inhe|QLyf=U@nxSa&ykmx;Jm-$bhI^{X?XH}1@xA` zW6_Q{y2*4@$(WcJ2|yp9e#$V4X2%}RF1|&E8OkcJ{|Sfgiezd@Y<)kms2;usvV$Tk z?Yc1_Ta(UjHag99+%hr(L+1Ec*`$c?ifr8+9E8$gS#8Ypw+TiZU18S>)^}U3YG%VP$Q4ib(XCErUjO(mK&yl zOaX%Iyr?Jx3TVe5e1r3>UtBWp^JgAFO93&WsfjtO2|8C5IwZ(}3QRZ4$;rsbs01A) zfL;=6i$CxMcJ>fJ_W&=K;UA5V9!rdsww5qvd4;HlxC>O8zqoEx;=z{&uJw$cC)8g8 zoj&zN4tVI68m-3b#3eIigr0(9UPb_X8S4H=#~qD(1or{dOAV~x%fa}3@vJm&=l>7_ zg^Rh!{+^6Mn}U&UgrzU}q2rj(k|cI(=s6^x$;v_p9ZSF6~rO$SIP(DPdakl%!~5Bf{ANcvLgM( zVPRiDRcpo!vz|wQ=i(*E2P{k^dSmraozUgCK`A5wYJ&2ll~Su6E!A_g`dct8faA${ z%;Dis-ZOp3duHuGsHl!`O9(8v>3vI-l%SWfC#7o<=!u+!x)v7sa+FIEWaQF2zosX@ zms6O`w$5ChE%KY1La~j^dM7?iEEF#w@oH{H%zpz<4c@xfrL#ccGeQ_de11CZm!}t* z``4hgQ*vOOdLLA|XOXhbyxcn*gdedROxQ~Zg{HXa7f7pTQ+ecsqIv9bFyJLN<{1lMRW34Ds;J)kX z+PpNIg^z9E1RkiI+-J`aUr-Rt8h`cBWlFa|)4fX+@bZk1wJSv-DXx07WE&@U*h z{z;^e=&ie`#v6oR%}T3sfqQOPgMsHpfj`<;Edn0CTsyd8N{P>gf$R!vF+gZZ2Ueno zDVH@pZF!pMT6V{-+5hB9GB3mf#>y!wOh-3P_F1NU6L)c$wG7JnU@73+XDFji!hfX{ zav1a`a!ienCray3sR!6DbQ6LJ4uGg6a@(7}O*@u|{sav20Z>A_!8HAJ+Ku~QgYU8~7eFajVYz`N{%(pOHE~dk3 z4V^c@qPtY|r`-fU@{O@9J9{1Qr?imBnPR}OYy54#C=H&t6l$nJ4&*{0>hyH z;ppxscOE)Aa~qwXs|q)MKVs;ryZ;XGAFM^NTL=9a0Ua4s4});Z1^V;-fr=*o|LpoV z+5b~{(Pez~m$Mg?yr6~UYSa{Ug0sKLOVIo;891^qqQ~zl9yi}0K~s5)Th(>!DG`VIALr*;_W+iBU82UK>&!kP6IEo zILex?<~Rwn?Co=iT+@?q7ZnDL7cj5eAb-G;w$vs)|)$l7!

_V1P$&3f~i^kqUMoELy`EmJa*a!7cMJav05WF>tp`1CT5Y%yL&{O)?4^wYw9a zt<=DA1RNVMKL@<5b<2=LM6?K)NTl|m;oE;n0%_OG$;tAxe)#*xwj+`LVUs06OB|f( zM79Pe$^@keiHZGGw;bkU`uRs!6K3Y`uJ8sknD07L#5>M48J!sTo6JSUc!{O9sBMmG?#QvEl0Mq^X!^2x(AF;^vTkasoB(3sQ@_T~+&OM8Q7wJ&T<{uA1F^7e zE%e3_!8Zl_2+Bw{1iVVBOeYex_DN|9%oO^)mJYO`$tcLIp(_ok2zZWugUH z^)8DZ7VV!exfbimjBBbJQWg(?EdH?RJ)NpHtUYYd-Xy8XpQz@Us4^GFTVBRq8Iter zYiyGyy)#mxJ^JN&*Q6WkI@QK}EapyV5V0T|+k(A4)?Qv{XhB@uhqN>{)tY=08^f}p z0RWr&2U=U1si~!fA#9(#dkWMKTV?@iB>4qPXFXUoYi=K||^Bkimkcg+|C`f_}3&qH?oS#0OeW3h_$U8w}htk}J zkE^`tt2yBVk=FJU1w}>Og;f2V`#|GS%CAg1O$HrzSjmt)ha&jKuM-~ZMl6D!d9^KovB107wmE2$nes`m1ZH?Bu z83)qaQ;&yFGlfulD(x_Itm~b-#DePFhNK!@SEkpOoOGOH9L5T!*%_~Wch{f)TAv90 zeXW4YY1|p&yP>w=z>@>k$H75CfdK(14B7zef?u?%oxCB&{9d_@P9ksbi1YQVeykCe>EhJi~>D8 zD)G^e(v0Hg#2-u1iNryc8U>}ie^ZdTD` zyw;bUK!yh5UE_fQMzQ+0WN{p}OQRJ8=co^|HV zO6-gzYt}CDxgI^n`t$!O+2cG`y>@Ma(+)B?ILOG#8WgxYBl{flg@CS9iB?iX`1Ov> z{vT)R7l@H-51U~QBm@KzWnXkkC22};m<gZg%MUg5u+yGlj!ga3aYhzn_um^Cr;0xoc=>|+ZydqCedwoN#ox^EJ{&39H)NF!5 zbXo^qV$veyU}t{NMJ#9+81x~jNnBl*1HXi!2i{Irjs zpNrG>wdlkh?2A{1h81=Ntj5?6H7INdxwqySw0`7EDDGg0ya`OPF`0m~f|Q}&dfv>!T}Ec;a2hS1eY3r}dDUQ|DuQCv zVbh}9+~{^=0ES2$kzZp|`mBeYUi-oB{`s5Nx8jT~`64D_<5l7JXKnk9{bafSIsiyv zPVhjOxKP#VO=3oU&R4ohxb z<0aNOuj}{sYx4n){D4x_B`v+|dHe(o(xXM&z+yfVu^De}6LANlSl%Po&@ zfYYpP?KFiZ^i7vtAxjgZtzQkUtzTxEXWYKyM28ubjdZUtlX>}@vDak*rA6fBFMmgT zT57{x@8(!?X}s)A?}3Y-Ka=M8u*^rl!{Qa@6KXcckn@hhH3xX)1&bqX?pZTi$GbbE ziOnjkR)j4n3ky|JqB+t+txcalFMa$tX+EBN@6l@&xi?86+1b8Sltc8i5BchC+56bj#gm|s0ikX(K@o<0AO!slalctZlJeHH39Iu2n>s?;--{$2l zHZ&B`?@L^(F34w#(eRqf4{+h=G_P};h_ILdt4j)Jdp<_`b%s_wX9e@q?Vtb&#m*PH zD#KOgk`OW3M!B4jSMC?Aot48S+A(HDb*CodyW$h%$ATXoT3QX+9jN&Oz7d7TPxINH>yP*X-O}N9W%p09Efn1yrw{-7J z;(yMDIWMlVA=(2GZ|^l0CWz{%tr${Kl@B?+y*BLTWh4&>dG|!6_mL4vMfS3J)+bC)jy{F^W@L~##J7EU zX9$pmfbL!6#RaY4U`$Jd$*=SFzMZoGyblZ*@2-t;?CkB#pV!u!v$CiS$j9S-cBN|I zZ1KFww>x;PQ(4@NLw+Fd{@z0jkV}75#l_=oOdQVq4D`98Gf|D#ai{wlz}L$@7@far?RJeX0Xbh$sXkaB6MnLgP`syrp1HG=4j$Ww+duAb z{FyPq@dwaFTGP=X2<}2>6`j`E49SPgjcGm}o#*U=g62#%kj%&WM#-w>LyQ8z64dFP zCfGPKI=VI_-q+cwV0{rz)_4yWLP|qZwl{GwH*G2s#ss1%_a{*S&m&^=fp&LHvQP7$_*f0mpLuam{y0ziAj7&y*WV`};o=8{eE3?eE=Ry~JV7NAqBk zAe4lsk3d!y`vUP{{x~)?S5sm?t)}lS!`(S> zBZv0&6Z=s!27Rx#^zjubNKGY(i;FosudXoJ&#JCIBD`-vS$4~4v8JNu2Zz88N#NNl za*qmLJKpMtHjl+gNeSHCq&GN26bj5r_Qk&@(LdGmJ!&J$rKW;ngso%Hdv8QbaQ|=% z{y{0=gZhV*?x0P#@bI`fN0gS{^H4JmsQKze>xcehcCqg=4=CAw!{-@`}A6}6MK64I^UmM zobm&3`0}Nr<_h_TfB??SoScD5QzV*#%js7UE;YaNT~1)v^___D7ZeE&t0Uru)>awa zp)J!o@=qI|D*P+?;V2ov0M(I{sH~;Eefh)pLa_M%gBpMXGHaXN;VW8w5jI`?C&3r9WSbMBxdt#NeX8z zzq>)RELCegzO`qI%b1Fv)NP(HB!3Y~I%^IM2@g>8;#rJi!!bloy}TR_HYRSG?brYL=_cV9zHa|#tKN8s`(}Cu)xgBFkDPG6_;aRRw&rF7WTu^jY?=Ov!B%21i53_U z5V$MTQ)zotsEjH{q(IDYm+*H#{|TUch4DL30aN<(iQao&=>=!hV}pB>#gIW z+`9I06ca=wB&9)+Zln>A?i8s*OG`I{0@B?L0#X9f4N4Cw-QC?iz;6$D&U2pkeShEi zi}`TRzIUy)*Sgla_R2DT^5O$1i$j9h8ftH`Jv91m@4;_PQwz$;!NHHfm@lpSILCm6 zHLw2mpX0>HJM_p#)qZoVgyotQWq;jfMFx+%oM;R|o+*KxnoHWV;P!Iv1oI1{vAe%rEHCuuJM_wE?~ z%e(8*E?yiV5pvcyc#Bmb9v0?fYc~??2nJKnj+H;P>16~$#{mEHBJD5MCUYCI%!A9#<)`M-aEc#c_0 z#&Qtea2>6ZUw?RvHS?$>lEMkuFPw&xvr@G%d|TaVZ@!+8mkST)11|1bs3>YkSw@6e zRLOzHm3{#qS6bzK!5||zh?3K@@w9GS305Rz~CF!qtY8p2+t^NyKI3J34(;HW#8HurnJuw%i-H*7(JtwOWl{vKYB8 z+=t9f2SVlD7|Vt|Vp{E9xcIvNuZ>>!ev7TR|LwwQXkdY*z{4|1h{c(#whOlxc}oDi z@zwD%&!{0xJdxjWKYMyUOAYrcpdyVI*{-qn4}-Jw@fcKk77rNj?MP6nxL4HGaoL{* zx3WONdhPf@022)6D(5Lu)`5+jVG+1^5BirNGlg2+xr63Zd28!DBK>dyg*LH8Ai+fM zhyx1&2uhaMT}mz6$pc&&AU;1umzI}a*QnL^I^USwN{YaQ8`iKju6N$FwWO&bez-qs za_I;$b`stg&IOly%qBm$XErc05}6npjU|JhoJRxU)fGE)MbXQT!gcP&Ih`NA?B}yL3(CnM(Odz>7rR+D&j&dNn!HzOX*C}x zZDtW6da($fi9|B8wB_WoyXnO606r1%5=Bv=@q_Hg-Ja>XnvV>ha^wDE5=Ddi`i?G) zwE_|alRl`O)3Zz%^!z{kq=eap1rtL<{SVpZf2C&Tj%z5{9^MXd3nOV>att` zV&afeCU=;C^R|eJN=CRsT`bNX$#aKo$G#~SXNmj#fwK?qgquTwEh`1Bc0T%;z@FQs zpMy`vIX6~fgMv>zaC~`@RmFzv%`{S26G2o0fehp*in8bkyTV?94sXB8HT(~Fqt@vA zR2>oxfX2&A6ort$S!!->38hlY!hbM5XJ%%4YHI3QS6tyQShS~c6LlPnzxRQ$5vBv& zb|R!ml0e66zWJ`W{Ij!>4-E+u#e8n{=$9^-h+8q$OyL-Cvps5Krf!3dx*Gjn((dt= z!9KNZSq#I@NWTI$k{;gQP6VhwE?#jaFy!@bO*n_|P&#zJSK<~^@Kk%tdaP`!Ra~JE z_gCTK;%qR1-Tk|tf`VSxe*72<{4O{!quXMs(fkb8NldjO-_P&Ye9Lu}2L%D0Iu4Wb zAqN+iIY4v{kJvt_k(m!`#-J*`Mv~?bY1g?>tx(wg(y{)sRXL=M#0oKdSlOJy5mcI-38E@&GmG z;b{lGrUR|EKimg+%^l2THf`B`4E`R(c|<0c?VrE+d!b-U>RZ=Vk=}?3+z1!Ys9fim zu`-jfz=9k5a(cvp0%_FctHyXT0a>yYc$E$_7VziTCL^#P55yc&guu-*0cnLI9Z;$H zsk1X4z?)iIxqxKD9#bimF>J@91-y8vPLIDaH}?s2Bek^y+8w|1nw_U3=0>^d{QtWX z$w`0QiE!Sw;Cv=FHsE>{3i;Rz`MA5S1Y1lIa~VX+P?~5ZPpLn;u;|It(NY;B$x2&spHb$D7Q}xm0Fl z$y$H0*e!P#C=(4Xb*)1?U`+a-&%PBas2#wLn>kTo3x5v>!Gr; zd2)h_vULu+KZHg8{o)YVKN_`_Aq|fj$SXe4T(v?>#HU-*ZB~v$2+s~yQbCQFoo_{8 z?gJ=g>08xKcKYwCihAYQ22g-b2|&$9ou=nBcw| z()gQ;^si5W-2kq!`_*CMKL}z8({(fe@ivMirAs~5O%cMhzI z22e!D36MWPU$ovRUWw*1%s5{?Ppit>!v*iz4{2>}MeDmx>q``TRv`Tt3tQv~-r&>> z1lgR3Z0e%cbno*(7Dpc_ zeI_(+`B$plpVNwgKF~Mdz<59;3OD=-S$jN`%NPP2A#;FbgV)^81c~(mE zLq4%7u{6eS;t^k7z0$GG0r*{=i$j{ZQWQ3Z$n4$do8cgU<1_Mw=;#B^k2+p9r|U0! z^iBsRC!^O^OZ|Lb$Hrh2V3j9q=Apj$(3+GH8jtraRj%fT9PF@%fT4OIInF7^-hA)Q z-BO^eR^tek2t~T$Sge*h#xlZ^2!_6^={dvh$0-(0`>;{odN}7h_S5xSYJxa@z{fEZ zV-A#4Qc9&ES^DooF0ldAoQ0t~Uwd6d;!38yH9N0jHu-CAIotq%e;7N^MM`awsGRhh zcdj}!32{mOPnQK8%Ea7ToSgDq&ap`llpqxjix)H&PaA%fLeHU{VN-U+gbFBlRGeJz z_g4m_B_xpt&S~*Rg9Yg~ z`ktODf-?4#ib_NObxcX4B_tFQN*3b2Aso_tx%(&n^zqXs=f;{bSXVSM=YizoEjBk- z4e_SFzHn}7y;%Vk06C^Hekld@s#;t9IXt$_R#vprZR~f-H>Rgf&kha_jg72RzfVt#uF8~t7WGBk$7__Hl#{tsN z(Q&jheT4N~v*r^&KiR_9uU{MCevAO{V@mYn1t0=YD8SbbGod?PS}6+aBH`Mq|3s-= zj%hnD!7Wkp6h3J8z0aJ^s;(~=5D`4q7c2z3&NU&o+Dc2U@sYwrp~cYDp=a?xd+-Eh zOro%uinaAeAn$iS{cII+CI25z&igxK>A=a+_j$V2F1252G37eWZ_q(yzBPP!H##Hu zh1y#zIP~>Xz!bpt`YS0ZZ!m!@5uBGLOfXyIiGj-MKHgi=)hV*nw_&S&>)Wsu2( zU}bu7(7UwQwl+QG*y2BP3XkRC;erJNxbft@ux3;$&Z=+ z;bhuNuX#wscev2|Mp-=Sg$O1Ra?%v-)YFN}lO0q9gvDezDvhEsSaTfz4PKNDV-zgD zd$-(f9Y8f%IwmGK*egvb9@K9C!Py#=Z4NBYFyxe#!FmW=X!TgfXa^^blkc4X1K+xL z${}x{d`6h`#l-^voxQyciDid;L2Iu0-gRGQ0VeoV-2N_t2h6|9&MLY)6hPRcaMecj znenc7?kKf1&YKKF^4@X+XQuI#HPEC}seM~5+zo;sO1lg<9+k?grbqK?`{`a86L1#{ zd<4o4!Wc<=hP*c=(&Vz4vCqh;4gOGk<%C?x!I>_%r0_TH`Wi&y&f<2oeA<2^*-p9X zwtQ)lOhQ#FB)w3g8p{zdGH|Dqz%soifuD)+k5ZA2SB9_eBW-PM2Zs|xV!gXbQDgL> zI*TE`uvcOH+0D(u$GuW`lh2+a2xwtqE|+M6AIa4!c%u~+6_JpT@bU5KtF9Bbhl8fe zk@cUS9gskT7iIlmZvfpS@sec$&Cjb-!@cS`BnoaJj4c$q=)7ArE(d@(g1>w&<2)#{ z-PhNrPuVdta&qtgXeKiw;|IjBe^T0)sbbsVz~Ual8+ei8Q7K9~c5coDZX5JxO3TlzmgJ)MBN!7A9LMNriym`mL+N z7#^TNaOLts+egt6mR6ynowWWdE`OtNr(~vB4=nhdf@^}Snx+r?$DMHT{7ET@Lo)MB zWbh+t*eZyw-_NU;>~w4i29jLmyhjb4tiHZ%ZnzP=~LTXu+Iu-o6q1REc%R z#s#?a3UaZ%@XiRRkpzZX-UtBoxYhL*Scsc3pFX*55Ryx9z=n|a}P(uco26-Ip1=Tz2yW-WLm zc-wOWZhXU3?RzfHg7t*RTyIr}>YvwTHa6ZZ2ixLGk{rEYZ0}+kBkyKt_?E1+cMjQ_lmzPNbCeBAPK{|LigAl~yKDjp6_t=mO3 zK{h7%VsB-YwpCgR+WKZ}YC2M=-C)oe9UL4ySt=g!atJuSXW9uImdjrN7<~aQ-Db0x zjNP>S{=UqAvoBH)DIv$?H1c&7` zxc_{j} zOYxl(qDzV~zY`Al>UiF)j)%mzf&!U(jFCK5Sv56Ia&oW37u@#W6|-a(jlpeL!9@Hr zSz$W^-3c5swN54F<>m45@xZno*&yU~{wSLzlXTuj1c51*J~|_n;qFc0pD8xz1O3M_7mL8+>NCu@hh1;_APAtmIo{&fR9m!fPF`!fzz1r<;8tS@v^ed< z?${u(pyA?<{m>EGS57Vk>7G$hQ4HGkT|wpM6T?kS3n^a}<9$$xdX6N|*YgUGwL8a20mAaI^K8 z|EQdKm>oku(4T9mh=+NcWp*3Gd~WBzk8>2WVud0T*v;{zN3pV)t`)EUZWH4QN<@HCaE0QY^n%w_3@j{))_b$Fe{E}++Swib{3$U0QmfXn zFI_YQ*auk|86T6LxVT(^;?Lo&buK6E6*k+U%h}mf#T5Fov-~A@QmbpMR{GPkPDZCm z9Up(3i zc_n>qu%GhPa>B&KM87xf$1cCaGTG%}fV;i@G3YQJn~88ms1(`EQ4E8&4BjG5O;OPv zr6vmzLN4!rOIL7$0~u{JN-ZXVSUvqrolDHdOqC7g*#oJ18;9-5vqfk`=|D@10g!^p z7vhV^Cy}od+egm9{4l5$d(pn_Eqod9gpen;M+Yl~QRj1hKAky(W_77f)0acRldXx0 zl>#2wKAT(u0s?5v>G{zHP-U*CyK{>*+!eX2tE=$2O=CA74>dmAH3nD5(9j_7SOWDO z_2-m~ddbT|!GX#V1c&SqJgomYUf^G=Zq*t1i|S3|0{81&a8e08__L!;D6)7AYCw`z zYe`H9$myW`lhYxfEOcW;2t0RAI&Pe-PU)?xBSkBSe1O2bqN%bx`JAjN-Sy^>3%&Da zHQ(o~F%Yo#{;)|p=Q`r#et;ln2ci`;>-*2Sg51}PXW*vZVDmb?wy`pzU{#%Cn`4pr!w_aRRAHfYEW;F(~V)_(RJIH z$0ik3S3}Av2mD}KORjVEvS|aY=)br<*ubCQv-tG?`lhd8-7%0jNqb}OA|RNs-^xz= z>)w(Y+O01${tX@QZiCrE`NAm3hq+kK*-+q=T4HVN-$i~fri`Ez27>z_wlZed^;ot1 zp$8H=;nKzC64_0I`Z$e`s?au$no1g;meld+KaGPP-&M-lOg!P9QtbhL2HaeJfUxVN zyQ5M5j(yi|9Qnq=x%pj~YwyZ`rC&n0*tyHb30PiyRt=K?Nsy z8*eT2c4on9ad_S5Bq>;T+R-jTL~o~p{}2(On1qsphJil@m~2!Lz~@;W4XMQ0`ZI&z zN3vJPC62CJvgN9GaVcy@fjR17l9kFhW3j;M0BUB#N8gSJ=7oGoM{e+!yIJ8qW{Kq+ z&vz(Tb=D$g3i&PRjm?O#4-6L`w8zMT92K2CV)_sLL*3zzf-ZD7&1|*gk%L)D6$V~( zmD6iFH~^{zwjhf`@8#ZZ2UmH;qczHOGX@Vcur=P~86Vok3b#C83PzeUN{&0cWgnx#>Vpow>|CpNH%2StOSR=XA zk6e2gN;Y!!G{JzSdF#hi&37sLCpXXLqJgnd@^u9(8FSrPl##I*)*%`h4AlQ)Yu@}@ zbo|Y;e$*K7d^VvlY2WhYaK({=p`s0;2~HQ zz0j=vs;opFSB!!mqo=eMX#%8IBan}!&AoZzHqwsJP6wWP#ZAU!Yr`G(!=n^RW*k9i zk1k**FBfYGOyB1T-6{31?ZI~h?66OEzg5{mU}r$il~}-xD1$Y5h3YBh$rH}b{Y0+r zk$2-yz(Jmi38^Qio^$z;e`=Ao+xky#;FQ6mUm_D%8GudXuqM)o!r8Q;uX>P z*JpbN7dN8?JLNGL$tKvh9BwZoME}eog1{H>YrWnpt{1D{r3i0y27K;uRmOCL-CHMA zb(pfPbFhD5dk&Wqhrmdb#;ExZ2re3E+e1c-8Aj>h&mx41M-hmGUe+yqw#eS6-s#yo zOUh;*+1SN7hNy)Sbq-(GS_ia5te^tBJd_C6QbCv$4eqCb@a2#fniamLmN$WDnts;2 zh9($%ji8Rs?0r<=X#zYDWEoq&h@WEPa)7))s)G=!e0EmVsp-yX^?)M}?7wWZXCkR`^Ivs@Q#ZE3 z@ijU+dU3MD54nN?J8|>+7cphHVshoC*2k?KMleD8;bP?DrIt{zscz;_NfCq#sI2-J z=bQae>g(%)6Av8llbsn^adDk%)CUM2NV9W0h9x@I?(XzA{=yJuqpxfM$m2Y@`!pq? z=;y%c1V%1mi^~tXht3W!u+JyHw*A^B)p-Izi`>LUA$!VTXAiK1y}ieeANvIbxn03H zFCaj~A}b_E?gFLP;1tsX*C+x<-i-4D>(RY@y-)Rc#zXjYjF+4aWqS`qYp?bxLNcVC zc@9M{aDv=ij~O9vA_L(~s}*v6ob{-wsVOY96c!fN)g=W@w^w|<gy0vuEoMCEK1+mM%=VsCW#xNnugb5tGSob}1Wvw3pT zW7Y(2Ox2<++2gBMCOx`WxpKuI`_&|#k^y}f#yQe&;kX!d@b^m@z0imXFWeu7R1nPD zWn#7oiw#FbB;yHbC-Zk`>%1MDs+k6t63(B*d}}WTHsjn0#8COS2@Sk2QVtlpq`Eyf zAk(cA=lb1?N$ZQ=>4@KMATMvHd$7vGt#PEX=NnWe_^UW^c=)z#k%>alTm!}$(36o_ zL9bqM4B?cD*D-jZUj&HdR0?E4_2*Fjs>7S$YleTN)zwzblba*S1RZoV2kZyJEzu(J z=I#ME(Id)>Eq^;qZdZfsnJOW3@A1VP1w;zNZy~>8Rp$s{L)H|gI>K?PjR5}w$b!S= zuy_!cp^L}SyQX6vg6-ZZN1szD4vY-WOlg=uY1Y3V|~+1 zEipa`{8*oT5A9hS#u9q@M9(nX0I?=`r7$`#yvY|Nb4Vq=KE1r~1?k!t7>FQWvlIei zTp1wz3NqUQd|y*lRRV+-1oS~DX&??%ADq9~d06LUv$i$SNhW#>Y-Xg2Wg^In=&0vs z>&opT+78r0IB(n$J7Z)SKmrw^%i-#~Mw6wl0Pm;d=O1BM{2iEy$i7wKzDMmx@W7*3 zqE{-;9PG*w64$-$1ZGE*A6~wc=rCcvYQkH{$ zY;D)DNKAp0^K*;gK4YN^)1lm`SjR67gdlqm#19#??)CLJ>=aN@4Z4H46dy?2_W1S< zuVT3^q_^Llzo9!EO=zJN<%9WHv6ni_33WKjK!2k+_siBg9ib(36&h@?&2Xxm#sC-- zt9~-!K6{2l7T=rEvl^^Rg19t*i&wFyX(;&pDWmt%-0ags%p0d|i@qAbxJ|_s^dFcf9 z`NB`%tDcC8>~aUF=W75aL?|`)%B3F*Bwqcbt>qYjFJeNc#@xpYZqOiP=YYA&;K?Mw z?VF^5a)%yGR$56Zm!0J( z;#aYS%Is5dMyRtmJn{s2>+a1zl?6W&o#}v>MfkBdvdbAu730^+p^mpCfgb3KD=WpC z2)lkj&BGDdI{45P;X^;Oy9$PMKMGhXX}_w{YCEp+M0I^cV3B;)-BX-YKl}+) z&#q+epq&(f!Dco8*Oe4~AeBX#wfx^mH8o13Z-~+%kLlGEt4wS1I#YI*0C9G{oO+?& zMUOUQC^sL^XTC6 zu#vZxE6@-GW|E7tR=y`@0o69;Y}bNq`XQ5f@j}N%=qd96ET}D?^rv_oLx0A*3MbG`C6M*nB&vj40SRb!rx+S?vv4sXq_?{z;Qk;uxg&M*aep zBr2q0P4e7=-|S-kNY5T8)$r$%Ca{@OpMXtQtCh^Zp2^v@(IM_WDJOU);&g5jLfpBp z>U%?fGKh}4>|yyU3$BxZeW&EGQ_P%2w~gVnz%!uz?%j{eALh=>rr(G_Z#)EXGh4ow)kz0$NzN5wFilm=FleC>@$)tA1I z(wdgA0%Ve8`1R(Q!q%K`n?09P?T$YN4#)*+G<~V0989yx>)9EVpQVbSHt$jD$VXf@dQR`;PZW?wQ4YQqyBgSLMP;OrS6?Zf(h($AdX zLhwsJjEzOq$of>fTyMF&+;q%7so$kwzmwFOw82a`;uqQmR`>aw+i(JKCB-!B-BqZX z_tvfb+|63dZAnrz*s6d{c&gJp?Ah7tMG&_6xOSGwX>R0AjEn?`7J@bxYD7KdZZl$Z7klsQVj2?kC0hT&`wO zqJ13VP{w)SG8d}ULDQQpB{%I|4}o64%izd(30{B@eq%7g8=<@E(>8VJBI7pZu+Y|R z6ZkTx7l7p!@x*qD0K`r3@g=7Tr)13?rb=Qj-JUx|otw?&?r~2NfE>C}CeV-v>5c6O zlu*as;@ifJ!4)%xc1BmTzOR>}W3}|EtZ3?$tZ{ZyUmvYxuqnfdr_#;2oayb;M8z=Z^CH zR!v~T!q-u)P!tf!W9TK~9WbuVn!6XmufbFMIaoV*PfQGx-}!zRVZW?MUYl}IL_njj z&~RRRLPkx^MYytJ`Hq8xl$1V1`#LHnWuww=`H;eGfJM7R4@`nwiLx}#CqXF4`t_jR z1CbpN{ZL=znF9!Vq8@{(KQfuueWnrjieod54!sMj5U*xk(+ewRpRUN03*G_7&-LQl zV-*K&PKI|rxl=TVYxzA+G+@ymsHXrn;~0FFv-ffVjbx@Y88X3$nTtf@zTgZ%_cCDF z+K(S6v=o2J>e+EgIr>8Ig_@Kt@EKOK*Hey@P18B61NsEM-Hl~U=7_GC4IV+}z;{I! z(_f?bV|HJjt*-HMkK_c5NL9yt^dx{EmsARDI`W_2M$>gOCdg>>SH*%jwLW z*XxXWYaXGGEW^aw1L6DnNO-arzwImKaDk@`QCwtH-? zEyEACUgp2!2yu$21(;!NlwRT#t#+-%`3^j2j35AFU{sNn&qO>n5BMtJmj6vyh#LK% z=!klgi$Z(R66N}A-DVngybAhi5Nec&}nO2K8^7u*}^Zmy&A&(maCb7fn%+D7c@mtb-u=qM&_`%k^(E8`Z#4t&;_i zv9-w<$?-Dq^})~yq1GE%e!#E-; zGUuvx@< zzn~zC25(N))mRBPzu7-Lw{rl=5)D^e=OO&=;nh8$d`*NsSeJIL1UA#e6o`3eG==BG zlUQztaDRybkgd$)(6iNajOmRw0NGinHXi~ZpkWI&b_1QAG7IGCT1g{_0ernO<$%!L zo~4W4V&v8C8=qIkG&d38!`wCD93`87fX{>(^@gM58{PXCbq;YKj19Y^~O9qU3FWq3!302m`?4 zM91h|T-HkBbK3-rD&eRI{f~+ikjC|DOZF*my>z$N7qsPohaj`Aqv_(=G&$T1>H4FtT#JO@00>8c zC`eCmmBN{mugGevduY}i8d~{^N{RT{prV4pKtE~byR07UGLtIJWzE)bTJ;LbiWS*) zkhf~HEM+zzas)WlILsMsAc+R?MQm|d(oO#JYis?X)HhQteFD}$K>l6jYa*_>jwr;# zcaQb-k^tGpa>@iG9E4=am~Zx_>j9G$Alz3+BYyM4oO-R5%6ZElFQ;noYXG0c9OR6L z>ohlh(!OM^m{{a@&Y!M)Vi^wBW;YHDWVU`NO^#XN@R2^yxhT!Nf!)wq5jPeI4k@E|(eOZ772v`(fw?tQtuUYF#>V_CxPPTp}kb|zf^8Ha;0%b)D z*-c7$d@ejHyzar*pE}b%HYxne@(k z63+<0{b1(9L*_0EtwjLr0bVn>pCFWdjfkhRElo%!15f}-p*A!hKsGF#kO9;L@8xF! z;@H>niOw(hHV4a0eddS7$3g7G?RfKrrjX!gZO;c1jSx#dE)%5`UYAW{?&HDoOBAWS zmvAd<={{T#Krl%zDZ}Vn;*(J(n=@kd5p4!-WB|7t842XL9a`W`FlaGtk40?4I26q} zSKCs8XCRKJ$92%@C*XQ8F6)Gm>az7RQ&D65o4q3ksO|ui zYdkT_b_XE|Rm(50%`eQmQ*6eVsMwbEHk2!UVtzS785{R9Vsxjf4{HOL>C_2TuOysGng6gXkKiEz(>iY_P|9*Z#2l%Lig(+*m1vI`cFcN32WH%l{twBf^d@7?)9QTgR=^Pe6T>gBYr z0FB=L!rT=&PV4J*VhM*4S*0meOO&@#?5f4=yVV7IfvLh@r)LY&L-m(W~%y743mM!EH071Lf{iqa$fnRtDgz}J{H>MjEr=fPwE zY(Aj;ZEdCYmx;*-klL@S`w{T&#&Mt9iOI^Qn~s2LJ&Ki7Z%neXsjw?uovwH1>Hsa= zItd1qO-=+? z2V&3>^TZo1+2JX>Hj90AMU-YJq7%7!e^ZJGH60zSiS!St0&o>ED2Kzo1O;)%aEomP z`dN((nM>kh{S{G`pX6CS6}r{;gXOvd2NAr8htrOk{ff@7J$(`_22n2kZ#|B@GG zoZ;%K(cKmJ1f>k+NvV=@LPYZ5Ame@SaUi4O7suwZcobq=CVQC#5>nNgD#ixn*Z~6t43tZUxTb!D{$486g356%T^LllTm!}{r z1>|HAY(L$^!MrY_p!EeQ7=0Flq6I`nm#;y%s>2SQr13^$MsnaHk>M5K8Q?Ge^hN_< z^XUMvxd6Gi?;>srkP8((OG`hxM-rE@fV)*#fhPR$p_Fte^;39yx`93Rj)lw zS+a~7)1`3Gh#(Tu(%vrq;W=;(FbDjlaK(=wy)Y?U&HVfeh^)R1ILbCXCWKTvI^HK} zc(D)`O67itM9K?-OdUIRq~yqd?`5h$#xc&V3Pnl4Gbt5Eg}fJOeG7=Z&WeZkk=>(t z$eO?%2YlXjmtE*wAw=2}S-q;070i`5^)m~+SBA&I+(_V{h1>M zFh{V3sR@hI>GMQS#Z~HkvGEKaerY9JGFw0+VPQ#s4!o1QpKp2B(o#>b7_P3%sLzr> zR{s{bp}^W4n1VVw^8p6?l#)R>8iTCO>Ed(xp9mNznZ)W*V05N4Hh;re!7!K{i$)dz*w(Nk~33_8)BzRl%7f z+L<Innfk|3ts#~$3EhOuhtSN zKmUn@)a*L{3e1ot!+8>=bTK49UePfEL@7P?DTH*qAhj;0F^^ef)h6z9f_PqZyl5yd z41n*n?^(ydAs;u9CG4xGkvt#s5&ip-Hy9OibJ0IvadE zlan3G^ZB>W*3_!3k6~y0{e6*6+H5(*h# zHLva6ksoDAI=Z?7B2cO7o+7=AvvZ4Y=EX_J$1GJbLQ#@)F6;tl9i6=fHH(UmiPYJ0 zcW><#$uEt*1>E0cPRgy3?7qH*3qsIl0rI`idTqnMvpgTzot(@FPWYg5qYzC8BrI&z zeJYhr)+o$S3fYFbIDX$6?)H@d6aqdgT>@iZfL|X*oThqaWOzi=C4hu@xiUR`eWGTatiMi9 z1*QX8$5Z~#st7kJr<-}c_@iC$#xzxxl&EMiQ&Pj=jDxNBfG66=%sx!=b_GtK-fW7n z*PX{TSUR^=>sOICmcRp-&;UnoO~PX4*lePlB8l-YfeOVe_V89!?KK~tomX=dV%`6P zsL*_`#1LS=PA=q4kC-EHDKOKiGF*{eBj$fG<1~L1@}a_0(bS5qDY?*p@gH~9|i))3h;0M zU+u%hPl14fv1xb1DlfFf%ztj&7%N#3wW#}aJ_uJca#i5av6!qcJ(}I;*y$f*QWNAa zmn;3Vci(;iNVS&3({;-;@iAj^U}9X|Lt_Xeu33$s4B7mhrU{q?i&lWM*!3cZ`i%%tgV6sao+Un&9NzRu zAzc&#K%}|5ApJ5L_$#GB)P(?dL{M;h&8$1%ybo25fWuk0%9JxapYg7;hWPY&i6r)= z59;Nqja&+dP9x}x3ifZYal1Es9FoQAnf=*@MfZ>TB_aCXnmfCf7HIBJ0zg~FPQM)4 zO5`w*?*+d{4cVt_QzBiEMw(D21t{g;r`nCLw9AVx@Zd5*qAR61d!=QSWpg)+j3yC8 zdjXDTpXzuz`t@(a<_7ZwTET<16WZ+@69qkXuQrAFsO4X|Uv(6L0RJ-fVo_6nGqOmAJz&FaGx0AHv@wZv*5xd zUat}!L*EB8+Ks;SH3~eg-16f^|K}yKptb@&&S-IrZGTHS2%dI!LWhQWdV9C7FB|G~ ziJYLU)SC&x^W17)J|XCki@T4l*bx|Bgb=csiTNeJI9s02*u%YswFM=Nu<{B^h2WlF z2GMj~?dO5Q6VrSb4QCDe&q(;qb6C(UVtUW}E)9LAhrSbvderINE~QS3 zVYT7hkOF!7EnSKa)NuWpI=cfSLrDggk?L}oo3P{dA^oSvh&Mg9SLb!^_|zVo_>L<) zpN>dgK8)A)13z{QVRCYCXSB4DBuLl$sI9GvbZTwQ&Qy_+;pFaaVPSEs zA3Zo+BM1(jf;s^=lBc}J>ELvu@AcKvUc8=meYL8%xUGf=^pZ zcjz8vz6NIkbyj6W2L}4G*O&Sh3-i^fi6n+AyPa4@Z8$}?@mmwHGmOin z61#IJ*>t$e$X;6d4qd{l9&XzYbZ(P%F3($RU^IpqnG`55M%8n)d?cN@xF^14fSu6R)G_mAhWh zM+Dq2dEAC_IfZjmi z47UHi)V+vvCluK|_h=QBeU7$mK{gD=IA}W8_iRk?; zzz-q=8H0$>k}x_W(DW7kMuVb%Z;j)QjHE14l$ve-P9rEO)Z*1OJbq|sr2l>I#KFO) zB#fu_;`f*MD8})U;DcsXDbGyqcZESoMXOx>8Dfw zDkOMbENFg(Nv0t8+VP`+?z{$;pNXUhs5oUBauWFC2V=SogEk-SKy^9ZyY%kk?$J@- zBuOMxqB5N(%EJVh~9P(2@Q|H=6?MS8*AJ3^anXVga#$!*RQKa%GqX& z=#K~uA4!5xX2+4#by!=8;rJ86rLF+5V*E{TR<$?WEI-Pd3O?#QSd z!oz2UP2S1jH1;Om(erk8Ew#_nKKx3FJ5!sf*K#>|`2!sn^8O$u`kMkd*Iynpi_o<3 za5OIaK$m`oXJ||&u+ur_{LYco!F)@p>+=ylQ2q4sLKT(p#ZMaSFAa@GB3i;EJr8D= zmN&1L8Pu`U)Xq&UMy3PRSe)MOKbbQXHuy$2brL9-djN_jFC%$>4(`I?<%;F4A>q^k zSEKqKJOu*4@^1kUR&iQ4eVl%pjHYio!SYqRK?^U$*jIJmVLLJP=nROces97F_8wQF zOStoKX?OcOArXzqCt5f!HifsmRF?d3e2+r8q*! z-)6NwXwS_piN#i|@9)Yi_-cqLjZzsfI5IO9kQ|O?f!> z!8=MyP$GuO)$v)Bn9MtgBMjV4&Ke5IZylKBJs$$!z(Es)^A?YAw2Y>u976n;FnafU z1gNG^VX7e=4KXooBO`SNhOE<5+;NrtqM`v>+Ag5)W9To%YQwRelXMoa5U4Y6SS72WvqFOUy3Gl?J}a47JEH?5Kc5rwnE;A#Bl=wDVr^Yg z!-Y)Qrxs-D<}rlYW?${~FY6~$Y`>g%C|?WUOq7&@0a_pmv|6I-AcKcrf}c& ziyEiAaNDKv5$t+SNouMda<{XgX*W^!@bYc7dJ+of%Yy7o)2vWn$8hr+QWu9X++DVm⋙Fhp0WjD<~+me}n+_GE4Am`}_2*spK^zs0;KO zf*2`_d686e{>G*I6=!TP^VuVH^?=Wx8xBHPgpLzE?Xj_rY;5)=9T&WCQ!hAtay!A2Lq)MhK-~|{L0G8 z^0J}q(&p8D^JH))eze_`=?TD+UJkfU;0OsJ;P#6DXjg{MPP==4#E`QKv^yYwC@U|8 zOGmxngN?2B{nC$#bk#98r=KZMxTJQpHx=5M-X4z!cedfu5S)K1G1(1P^BVNa`-{+K|cPCPUq!kadp10^;h2o(;QEKc*RUs zM_HPgkskuIf?ZmOkTBO}5*>Z{k*G^@l%aQtQAoO)ry(xiX+_U}RtBgxEhq-RR0raVTvt?C=xeT*1no;qw+BZ{)!401n+moDcNc4n+ay&iRp1*wAW6&%8 z!8FD@3UBP5xwKsO#W6)V+VkfxBLa!(G+sjo2ffz)0uvo!r&ubZqwj{RN{sF7_%31- zYU0jmd63bOfk7{T4mHk8t6v=z>FqRfIgq-C5hYjU$S+Alb1;zQup2TqwqZOyM`Ss3 z)zO|!m%=?-`!X&t^_AK6)sV!|=I+&nP*ncw*?-$|#xUR2#COSo#0e737MP`FrbZgt zkmwjW*WolFZbR)l=jN_W)UKZPcMCf^+hF-kU2G2M$9XKLIkerB)q|B@m zDdQn~geZG&*^ja^vsbq4J&*Zb=Nz8&Jip)XegAmR-;(e5-1l{T)^*=|Md#Qh@_{e` z>7jaj`1Yk4>As3|7ukwa@mpSERTdokOZk{jxKA~{ad}5aTuMq%Zkc~zZs(6514CYw zj`QVD*Yoa|CuKjPi|?8(=I=ojlo3CC5><=k1hQ9Bkq>TrBANph z%!CFPG#t@#htJkslv%zvGmL~w>R*$PMEOKG@QE|jzWjNLpT7pEhn$=adVTVc%rf^0 zJC;c0j;R~ZD)Fe}xRX)Yzdf+ugxyz4N~TaYY7t43VEkyli$nzDlT)b4k&#o>!Z)?t zXt*syTwH=nN;aCJsjHdjZiV;!?7ufXImu^Ozp;5#&21Vk18_C*m9G5y^>g7N)1r|t zIc^tkS9PT8yS^oJw22Zc)?R@7DDP9M8$XJQdl>jp-)f@4>Bv(`_1+?_a}?`mmcM@a z^3uVRl&-hXPQ$|LwNjDtPe33W!GJ(Mr1?i2ktW1$QnZn5r=QnYv@D}&TtdQK3iN40 zaTOKy2P4;3o>2R*t>v8;%zt^F`|&1gouvJ`^+P!Z06SWSrImYl8H+qLTRHTXCw8J3 ziaG{deCOm%dwc7rNKZ;hV0+OR!sM-0Qj0hj*OBI!A~p3q<;^?pEqsTB_DDHBoyxa* z>}}(~$CX~g?@@*|cJE%Qn;R-WD=p2coY?y{V1fhm*J_PqcH7=a z`7H^2p2(JhgoLNid~JQ&+rsar-#^28j9@(UePPfBCwIW|m|k#1$sN0VZh}Y6;uP&w zv*pK0s2MC@hpS_sk(1x#j_$@rx+k0YDaZ2cUxEZ-)!%{yd$~1*5z1&Y$q;XkhDk|q zvg?)R8Y(!IluU@9le4i2ot{qaDB!j5lUVCWa&EuW6P=`%8m^Xte7hCNM23B!h2{W0 zvhRxv8oGSnhUriyR|p9m&;duEk&xh}Yq`_Em)F#@EZz709MX-=v)g_ty~%G*uQgSw za<{Oiy1JsWk^!+0$fMg^Xk!OA2!oCQ+vm&cBNq6H16jr>W>#MItJ$LNRc+eaO0sv}ke6PTiBS>>oRyWY2_xOx!BwN}e?p!)WLLD&Y zqm{eh>FK#9$^8S4n`jhxU}zZZn>p^QAVlBY)<(;2%3;-CKNu*HTQ>D#54}K-blsjM z%5=7hJ^#j|`fW5_rwXkl-S>R^zG5*1oWZgt3iHB38XA*9VLm4nh-{@QsDZ26(eN=mrz=F#=Z za3Hv3c+t`Erx3*0_7azaJX~E@po`%Nuu-B}{w_nX~WeKOEC?CE+o-eda6= z9V4S?#~))xI7n2R6>az4E6*;cge@395-P1xhuWo65Q(Z|q?4lL*=}uG$QH5}2mnq_ zM;?jt@BCvQ34n$wHe096cZDSSV~(7dJH1D%&Orj*-k;Ocn?I~v%Y_j(f$`Xw8>Pr!yh4Y_84~M+9KQ|v9kUi{U=jUq1q!dZ2goJGUefj zs1wcQ(Ri6qqY44fj7G34B}_)PmEg!>ou$&$jwn6d+IZ!kCIDDY@)I>Ycgisje3FRP zDSEE+*(ZA7#V*#wwgSAJ&1YAs9xRaN!^d$0GL zDuQ-I*U?IyKS#gk37^juOT~mfSVHUP5N_^P%%|Kq3{~FsWf{$ybe$?cn-v*pn!e*Z z3)=N*2}#$D^?ar4LB5%9TW`kl^L7Hx5tF!eiY>p_Nd|2gk?9CX9Jd>ix@; zy5ClV?Q4VxYq(N0$L^{IOiWM9g^^z^opq&ts;(z4zS0=Eb@%Rb#byxjN4KGc>Q@{K z;TYYL^pc54GTm5BooTLowW|Cx)*G$5=@s`~FM1{7@o-fx2S@1Rx{D2fa~JBbVu25o zyk9bTli&QD9s&Dj3)a4l4yiFZ4(BFsE~}Xhc~8~R=G+~0gHbf`mk@_N^n+2&#?M+= zYI8l^GZ^FmV&B|xir@pnT?$7Epk)+ zob>)o;x0j~pc7u8r~av^tX%4mmG$Z6A=?@rc?m`D)!rfkjN}*sO9m)V{MBn_GoWH* z-?`MO*YrWeJ|m;;8b1R=_?gz)fT>JiKWhmt^;s>WckJgxns<`Fizj1fZ$GQ%PI8=0gaK`6FaB6icjnQsnntu9WcYi9bhqok`WPLZK(Sp zx1(PB6U4>?-eOO?jN{mqgu}jj{oT?u_jl%`5cxcMS4D0XRTX3j2-)lFnMlW#PN!<$ zoBsL7AFZF>1Fhi8SfhgG^wu}mhUVq48hT67#^kB!?}+8K`70nZ?`*H$23tzz$|Kth za2hJ764ksK6V&6kb(!ft!n7W)iz_624nA;z^`o?yh>F)HxNYh*%yjymB_;e(lROX%UR}qJ zLLd8Lhb>u8q!{#=V47m%UN?z5=C_eO#anj@EGsVej${`t$kNBjT7L-^oQbSSi_z8F zXV8oJ9pdOH4cBr&G|LN z3(B@7);-7%&dc17rGb`LL^cQ~oRFgz>?xlM2i=HSihaG5p{z9MU!sFj_Nxep_nB0W zUJvhBGH*5bDH|YnTG9da&T;6qF^3CK=CX#SHqPzkJE<~m~e@sqwa%e!Y-S+wLjZapc)0te6PF}Cbza# z3$$fi%-|We7J7jRty|oLF89~wE~?TBI|D=Q$bK{mKq9Tq z%PD zGM4J`y-}z#XRD544-Dq1vHNPTnqZZ2?s{5oXsDnKI6ls27Ad%78R_VG(&$~iy^HJX zbKnl?`FRfKZKAWcC=m4hy+yP?HY}&-!%6AgGVw@=^MGypzRCC;A-b(KARHy(>fhy< z-`JSDRvoO{T;p=hZ|_`YuckBlS_J;ei3~fB<^St55a{0a~7k z4ya6u`Zd|RY${SxeZ#}$oBBZiy)Fcx(N{XSv^!)l=&0Yf&^|ezuSA=Fs57(jZAla3 zfELrO_Z??W^p8&%kIu~8kX+&RHelD)XJ0iakI*3|Q7h6}D#ytHSk^pXhDK3iSTpPZ zWBukUAQ&Gn1VRXh)IRTjF(Dp)e?C$x5Pg4j<_`Gh@LjX92|mopx4x!5_2uiM=5rku z)VX`Q0{{@GBKeQaZjDS1p%S2-<|&4nYoKO3efwuqpZ{P~2Aj*)HnE}tksixE-XxQ$ zS-`#E4`?52ldNN?@*eHqt`}~4F+MPG(NcMv&+Bq3K)H4FXL~3Fop8ri80XEm zKRD^Z(&l`;Pe=t%FyT&N+;V( zkcJElb#xfA4Et?ybd|N0-NX$uzfjVSO>oFB6ei^l(jx=} z&zzIzE_suG|31({PN?+kDR=rag@|5}Q6*uxNb|CXB(t1=g)x72*<)kx_{cnKFq=Gq zFCmf5H4~3;g8Ph_(cR*;)q$dDYQ5SZk!L>(cgAkV=OkXh$?!bA&BEV&7?im}IG+3) zA^j^z&{!vVkK*=dy?sgi_X)f872zFT`5dUp8Hl$UN>BaTg6x9~-78G?m+($b-ph1| zJz`FG=Pb1RXxzXJ2Z-<$jMZxsj3dA-ok;x9w5g?zbF<+rd#c5e}R4 zpW@>Q!Wf1eH&)cL7Di3dXXaI%2QDt70bzZsTiK+b?6it{*fPCQ0^+fv5ra`2bY~}vf zbX8l3mX9fbiLNT>Ud zmX;g3wyq$J3~hY(=huu36~e=S9CJ}`e||myaf0640zA8Mg69w?0NLS`B(MpL{x4(k z#0ZiY+EwN5;{yIyA*m5~CG=Ls)h>oCq9Jp=Zr{G?LqoyDPRq(XwpIfr z5TXmKHY5HkOV_w87#6=TL{~bAS-UoebP#+h;!8&XuvGno3%lZ+*YL|G;iCo73 z15*pEF_W7X4%A*)Z4B^e#azM^Jn634q7BA|JfeUXH@_A-YjCThu~ExS_6 z+%?>$fmTkiNQwx?XAC(7SJj>-JVF(G?Ya3?Tg#hI$IcLcFR(24qTuS+-RWZL$$Dep zyn~MTL6Q8BGP*od;rDfLea%tVTzh%O@6fwzyy@oj7z^inff$-i>h1n}J3&GC zXHo>MpZx6My`zQU3Tsmpp64@0>o$mVHL|A(FKz$A^ZR!1@{3e&@3-yk$Po zH8gttR#?|#Lqlei_<3SPsNwN_Ne0zCLxr+X)8fA<;esjGSFf_=j$=#$5icN58D#}l zL=a7SugiGkYm%s5CA}kc+hOhgUF4%(Fnp&Oi*KfjG5DtMO(!<+b$}j|P4HSIh4jrg zL)yHVKDB6qhvpVfGj3lx^~Du0{p5V(mGi?!=VA#SLOfuKjW;G)OMiW7J}yb1Lg>ud z+4~9un61(o8$HCmk4$(svCWw4tQPOdv|{Pd34a9_D5~)Zld-OVDb^K864>t{%t!N= zTS5{6g(qpkl#%+?w9RiRHqTpd>V}Ju5Syge;}bcw#CXAV8_yPox$*EGLFMLs)@x{0 zYh0-1hct|Ro*S0~V;~q!D3;>P<%eBIJfk`Qw!~?|zFhw<;bFbFF!H5V!x}xu?(f3^uc(QQsu<#(mzNNJwA_l(_98 z3Kn9FA4NV_Ob*0aAsHAGMXRM=eOC8!tnxz^b8uvV*R<Hp_kWyv^F3=GQCtOjpuT$-$d#jzkLAyDIuV74?4 z1byf!XwG^o+(wBNbC#C&V4sp9ZBI+;in(vKB&4ugDq^&5)iZ{W0=0&-f0j%CXmuA@ zW*Ff2_iHftw%;8{T2P6Qrw(Bw0lECXt3hj{A`4p!qvzRJY2$|Q!;X%vq3pp63*6lx z`mN?pUeeZl7x?7MB2K(vSb4cC7XQ~&qvr%B)tJi^aFu-CBj(t?7FxxkkgYDrcUfOV z?$%|h>b3x{xVWkdd|A}CZ`Z*n=ro4Ys|Wyv{Xc?`RQ3M^LNJzu2E%`cArA}31^M{i z^W79NhSy~|Gv3TUc6VYF99|nF@6+M#;9&Vwr`SpD3?xe?jUZ0`gJ{`RvcEn-3RBln zHBwQ)PQ6U_@sDpjaDO3nr^g90GLcs$VPOn)_z`vsG@YFM!y_gJLJuCqgDJ-8a{OFB zTo}oll=chO41YBgd~k0cDgGa+MHjPEqthU}_`}366YC?YOkj(y$BBl+Yo%mmDS){s znKwA)kQvr*a+KR3L7I?ORwm<-2NKa3CX4pJ2VfWJ;2NOEIFW{_<;jC6gU31jO(UHtz0eArpI$x9vBclEN(eT#R zDyOEFIlC6UP!jh@9#8d^k2wrhTUticDuUjt`EZBtH zz<`C8cHP;gM#cOGvgS}gZ5#;?GcW8pA%ft9zYF{ z7-M>T9-ab(p}9Jf>P{4~?Duk?HwF0(t{IOHC(}cb2&dGQaV>rQkNNrcJu_#1uuec0 zS0i}hGf8oM`-m7LWYubG8`f8ry9#(BH5>^q$;v7-FP*I*(VAi#!Ax3!E@SUSiB_|7(Afw9wLi za$mq^n*4jJF1u$Xr?Z0A;a!X4{;tK5133{r6v}+)^#pG>#1#rJY zzU8#s$ii_rC^`O-SH#eD3*&;Yu;{eYXyoB|LxpY+4=&`_^1A-j9;_Ar8DqrK$ej#R^2vPZ5@5ERHA>i4$F*#ZJ)(g;=d^`#}d!dQ$BZ|Bv<4 zG_atux=iM9R@muJ*K8!M-^AKw`cJ8unaSW$+HD^5L>@k(N5)wAB`5cjK15MfFHrK= zm6g@@_1TX%d0AWYm<{6F+On=FrsR-ys)4xy=M3NKI4->dSaC}41PfeX&imZ_Rhqwn zFDaA4<7ZFOR+cToI7aOqOiggM$Fv049+$UQHoJaABLf+Y%AGrG@??ZAv@9%g z-5wXS7uY0|F3SR zUCEu_e0$Sh@qf7 zR%{5*;j}42|D@D)w7(G_{%K82B1$57@fDt7%&je7cUcl1o(%|0+c4DC3+?+V-rWhG z_^dZLJ1E(Ri^a8|bUtXfGR?J@$3~xg{Bk$u_Eo5n1E)10n$OgT_2l=?jz+v1zvSzc zmYsd+(i;Dc)W;%M*H<0W)#eapxm6zn+CYY{@7axwL><*+6Ccg2hYL&N`a#;DpC8jU zp#HsCaw(kW8o7boYnJM8R~y7W+=lOJPeXbPlg;1WiM2Alb2z|{v!S7(uCA`Py?uET zy(J?er>dqVU{L!3FrVX6+|tjwAt=uCOXiOX*uD>QL>DON63pO-2zrO4` zc$<)%A=ODn;!it%j?D3qIq)cSGmr^sB#j)WvFPZ(2iv|1XBg3fmdwZw+29aHA@uOg z45M#VHQlvTc{JgQc@Nv*K!e1&Q^zf)yELx%T^mPi?C*YR3txc?LE6xe7DE$uv-LZU z#N-q-XLn!(+Ni&@_gm#Pa{txY*-$@DFMIxniqsC>#xgRSX?iaUkD48;G&S^eBi!ge z)apn*uES)bbnf|Bqh^NHtd976w9*6%1!WDN6?bwH%r` z*yPviQ7{6-9F?Qke*W$SFI33BCdY+oa+ zv4p|FCVdd@L7k7EgSVbq*yJ!j$jll4-MM_`MWfluUwbi)fA+sisHp2kbNw$M|8qH~ zxrz#jP2tB%!9`^CJ%vQiKFqlb#l)l_g-!)zn{3p4$pVyB#&5vIQV0kE zO)`W5v{aaEEWwyZ-`!=%@rfT)!OVI}r=9PoXN0EM!54hAr;*@{^UCB&5hs2+Cye7y zC--#WJ|5mAlo!Zl43C;-=Wvq{ub4hmlxO``*?icx-YJFvYxhSWVDe$!xh&fbT?@d}9~_20PwdxruIgROx$=9WKGGzlKj$hr&A7CT z-206R%6d*R0?G$)<@8OIXyjW!NXn{Gna6BD+^p=x+h=b0TCaHj&<3gWYhdQZ|E<>U@;L|kIwwVDZJ zGoq*So2cY$YQDqM*u;zqWdAYg=RsAjCSqs-X*N?oXrVo+5p6}yG(~$dp)C43HK?4X zkY{TL*~6L3bLVgQo#owoMrX^+>Nh1@)A~?og2TWs>;C_qflt1? zuN+HBob!eXa`2Gt9TlXZVJZov+oui)@?-z?f>uzDd9eMz`Qd*Kr|qMXg(}r=5)yh! zZ?sVw2BG?e#c_9~=&>a2Q&cG_FR9 zft1~msR3FGx>9(BhiA5|cPZZ8deR&^0))F4_^oc)ZJ01VdziDcK&;T8>aHNm&~q_) zH>GAD{t>&i^qSkExuiK|HUq><4(!Stq?qYDyRg9pw65G>UnKBNyrv3IM>vG&7YLJ@1Xk%a`{<3unF(%?Ch%Q&aV@Z%>WMJ7ztWBCc?fj zZpZDz!osk+ch_euYN#&jg;Ln37Gp${pz!O7H6oSg$Q7eAV1MxeL?So z%T{im!2(0plOp*Xmw9W#n)F^)e)>!d{V*9s9F>#l99On1Vw>F!T`dbZ~x1%ldd(&&xcu+LzxpR#)X^LMn@+Wp@2` zhmN!xIfKzD)zMPle8V!te{(jDy7x7NnupoKReY@FI?l;I7FWNc%<1F{hh8g^W0gs zPxDCU^mI~I`UkkC=#rn981~ubEILLSRCOB|2|)Ig=x$CVmW=Wck9F`VKNv}ejQg1@ zAt*h)iW#cLDylcO;>6I5!*M+nYo42Qopu6i>c$|~LzTGi);Z9W9n@Ujd(OAW^m@f z*lU<&kPGyBQ~!3P8XxOwhHx@-^4g>q6c}HVt9hEiq(FSfSV02cWPpQo5P5jD&?+?! z+wJ0!x-e+Bc%&;NC6SepTJv6ahdJHWj1?6aidk_M$3f7&Z(@>i`xP>^DpHxrcW&^FnNTPT-&_YJQ1}#EF#Nn9` zp6cy!-~cC)CjkQk1Lt+5fx*m1vS|CQk^@`BOOI64)E;e1V4mdw=Bs?e!z~~Fv_Fs^ zC+!=xr&w#wDTJ*vWzf+|yn}pY>Z!{folSwsQQ64>+S=1i%{vkm;K-C$zkveM*tJn{ zy!9yI;?FIYi0I^T7{KkdTRi^rCLd0wl?Yo%?km!=9U)G4cN~Nfh zRr5U^&L*F9I#SYA>XUnNKkHo6=n5gmrHmtFqfT2xpz?=SiEZvx&ZR3L(}MU4<_|W+ zjRr3R^9uCHemT#YD+)n#e*$e$P>|$P=r>HeO;JG|s1 zvu3PdYC1Yw{75GI+#Afo!G2z-et{vPM%ko_ij2}yoztf~VbJ4CS?_6n0bR_0i2EcT z#m2KSwG#VjG{)(u|KkUKbw?t)M_8}e{j{6zg-DtKS+;Pc)>iZ`Vc+!UCeRW#yRUWQ zMJ$wsf`UU-o&5aH?X>X*?B4Dys|!z~Lb|hzZXPw->y0h9RcK88vh*tv=?%VbXK#{X zgw^C3Q3NJlj`?VM2C|U<6+K@pjkd@}BBCNARi-+V+EP3>hp0C~L#=G)`aRaPr03hl zPa$MvitmkpeX+LEE%&n#wKGB$UaEUG;*4~08Pi6#e~H6QNsyjW?^d7O7`uciq}b1g z)~iX#uZ}yj!spxnoIJNmOjUh`-y2f*lRyWnF0u7SD_*L9FHK_$fktiV zcPNE*Sbmm{vhqD-%L+_H1s@8W(;WMlr?!~@BjJ@E{2GpJ5v{o_W(ds|FKQ4ty2^FJ%Vu(EQvaS%v#Zq6v zvKvGjrX_X5tU3ctfhZSIvpuSpsG)kxeRyvGx*Gpq(X?b0_HiS0ohAXncz08qG;Ayc z7Z*7UNFj&64prvPQ8?FFo23RF`kQFV`tOc`?-EU&(z?2EtDmn(RCp-HbYh2(^cHXV zzq_r~dk2xSwSLVLCMrC2wK7PCpY)gZRrQuQT42)Nz1XyOpb^%O&C2JCXx&p<6|lW^ zZ%M%XdgW_^-{#kU6qMXzy`$;Y>?U}WFNn@IStH6|vih_S0@1d%QP51=i6xQlcFmuHId%$Bo#u#{K6Z!Y*1knbJabf7 ze8$4LD>>lAW7_3*gf5-c#hKH*g%B894+_cmLASJpqqu>jHwT^L=CfHoSSo3V|A9#lEM^W z?B_-z1|k5rhehQPq>+&TP)moEtzE1v^;Owq+s=?9; z#}+Kwz08S$C0p%!<_qXSQY9POl~C`l7;E1&tpB9075b>VOw%mKy%*G5VlY;v6O~Nj!}UyyjvNk{ z$DDc4A?EIk#2hq$`D9W2E7kSRa@sBS$WBYVBP~De{ZpOH%=0pTE%;wi?qt#I4ryy` zWfRn1#xMOxNBnu@|3gQ#)cV8!J^yMA30pl;-sjHD`bK7yuoN)I!cvHFiF30;xB?^0 z=H2!@X=2|Pr}0o(0djByUPjkv-vZT?W@g@*~di4*G=_>geb_cnGsAX3p4Et z$+sNo;c!6$BuqvtZ$C%#;Y8Hpmkg|@QjFa9rOeeR)fZIn>&I%S2cb6#*tOS5g=Mvx zVG;oZu*GN6SqB>$`Vwp>t!B@>eqB5Q(@+Bg{ZlA@7-kM+r#7hH)TFm%K;0iGlfL=- za8H4nnCudcNe+yUOJT>P^al%HPZoDIcXy);W<#2Ie&3#$7*)0u0K}Is zi(n=-Gqc^*rHIwCQG4Hleu)iA?OP|PRbeRxa0NtbcU9(=w#i>YUD%lts8@}ht* z>1cge4ScGqK4kaZI&kdJ`lC-J((5&!N*ca>lc_7w-2LGL3U!Ne5_XGqJOC%NCTePH zd+=W9-Ej0=;*oX?URu@A)=oyNVXn);eEQ>U!mHoFFVLKY8}?G*Zy`DG<;6C|xT()J zVtjTHE;Ve~OoS^au%EdWfd=H^bq^madzKrA!-bI`TbX8 zaUAyFZXOl+yR{!UkWBdZJ34US;hn#M3`~|KLd + ]> + + + + +clusterOriginsBase + +OriginsBase + + +clusterOriginsAdmin + +OriginsAdmin + + +clusterIERC20 + +IERC20 + + +clusterSafeMath + +SafeMath  (lib) + + +clusterILockedFund + +ILockedFund + + +clusterIOrigins + +IOrigins + + +clusterLockedFund + +LockedFund + + +clusterIVestingLogic + +IVestingLogic + + +clusterIVestingRegistry + +IVestingRegistry + + +cluster_totalBal + +_totalBal + + +clusterrequiredBal + +requiredBal + + +clustercurrentBal + +currentBal + + +cluster_saleStartTS + +_saleStartTS + + +clusterdeposit + +deposit + + +clusterreceiver + +receiver + + +cluster_amount + +_amount + + +cluster_01 + +Legend + + + + + +<Constructor> + + + + + +setDepositAddress + + + + + +_setDepositAddress + + + + + + + + + + + +setLockedFund + + + + + +_setLockedFund + + + + + + + + + + + +createTier + + + + + +_setTierVerification + + + + + + + + + + + +_setTierDeposit + + + + + + + + + + + +_setTierTokenAmount + + + + + + + + + + + +_setTierVestOrLock + + + + + + + + + + + +_setTierTime + + + + + + + + + + + +setTierVerification + + + + + + + + + + + +setTierDeposit + + + + + + + + + + + +setTierTokenLimit + + + + + +_setTierTokenLimit + + + + + + + + + + + +setTierTokenAmount + + + + + + + + + + + +setTierVestOrLock + + + + + + + + + + + +setTierTime + + + + + + + + + + + +addressVerification + + + + + +_addressVerification + + + + + + + + + + + +singleAddressMultipleTierVerification + + + + + + + + + + + +multipleAddressSingleTierVerification + + + + + + + + + + + +multipleAddressAndTierVerification + + + + + + + + + + + +buy + + + + + +_buy + + + + + + + + + + + +withdrawSaleDeposit + + + + + +_withdrawSaleDeposit + + + + + + + + + + + +VerificationType + + + + + + + + + + + +DepositType + + + + + + + + + + + + + + + + + +_getTotalRemainingTokens + + + + + +add + + + + + + + + + + + + + + + + + +balanceOf + + + + + + + + + + + +transferFrom + + + + + + + + + + + +transfer + + + + + + + + + + + +sub + + + + + + + + + + + +sub + + + + + + + + + + + +TransferType + + + + + + + + + + + +SaleEndDurationOrTS + + + + + + + + + + + + + + + + + + + + + + + +add + + + + + + + + + + + +_saleAllowed + + + + + +_updateTierTokenDetailsAfterBuy + + + + + +_tokenTransferOnBuy + + + + + +approve + + + + + + + + + + + +depositVested + + + + + + + + + + + +_updateWalletCount + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +add + + + + + + + + + + + +mul + + + + + + + + + + + +checkOwner + + + + + + + + + + + +transfer + + + + + + + + + + + +getTierCount + + + + + +getDepositAddress + + + + + +getToken + + + + + +getLockDetails + + + + + +readTierPartA + + + + + +readTierPartB + + + + + +getTokensBoughtByAddressOnTier + + + + + +getParticipatingWalletCountPerTier + + + + + +getTokensSoldPerTier + + + + + +checkSaleEnded + + + + + +isAddressApproved + + + + + + +onlyOwner + + + + + + +onlyVerifier + + + + + +<Constructor> + + + + + +addOwner + + + + + +_addOwner + + + + + + + + + + + +removeOwner + + + + + +_removeOwner + + + + + + + + + + + +addVerifier + + + + + +_addVerifier + + + + + + + + + + + +removeVerifier + + + + + +_removeVerifier + + + + + + + + + + + +checkOwner + + + + + +checkVerifier + + + + + +getOwners + + + + + +getVerifiers + + + + + +totalSupply + + + + + +allowance + + + + + +add + + + + + +sub + + + + + + + + + + + +mul + + + + + +div + + + + + + + + + + + +divCeil + + + + + + + + + + + +mod + + + + + + + + + + + +min256 + + + + + +_depositVested + + + + + + + + + + + +addAdmin + + + + + +removeAdmin + + + + + +changeVestingRegistry + + + + + +changeWaitedTS + + + + + +withdrawWaitedUnlockedBalance + + + + + +createVestingAndStake + + + + + +createVesting + + + + + +stakeTokens + + + + + +withdrawAndStakeTokens + + + + + +withdrawAndStakeTokensFrom + + + + + +setDepositAddress + + + + + +setLockedFund + + + + + +createTier + + + + + +setTierVerification + + + + + +setTierDeposit + + + + + +setTierTokenLimit + + + + + +setTierTokenAmount + + + + + +setTierVestOrLock + + + + + +setTierTime + + + + + +addressVerification + + + + + +singleAddressMultipleTierVerification + + + + + +multipleAddressSingleTierVerification + + + + + +multipleAddressAndTierVerification + + + + + +buy + + + + + +withdrawSaleDeposit + + + + + +getTierCount + + + + + +getDepositAddress + + + + + +getToken + + + + + +getLockDetails + + + + + +readTierPartA + + + + + +readTierPartB + + + + + +getTokensBoughtByAddressOnTier + + + + + +getParticipatingWalletCountPerTier + + + + + +getTokensSoldPerTier + + + + + +checkSaleEnded + + + + + +isAddressApproved + + + + + + +onlyAdmin + + + + + +<Constructor> + + + + + +addAdmin + + + + + +_addAdmin + + + + + + + + + + + +removeAdmin + + + + + +_removeAdmin + + + + + + + + + + + +changeVestingRegistry + + + + + +_changeVestingRegistry + + + + + + + + + + + +changeWaitedTS + + + + + +_changeWaitedTS + + + + + + + + + + + +withdrawWaitedUnlockedBalance + + + + + +_withdrawWaitedUnlockedBalance + + + + + + + + + + + +createVestingAndStake + + + + + +_createVestingAndStake + + + + + + + + + + + +createVesting + + + + + +_createVesting + + + + + + + + + + + +stakeTokens + + + + + +_getVesting + + + + + + + + + + + +_stakeTokens + + + + + + + + + + + +cliff + + + + + + + + + + + +duration + + + + + + + + + + + +withdrawAndStakeTokens + + + + + + + + + + + + + + + + + +withdrawAndStakeTokensFrom + + + + + + + + + + + + + + + + + + + + + + + +mul + + + + + + + + + + + + + + + + + + + + + + + +createVesting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +getVesting + + + + + + + + + + + + + + + + + +getWaitedTS + + + + + +getToken + + + + + +getVestingDetails + + + + + +vestedBalance + + + + + +getLockedBalance + + + + + +getWaitedUnlockedBalance + + + + + +getUnlockedBalance + + + + + +adminStatus + + + + + +getCliffAndDuration + + + + + +stakeTokens + + + + + +withdrawTokens + + + + + +stakeTokens + + + + + +Internal Call +External Call +Defined Contract +Undefined Contract + + + + + +    +    + +    + + + + + + + + + + + + + + + + \ No newline at end of file From 2f67de746532685a1102c45c337e135f2e0945ad Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:32:16 +0530 Subject: [PATCH 048/112] IApproveAndCall formatted --- contracts/Testhelpers/IApproveAndCall.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Testhelpers/IApproveAndCall.sol b/contracts/Testhelpers/IApproveAndCall.sol index e25d037..55c7284 100644 --- a/contracts/Testhelpers/IApproveAndCall.sol +++ b/contracts/Testhelpers/IApproveAndCall.sol @@ -18,4 +18,4 @@ interface IApproveAndCall { address _token, bytes calldata _data ) external; -} \ No newline at end of file +} From a13b19a86010401473658a00f55abfc4d20f8801 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 15:33:34 +0530 Subject: [PATCH 049/112] Token Contract import updated --- contracts/Testhelpers/Token.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/Testhelpers/Token.sol b/contracts/Testhelpers/Token.sol index 5e5c895..fc015bc 100644 --- a/contracts/Testhelpers/Token.sol +++ b/contracts/Testhelpers/Token.sol @@ -1,8 +1,8 @@ pragma solidity ^0.5.17; -import "../openzeppelin/ERC20Detailed.sol"; -import "../openzeppelin/ERC20.sol"; -import "../openzeppelin/Ownable.sol"; +import "../Openzeppelin/ERC20Detailed.sol"; +import "../Openzeppelin/ERC20.sol"; +import "../Openzeppelin/Ownable.sol"; import "./IApproveAndCall.sol"; /** From 7a3fa7680f57a149444207f60364511d19c2d9aa Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 17:57:01 +0530 Subject: [PATCH 050/112] Locked Fund Script Updated --- scripts/deployLockedFund.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/deployLockedFund.py b/scripts/deployLockedFund.py index 7fcb48f..1b6025b 100644 --- a/scripts/deployLockedFund.py +++ b/scripts/deployLockedFund.py @@ -116,8 +116,8 @@ def updateVestingRegistry(): def updateWaitedTS(): lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) print("Updating Waited Timestamp of LockedFund...\n") - lockedFund.changeVestingRegistry(values['vestingRegistry']) - print("Updated Waited Timestamp as", values['vestingRegistry'], " of LockedFund...\n") + lockedFund.changeWaitedTS(values['waitedTimestamp']) + print("Updated Waited Timestamp as", values['waitedTimestamp'], " of LockedFund...\n") # ========================================================================================================================================= def writeToJSON(): From ea66272db372fd64cbcc8294c91a72fc1601ac52 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 17:57:17 +0530 Subject: [PATCH 051/112] Package Lock Updated --- package-lock.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/package-lock.json b/package-lock.json index 5219bc0..142d997 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18579,6 +18579,16 @@ "verror": "1.10.0" } }, + "keccak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "dev": true, + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", From 7f9eac1d5e31f0902b0c401e9cea6b63daafedd2 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Fri, 18 Jun 2021 17:58:17 +0530 Subject: [PATCH 052/112] Mainnet JSON Updated --- scripts/values/mainnet.json | 55 +++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/scripts/values/mainnet.json b/scripts/values/mainnet.json index c42693a..b3d1913 100644 --- a/scripts/values/mainnet.json +++ b/scripts/values/mainnet.json @@ -1,4 +1,55 @@ { - "FISH" : "", - "NEW_SALE_NAME": "" + "token": "0xF769f619E3b9DBCd552E62dF217D5DC095f6a42b", + "decimal": "18", + "multisigOwners": [ + "", + "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435", + "0xe1a148735f07bc5fe7cfb60499d325c8380488a8" + ], + "multisig": "0x8f2608FA847A37989Df18E008ed476569AfE21D0", + "initialAdmin": "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", + "originsWhitelisters": [ + "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222" + ], + "depositAddress": "", + "waitedTimestamp": "", + "vestingRegistry": "", + "origins": "", + "lockedFund": "", + "tiers": [ + { + "minimumAmount": "", + "maximumAmount": "", + "tokensForSale": "11508000", + "saleStartTimestamp": "0", + "saleEnd": "172800", + "unlockedBP": "0", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "100", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "2", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + }, + { + "minimumAmount": "", + "maximumAmount": "", + "tokensForSale": "20000000", + "saleStartTimestamp": "0", + "saleEnd": "172800", + "unlockedBP": "5000", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "50", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "2", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + } + ], + "toWhitelist": [], + "whitelisted": [] } \ No newline at end of file From 3237c7d0c125dddb19e35b0ece5f9a91f4de2456 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:38:38 +0530 Subject: [PATCH 053/112] Brownie Config Updated --- brownie-config.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/brownie-config.yaml b/brownie-config.yaml index cc07a8f..fd6ff23 100644 --- a/brownie-config.yaml +++ b/brownie-config.yaml @@ -4,7 +4,7 @@ project_structure: build: build contracts: contracts - interfaces: interfaces + interfaces: contracts/Interfaces reports: reports scripts: scripts tests: tests @@ -24,7 +24,7 @@ networks: mnemonic: brownie block_time: 0 default_balance: 1000000 - #time: 2020-05-08T14:54:08+0000 + # time: 2020-05-08T14:54:08+0000 live: cmd_settings: port: 443 @@ -50,10 +50,10 @@ console: reports: exclude_paths: - - contracts/helpers/*.* + - contracts/Openzeppelin/*.* + - contracts/Testhelpers/*.* exclude_contracts: - - Ownable - - SafeMath + - MultiSigWallet hypothesis: deadline: null From 2f43cca257d48f33f58209da372057481862de9a Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:39:08 +0530 Subject: [PATCH 054/112] Locked Fund MAX_DURATION Updated --- contracts/LockedFund.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/LockedFund.sol b/contracts/LockedFund.sol index 1f2b315..c5e9a59 100644 --- a/contracts/LockedFund.sol +++ b/contracts/LockedFund.sol @@ -23,7 +23,7 @@ contract LockedFund is ILockedFund { /// @notice The maximum basis point which is allowed. uint256 internal constant MAX_BASIS_POINT = 10000; /// @notice The maximum duration allowed for staking. - uint256 internal constant MAX_DURATION = 37; + uint256 internal constant MAX_DURATION = 36; /// @notice The interval duration. uint256 public constant INTERVAL = 4 weeks; @@ -336,7 +336,7 @@ contract LockedFund is ILockedFund { ) internal { /// If duration is also zero, then it is similar to Unlocked Token. require(_duration != 0, "LockedFund: Duration cannot be zero."); - require(_duration < MAX_DURATION, "LockedFund: Duration is too long."); + require(_duration <= MAX_DURATION, "LockedFund: Duration is too long."); // MAX_BASIS_POINT is not included because if 100% is unlocked, then this function is not required to be used. require(_basisPoint < MAX_BASIS_POINT, "LockedFund: Basis Point has to be less than 10000."); From e0fa3ed4002e6f7319bbb76fd72876a57edc4e02 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:40:17 +0530 Subject: [PATCH 055/112] OriginsStorage Updated --- contracts/OriginsStorage.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/OriginsStorage.sol b/contracts/OriginsStorage.sol index fff512a..50e7480 100644 --- a/contracts/OriginsStorage.sol +++ b/contracts/OriginsStorage.sol @@ -87,6 +87,8 @@ contract OriginsStorage { mapping(uint256 => uint256) internal tokensSoldPerTier; /// @notice Contains if a tier sale ended or not. mapping(uint256 => bool) internal tierSaleEnded; + /// @notice Contains if a tier asset collected withdrawn or not. + mapping(uint256 => bool) internal tierSaleWithdrawn; /// @notice The address to uint to bool mapping to see if the particular address is eligible or not for a tier. mapping(address => mapping(uint256 => bool)) internal addressApproved; From 663ca592230059b1bd2f7197e02c0808f52efe26 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:40:42 +0530 Subject: [PATCH 056/112] OriginsAdmin Updated --- contracts/OriginsAdmin.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/OriginsAdmin.sol b/contracts/OriginsAdmin.sol index 232ad12..9c2f2ea 100644 --- a/contracts/OriginsAdmin.sol +++ b/contracts/OriginsAdmin.sol @@ -1,12 +1,14 @@ pragma solidity ^0.5.17; +import "./OriginsStorage.sol"; + /** * @title An owner contract with granular access for multiple parties. * @author Franklin Richards - powerhousefrank@protonmail.com * @notice You can use this contract for creating multiple owners with different access. * @dev To add a new role, add the corresponding array and mapping, along with add, remove and get functions. */ -contract OriginsAdmin { +contract OriginsAdmin is OriginsStorage { /* Storage */ address[] private owners; @@ -75,7 +77,7 @@ contract OriginsAdmin { * @dev Initializes the contract, setting the deployer as the initial owner. * @param _owners The owners list. */ - constructor(address[] memory _owners) internal { + constructor(address[] memory _owners) public { uint256 len = _owners.length; for (uint256 index = 0; index < len; index++) { require(!isOwner[_owners[index]], "OriginsAdmin: Each owner can be added only once."); From b26d02aa4aa0605eab68db93f71b3d5168a8a85b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:41:15 +0530 Subject: [PATCH 057/112] OriginsEvents Updated --- contracts/OriginsEvents.sol | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/contracts/OriginsEvents.sol b/contracts/OriginsEvents.sol index 3f5caf1..90d4a54 100644 --- a/contracts/OriginsEvents.sol +++ b/contracts/OriginsEvents.sol @@ -1,11 +1,13 @@ pragma solidity ^0.5.17; +import "./OriginsAdmin.sol"; + /** * @title A contract containing all the events of Origins Base. * @author Franklin Richards - powerhousefrank@protonmail.com * @notice You can use this contract for adding events into Origins Base. */ -contract OriginsEvents { +contract OriginsEvents is OriginsAdmin{ /* Events */ /** @@ -69,7 +71,7 @@ contract OriginsEvents { uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, - uint256 indexed _saleEndDurationOrTS + SaleEndDurationOrTS _saleEndDurationOrTS ); /** @@ -89,7 +91,7 @@ contract OriginsEvents { uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, - uint256 _transferType + TransferType _transferType ); /** @@ -105,7 +107,7 @@ contract OriginsEvents { uint256 _tierID, uint256 _depositRate, address indexed _depositToken, - uint256 _depositType + DepositType _depositType ); /** @@ -114,7 +116,7 @@ contract OriginsEvents { * @param _tierID The Tier ID which is being updated. * @param _verificationType The type of verification for the particular sale. */ - event TierVerificationUpdated(address indexed _initiator, uint256 _tierID, uint256 _verificationType); + event TierVerificationUpdated(address indexed _initiator, uint256 _tierID, VerificationType _verificationType); /** * @notice Emitted when the Tier Sale Ends. @@ -158,7 +160,7 @@ contract OriginsEvents { address indexed _initiator, address indexed _receiver, uint256 _tierID, - uint256 _depositType, + DepositType _depositType, uint256 _amount ); } From 053e7598b78628842ac168a8110c64dffe585261 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:41:47 +0530 Subject: [PATCH 058/112] IOrigins Updated --- contracts/Interfaces/IOrigins.sol | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/contracts/Interfaces/IOrigins.sol b/contracts/Interfaces/IOrigins.sol index 80772e1..3f97f57 100644 --- a/contracts/Interfaces/IOrigins.sol +++ b/contracts/Interfaces/IOrigins.sol @@ -161,7 +161,7 @@ contract IOrigins { * @param _amount The amount of token (deposit asset) which will be sent for purchasing. * @dev If deposit type if RBTC, then _amount can be passed as zero. */ - function buy(uint256 _tierID, uint256 _amount) public payable; + function buy(uint256 _tierID, uint256 _amount) external payable; /** * @notice The function used by the admin or deposit address to withdraw the sale proceedings. @@ -175,26 +175,26 @@ contract IOrigins { * @notice Function to read the tier count. * @return The number of tiers present in the contract. */ - function getTierCount() public view returns (uint256); + function getTierCount() external view returns (uint256); /** * @notice Function to read the deposit address. * @return The address of the deposit address. * @dev If zero is returned, any of the owners can withdraw the raised funds. */ - function getDepositAddress() public view returns (address); + function getDepositAddress() external view returns (address); /** * @notice Function to read the token on sale. * @return The Token contract address which is being sold in the contract. */ - function getToken() public view returns (address); + function getToken() external view returns (address); /** * @notice Function to read the locked fund contract address. * @return Address of Locked Fund Contract. */ - function getLockDetails() public view returns (address); + function getLockDetails() external view returns (address); /** * @notice Function to read a Tier parameter. @@ -211,7 +211,7 @@ contract IOrigins { * @return _depositRate Contains the rate of the token w.r.t. the depositing asset. */ function readTierPartA(uint256 _tierID) - public + external view returns ( uint256 _minAmount, @@ -236,7 +236,7 @@ contract IOrigins { * @return _transferType Contains the type of token transfer after a user buys to get the tokens. */ function readTierPartB(uint256 _tierID) - public + external view returns ( address _depositToken, @@ -252,7 +252,7 @@ contract IOrigins { * @param _tierID The tier ID for which the address has to be checked. * @return The amount of tokens bought by the address. */ - function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) public view returns (uint256); + function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) external view returns (uint256); /** * @notice Function to read participating wallet count per tier. @@ -262,14 +262,14 @@ contract IOrigins { * A user can participate on one round and not on other. * In the future maybe a count on that can be created. */ - function getParticipatingWalletCountPerTier(uint256 _tierID) public view returns (uint256); + function getParticipatingWalletCountPerTier(uint256 _tierID) external view returns (uint256); /** * @notice Function to read tokens sold per tier. * @param _tierID The tier ID for which the sold metrics has to be checked. * @return The amount of tokens sold on that tier. */ - function getTokensSoldPerTier(uint256 _tierID) public view returns (uint256); + function getTokensSoldPerTier(uint256 _tierID) external view returns (uint256); /** * @notice Function to check if a tier sale ended or not. @@ -277,7 +277,7 @@ contract IOrigins { * @return True is sale ended, False otherwise. * @dev A return of false does not necessary mean the sale is active. It can also be in inactive state. */ - function checkSaleEnded(uint256 _tierID) public view returns (bool _status); + function checkSaleEnded(uint256 _tierID) external view returns (bool _status); /** * @notice Function to read address which are approved for sale in a tier. @@ -285,5 +285,5 @@ contract IOrigins { * @param _tierID The tier ID for which the address has to be checked. * @return True is allowed, False otherwise. */ - function isAddressApproved(address _addr, uint256 _tierID) public view returns (bool); + function isAddressApproved(address _addr, uint256 _tierID) external view returns (bool); } From 406c2a1521cdecc91616864c326145d929644393 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:50:24 +0530 Subject: [PATCH 059/112] OriginsBase Updated --- contracts/OriginsBase.sol | 199 +++++++++++++++++++------------------- 1 file changed, 102 insertions(+), 97 deletions(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index 996a88b..cbf01a4 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -1,16 +1,14 @@ pragma solidity ^0.5.17; -import "./OriginsAdmin.sol"; import "./OriginsEvents.sol"; -import "./OriginsStorage.sol"; -import "./Interfaces/IOrigins.sol"; /** * @title A contract for Origins platform. * @author Franklin Richards - powerhousefrank@protonmail.com * @notice You can use this contract for creating a sale in the Origins Platform. + * @dev Don't forget to update the Interface: IOrigins, according to the changes in this. */ -contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { +contract OriginsBase is OriginsEvents { /* Functions */ /** @@ -55,35 +53,34 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { /** * @notice Function to create a new tier. + * @param _maxAmount The maximum amount of asset which can be deposited. * @param _remainingTokens Contains the remaining tokens for sale. * @param _saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. * @param _saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. - * @param _unlockedTokenWithdrawTS Contains the timestamp for the waited unlocked tokens to be withdrawn. * @param _unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock. * @param _vestOrLockCliff Contains the cliff of the vesting/lock for distribution. * @param _vestOrLockDuration Contains the duration of the vesting/lock for distribution. * @param _depositRate Contains the rate of the token w.r.t. the depositing asset. - * @param _depositToken Contains the deposit token address if the deposit type is Token. * @param _verificationType Contains the method by which verification happens. * @param _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. * @param _transferType Contains the type of token transfer after a user buys to get the tokens. * @return _tierID The newly created tier ID. * @dev In the future this should be decoupled. + * Some are currently sent with default value due to Stack Too Deep problem. */ function createTier( + uint256 _maxAmount, uint256 _remainingTokens, uint256 _saleStartTS, uint256 _saleEnd, - uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, uint256 _vestOrLockCliff, uint256 _vestOrLockDuration, uint256 _depositRate, - address _depositToken, - uint256 _depositType, - uint256 _verificationType, - uint256 _saleEndDurationOrTS, - uint256 _transferType + DepositType _depositType, + VerificationType _verificationType, + SaleEndDurationOrTS _saleEndDurationOrTS, + TransferType _transferType ) external onlyOwner returns (uint256 _tierID) { /// @notice `tierCount` should always start at 1, because else default value zero will result in verification process. tierCount++; @@ -96,19 +93,17 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { /// @notice Verification Parameter. _setTierVerification(_tierID, _verificationType); - /// @notice Deposit Parameters. - _setTierDeposit(_tierID, _depositRate, _depositToken, _depositType); + /// @notice Deposit Parameters. (IMPORTANT TODO, change deposit token address here.) + _setTierDeposit(_tierID, _depositRate, address(0), _depositType); - /// @notice Token Amount Limit Parameters (TODO). - /// @dev This is not set here due to stack too deep error. - //_setTierTokenLimit(_tierID, _minAmount, _maxAmount); - // @dev Corresponding _minAmount and _maxAmount parameters has been removed. + /// @notice Token Amount Limit Parameters. (IMPORTANT TODO, change minimum amount.) + _setTierTokenLimit(_tierID, 0, _maxAmount); /// @notice Tier Token Amount Parameters. _setTierTokenAmount(_tierID, _remainingTokens); /// @notice Vesting or Locking Parameters. - _setTierVestOrLock(_tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedTokenWithdrawTS, _unlockedBP, _transferType); + _setTierVestOrLock(_tierID, _vestOrLockCliff, _vestOrLockDuration, 0, _unlockedBP, _transferType); /// @notice Time Parameters. _setTierTime(_tierID, _saleStartTS, _saleEnd, _saleEndDurationOrTS); @@ -119,7 +114,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @param _tierID The Tier ID which is being updated. * @param _verificationType The type of verification for the particular sale. */ - function setTierVerification(uint256 _tierID, uint256 _verificationType) external onlyOwner { + function setTierVerification(uint256 _tierID, VerificationType _verificationType) external onlyOwner { _setTierVerification(_tierID, _verificationType); } @@ -134,7 +129,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { uint256 _tierID, uint256 _depositRate, address _depositToken, - uint256 _depositType + DepositType _depositType ) external onlyOwner { _setTierDeposit(_tierID, _depositRate, _depositToken, _depositType); } @@ -177,7 +172,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, - uint256 _transferType + TransferType _transferType ) external onlyOwner { _setTierVestOrLock(_tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedTokenWithdrawTS, _unlockedBP, _transferType); } @@ -193,7 +188,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, - uint256 _saleEndDurationOrTS + SaleEndDurationOrTS _saleEndDurationOrTS ) external onlyOwner { _setTierTime(_tierID, _saleStartTS, _saleEnd, _saleEndDurationOrTS); } @@ -247,7 +242,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @param _amount The amount of token (deposit asset) which will be sent for purchasing. * @dev If deposit type if RBTC, then _amount can be passed as zero. */ - function buy(uint256 _tierID, uint256 _amount) public payable { + function buy(uint256 _tierID, uint256 _amount) external payable { _buy(_tierID, _amount); } @@ -290,8 +285,8 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @param _tierID The Tier ID which is being updated. * @param _verificationType The type of verification for the particular sale. */ - function _setTierVerification(uint256 _tierID, uint256 _verificationType) internal { - tiers[_tierID].verificationType = VerificationType(_verificationType); + function _setTierVerification(uint256 _tierID, VerificationType _verificationType) internal { + tiers[_tierID].verificationType = _verificationType; emit TierVerificationUpdated(msg.sender, _tierID, _verificationType); } @@ -307,7 +302,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { uint256 _tierID, uint256 _depositRate, address _depositToken, - uint256 _depositType + DepositType _depositType ) internal { require(_depositRate > 0, "OriginsBase: Deposit Rate cannot be zero."); if (DepositType(_depositType) == DepositType.Token) { @@ -316,7 +311,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { tiers[_tierID].depositRate = _depositRate; tiers[_tierID].depositToken = IERC20(_depositToken); - tiers[_tierID].depositType = DepositType(_depositType); + tiers[_tierID].depositType = _depositType; emit TierDepositUpdated(msg.sender, _tierID, _depositRate, _depositToken, _depositType); } @@ -396,7 +391,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { uint256 _vestOrLockDuration, uint256 _unlockedTokenWithdrawTS, uint256 _unlockedBP, - uint256 _transferType + TransferType _transferType ) internal { /// @notice The below is mainly for TransferType of Vested and Locked, but should not hinder for other types as well. require(_vestOrLockCliff <= _vestOrLockDuration, "OriginsBase: Cliff has to be <= duration."); @@ -407,7 +402,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { /// @notice Zero is also an accepted value, which means the unlock time is not yet decided. tiers[_tierID].unlockedTokenWithdrawTS = _unlockedTokenWithdrawTS; tiers[_tierID].unlockedBP = _unlockedBP; - tiers[_tierID].transferType = TransferType(_transferType); + tiers[_tierID].transferType = _transferType; emit TierVestOrLockUpdated( msg.sender, @@ -431,20 +426,23 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { uint256 _tierID, uint256 _saleStartTS, uint256 _saleEnd, - uint256 _saleEndDurationOrTS + SaleEndDurationOrTS _saleEndDurationOrTS ) internal { - if (_saleStartTS != 0 && _saleEnd != 0 && SaleEndDurationOrTS(_saleEndDurationOrTS) == SaleEndDurationOrTS.Duration) { - require(_saleStartTS.add(_saleEnd) > block.timestamp, "OriginsBase: The sale end duration cannot be past already."); - } else if ((_saleStartTS != 0 || _saleEnd != 0) && SaleEndDurationOrTS(_saleEndDurationOrTS) == SaleEndDurationOrTS.Timestamp) { + uint256 saleEndTS = _saleEnd; + if (_saleStartTS != 0 && _saleEnd != 0 && _saleEndDurationOrTS == SaleEndDurationOrTS.Duration) { + saleEndTS = _saleStartTS.add(_saleEnd); + } else if ((_saleStartTS != 0 || _saleEnd != 0) && _saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp) { require(_saleStartTS < _saleEnd, "OriginsBase: The sale start TS cannot be after sale end TS."); - require(_saleEnd > block.timestamp, "OriginsBase: The sale end time cannot be past already."); + } + if(saleEndTS != 0){ + require(saleEndTS > block.timestamp, "OriginsBase: The sale end duration cannot be past already."); } tiers[_tierID].saleStartTS = _saleStartTS; - tiers[_tierID].saleEnd = _saleEnd; - tiers[_tierID].saleEndDurationOrTS = SaleEndDurationOrTS(_saleEndDurationOrTS); + tiers[_tierID].saleEnd = saleEndTS; + tiers[_tierID].saleEndDurationOrTS = _saleEndDurationOrTS; - emit TierTimeUpdated(msg.sender, _tierID, _saleStartTS, _saleEnd, _saleEndDurationOrTS); + emit TierTimeUpdated(msg.sender, _tierID, _saleStartTS, saleEndTS, _saleEndDurationOrTS); } /** @@ -475,13 +473,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { } else if (tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.UntilSupply && tiers[_id].remainingTokens == 0) { tierSaleEnded[_id] = true; return false; - } else if (tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp && tiers[_id].saleEnd < block.timestamp) { - tierSaleEnded[_id] = true; - return false; - } else if ( - tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.Duration && - tiers[_id].saleStartTS.add(tiers[_id].saleEnd) < block.timestamp - ) { + } else if (tiers[_id].saleEnd < block.timestamp) { tierSaleEnded[_id] = true; return false; } @@ -491,53 +483,30 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { return true; } - /** - * @notice Internal Function to update the Tier Token Details. - * @param _tierID The Tier whose Token Details are updated. - */ - function _updateTierTokenDetailsAfterBuy(uint256 _tierID) internal { - Tier memory tierDetails = tiers[_tierID]; - - if (tierDetails.remainingTokens < tierDetails.maxAmount) { - if (tierDetails.remainingTokens < tierDetails.minAmount) { - if (tierDetails.remainingTokens == 0) { - tierSaleEnded[_tierID] = true; - emit TierSaleEnded(msg.sender, _tierID); - } - tiers[_tierID].minAmount = 0; - emit TierSaleUpdatedMinimum(msg.sender, _tierID); - } - tiers[_tierID].maxAmount = tierDetails.remainingTokens; - emit TierSaleUpdatedMaximum(msg.sender, _tierID, tierDetails.remainingTokens); - } - } - /** * @notice Internal Function to transfer the token during buying. - * @param _tierID The Tier from which the tokens were bought. + * @param _tierDetails The Tier from which the tokens were bought. * @param _tokensBought The number of tokens bought. */ - function _tokenTransferOnBuy(uint256 _tierID, uint256 _tokensBought) internal { - Tier memory tierDetails = tiers[_tierID]; - - require(tierDetails.transferType != TransferType.None, "OriginsBase: Transfer Type not set by owner"); + function _tokenTransferOnBuy(Tier memory _tierDetails, uint256 _tokensBought) internal { + require(_tierDetails.transferType != TransferType.None, "OriginsBase: Transfer Type not set by owner"); - if (tierDetails.transferType == TransferType.Unlocked) { - tierDetails.depositToken.transfer(msg.sender, _tokensBought); - } else if (tierDetails.transferType == TransferType.WaitedUnlock) { + if (_tierDetails.transferType == TransferType.Unlocked) { + token.transfer(msg.sender, _tokensBought); + } else if (_tierDetails.transferType == TransferType.WaitedUnlock) { /// TODO Call LockedFund Contract to release the token after a certain period. /// TODO approve LockedFund revert("Not implemented yet."); - } else if (tierDetails.transferType == TransferType.Vested) { + } else if (_tierDetails.transferType == TransferType.Vested) { token.approve(address(lockedFund), _tokensBought); lockedFund.depositVested( msg.sender, _tokensBought, - tierDetails.vestOrLockCliff, - tierDetails.vestOrLockDuration, - tierDetails.unlockedBP + _tierDetails.vestOrLockCliff, + _tierDetails.vestOrLockDuration, + _tierDetails.unlockedBP ); - } else if (tierDetails.transferType == TransferType.Locked) { + } else if (_tierDetails.transferType == TransferType.Locked) { /// TODO Call the LockedFund Contract with simple lock on the received token. /// Don't forget the immediate unlocked amount after the unlockTimestamp. /// TODO approve LockedFund @@ -545,6 +514,26 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { } } + /** + * @notice Internal Function to update the Tier Token Details. + * @param _tierDetails The Tier whose Token Details are updated. + * @param _tierID The Tier ID whose Token Details are updated. + */ + function _updateTierTokenDetailsAfterBuy(Tier memory _tierDetails, uint256 _tierID) internal { + if (_tierDetails.remainingTokens < _tierDetails.maxAmount) { + if (_tierDetails.remainingTokens < _tierDetails.minAmount) { + if (_tierDetails.remainingTokens == 0) { + tierSaleEnded[_tierID] = true; + emit TierSaleEnded(msg.sender, _tierID); + } + tiers[_tierID].minAmount = 0; + emit TierSaleUpdatedMinimum(msg.sender, _tierID); + } + tiers[_tierID].maxAmount = _tierDetails.remainingTokens; + emit TierSaleUpdatedMaximum(msg.sender, _tierID, _tierDetails.remainingTokens); + } + } + /** * @notice Internal function to update the wallet count and tier token sold stat. * @notice _tierID The Tier ID whose stat has to be updated. @@ -596,6 +585,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { uint256 deposit; if (tierDetails.depositType == DepositType.RBTC) { deposit = msg.value; + require(deposit != 0, "OriginsBase: Amount cannot be zero."); } else { require(_amount != 0, "OriginsBase: Amount cannot be zero."); require(address(tierDetails.depositToken) != address(0), "OriginsBase: Deposit Token not set by owner."); @@ -618,18 +608,23 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { tokensBoughtByAddressOnTier[msg.sender][_tierID] = tokensBoughtByAddressOnTier[msg.sender][_tierID].add(tokensBought); /// @notice Checking what type of Transfer to do. - _tokenTransferOnBuy(_tierID, tokensBought); + _tokenTransferOnBuy(tierDetails, tokensBought); /// @notice Updating the tier token parameters. - _updateTierTokenDetailsAfterBuy(_tierID); + _updateTierTokenDetailsAfterBuy(tierDetails, _tierID); /// @notice Updating the stats. _updateWalletCount(_tierID, deposit, tokensBoughtByAddress, tokensBought); /// @notice Refunding the excess funds. if (refund > 0) { - bool txStatus = tierDetails.depositToken.transfer(msg.sender, refund); - require(txStatus, "OriginsBase: Token refund not received by user correctly."); + if (tierDetails.depositType == DepositType.RBTC) { + msg.sender.transfer(refund); + } + else { + bool txStatus = tierDetails.depositToken.transfer(msg.sender, refund); + require(txStatus, "OriginsBase: Token refund not received by user correctly."); + } } emit TokenBuy(msg.sender, _tierID, tokensBought); @@ -649,15 +644,25 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { /// @notice Only withdraw is allowed where sale is ended. Premature withdraw is not allowed. for (uint256 index = 1; index <= tierCount; index++) { - if (tierSaleEnded[index]) { + if (tierSaleEnded[index] && !tierSaleWithdrawn[index]) { + tierSaleWithdrawn[index] = true; uint256 amount = tokensSoldPerTier[index].div(tiers[index].depositRate); + if (tiers[index].depositType == DepositType.RBTC) { receiver.transfer(amount); - emit ProceedingWithdrawn(msg.sender, receiver, index, uint256(DepositType.RBTC), amount); + emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.RBTC, amount); } else { tiers[index].depositToken.transfer(receiver, amount); - emit ProceedingWithdrawn(msg.sender, receiver, index, uint256(DepositType.Token), amount); + emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.Token, amount); } + + uint256 remainingTokens = tiers[index].remainingTokens; + if(remainingTokens > 0){ + token.transfer(receiver, remainingTokens); + tiers[index].remainingTokens = 0; + emit RemainingTokenWithdrawn(msg.sender, receiver, index, remainingTokens); + } + } } } @@ -668,7 +673,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @notice Function to read the tier count. * @return The number of tiers present in the contract. */ - function getTierCount() public view returns (uint256) { + function getTierCount() external view returns (uint256) { return tierCount; } @@ -677,7 +682,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @return The address of the deposit address. * @dev If zero is returned, any of the owners can withdraw the raised funds. */ - function getDepositAddress() public view returns (address) { + function getDepositAddress() external view returns (address) { return depositAddress; } @@ -685,7 +690,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @notice Function to read the token on sale. * @return The Token contract address which is being sold in the contract. */ - function getToken() public view returns (address) { + function getToken() external view returns (address) { return address(token); } @@ -693,7 +698,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @notice Function to read the locked fund contract address. * @return Address of Locked Fund Contract. */ - function getLockDetails() public view returns (address) { + function getLockDetails() external view returns (address) { return address(lockedFund); } @@ -712,7 +717,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @return _depositRate Contains the rate of the token w.r.t. the depositing asset. */ function readTierPartA(uint256 _tierID) - public + external view returns ( uint256 _minAmount, @@ -752,7 +757,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @return _transferType Contains the type of token transfer after a user buys to get the tokens. */ function readTierPartB(uint256 _tierID) - public + external view returns ( address _depositToken, @@ -778,7 +783,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @param _tierID The tier ID for which the address has to be checked. * @return The amount of tokens bought by the address. */ - function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) public view returns (uint256) { + function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) external view returns (uint256) { return tokensBoughtByAddressOnTier[_addr][_tierID]; } @@ -790,7 +795,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * A user can participate on one round and not on other. * In the future maybe a count on that can be created. */ - function getParticipatingWalletCountPerTier(uint256 _tierID) public view returns (uint256) { + function getParticipatingWalletCountPerTier(uint256 _tierID) external view returns (uint256) { return participatingWalletCountPerTier[_tierID]; } @@ -799,7 +804,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @param _tierID The tier ID for which the sold metrics has to be checked. * @return The amount of tokens sold on that tier. */ - function getTokensSoldPerTier(uint256 _tierID) public view returns (uint256) { + function getTokensSoldPerTier(uint256 _tierID) external view returns (uint256) { return tokensSoldPerTier[_tierID]; } @@ -809,7 +814,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @return True is sale ended, False otherwise. * @dev A return of false does not necessary mean the sale is active. It can also be in inactive state. */ - function checkSaleEnded(uint256 _tierID) public view returns (bool _status) { + function checkSaleEnded(uint256 _tierID) external view returns (bool _status) { return tierSaleEnded[_tierID]; } @@ -819,7 +824,7 @@ contract OriginsBase is IOrigins, OriginsAdmin, OriginsEvents, OriginsStorage { * @param _tierID The tier ID for which the address has to be checked. * @return True is allowed, False otherwise. */ - function isAddressApproved(address _addr, uint256 _tierID) public view returns (bool) { + function isAddressApproved(address _addr, uint256 _tierID) external view returns (bool) { return addressApproved[_addr][_tierID]; } } From 2df7e870f370c8827d34f56e8eb9f1b01cab0372 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:50:46 +0530 Subject: [PATCH 060/112] RemainingTokenWithdraw Event Added --- contracts/OriginsEvents.sol | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contracts/OriginsEvents.sol b/contracts/OriginsEvents.sol index 90d4a54..7f55ee7 100644 --- a/contracts/OriginsEvents.sol +++ b/contracts/OriginsEvents.sol @@ -163,4 +163,14 @@ contract OriginsEvents is OriginsAdmin{ DepositType _depositType, uint256 _amount ); + + /** + * @notice Emitted when depositAddress or Owner withdraws a tier remaining token. + * @param _initiator The one who initiates this event. + * @param _receiver The one who receives the remaining tokens. + * @param _tierID The Tier ID of which the proceeding is withdrawn. + * @param _remainingToken The amount of tokens withdrawn. + */ + event RemainingTokenWithdrawn(address indexed _initiator, address indexed _receiver, uint256 _tierID, uint256 _remainingToken); + } From 2a376cf10c10f80c60c7c7a4e8cc54c3382b464d Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:51:17 +0530 Subject: [PATCH 061/112] Multisig Deployment Script Updated --- scripts/deployMultisig.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/deployMultisig.py b/scripts/deployMultisig.py index de9d48a..cf7c639 100644 --- a/scripts/deployMultisig.py +++ b/scripts/deployMultisig.py @@ -22,7 +22,7 @@ def loadConfig(): if thisNetwork == "development": acct = accounts[0] - configFile = open('./scripts/values/testnet.json') + configFile = open('./scripts/values/development.json') elif thisNetwork == "testnet": acct = accounts.load("rskdeployer") configFile = open('./scripts/values/testnet.json') @@ -65,7 +65,9 @@ def deployMultisig(): # ========================================================================================================================================= def writeToJSON(): - if thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + if thisNetwork == "development": + fileHandle = open('./scripts/values/development.json', "w") + elif thisNetwork == "testnet" or thisNetwork == "rsk-testnet": fileHandle = open('./scripts/values/testnet.json', "w") elif thisNetwork == "rsk-mainnet": fileHandle = open('./scripts/values/mainnet.json', "w") From 4f55ef7ac1b6b834f50ccf0c04d92ab74aac863e Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:52:10 +0530 Subject: [PATCH 062/112] LockedFund Deployment Script Updated --- scripts/deployLockedFund.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/scripts/deployLockedFund.py b/scripts/deployLockedFund.py index 1b6025b..3755523 100644 --- a/scripts/deployLockedFund.py +++ b/scripts/deployLockedFund.py @@ -25,16 +25,16 @@ def loadConfig(): if thisNetwork == "development": acct = accounts[0] - configFile = open('./scripts/values/testnet.json') + configFile = open('./scripts/values/development.json') elif thisNetwork == "testnet": acct = accounts.load("rskdeployer") - configFile = open('./scripts/values/testnet.json') + configFile = open('./scripts/values/testnet.json') elif thisNetwork == "rsk-testnet": acct = accounts.load("rskdeployer") - configFile = open('./scripts/values/testnet.json') + configFile = open('./scripts/values/testnet.json') elif thisNetwork == "rsk-mainnet": acct = accounts.load("rskdeployer") - configFile = open('./scripts/values/mainnet.json') + configFile = open('./scripts/values/mainnet.json') else: raise Exception("Network not supported.") @@ -121,7 +121,9 @@ def updateWaitedTS(): # ========================================================================================================================================= def writeToJSON(): - if thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + if thisNetwork == "development": + fileHandle = open('./scripts/values/development.json', "w") + elif thisNetwork == "testnet" or thisNetwork == "rsk-testnet": fileHandle = open('./scripts/values/testnet.json', "w") elif thisNetwork == "rsk-mainnet": fileHandle = open('./scripts/values/mainnet.json', "w") @@ -129,9 +131,10 @@ def writeToJSON(): # ========================================================================================================================================= def waitTime(): - print("\nWaiting for 30 seconds for the node to propogate correctly...\n") - time.sleep(15) - print("Just 15 more seconds...\n") - time.sleep(10) - print("5 more seconds I promise...\n") - time.sleep(5) + if(thisNetwork != "development"): + print("\nWaiting for 30 seconds for the node to propogate correctly...\n") + time.sleep(15) + print("Just 15 more seconds...\n") + time.sleep(10) + print("5 more seconds I promise...\n") + time.sleep(5) From c89c9c0e20daa24f0c3a1d8d0b2852e44658f73d Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:52:47 +0530 Subject: [PATCH 063/112] Testnet Contracts JSON Updated --- scripts/values/testnet.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index 9833f75..b318071 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -21,7 +21,7 @@ "minimumAmount": "1", "maximumAmount": "50000000000000000", "tokensForSale": "11508000", - "saleStartTimestamp": "0", + "saleStartTimestamp": "1624233600", "saleEnd": "172800", "unlockedBP": "0", "vestOrLockCliff": "1", @@ -37,7 +37,7 @@ "minimumAmount": "1", "maximumAmount": "75000000000000000", "tokensForSale": "20000000", - "saleStartTimestamp": "0", + "saleStartTimestamp": "1624406400", "saleEnd": "172800", "unlockedBP": "5000", "vestOrLockCliff": "1", From f6574020709f4537e807088bfede5f1c932b8c0d Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:53:06 +0530 Subject: [PATCH 064/112] Development Contracts JSON Added --- scripts/values/development.json | 63 +++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 scripts/values/development.json diff --git a/scripts/values/development.json b/scripts/values/development.json new file mode 100644 index 0000000..6ba8d3d --- /dev/null +++ b/scripts/values/development.json @@ -0,0 +1,63 @@ +{ + "token": "0xDeB0f280a80cD060e452eDBa6c8132997F8119b6", + "decimal": "18", + "multisigOwners": [ + "0x77149f8EEa7A9A601E810e032C196b2419afd6fb", + "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", + "0xf8D704575f88035F694136E465E72E9B7d49d453" + ], + "multisig": "0xF875bc8E556d6908Ad9Cc275e4f5f7b514a0b0De", + "initialAdmin": "0x77149f8EEa7A9A601E810e032C196b2419afd6fb", + "originsVerifiers": [ + "0x77149f8EEa7A9A601E810e032C196b2419afd6fb" + ], + "depositAddress": "0xB594a05f0118F071A7978a7e26834CBFd30cec53", + "waitedTimestamp": "1624317500", + "vestingRegistry": "0xBE62193751BdFBc4976B22CCE09511AA0d40BF17", + "origins": "0xB22691778D55F4B79F594264d14b71276Dca3C38", + "lockedFund": "0xE9f15545367F1eAcA292fa0D70E527c729701d9a", + "tiers": [ + { + "minimumAmount": "0", + "maximumAmount": "50000000000000000", + "tokensForSale": "11508000", + "saleStartTimestamp": "1624233600", + "saleEnd": "172800", + "unlockedBP": "0", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "100", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "2", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + }, + { + "minimumAmount": "0", + "maximumAmount": "75000000000000000", + "tokensForSale": "20000000", + "saleStartTimestamp": "1624406400", + "saleEnd": "172800", + "unlockedBP": "5000", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "50", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "2", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + } + ], + "toVerify": [ + "0x54b8Aef719B63Ef9354b618AC1828b71EE6e496D", + "0xa41f08993b6d4dE3281F31492F7a93D6F403806B", + "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", + "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", + "0x7d20eaa96aDbFe158C222210E7A8c05c44Da9d15", + "0x2bD2201bfe156a71EB0d02837172FFc237218505", + "0xA987a709f4A93eC25738FeC0F8d6189260459ed7" + ], + "verified": [] +} \ No newline at end of file From 9925e1f14f096d3e3da55c050af7cb4a9d745d00 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 12:58:34 +0530 Subject: [PATCH 065/112] Base and Event Code Formatted --- contracts/OriginsBase.sol | 10 ++++------ contracts/OriginsEvents.sol | 3 +-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index cbf01a4..83eed0f 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -69,7 +69,7 @@ contract OriginsBase is OriginsEvents { * Some are currently sent with default value due to Stack Too Deep problem. */ function createTier( - uint256 _maxAmount, + uint256 _maxAmount, uint256 _remainingTokens, uint256 _saleStartTS, uint256 _saleEnd, @@ -434,7 +434,7 @@ contract OriginsBase is OriginsEvents { } else if ((_saleStartTS != 0 || _saleEnd != 0) && _saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp) { require(_saleStartTS < _saleEnd, "OriginsBase: The sale start TS cannot be after sale end TS."); } - if(saleEndTS != 0){ + if (saleEndTS != 0) { require(saleEndTS > block.timestamp, "OriginsBase: The sale end duration cannot be past already."); } @@ -620,8 +620,7 @@ contract OriginsBase is OriginsEvents { if (refund > 0) { if (tierDetails.depositType == DepositType.RBTC) { msg.sender.transfer(refund); - } - else { + } else { bool txStatus = tierDetails.depositToken.transfer(msg.sender, refund); require(txStatus, "OriginsBase: Token refund not received by user correctly."); } @@ -657,12 +656,11 @@ contract OriginsBase is OriginsEvents { } uint256 remainingTokens = tiers[index].remainingTokens; - if(remainingTokens > 0){ + if (remainingTokens > 0) { token.transfer(receiver, remainingTokens); tiers[index].remainingTokens = 0; emit RemainingTokenWithdrawn(msg.sender, receiver, index, remainingTokens); } - } } } diff --git a/contracts/OriginsEvents.sol b/contracts/OriginsEvents.sol index 7f55ee7..f786695 100644 --- a/contracts/OriginsEvents.sol +++ b/contracts/OriginsEvents.sol @@ -7,7 +7,7 @@ import "./OriginsAdmin.sol"; * @author Franklin Richards - powerhousefrank@protonmail.com * @notice You can use this contract for adding events into Origins Base. */ -contract OriginsEvents is OriginsAdmin{ +contract OriginsEvents is OriginsAdmin { /* Events */ /** @@ -172,5 +172,4 @@ contract OriginsEvents is OriginsAdmin{ * @param _remainingToken The amount of tokens withdrawn. */ event RemainingTokenWithdrawn(address indexed _initiator, address indexed _receiver, uint256 _tierID, uint256 _remainingToken); - } From 94767b63445c593e720115944a12864dac0f8a51 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 17:23:01 +0530 Subject: [PATCH 066/112] Deploy Locked Script Updated --- scripts/deployLockedFund.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/deployLockedFund.py b/scripts/deployLockedFund.py index 3755523..d4280e5 100644 --- a/scripts/deployLockedFund.py +++ b/scripts/deployLockedFund.py @@ -77,7 +77,7 @@ def deployLockedFund(): vestingRegistry = values['vestingRegistry'] adminList = [values['multisig'], values['initialAdmin']] - print("=============================================================") + print("\n=============================================================") print("Deployment Parameters for LockedFund") print("=============================================================") print("Waited Timestamp: ", waitedTS) @@ -94,28 +94,28 @@ def deployLockedFund(): # ========================================================================================================================================= def addOriginsAsAdmin(): lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) - print("Adding Origins as an admin to LockedFund...\n") + print("\nAdding Origins as an admin to LockedFund...\n") lockedFund.addAdmin(values['origins']) print("Added Origins as", values['origins'], " as an admin of Locked Fund.") # ========================================================================================================================================= def removeMyselfAsAdmin(): lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) - print("Removing myself as an admin to LockedFund...\n") + print("\nRemoving myself as an admin to LockedFund...\n") lockedFund.removeAdmin(acct) print("Removed myself as", acct, " as an admin of Locked Fund.") # ========================================================================================================================================= def updateVestingRegistry(): lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) - print("Updating Vesting Registry of LockedFund...\n") + print("\nUpdating Vesting Registry of LockedFund...\n") lockedFund.changeVestingRegistry(values['vestingRegistry']) print("Updated Vesting Registry as", values['vestingRegistry'], " of LockedFund...\n") # ========================================================================================================================================= def updateWaitedTS(): lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) - print("Updating Waited Timestamp of LockedFund...\n") + print("\nUpdating Waited Timestamp of LockedFund...\n") lockedFund.changeWaitedTS(values['waitedTimestamp']) print("Updated Waited Timestamp as", values['waitedTimestamp'], " of LockedFund...\n") From 7ee3910ea4993080507b35983ae5b0d747375a5c Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 17:23:23 +0530 Subject: [PATCH 067/112] JSON Values Updated --- scripts/values/development.json | 3 +++ scripts/values/mainnet.json | 9 ++++++--- scripts/values/testnet.json | 15 +++++++++------ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/scripts/values/development.json b/scripts/values/development.json index 6ba8d3d..81dc788 100644 --- a/scripts/values/development.json +++ b/scripts/values/development.json @@ -17,6 +17,9 @@ "origins": "0xB22691778D55F4B79F594264d14b71276Dca3C38", "lockedFund": "0xE9f15545367F1eAcA292fa0D70E527c729701d9a", "tiers": [ + { + "DONT_DELETE_THIS": "This acts as the zero index entry in SC which has to be skipped." + }, { "minimumAmount": "0", "maximumAmount": "50000000000000000", diff --git a/scripts/values/mainnet.json b/scripts/values/mainnet.json index b3d1913..e805153 100644 --- a/scripts/values/mainnet.json +++ b/scripts/values/mainnet.json @@ -17,6 +17,9 @@ "origins": "", "lockedFund": "", "tiers": [ + { + "DONT_DELETE_THIS": "This acts as the zero index entry in SC which has to be skipped." + }, { "minimumAmount": "", "maximumAmount": "", @@ -45,11 +48,11 @@ "depositRate": "50", "depositToken": "0x0000000000000000000000000000000000000000", "depositType": "0", - "verificationType": "2", + "verificationType": "1", "saleEndDurationOrTimestamp": "2", "transferType": "3" } ], - "toWhitelist": [], - "whitelisted": [] + "toVerify": [], + "verified": [] } \ No newline at end of file diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index b318071..554156d 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -12,11 +12,14 @@ "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222" ], "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", - "waitedTimestamp": "1624317500", + "waitedTimestamp": "1624579200", "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509", - "origins": "0x4083f95624f7118996e3fA8D43B803F9F3aEE097", - "lockedFund": "0xC2C12474e4A2456E40366Bd029f6deE80f9d2Dc1", + "origins": "0x576E7dEce0d3A432a3Fe00DbE130707A7EBde5C1", + "lockedFund": "0x0dAc53C5E204C949128e476917CDE7248da1f68E", "tiers": [ + { + "DONT_DELETE_THIS": "This acts as the zero index entry in SC which has to be skipped." + }, { "minimumAmount": "1", "maximumAmount": "50000000000000000", @@ -45,12 +48,12 @@ "depositRate": "50", "depositToken": "0x0000000000000000000000000000000000000000", "depositType": "0", - "verificationType": "2", + "verificationType": "1", "saleEndDurationOrTimestamp": "2", "transferType": "3" } ], - "toWhitelist": [ + "toVerify": [ "0x54b8Aef719B63Ef9354b618AC1828b71EE6e496D", "0xa41f08993b6d4dE3281F31492F7a93D6F403806B", "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", @@ -59,5 +62,5 @@ "0x2bD2201bfe156a71EB0d02837172FFc237218505", "0xA987a709f4A93eC25738FeC0F8d6189260459ed7" ], - "whitelisted": [] + "verified": [] } \ No newline at end of file From a2c135288a14dfa5c2a3fb4e89188e6cabb87e53 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 17:26:21 +0530 Subject: [PATCH 068/112] Origins Deployment Script Added --- scripts/deployOrigins.py | 458 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 458 insertions(+) create mode 100644 scripts/deployOrigins.py diff --git a/scripts/deployOrigins.py b/scripts/deployOrigins.py new file mode 100644 index 0000000..a23a18a --- /dev/null +++ b/scripts/deployOrigins.py @@ -0,0 +1,458 @@ +from brownie import * + +import time +import json +import sys +import csv +import math + +def main(): + loadConfig() + + balanceBefore = acct.balance() + choice() + balanceAfter = acct.balance() + + print("=============================================================") + print("RSK Before Balance: ", balanceBefore) + print("RSK After Balance: ", balanceAfter) + print("Gas Used: ", balanceBefore - balanceAfter) + print("=============================================================") + +# ========================================================================================================================================= +def loadConfig(): + global values, acct, thisNetwork + thisNetwork = network.show_active() + + if thisNetwork == "development": + acct = accounts[0] + configFile = open('./scripts/values/development.json') + elif thisNetwork == "testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/values/testnet.json') + elif thisNetwork == "rsk-testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/values/testnet.json') + elif thisNetwork == "rsk-mainnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/values/mainnet.json') + else: + raise Exception("Network not supported.") + + # Load deployment parameters and contracts addresses + values = json.load(configFile) + +# ========================================================================================================================================= +def choice(): + repeat = True + while(repeat): + print("\nOptions:") + print("1 for Deploying Origins.") + print("2 for Updating/Adding Deposit Address.") + print("3 for Setting Locked Fund.") + print("4 for Creating a new Tier.") + print("5 for Setting Tier Verification.") + print("6 for Setting Tier Deposit Parameters.") + print("7 for Setting Tier Token Limit Parameters.") + print("8 for Setting Tier Token Amount Parameters.") + print("9 for Setting Tier Vest or Lock Parameters.") + print("10 for Setting Tier Time Parameters.") + print("11 for Buying Tokens.") + print("12 for Adding Myself as a Verifier.") + print("13 for Verifying Wallet List with Tier ID") + print("14 for Removing Myself as an Owner.") + print("15 for Removing Myself as a Verifier.") + print("16 for getting the Tier Count.") + print("17 for getting the Tier Details.") + print("18 for getting the Owner Details.") + print("19 for getting the Verifier Details.") + print("20 to exit.") + selection = int(input("Enter the choice: ")) + if(selection == 1): + deployOrigins() + elif(selection == 2): + updateDepositAddress() + elif(selection == 3): + updateLockedFund() + elif(selection == 4): + createNewTier() + elif(selection == 5): + setTierVerification() + elif(selection == 6): + setTierDeposit() + elif(selection == 7): + setTierTokenLimit() + elif(selection == 8): + setTierTokenAmount() + elif(selection == 9): + setTierVestOrLock() + elif(selection == 10): + setTierTime() + elif(selection == 11): + buyTokens() + elif(selection == 12): + addMyselfAsVerifier() + elif(selection == 13): + verifyWallet() + elif(selection == 14): + removeMyselfAsOwner() + elif(selection == 15): + removeMyselfAsVerifier() + elif(selection == 16): + getTierCount() + elif(selection == 17): + getTierDetails() + elif(selection == 18): + getOwnerList() + elif(selection == 19): + getVerifierList() + elif(selection == 20): + repeat = False + else: + print("\nSmarter people have written this, enter valid selection ;)\n") + +# ========================================================================================================================================= +def deployOrigins(): + adminList = [values['multisig'], values['initialAdmin']] + token = values['token'] + depositAddress = values['depositAddress'] + + print("\n=============================================================") + print("Deployment Parameters for Origins") + print("=============================================================") + print("Admin List: ", adminList) + print("Token Address: ", token) + print("Deposit Address: ", depositAddress) + print("=============================================================") + + origins = acct.deploy(OriginsBase, adminList, token, depositAddress) + + values['origins'] = str(origins) + writeToJSON() + +# ========================================================================================================================================= +def updateDepositAddress(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nUpdating Deposit Address of Origins...\n") + origins.setDepositAddress(values['depositAddress']) + print("Updated Deposit Address as", values['depositAddress'], " of Origins...\n") + +# ========================================================================================================================================= +def updateLockedFund(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nUpdating Locked Fund Contract Address of Origins...\n") + origins.setLockedFund(values['lockedFund']) + print("Updated Locked Fund Contract Address as", values['lockedFund'], " of Origins...\n") + +# ========================================================================================================================================= +def readTier(reason): + print("\nIf you want to",reason,"the first tier, i.e. Index = 1 in JSON `tiers`, enter 1.") + tierID = int(input("Enter the Tier ID (Based on JSON File): ")) + return tierID + +# ========================================================================================================================================= +def getDepositType(depositType): + if depositType == 0: + return "RBTC" + elif depositType == 1: + return "Token" + else: + return "Invalid Entry!" + +# ========================================================================================================================================= +def getVerificationType(verificationType): + if verificationType == 0: + return "None" + elif verificationType == 1: + return "Everyone" + elif verificationType == 2: + return "ByAddress" + else: + return "Invalid Entry!" + +# ========================================================================================================================================= +def getSaleEndDurationOrTS(saleEndDurationOrTimestamp): + if saleEndDurationOrTimestamp == 0: + return "None" + elif saleEndDurationOrTimestamp == 1: + return "UntilSupply" + elif saleEndDurationOrTimestamp == 2: + return "Duration" + elif saleEndDurationOrTimestamp == 3: + return "Timestamp" + else: + return "Invalid Entry!" + +# ========================================================================================================================================= +def getTransferType(transferType): + if transferType == 0: + return "None" + elif transferType == 1: + return "Unlocked" + elif transferType == 2: + return "WaitedUnlock" + elif transferType == 3: + return "Vested" + elif transferType == 4: + return "Locked" + else: + return "Invalid Entry!" + +# ========================================================================================================================================= +def makeAllowance(tokenObj, spender, amount): + print("\nApproving Token Transfer from", acct, " to", spender) + tokenObj.approve(spender, amount) + print("Token Transfer Approved...") + +# ========================================================================================================================================= +def checkAllowance(tokenObj, spender, amount): + if(tokenObj.allowance(acct, spender) < amount): + if thisNetwork == "rsk-mainnet": + print("\nNot enough token approved. Please approve the spender.") + print("1 for approve.") + print("Anything else for exit.") + selection = int(input("Enter Choice: ")) + if(selection == 1): + makeAllowance(tokenObj, spender, amount) + else: + sys.exit() + else: + makeAllowance(tokenObj, spender, amount) + +# ========================================================================================================================================= +def createNewTier(): + tierID = readTier("add") + + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + + # IMPORTANT TODO: It is removed for the current sale, but has to be reimplemented in the future. + # minAmount = values['tiers'][tierID]['minimumAmount'] + + maxAmount = values['tiers'][tierID]['maximumAmount'] + tokensForSale = int(values['tiers'][tierID]['tokensForSale']) + decimal = int(values['decimal']) + remainingTokens = tokensForSale * (10 ** decimal) + saleStartTimestamp = values['tiers'][tierID]['saleStartTimestamp'] + saleEnd = values['tiers'][tierID]['saleEnd'] + + # IMPORTANT TODO: This needs to be changed in the future when adding Origins the capability + # to call the Locked Fund Contract to set the waitedTS. + # unlockedTS = values['waitedTimestamp'] + + unlockedBP = values['tiers'][tierID]['unlockedBP'] + vestOrLockCliff = values['tiers'][tierID]['vestOrLockCliff'] + vestOrLockDuration = values['tiers'][tierID]['vestOrLockDuration'] + depositRate = values['tiers'][tierID]['depositRate'] + + # IMPORTANT TODO: It is removed for the current sale, but has to be reimplemented in the future. + # depositToken = values['tiers'][tierID]['depositToken'] + + depositType = values['tiers'][tierID]['depositType'] + depositTypeReadable = getDepositType(int(depositType)) + verificationType = values['tiers'][tierID]['verificationType'] + verificationTypeReadable = getVerificationType(int(verificationType)) + saleEndDurationOrTimestamp = values['tiers'][tierID]['saleEndDurationOrTimestamp'] + saleEndDurationOrTimestampReadable = getSaleEndDurationOrTS(int(saleEndDurationOrTimestamp)) + transferType = values['tiers'][tierID]['transferType'] + transferTypeReadable = getTransferType(int(transferType)) + + print("\n=============================================================") + print("Tier Parameters:") + print("=============================================================") + # print("Minimum allowed asset: ", minAmount) + print("Maximum allowed asset: ", maxAmount) + print("Tokens For Sale (with Decimal): ", tokensForSale) + print("Tokens For Sale (without Decimal): ", remainingTokens) + print("Sale Start Timestamp: ", saleStartTimestamp) + print("Sale End Duration/Timestamp: ", saleEnd) + # print("Unlocked Token Timestamp: ", unlockedTS) + print("Unlocked Token Basis Point: ", unlockedBP) + print("Vest Or Lock Cliff: ", vestOrLockCliff) + print("Vest Or Lock Duration: ", vestOrLockDuration) + print("Deposit Rate: ", depositRate) + # print("Deposit Token: ", depositToken) + print("Deposit Type: ", depositTypeReadable) + print("Verification Type: ", verificationTypeReadable) + print("Sale End Duration or Timestamp: ", saleEndDurationOrTimestampReadable) + print("Transfer Type: ", transferTypeReadable) + print("=============================================================") + + if(depositTypeReadable == "Invalid Entry!" or verificationTypeReadable == "Invalid Entry!" or saleEndDurationOrTimestampReadable == "Invalid Entry!" or transferTypeReadable == "Invalid Entry!"): + print("\nPlease check the types and tier parameters.") + sys.exit() + + token = Contract.from_abi("Token", address=values['token'], abi=Token.abi, owner=acct) + checkAllowance(token, origins.address, remainingTokens) + + balance = token.balanceOf(acct) + print("\nCurrent User Token Balance:",balance) + + print("\nCreating new tier...") + # Based on the new parameters added on the TODO above, need to add the parameters here as well. + origins.createTier(maxAmount, remainingTokens, saleStartTimestamp, saleEnd, unlockedBP, vestOrLockCliff, vestOrLockDuration, depositRate, depositType, verificationType, saleEndDurationOrTimestamp, transferType) + + balance = token.balanceOf(acct) + print("Updated User Token Balance:",balance) + +# ========================================================================================================================================= +def setTierVerification(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierVerification(tierID, values['tiers'][tierID]['verificationType']) + print("Tier Verification Updated.") + +# ========================================================================================================================================= +def setTierDeposit(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierDeposit(tierID, values['tiers'][tierID]['depositRate'], values['tiers'][tierID]['depositToken'], values['tiers'][tierID]['depositType']) + print("Tier Deposit Updated.") + +# ========================================================================================================================================= +def setTierTokenLimit(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierTokenLimit(tierID, values['tiers'][tierID]['minimumAmount'], values['tiers'][tierID]['maximumAmount']) + print("Tier Token Limit Updated.") + +# ========================================================================================================================================= +def setTierTokenAmount(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + tokensForSale = int(values['tiers'][tierID]['tokensForSale']) + decimal = int(values['decimal']) + remainingTokens = tokensForSale * (10 ** decimal) + origins.setTierTokenAmount(tierID, remainingTokens) + print("Tier Token Amount Updated.") + +# ========================================================================================================================================= +def setTierVestOrLock(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierVestOrLock(tierID, values['tiers'][tierID]['vestOrLockCliff'], values['tiers'][tierID]['vestOrLockDuration'], values['waitedTimestamp'], values['tiers'][tierID]['unlockedBP'], values['tiers'][tierID]['transferType']) + print("Tier Vest or Lock Updated.") + +# ========================================================================================================================================= +def setTierTime(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierTime(tierID, values['tiers'][tierID]['saleStartTimestamp'], values['tiers'][tierID]['saleEnd'], values['tiers'][tierID]['saleEndDurationOrTimestamp']) + print("Tier Time Updated.") + +# ========================================================================================================================================= +def buyTokens(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + tierID = readTier("buy tokens in") + amount = 0 + rbtcAmount = 0 + print("\nIf you want to send just `X` RBTC/Token, put 1 itself, (X * (10 ** Decimals)) is done behind the screen.") + amount = int(input("Enter the amount of tokens/RBTC you want to send: ")) + if(values['tiers'][tierID]['depositToken'] != '0x0000000000000000000000000000000000000000'): + token = Contract.from_abi("Token", address=values['tiers'][tierID]['depositToken'], abi=Token.abi, owner=acct) + checkAllowance(token, origins.address, amount) + origins.buy(tierID, amount, {'value':rbtcAmount}) + +# ========================================================================================================================================= +def addMyselfAsVerifier(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.addVerifier(acct) + print("Added",acct,"as a verifier.") + +# ========================================================================================================================================= +def verifyWallet(): + tierID = readTier("add the wallet list to") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.multipleAddressSingleTierVerification(values['toVerify'], tierID) + print("All the address Verified.") + +# ========================================================================================================================================= +def removeMyselfAsVerifier(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nRemoving myself as a Verifier...") + origins.removeVerifier(acct) + print("Removed myself as a Verifier.") + +# ========================================================================================================================================= +def removeMyselfAsOwner(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nRemoving myself as an Owner...") + origins.removeOwner(acct) + print("Removed myself as an Owner.") + +# ========================================================================================================================================= +def getTierCount(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\n=============================================================") + print("Tier Count:",origins.getTierCount()) + print("=============================================================") + +# ========================================================================================================================================= +def getTierDetails(): + # Here +1 is added because readTier will return 0 for entering 1. The index in Smart Contract is 1 itself, unlike the JSON file. + tierID = readTier("read") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + + minAmount, maxAmount, remainingTokens, saleStartTimestamp, saleEnd, unlockedTS, unlockedBP, vestOrLockCliff, vestOrLockDuration, depositRate = origins.readTierPartA(tierID) + depositToken, depositType, verificationType, saleEndDurationOrTimestamp, transferType = origins.readTierPartB(tierID) + + decimal = int(values['decimal']) + tokensForSale = remainingTokens / (10 ** decimal) + depositTypeReadable = getDepositType(int(depositType)) + verificationTypeReadable = getVerificationType(int(verificationType)) + saleEndDurationOrTimestampReadable = getSaleEndDurationOrTS(int(saleEndDurationOrTimestamp)) + transferTypeReadable = getTransferType(int(transferType)) + + print("\n=============================================================") + print("Tier Details of Tier ID",tierID) + print("=============================================================") + print("Minimum allowed asset: ", minAmount) + print("Maximum allowed asset: ", maxAmount) + print("Tokens For Sale (with Decimal): ", tokensForSale) + print("Tokens For Sale (without Decimal): ", remainingTokens) + print("Sale Start Timestamp: ", saleStartTimestamp) + print("Sale End Duration/Timestamp: ", saleEnd) + # print("Unlocked Token Timestamp: ", unlockedTS) + print("Unlocked Token Basis Point: ", unlockedBP) + print("Vest Or Lock Cliff: ", vestOrLockCliff) + print("Vest Or Lock Duration: ", vestOrLockDuration) + print("Deposit Rate: ", depositRate) + print("Deposit Token: ", depositToken) + print("Deposit Type: ", depositTypeReadable) + print("Verification Type: ", verificationTypeReadable) + print("Sale End Duration or Timestamp: ", saleEndDurationOrTimestampReadable) + print("Transfer Type: ", transferTypeReadable) + print("=============================================================") + +# ========================================================================================================================================= +def getOwnerList(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\n=============================================================") + print("Owner List: ",origins.getOwners()) + print("=============================================================") + +# ========================================================================================================================================= +def getVerifierList(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\n=============================================================") + print("Verifier List: ",origins.getVerifiers()) + print("=============================================================") + +# ========================================================================================================================================= +def writeToJSON(): + if thisNetwork == "development": + fileHandle = open('./scripts/values/development.json', "w") + elif thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + fileHandle = open('./scripts/values/testnet.json', "w") + elif thisNetwork == "rsk-mainnet": + fileHandle = open('./scripts/values/mainnet.json', "w") + json.dump(values, fileHandle, indent=4) + +# ========================================================================================================================================= +def waitTime(): + if(thisNetwork != "development"): + print("\nWaiting for 30 seconds for the node to propogate correctly...\n") + time.sleep(15) + print("Just 15 more seconds...\n") + time.sleep(10) + print("5 more seconds I promise...\n") + time.sleep(5) From 1151416251b48b0f4ecc4439bebf34f4affb99af Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Mon, 21 Jun 2021 17:26:46 +0530 Subject: [PATCH 069/112] Origins README added. --- scripts/README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 scripts/README.md diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..e00b87a --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,55 @@ +## Prerequisite + +Please fill the below details in mainnet.json (or the corresponding network JSON files): +- Token Contract in `token` +- Token Decimals in `decimal` +- Multisig Owners in `multisigOwners` +- Initial Admin in `initialAdmin`, this should be the EOA which runs this script. Don't forget to remove yourself as an admin. It is recommended to use a multisig as the sole admin after initial setup. +- Verifier in `originsVerifiers`, this address will be adding the address list which has to be verified to a particular tier. +- Deposit Address in `depositAddress`, this address will receive the sale proceedings from the sale. Recommended to use a multisig provided by the Token Owners. +- Token Release Time in `waitedTimestamp`, after this time, users who bought tokens in any tier with Transfer Type of Sale anything apart from `Unlocked` will be able to claim/vest their token in Locked Fund Contract. +- Populate the tiers as per the tier details. + +## Steps: + +1. Create a multisig, if not already created. If already created, please add that to `multisig` in the JSON file to the corresponding network. + +To create: + +``` +brownie run scripts/deployMultisig.py --network [ENTER DESIRED NETWORK] +``` + +2. Create the Locked Fund Contract. + +To create: + +``` +brownie run scripts/deployLockedFund.py --network [ENTER DESIRED NETWORK] +``` + +Then select the correct option to deploy Locked Fund Contract. + +3. Create the Origins Platform. + +To create: + +``` +brownie run scripts/deployOrigins.py --network [ENTER DESIRED NETWORK] +``` + +Then select the correct option to deploy Origins. + +4. Once the Origins is created, tiers has to be created. And required things to be set. There is an option when running `deployOrigins` to create tier. Select that, and add the tier ID based on JSON to add the tier in smart contract. + +5. Set the `waitedTS` of Locked Fund. Running the `deployLockedFund` will show an option for the same. + +6. Set the origins as an admin of Locked Fund. Similar to above, running the `deployLockedFund` will show an option for the same. + +7. Other things to do after things are deployed: + - If the verification type is `ByAddress` (Optional): + - Add yourself as a Verifier to verify address. + - Verify Addresses, if the verification type is `ByAddress`. (Currently it takes all the addresses at once and tries to verify, need to sequentialize that to take X number of wallets at once. A CSV parsed sequential list taker has to be built.) + - Remove yourself as a whitelister. + - Remove yourself as an Owner of Origins Platform. + - Remove yourself as an Owner of Locked Fund. \ No newline at end of file From f134aaa3406affec376c7cca855ae8064a8d5131 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 22 Jun 2021 14:17:30 +0530 Subject: [PATCH 070/112] Transfer check added --- contracts/OriginsBase.sol | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index 83eed0f..c82aa57 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -492,7 +492,8 @@ contract OriginsBase is OriginsEvents { require(_tierDetails.transferType != TransferType.None, "OriginsBase: Transfer Type not set by owner"); if (_tierDetails.transferType == TransferType.Unlocked) { - token.transfer(msg.sender, _tokensBought); + bool txStatus = token.transfer(msg.sender, _tokensBought); + require(txStatus, "OriginsBase: User didn't received the tokens correctly."); } else if (_tierDetails.transferType == TransferType.WaitedUnlock) { /// TODO Call LockedFund Contract to release the token after a certain period. /// TODO approve LockedFund @@ -651,14 +652,16 @@ contract OriginsBase is OriginsEvents { receiver.transfer(amount); emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.RBTC, amount); } else { - tiers[index].depositToken.transfer(receiver, amount); + bool txStatus = tiers[index].depositToken.transfer(receiver, amount); + require(txStatus, "OriginsBase: Admin didn't received the tokens correctly."); emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.Token, amount); } uint256 remainingTokens = tiers[index].remainingTokens; if (remainingTokens > 0) { - token.transfer(receiver, remainingTokens); tiers[index].remainingTokens = 0; + bool txStatus = token.transfer(receiver, remainingTokens); + require(txStatus, "OriginsBase: User didn't received the tokens correctly."); emit RemainingTokenWithdrawn(msg.sender, receiver, index, remainingTokens); } } From 61b8724bd72fa3f78854096994784d9f8aa78e83 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 22 Jun 2021 19:52:31 +0530 Subject: [PATCH 071/112] Rectified token calculation in OriginsBase --- contracts/OriginsBase.sol | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index c82aa57..67b7922 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -580,7 +580,7 @@ contract OriginsBase is OriginsEvents { uint256 tokensBoughtByAddress = tokensBoughtByAddressOnTier[msg.sender][_tierID]; /// @notice Checking if the user already reached the maximum amount. - require(tokensBoughtByAddress < tierDetails.maxAmount, "OriginsBase: User already bought maximum allowed."); + require(tokensBoughtByAddress < tierDetails.maxAmount.div(tierDetails.depositRate), "OriginsBase: User already bought maximum allowed."); /// @notice Checking which deposit type is selected. uint256 deposit; @@ -594,13 +594,14 @@ contract OriginsBase is OriginsEvents { require(txStatus, "OriginsBase: Not enough token supplied by user for buying."); deposit = _amount; } + require(deposit >= tierDetails.minAmount, "OriginsBase: Deposit is less than minimum allowed."); /// @notice Checking what should be the allowed deposit amount. uint256 refund; - require(deposit >= tierDetails.minAmount, "OriginsBase: Deposit is less than minimum allowed."); - if (tierDetails.maxAmount.sub(tokensBoughtByAddress) <= deposit) { - refund = deposit.add(tokensBoughtByAddress).sub(tierDetails.maxAmount); - deposit = tierDetails.maxAmount.sub(tokensBoughtByAddress); + uint256 boughtInAsset = tokensBoughtByAddress.div(tierDetails.depositRate); + if (tierDetails.maxAmount.sub(boughtInAsset) <= deposit) { + refund = deposit.add(boughtInAsset).sub(tierDetails.maxAmount); + deposit = tierDetails.maxAmount.sub(boughtInAsset); } /// @notice actual buying happens here. From db48ccf20a033700b444023737497053dbef268c Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 22 Jun 2021 20:21:39 +0530 Subject: [PATCH 072/112] Testnet Address Updated --- scripts/values/testnet.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index 554156d..aa59d16 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -14,7 +14,7 @@ "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", "waitedTimestamp": "1624579200", "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509", - "origins": "0x576E7dEce0d3A432a3Fe00DbE130707A7EBde5C1", + "origins": "0x614528858f1D4e6D3e9Ef4f868771c93b4799D90", "lockedFund": "0x0dAc53C5E204C949128e476917CDE7248da1f68E", "tiers": [ { @@ -25,7 +25,7 @@ "maximumAmount": "50000000000000000", "tokensForSale": "11508000", "saleStartTimestamp": "1624233600", - "saleEnd": "172800", + "saleEnd": "259200", "unlockedBP": "0", "vestOrLockCliff": "1", "vestOrLockDuration": "11", @@ -40,7 +40,7 @@ "minimumAmount": "1", "maximumAmount": "75000000000000000", "tokensForSale": "20000000", - "saleStartTimestamp": "1624406400", + "saleStartTimestamp": "1624492800", "saleEnd": "172800", "unlockedBP": "5000", "vestOrLockCliff": "1", From fd1b25c9ae2e717e821fe47b10f9c4c1a9f77c3c Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 22 Jun 2021 20:22:07 +0530 Subject: [PATCH 073/112] Solcover updated --- .solcover.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.solcover.js b/.solcover.js index f64b422..7104a0b 100644 --- a/.solcover.js +++ b/.solcover.js @@ -1,3 +1,3 @@ module.exports = { - skipFiles: ['helpers', 'openzeppelin'] + skipFiles: ['Sovryn', 'Openzeppelin', 'Interfaces'] }; \ No newline at end of file From 4f44a836c4524be1b0025d0ac56718fcf5a6d37b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 22 Jun 2021 20:22:44 +0530 Subject: [PATCH 074/112] LockedFund Script Updated --- scripts/deployLockedFund.py | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/scripts/deployLockedFund.py b/scripts/deployLockedFund.py index d4280e5..f64e995 100644 --- a/scripts/deployLockedFund.py +++ b/scripts/deployLockedFund.py @@ -47,23 +47,26 @@ def choice(): while(repeat): print("\nOptions:") print("1 for Deploying Locked Fund.") - print("2 for Adding Origins as an Admin.") - print("3 for Removing yourself as an Admin.") - print("4 for Updating Vesting Registry.") - print("5 for Updating waited timestamp.") - print("6 to exit.") + print("2 for Adding LockedFund as an Admin of Vesting Registry.") + print("3 for Adding Origins as an Admin.") + print("4 for Removing yourself as an Admin.") + print("5 for Updating Vesting Registry.") + print("6 for Updating waited timestamp.") + print("7 to exit.") selection = int(input("Enter the choice: ")) if(selection == 1): deployLockedFund() elif(selection == 2): - addOriginsAsAdmin() + addLockedFundAsAdmin() elif(selection == 3): - removeMyselfAsAdmin() + addOriginsAsAdmin() elif(selection == 4): - updateVestingRegistry() + removeMyselfAsAdmin() elif(selection == 5): - updateWaitedTS() + updateVestingRegistry() elif(selection == 6): + updateWaitedTS() + elif(selection == 7): repeat = False else: print("\nSmarter people have written this, enter valid selection ;)\n") @@ -88,9 +91,24 @@ def deployLockedFund(): lockedFund = acct.deploy(LockedFund, waitedTS, token, vestingRegistry, adminList) + print("\nLocked Fund Deployed.") + print("\nAdding LockedFund as an admin of Vesting Registry.") + + vestingRegistry = Contract.from_abi("VestingRegistry", address=values['vestingRegistry'], abi=VestingRegistry.abi, owner=acct) + vestingRegistry.addAdmin(lockedFund.address) + + print("\nAdded Locked Fund:",lockedFund.address,"as the admin of Vesting Registry:", values['vestingRegistry']) + values['lockedFund'] = str(lockedFund) writeToJSON() +# ========================================================================================================================================= +def addLockedFundAsAdmin(): + vestingRegistry = Contract.from_abi("VestingRegistry", address=values['vestingRegistry'], abi=VestingRegistry.abi, owner=acct) + print("\nAdding LockedFund as an admin of Vesting Registry.") + vestingRegistry.addAdmin(values['lockedFund']) + print("\nAdded Locked Fund:",values['lockedFund'],"as the admin of Vesting Registry:", values['vestingRegistry']) + # ========================================================================================================================================= def addOriginsAsAdmin(): lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) From ac2557ae88206f8f7ac3996a8d52f2cceb12cc2c Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 22 Jun 2021 20:23:23 +0530 Subject: [PATCH 075/112] OriginsBase Script Updated --- scripts/deployOrigins.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/scripts/deployOrigins.py b/scripts/deployOrigins.py index a23a18a..7f29b98 100644 --- a/scripts/deployOrigins.py +++ b/scripts/deployOrigins.py @@ -127,9 +127,25 @@ def deployOrigins(): origins = acct.deploy(OriginsBase, adminList, token, depositAddress) + print("\nOrigins Deployed.") + values['origins'] = str(origins) writeToJSON() + updateLockedFund() + + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + + print("\nAdding Origins as an admin to LockedFund...\n") + lockedFund.addAdmin(values['origins']) + print("Added Origins as", values['origins'], " as an admin of Locked Fund.") + + addMyselfAsVerifier() + + getOwnerList() + + getVerifierList() + # ========================================================================================================================================= def updateDepositAddress(): origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) @@ -355,6 +371,7 @@ def buyTokens(): # ========================================================================================================================================= def addMyselfAsVerifier(): origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nAdding myself as a Verifier...") origins.addVerifier(acct) print("Added",acct,"as a verifier.") From 8c659b0f2ae9449ce2733c9c3b525ef92ce91bf8 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 22 Jun 2021 20:30:27 +0530 Subject: [PATCH 076/112] LockedFund Error Message Updated --- contracts/LockedFund.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/LockedFund.sol b/contracts/LockedFund.sol index c5e9a59..da172ef 100644 --- a/contracts/LockedFund.sol +++ b/contracts/LockedFund.sol @@ -126,7 +126,7 @@ contract LockedFund is ILockedFund { * @notice Modifier to check only admin is allowed for certain functions. */ modifier onlyAdmin { - require(isAdmin[msg.sender], "Only admin can call this."); + require(isAdmin[msg.sender], "LockedFund: Only admin can call this."); _; } From 782f2758e4161ff26f0005234737ad04e09ef515 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Tue, 22 Jun 2021 20:37:41 +0530 Subject: [PATCH 077/112] Formatted OriginsBase --- contracts/OriginsBase.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index 67b7922..59741f9 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -580,7 +580,10 @@ contract OriginsBase is OriginsEvents { uint256 tokensBoughtByAddress = tokensBoughtByAddressOnTier[msg.sender][_tierID]; /// @notice Checking if the user already reached the maximum amount. - require(tokensBoughtByAddress < tierDetails.maxAmount.div(tierDetails.depositRate), "OriginsBase: User already bought maximum allowed."); + require( + tokensBoughtByAddress < tierDetails.maxAmount.div(tierDetails.depositRate), + "OriginsBase: User already bought maximum allowed." + ); /// @notice Checking which deposit type is selected. uint256 deposit; From 254632ea79192f6a5990d813b47f433dd81f1343 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 23 Jun 2021 11:11:38 +0530 Subject: [PATCH 078/112] LockedFund waitedTS require check removed --- contracts/LockedFund.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/LockedFund.sol b/contracts/LockedFund.sol index da172ef..331f2d1 100644 --- a/contracts/LockedFund.sol +++ b/contracts/LockedFund.sol @@ -360,7 +360,6 @@ contract LockedFund is ILockedFund { * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. */ function _withdrawWaitedUnlockedBalance(address _sender, address _receiverAddress) internal { - require(waitedTS != 0, "LockedFund: Waited TS not set yet."); require(waitedTS < block.timestamp, "LockedFund: Wait Timestamp not yet passed."); address userAddr = _receiverAddress; From f6e3fa691e49bc01bab6790bfabbb29579be4929 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 23 Jun 2021 12:21:01 +0530 Subject: [PATCH 079/112] LockedFund internal stake function updated --- contracts/LockedFund.sol | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/contracts/LockedFund.sol b/contracts/LockedFund.sol index 331f2d1..5724edf 100644 --- a/contracts/LockedFund.sol +++ b/contracts/LockedFund.sol @@ -390,19 +390,6 @@ contract LockedFund is ILockedFund { emit VestingCreated(msg.sender, _tokenOwner, _vestingAddress); } - /** - * @notice Internal function to create vesting if not already created and Stakes tokens for a user. - */ - function _createVestingAndStake(address _sender) internal { - address vestingAddr = _getVesting(_sender); - - if (vestingAddr == address(0)) { - vestingAddr = _createVesting(_sender); - } - - _stakeTokens(_sender, vestingAddr); - } - /** * @notice Returns the Vesting Contract Address. * @param _tokenOwner The owner of the vesting contract. @@ -414,11 +401,12 @@ contract LockedFund is ILockedFund { /** * @notice Stakes the tokens in a particular vesting contract. + * @param _sender The user wallet address. * @param _vesting The Vesting Contract Address. */ function _stakeTokens(address _sender, address _vesting) internal { - uint256 amount = lockedBalances[_sender]; - lockedBalances[_sender] = 0; + uint256 amount = vestedBalances[_sender]; + vestedBalances[_sender] = 0; require(token.approve(_vesting, amount), "LockedFund: Approve failed."); IVestingLogic(_vesting).stakeTokens(amount); @@ -426,6 +414,20 @@ contract LockedFund is ILockedFund { emit TokenStaked(_sender, _vesting, amount); } + /** + * @notice Internal function to create vesting if not already created and Stakes tokens for a user. + * @param _sender The user wallet address. + */ + function _createVestingAndStake(address _sender) internal { + address vestingAddr = _getVesting(_sender); + + if (vestingAddr == address(0)) { + vestingAddr = _createVesting(_sender); + } + + _stakeTokens(_sender, vestingAddr); + } + /* Getter or Read Functions */ /** @@ -457,7 +459,7 @@ contract LockedFund is ILockedFund { * @param _addr The address of the user to check the vested balance. * @return _balance The vested balance of the address `_addr`. */ - function vestedBalance(address _addr) external view returns (uint256 _balance) { + function getVestedBalance(address _addr) external view returns (uint256 _balance) { return vestedBalances[_addr]; } From 7254de85a4f9451895078b18b2b198ebe6bb62d3 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 23 Jun 2021 12:37:01 +0530 Subject: [PATCH 080/112] LockedFund Testnet Contract Updated --- scripts/values/testnet.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index aa59d16..5d80954 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -15,7 +15,7 @@ "waitedTimestamp": "1624579200", "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509", "origins": "0x614528858f1D4e6D3e9Ef4f868771c93b4799D90", - "lockedFund": "0x0dAc53C5E204C949128e476917CDE7248da1f68E", + "lockedFund": "0x1DDAf77DE0c18af5dc9457C4DB83F13652618157", "tiers": [ { "DONT_DELETE_THIS": "This acts as the zero index entry in SC which has to be skipped." From cf1be3b262d03cc3a96cb13decb383446db5db4b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 23 Jun 2021 12:37:26 +0530 Subject: [PATCH 081/112] LockedFund Script Updated --- scripts/deployLockedFund.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/deployLockedFund.py b/scripts/deployLockedFund.py index f64e995..b3e3db8 100644 --- a/scripts/deployLockedFund.py +++ b/scripts/deployLockedFund.py @@ -94,7 +94,7 @@ def deployLockedFund(): print("\nLocked Fund Deployed.") print("\nAdding LockedFund as an admin of Vesting Registry.") - vestingRegistry = Contract.from_abi("VestingRegistry", address=values['vestingRegistry'], abi=VestingRegistry.abi, owner=acct) + vestingRegistry = Contract.from_abi("VestingRegistry3", address=values['vestingRegistry'], abi=VestingRegistry3.abi, owner=acct) vestingRegistry.addAdmin(lockedFund.address) print("\nAdded Locked Fund:",lockedFund.address,"as the admin of Vesting Registry:", values['vestingRegistry']) @@ -104,7 +104,7 @@ def deployLockedFund(): # ========================================================================================================================================= def addLockedFundAsAdmin(): - vestingRegistry = Contract.from_abi("VestingRegistry", address=values['vestingRegistry'], abi=VestingRegistry.abi, owner=acct) + vestingRegistry = Contract.from_abi("VestingRegistry3", address=values['vestingRegistry'], abi=VestingRegistry3.abi, owner=acct) print("\nAdding LockedFund as an admin of Vesting Registry.") vestingRegistry.addAdmin(values['lockedFund']) print("\nAdded Locked Fund:",values['lockedFund'],"as the admin of Vesting Registry:", values['vestingRegistry']) From 8650ab87dd3d2ffc0902c9934fce0fb29bd24e2b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 23 Jun 2021 13:18:18 +0530 Subject: [PATCH 082/112] OriginsBase Max Allowed calculation udpated --- contracts/OriginsBase.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index 59741f9..4af3f67 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -581,7 +581,7 @@ contract OriginsBase is OriginsEvents { /// @notice Checking if the user already reached the maximum amount. require( - tokensBoughtByAddress < tierDetails.maxAmount.div(tierDetails.depositRate), + tokensBoughtByAddress < tierDetails.maxAmount.mul(tierDetails.depositRate), "OriginsBase: User already bought maximum allowed." ); From 13adcdaa9ca0e1f3434f902705af8e591ed0e024 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 23 Jun 2021 13:27:41 +0530 Subject: [PATCH 083/112] Origins Testnet Contract Updated --- scripts/values/testnet.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index 5d80954..cb3638a 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -14,7 +14,7 @@ "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", "waitedTimestamp": "1624579200", "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509", - "origins": "0x614528858f1D4e6D3e9Ef4f868771c93b4799D90", + "origins": "0x2450452B49C8c329e5bcE3AcCb19e1beDaC81e7E", "lockedFund": "0x1DDAf77DE0c18af5dc9457C4DB83F13652618157", "tiers": [ { From 54e25818793231becdf0a13d312841467d1578bd Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 23 Jun 2021 13:46:00 +0530 Subject: [PATCH 084/112] OriginsBase RemainingToken Calculation Updated --- contracts/OriginsBase.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index 4af3f67..ae1439b 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -609,7 +609,7 @@ contract OriginsBase is OriginsEvents { /// @notice actual buying happens here. uint256 tokensBought = deposit.mul(tierDetails.depositRate); - tierDetails.remainingTokens = tierDetails.remainingTokens.sub(tokensBought); + tiers[_tierID].remainingTokens = tierDetails.remainingTokens.sub(tokensBought); tokensBoughtByAddressOnTier[msg.sender][_tierID] = tokensBoughtByAddressOnTier[msg.sender][_tierID].add(tokensBought); /// @notice Checking what type of Transfer to do. From 01e7e728680a0a629e1a89d0ad63d3ad81945b2c Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Wed, 23 Jun 2021 13:52:50 +0530 Subject: [PATCH 085/112] Testnet Contracts Updated --- scripts/values/testnet.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index cb3638a..343b700 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -14,7 +14,7 @@ "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", "waitedTimestamp": "1624579200", "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509", - "origins": "0x2450452B49C8c329e5bcE3AcCb19e1beDaC81e7E", + "origins": "0x127557B259949DFdD43dc18952217CA707eaFD02", "lockedFund": "0x1DDAf77DE0c18af5dc9457C4DB83F13652618157", "tiers": [ { From 26d9db9df70e2e6cb9879e8afe903c7796c94c2f Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:10:50 +0530 Subject: [PATCH 086/112] README Updated --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 33d303e..6fd1da7 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ TODO - If the deposit asset price is lower than the token which is sold, currently that is not possible with this system. A simple solution is to have a divisor constant or a numerator & denominator system instead of the rate system. - LockedFund can only have a single cliff and duration per person. Tier based system would be much better when the vesting registry is updated (waiting for a PR to be merged in Sovryn). +- Address can only be validated, and cannot be invalidated. Adding a simple function should suffice. To be done in the next update. ## Improvements @@ -93,3 +94,4 @@ TODO - Divide the contract based on Verification Type, Vesting/Locked Type, Deposit by Token or RBTC, etc to make the contract size and interaction gas cost to the minimum without losing the Origins Granularity. This will be a new contract which will be inheriting from OriginsBase, with OriginsBase itself inheriting a unique OriginsStorage based on the granularity. - Maybe a single contract can act as the platform if instead of different tiers based on ID, the tiers are based on token address (which is to be sold), thus having multiple tiers based on that. So, a single contract can handle multiple sales at once with multiple tiers. This can only be done after struct decoupling and gas profiling of each function and possible gas saving methods added. - Total unique wallets participated in all tiers. Currently only unique wallets participated in a each tier is counted, which is not the same as unique wallets participated in all tiers combined. New storage structure will be required. +- Tests related to other type of sales to be added. From 4d086db711ddc5f669d338dbba6527312baa479e Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:11:25 +0530 Subject: [PATCH 087/112] OriginsBase Smart Contract Updated --- contracts/OriginsBase.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index ae1439b..261db1c 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -517,12 +517,12 @@ contract OriginsBase is OriginsEvents { /** * @notice Internal Function to update the Tier Token Details. - * @param _tierDetails The Tier whose Token Details are updated. * @param _tierID The Tier ID whose Token Details are updated. */ - function _updateTierTokenDetailsAfterBuy(Tier memory _tierDetails, uint256 _tierID) internal { + function _updateTierTokenDetailsAfterBuy(uint256 _tierID) internal { + Tier memory _tierDetails = tiers[_tierID]; if (_tierDetails.remainingTokens < _tierDetails.maxAmount) { - if (_tierDetails.remainingTokens < _tierDetails.minAmount) { + if (_tierDetails.remainingTokens <= _tierDetails.minAmount) { if (_tierDetails.remainingTokens == 0) { tierSaleEnded[_tierID] = true; emit TierSaleEnded(msg.sender, _tierID); @@ -616,7 +616,7 @@ contract OriginsBase is OriginsEvents { _tokenTransferOnBuy(tierDetails, tokensBought); /// @notice Updating the tier token parameters. - _updateTierTokenDetailsAfterBuy(tierDetails, _tierID); + _updateTierTokenDetailsAfterBuy(_tierID); /// @notice Updating the stats. _updateWalletCount(_tierID, deposit, tokensBoughtByAddress, tokensBought); @@ -648,7 +648,7 @@ contract OriginsBase is OriginsEvents { /// @notice Only withdraw is allowed where sale is ended. Premature withdraw is not allowed. for (uint256 index = 1; index <= tierCount; index++) { - if (tierSaleEnded[index] && !tierSaleWithdrawn[index]) { + if ((tierSaleEnded[index] || !_saleAllowed(index)) && !tierSaleWithdrawn[index]) { tierSaleWithdrawn[index] = true; uint256 amount = tokensSoldPerTier[index].div(tiers[index].depositRate); From 0c863faf1df1798909d99c5893d1b6e0b09b4c4e Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:12:42 +0530 Subject: [PATCH 088/112] Supporting Interfaces Added --- contracts/Interfaces/IApproveAndCall.sol | 21 ++++++++++++ contracts/Interfaces/IFeeSharingProxy.sol | 17 ++++++++++ contracts/Interfaces/IStaking.sol | 39 +++++++++++++++++++++++ contracts/Interfaces/ITeamVesting.sol | 11 +++++++ contracts/Interfaces/IVesting.sol | 16 ++++++++++ contracts/Interfaces/IVestingFactory.sol | 30 +++++++++++++++++ contracts/Interfaces/IVestingLogic.sol | 12 +------ 7 files changed, 135 insertions(+), 11 deletions(-) create mode 100644 contracts/Interfaces/IApproveAndCall.sol create mode 100644 contracts/Interfaces/IFeeSharingProxy.sol create mode 100644 contracts/Interfaces/IStaking.sol create mode 100644 contracts/Interfaces/ITeamVesting.sol create mode 100644 contracts/Interfaces/IVesting.sol create mode 100644 contracts/Interfaces/IVestingFactory.sol diff --git a/contracts/Interfaces/IApproveAndCall.sol b/contracts/Interfaces/IApproveAndCall.sol new file mode 100644 index 0000000..55c7284 --- /dev/null +++ b/contracts/Interfaces/IApproveAndCall.sol @@ -0,0 +1,21 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for contract governance/ApprovalReceiver.sol + * @dev Interfaces are used to cast a contract address into a callable instance. + */ +interface IApproveAndCall { + /** + * @notice Receives approval from SOV token. + * @param _sender The sender of SOV.approveAndCall function. + * @param _amount The amount was approved. + * @param _token The address of token. + * @param _data The data will be used for low level call. + * */ + function receiveApproval( + address _sender, + uint256 _amount, + address _token, + bytes calldata _data + ) external; +} diff --git a/contracts/Interfaces/IFeeSharingProxy.sol b/contracts/Interfaces/IFeeSharingProxy.sol new file mode 100644 index 0000000..10898bb --- /dev/null +++ b/contracts/Interfaces/IFeeSharingProxy.sol @@ -0,0 +1,17 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for contract governance/FeeSharingProxy.sol + * @dev Interfaces are used to cast a contract address into a callable instance. + * */ +interface IFeeSharingProxy { + function withdrawFees(address _token) external; + + function transferTokens(address _token, uint96 _amount) external; + + function withdraw( + address _loanPoolToken, + uint32 _maxCheckpoints, + address _receiver + ) external; +} diff --git a/contracts/Interfaces/IStaking.sol b/contracts/Interfaces/IStaking.sol new file mode 100644 index 0000000..a82cbd1 --- /dev/null +++ b/contracts/Interfaces/IStaking.sol @@ -0,0 +1,39 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for contract governance/Staking/Staking.sol + * @dev Interfaces are used to cast a contract address into a callable instance. + */ +interface IStaking { + function stakesBySchedule( + uint256 amount, + uint256 cliff, + uint256 duration, + uint256 intervalLength, + address stakeFor, + address delegatee + ) external; + + function stake( + uint96 amount, + uint256 until, + address stakeFor, + address delegatee + ) external; + + function getPriorVotes( + address account, + uint256 blockNumber, + uint256 date + ) external view returns (uint96); + + function getPriorTotalVotingPower(uint32 blockNumber, uint256 time) external view returns (uint96); + + function getPriorWeightedStake( + address account, + uint256 blockNumber, + uint256 date + ) external view returns (uint96); + + function timestampToLockDate(uint256 timestamp) external view returns (uint256 lockDate); +} diff --git a/contracts/Interfaces/ITeamVesting.sol b/contracts/Interfaces/ITeamVesting.sol new file mode 100644 index 0000000..006d0c4 --- /dev/null +++ b/contracts/Interfaces/ITeamVesting.sol @@ -0,0 +1,11 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for TeamVesting contract. + * @dev Interfaces are used to cast a contract address into a callable instance. + * This interface is used by Staking contract to call governanceWithdrawTokens + * function having the vesting contract instance address. + */ +interface ITeamVesting { + function governanceWithdrawTokens(address receiver) external; +} diff --git a/contracts/Interfaces/IVesting.sol b/contracts/Interfaces/IVesting.sol new file mode 100644 index 0000000..12a68af --- /dev/null +++ b/contracts/Interfaces/IVesting.sol @@ -0,0 +1,16 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for Vesting contract. + * @dev Interfaces are used to cast a contract address into a callable instance. + * This interface is used by VestingLogic contract to implement stakeTokens function + * and on VestingRegistry contract to call IVesting(vesting).stakeTokens function + * at a vesting instance. + */ +interface IVesting { + function duration() external returns (uint256); + + function endDate() external returns (uint256); + + function stakeTokens(uint256 amount) external; +} diff --git a/contracts/Interfaces/IVestingFactory.sol b/contracts/Interfaces/IVestingFactory.sol new file mode 100644 index 0000000..05fc882 --- /dev/null +++ b/contracts/Interfaces/IVestingFactory.sol @@ -0,0 +1,30 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for Vesting Factory contract. + * @dev Interfaces are used to cast a contract address into a callable instance. + * This interface is used by VestingFactory contract to override empty + * implemention of deployVesting and deployTeamVesting functions + * and on VestingRegistry contract to use an instance of VestingFactory. + */ +interface IVestingFactory { + function deployVesting( + address _SOV, + address _staking, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharing, + address _owner + ) external returns (address); + + function deployTeamVesting( + address _SOV, + address _staking, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharing, + address _owner + ) external returns (address); +} diff --git a/contracts/Interfaces/IVestingLogic.sol b/contracts/Interfaces/IVestingLogic.sol index 7040a63..c858ef9 100644 --- a/contracts/Interfaces/IVestingLogic.sol +++ b/contracts/Interfaces/IVestingLogic.sol @@ -1,16 +1,6 @@ pragma solidity ^0.5.17; -/** - * @title Vesting Storage Contract (Incomplete). - * @notice This contract is just the required storage fromm vesting for LockedFund. - */ -contract VestingStorage { - /// @notice The cliff. After this time period the tokens begin to unlock. - uint256 public cliff; - - /// @notice The duration. After this period all tokens will have been unlocked. - uint256 public duration; -} +import "../Sovryn/Governance/Vesting/VestingStorage.sol"; /** * TODO From 11b2c8d9266e262ccbefc5154c1be3ec78c21e47 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:13:15 +0530 Subject: [PATCH 089/112] Supporting Openzeppelin Contracts Added --- contracts/Openzeppelin/SafeERC20.sol | 95 ++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 contracts/Openzeppelin/SafeERC20.sol diff --git a/contracts/Openzeppelin/SafeERC20.sol b/contracts/Openzeppelin/SafeERC20.sol new file mode 100644 index 0000000..57ad855 --- /dev/null +++ b/contracts/Openzeppelin/SafeERC20.sol @@ -0,0 +1,95 @@ +pragma solidity >=0.5.0 <0.6.0; + +import "./SafeMath.sol"; +import "./Address.sol"; +import "../Interfaces/IERC20.sol"; + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using SafeMath for uint256; + using Address for address; + + function safeTransfer( + IERC20 token, + address to, + uint256 value + ) internal { + callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); + } + + function safeTransferFrom( + IERC20 token, + address from, + address to, + uint256 value + ) internal { + callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); + } + + function safeApprove( + IERC20 token, + address spender, + uint256 value + ) internal { + // safeApprove should only be called when setting an initial allowance, + // or when resetting it to zero. To increase and decrease it, use + // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' + // solhint-disable-next-line max-line-length + require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance"); + callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); + } + + function safeIncreaseAllowance( + IERC20 token, + address spender, + uint256 value + ) internal { + uint256 newAllowance = token.allowance(address(this), spender).add(value); + callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + + function safeDecreaseAllowance( + IERC20 token, + address spender, + uint256 value + ) internal { + uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); + callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. + + // A Solidity high level call has three parts: + // 1. The target address is checked to verify it contains contract code + // 2. The call itself is made, and success asserted + // 3. The return value is decoded, which in turn checks the size of the returned data. + // solhint-disable-next-line max-line-length + require(address(token).isContract(), "SafeERC20: call to non-contract"); + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returndata) = address(token).call(data); + require(success, "SafeERC20: low-level call failed"); + + if (returndata.length > 0) { + // Return data is optional + // solhint-disable-next-line max-line-length + require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); + } + } +} From 509f79702014bcccba4cd930a588fec22b91cfaa Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:13:43 +0530 Subject: [PATCH 090/112] Supporting Sovryn Contracts Added --- .../Sovryn/Governance/FeeSharingProxy.sol | 353 +++++++++ .../Sovryn/Governance/Staking/Checkpoints.sol | 211 +++++ .../Sovryn/Governance/Staking/Staking.sol | 718 ++++++++++++++++++ .../Governance/Staking/StakingProxy.sol | 22 + .../Governance/Staking/StakingStorage.sol | 127 ++++ .../Governance/Staking/WeightedStaking.sol | 447 +++++++++++ .../Sovryn/Governance/Vesting/TeamVesting.sol | 55 ++ .../Sovryn/Governance/Vesting/Vesting.sol | 39 + .../Governance/Vesting/VestingFactory.sol | 79 ++ .../Governance/Vesting/VestingLogic.sol | 220 ++++++ .../Governance/Vesting/VestingRegistry3.sol | 200 +++++ .../Governance/Vesting/VestingStorage.sol | 43 ++ contracts/Sovryn/Helper/ErrorDecoder.sol | 53 ++ contracts/Sovryn/Helper/SafeMath96.sol | 113 +++ .../Sovryn/Mockup/FeeSharingProxyMockup.sol | 23 + .../Sovryn/{ => Multisig}/MultiSigWallet.sol | 0 contracts/Sovryn/Proxy/Proxy.sol | 125 +++ contracts/Sovryn/Proxy/UpgradableProxy.sol | 39 + contracts/Sovryn/RSK/RSKAddrValidator.sol | 21 + contracts/Sovryn/Token/ApprovalReceiver.sol | 105 +++ contracts/Sovryn/Token/Token.sol | 60 ++ 21 files changed, 3053 insertions(+) create mode 100644 contracts/Sovryn/Governance/FeeSharingProxy.sol create mode 100644 contracts/Sovryn/Governance/Staking/Checkpoints.sol create mode 100644 contracts/Sovryn/Governance/Staking/Staking.sol create mode 100644 contracts/Sovryn/Governance/Staking/StakingProxy.sol create mode 100644 contracts/Sovryn/Governance/Staking/StakingStorage.sol create mode 100644 contracts/Sovryn/Governance/Staking/WeightedStaking.sol create mode 100644 contracts/Sovryn/Governance/Vesting/TeamVesting.sol create mode 100644 contracts/Sovryn/Governance/Vesting/Vesting.sol create mode 100644 contracts/Sovryn/Governance/Vesting/VestingFactory.sol create mode 100644 contracts/Sovryn/Governance/Vesting/VestingLogic.sol create mode 100644 contracts/Sovryn/Governance/Vesting/VestingRegistry3.sol create mode 100644 contracts/Sovryn/Governance/Vesting/VestingStorage.sol create mode 100644 contracts/Sovryn/Helper/ErrorDecoder.sol create mode 100644 contracts/Sovryn/Helper/SafeMath96.sol create mode 100644 contracts/Sovryn/Mockup/FeeSharingProxyMockup.sol rename contracts/Sovryn/{ => Multisig}/MultiSigWallet.sol (100%) create mode 100644 contracts/Sovryn/Proxy/Proxy.sol create mode 100644 contracts/Sovryn/Proxy/UpgradableProxy.sol create mode 100644 contracts/Sovryn/RSK/RSKAddrValidator.sol create mode 100644 contracts/Sovryn/Token/ApprovalReceiver.sol create mode 100644 contracts/Sovryn/Token/Token.sol diff --git a/contracts/Sovryn/Governance/FeeSharingProxy.sol b/contracts/Sovryn/Governance/FeeSharingProxy.sol new file mode 100644 index 0000000..dfa336e --- /dev/null +++ b/contracts/Sovryn/Governance/FeeSharingProxy.sol @@ -0,0 +1,353 @@ +pragma solidity ^0.5.17; + +import "../Helper/SafeMath96.sol"; +import "../../Openzeppelin/SafeMath.sol"; +import "../../Openzeppelin/SafeERC20.sol"; +import "../../Interfaces/IFeeSharingProxy.sol"; +import "../../Interfaces/IStaking.sol"; + +/** + * @title The FeeSharingProxy contract. + * @notice Staking is not only granting voting rights, but also access to fee + * sharing according to the own voting power in relation to the total. Whenever + * somebody decides to collect the fees from the protocol, they get transferred + * to a proxy contract which invests the funds in the lending pool and keeps + * the pool tokens. + * + * The fee sharing proxy will be set as feesController of the protocol contract. + * This allows the fee sharing proxy to withdraw the fees. The fee sharing + * proxy holds the pool tokens and keeps track of which user owns how many + * tokens. In order to know how many tokens a user owns, the fee sharing proxy + * needs to know the user’s weighted stake in relation to the total weighted + * stake (aka total voting power). + * + * Because both values are subject to change, they may be different on each fee + * withdrawal. To be able to calculate a user’s share of tokens when he wants + * to withdraw, we need checkpoints. + * + * This contract is intended to be set as the protocol fee collector. + * Anybody can invoke the withdrawFees function which uses + * protocol.withdrawFees to obtain available fees from operations on a + * certain token. These fees are deposited in the corresponding loanPool. + * Also, the staking contract sends slashed tokens to this contract. When a + * user calls the withdraw function, the contract transfers the fee sharing + * rewards in proportion to the user’s weighted stake since the last withdrawal. + * + * The protocol is collecting fees in all sorts of currencies and then automatically + * supplies them to the respective lending pools. Therefore, all fees are + * generating interest for the SOV holders. If one of them withdraws fees, it will + * get pool tokens. It is planned to add the option to convert anything to rBTC + * before withdrawing, but not yet implemented. + * */ +contract FeeSharingProxy is SafeMath96, IFeeSharingProxy { + using SafeMath for uint256; + using SafeERC20 for IERC20; + + /* Storage */ + + /// @dev TODO FEE_WITHDRAWAL_INTERVAL, MAX_CHECKPOINTS + uint256 constant FEE_WITHDRAWAL_INTERVAL = 86400; + + uint32 constant MAX_CHECKPOINTS = 100; + + IProtocol public protocol; + IStaking public staking; + + /// @notice Checkpoints by index per pool token address + mapping(address => mapping(uint256 => Checkpoint)) public tokenCheckpoints; + + /// @notice The number of checkpoints for each pool token address. + mapping(address => uint32) public numTokenCheckpoints; + + /// @notice + /// user => token => processed checkpoint + mapping(address => mapping(address => uint32)) public processedCheckpoints; + + /// @notice Last time fees were withdrawn per pool token address: + /// token => time + mapping(address => uint256) public lastFeeWithdrawalTime; + + /// @notice Amount of tokens that were transferred, but not saved in checkpoints. + /// token => amount + mapping(address => uint96) public unprocessedAmount; + + struct Checkpoint { + uint32 blockNumber; + uint32 timestamp; + uint96 totalWeightedStake; + uint96 numTokens; + } + + /* Events */ + + /// @notice An event emitted when fee get withdrawn. + event FeeWithdrawn(address indexed sender, address indexed token, uint256 amount); + + /// @notice An event emitted when tokens transferred. + event TokensTransferred(address indexed sender, address indexed token, uint256 amount); + + /// @notice An event emitted when checkpoint added. + event CheckpointAdded(address indexed sender, address indexed token, uint256 amount); + + /// @notice An event emitted when user fee get withdrawn. + event UserFeeWithdrawn(address indexed sender, address indexed receiver, address indexed token, uint256 amount); + + /* Functions */ + + constructor(IProtocol _protocol, IStaking _staking) public { + protocol = _protocol; + staking = _staking; + } + + /** + * @notice Withdraw fees for the given token: + * lendingFee + tradingFee + borrowingFee + * @param _token Address of the token + * */ + function withdrawFees(address _token) public { + require(_token != address(0), "FeeSharingProxy::withdrawFees: invalid address"); + + address loanPoolToken = protocol.underlyingToLoanPool(_token); + require(loanPoolToken != address(0), "FeeSharingProxy::withdrawFees: loan token not found"); + + uint256 amount = protocol.withdrawFees(_token, address(this)); + require(amount > 0, "FeeSharingProxy::withdrawFees: no tokens to withdraw"); + + /// @dev TODO can be also used - function addLiquidity(IERC20Token _reserveToken, uint256 _amount, uint256 _minReturn) + IERC20(_token).approve(loanPoolToken, amount); + uint256 poolTokenAmount = ILoanToken(loanPoolToken).mint(address(this), amount); + + /// @notice Update unprocessed amount of tokens + uint96 amount96 = safe96(poolTokenAmount, "FeeSharingProxy::withdrawFees: pool token amount exceeds 96 bits"); + unprocessedAmount[loanPoolToken] = add96( + unprocessedAmount[loanPoolToken], + amount96, + "FeeSharingProxy::withdrawFees: unprocessedAmount exceeds 96 bits" + ); + + _addCheckpoint(loanPoolToken); + + emit FeeWithdrawn(msg.sender, loanPoolToken, poolTokenAmount); + } + + /** + * @notice Transfer tokens to this contract. + * @dev We just update amount of tokens here and write checkpoint in a separate methods + * in order to prevent adding checkpoints too often. + * @param _token Address of the token. + * @param _amount Amount to be transferred. + * */ + function transferTokens(address _token, uint96 _amount) public { + require(_token != address(0), "FeeSharingProxy::transferTokens: invalid address"); + require(_amount > 0, "FeeSharingProxy::transferTokens: invalid amount"); + + /// @notice Transfer tokens from msg.sender + bool success = IERC20(_token).transferFrom(address(msg.sender), address(this), _amount); + require(success, "Staking::transferTokens: token transfer failed"); + + /// @notice Update unprocessed amount of tokens. + unprocessedAmount[_token] = add96(unprocessedAmount[_token], _amount, "FeeSharingProxy::transferTokens: amount exceeds 96 bits"); + + _addCheckpoint(_token); + + emit TokensTransferred(msg.sender, _token, _amount); + } + + /** + * @notice Add checkpoint with accumulated amount by function invocation. + * @param _token Address of the token. + * */ + function _addCheckpoint(address _token) internal { + if (block.timestamp - lastFeeWithdrawalTime[_token] >= FEE_WITHDRAWAL_INTERVAL) { + lastFeeWithdrawalTime[_token] = block.timestamp; + uint96 amount = unprocessedAmount[_token]; + + /// @notice Reset unprocessed amount of tokens to zero. + unprocessedAmount[_token] = 0; + + /// @notice Write a regular checkpoint. + _writeTokenCheckpoint(_token, amount); + } + } + + /** + * @notice Withdraw accumulated fee to the message sender. + * + * The Sovryn protocol collects fees on every trade/swap and loan. + * These fees will be distributed to SOV stakers based on their voting + * power as a percentage of total voting power. Therefore, staking more + * SOV and/or staking for longer will increase your share of the fees + * generated, meaning you will earn more from staking. + * + * @param _loanPoolToken Address of the pool token. + * @param _maxCheckpoints Maximum number of checkpoints to be processed. + * @param _receiver The receiver of tokens or msg.sender + * */ + function withdraw( + address _loanPoolToken, + uint32 _maxCheckpoints, + address _receiver + ) public { + /// @dev Prevents processing all checkpoints because of block gas limit. + require(_maxCheckpoints > 0, "FeeSharingProxy::withdraw: _maxCheckpoints should be positive"); + + address user = msg.sender; + if (_receiver == address(0)) { + _receiver = msg.sender; + } + + uint256 amount; + uint32 end; + (amount, end) = _getAccumulatedFees(user, _loanPoolToken, _maxCheckpoints); + + processedCheckpoints[user][_loanPoolToken] = end; + + require(IERC20(_loanPoolToken).transfer(user, amount), "FeeSharingProxy::withdraw: withdrawal failed"); + + emit UserFeeWithdrawn(msg.sender, _receiver, _loanPoolToken, amount); + } + + /** + * @notice Get the accumulated loan pool fee of the message sender. + * @param _user The address of the user or contract. + * @param _loanPoolToken Address of the pool token. + * @return The accumulated fee for the message sender. + * */ + function getAccumulatedFees(address _user, address _loanPoolToken) public view returns (uint256) { + uint256 amount; + (amount, ) = _getAccumulatedFees(_user, _loanPoolToken, 0); + return amount; + } + + /** + * @notice Whenever fees are withdrawn, the staking contract needs to + * checkpoint the block number, the number of pool tokens and the + * total voting power at that time (read from the staking contract). + * While the total voting power would not necessarily need to be + * checkpointed, it makes sense to save gas cost on withdrawal. + * + * When the user wants to withdraw its share of tokens, we need + * to iterate over all of the checkpoints since the users last + * withdrawal (note: remember last withdrawal block), query the + * user’s balance at the checkpoint blocks from the staking contract, + * compute his share of the checkpointed tokens and add them up. + * The maximum number of checkpoints to process at once should be limited. + * + * @param _user Address of the user's account. + * @param _loanPoolToken Loan pool token address. + * @param _maxCheckpoints Checkpoint index incremental. + * */ + function _getAccumulatedFees( + address _user, + address _loanPoolToken, + uint32 _maxCheckpoints + ) internal view returns (uint256, uint32) { + uint32 start = processedCheckpoints[_user][_loanPoolToken]; + uint32 end; + /// @dev Additional bool param can't be used because of stack too deep error. + if (_maxCheckpoints > 0) { + /// @dev withdraw -> _getAccumulatedFees + require(start < numTokenCheckpoints[_loanPoolToken], "FeeSharingProxy::withdrawFees: no tokens for a withdrawal"); + end = _getEndOfRange(start, _loanPoolToken, _maxCheckpoints); + } else { + /// @dev getAccumulatedFees -> _getAccumulatedFees + /// Don't throw error for getter invocation outside of transaction. + if (start >= numTokenCheckpoints[_loanPoolToken]) { + return (0, numTokenCheckpoints[_loanPoolToken]); + } + end = numTokenCheckpoints[_loanPoolToken]; + } + + uint256 amount = 0; + uint256 cachedLockDate = 0; + uint96 cachedWeightedStake = 0; + for (uint32 i = start; i < end; i++) { + Checkpoint storage checkpoint = tokenCheckpoints[_loanPoolToken][i]; + uint256 lockDate = staking.timestampToLockDate(checkpoint.timestamp); + uint96 weightedStake; + if (lockDate == cachedLockDate) { + weightedStake = cachedWeightedStake; + } else { + /// @dev We need to use "checkpoint.blockNumber - 1" here to calculate weighted stake + /// For the same block like we did for total voting power in _writeTokenCheckpoint + weightedStake = staking.getPriorWeightedStake(_user, checkpoint.blockNumber - 1, checkpoint.timestamp); + cachedWeightedStake = weightedStake; + cachedLockDate = lockDate; + } + uint256 share = uint256(checkpoint.numTokens).mul(weightedStake).div(uint256(checkpoint.totalWeightedStake)); + amount = amount.add(share); + } + return (amount, end); + } + + /** + * @notice Withdrawal should only be possible for blocks which were already + * mined. If the fees are withdrawn in the same block as the user withdrawal + * they are not considered by the withdrawing logic (to avoid inconsistencies). + * + * @param start Start of the range. + * @param _loanPoolToken Loan pool token address. + * @param _maxCheckpoints Checkpoint index incremental. + * */ + function _getEndOfRange( + uint32 start, + address _loanPoolToken, + uint32 _maxCheckpoints + ) internal view returns (uint32) { + uint32 nCheckpoints = numTokenCheckpoints[_loanPoolToken]; + uint32 end; + if (_maxCheckpoints == 0) { + /// @dev All checkpoints will be processed (only for getter outside of a transaction). + end = nCheckpoints; + } else { + if (_maxCheckpoints > MAX_CHECKPOINTS) { + _maxCheckpoints = MAX_CHECKPOINTS; + } + end = safe32(start + _maxCheckpoints, "FeeSharingProxy::withdraw: checkpoint index exceeds 32 bits"); + if (end > nCheckpoints) { + end = nCheckpoints; + } + } + + /// @dev Withdrawal should only be possible for blocks which were already mined. + uint32 lastBlockNumber = tokenCheckpoints[_loanPoolToken][end - 1].blockNumber; + if (block.number == lastBlockNumber) { + end--; + } + return end; + } + + /** + * @notice Write a regular checkpoint w/ the foolowing data: + * block number, block timestamp, total weighted stake and num of tokens. + * @param _token The pool token address. + * @param _numTokens The amount of pool tokens. + * */ + function _writeTokenCheckpoint(address _token, uint96 _numTokens) internal { + uint32 blockNumber = safe32(block.number, "FeeSharingProxy::_writeCheckpoint: block number exceeds 32 bits"); + uint32 blockTimestamp = safe32(block.timestamp, "FeeSharingProxy::_writeCheckpoint: block timestamp exceeds 32 bits"); + uint32 nCheckpoints = numTokenCheckpoints[_token]; + + uint96 totalWeightedStake = staking.getPriorTotalVotingPower(blockNumber - 1, block.timestamp); + if (nCheckpoints > 0 && tokenCheckpoints[_token][nCheckpoints - 1].blockNumber == blockNumber) { + tokenCheckpoints[_token][nCheckpoints - 1].totalWeightedStake = totalWeightedStake; + tokenCheckpoints[_token][nCheckpoints - 1].numTokens = _numTokens; + } else { + tokenCheckpoints[_token][nCheckpoints] = Checkpoint(blockNumber, blockTimestamp, totalWeightedStake, _numTokens); + numTokenCheckpoints[_token] = nCheckpoints + 1; + } + emit CheckpointAdded(msg.sender, _token, _numTokens); + } +} + +/* Interfaces */ + +interface IProtocol { + function withdrawFees(address token, address receiver) external returns (uint256); + + function underlyingToLoanPool(address token) external returns (address); +} + +interface ILoanToken { + function mint(address receiver, uint256 depositAmount) external returns (uint256 mintAmount); +} diff --git a/contracts/Sovryn/Governance/Staking/Checkpoints.sol b/contracts/Sovryn/Governance/Staking/Checkpoints.sol new file mode 100644 index 0000000..f0ead2a --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/Checkpoints.sol @@ -0,0 +1,211 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "./StakingStorage.sol"; +import "../../Helper/SafeMath96.sol"; + +/** + * @title Checkpoints contract. + * @notice Increases and decreases storage values for users, delegatees and + * total daily stake. + * */ +contract Checkpoints is StakingStorage, SafeMath96 { + /// @notice An event emitted when an account changes its delegate. + event DelegateChanged(address indexed delegator, uint256 lockedUntil, address indexed fromDelegate, address indexed toDelegate); + + /// @notice An event emitted when a delegate account's stake balance changes. + event DelegateStakeChanged(address indexed delegate, uint256 lockedUntil, uint256 previousBalance, uint256 newBalance); + + /// @notice An event emitted when tokens get staked. + event TokensStaked(address indexed staker, uint256 amount, uint256 lockedUntil, uint256 totalStaked); + + /// @notice An event emitted when tokens get withdrawn. + event TokensWithdrawn(address indexed staker, address receiver, uint256 amount); + + /// @notice An event emitted when vesting tokens get withdrawn. + event VestingTokensWithdrawn(address vesting, address receiver); + + /// @notice An event emitted when the owner unlocks all tokens. + event TokensUnlocked(uint256 amount); + + /// @notice An event emitted when a staking period gets extended. + event ExtendedStakingDuration(address indexed staker, uint256 previousDate, uint256 newDate); + + event AdminAdded(address admin); + + event AdminRemoved(address admin); + + event ContractCodeHashAdded(bytes32 hash); + + event ContractCodeHashRemoved(bytes32 hash); + + /** + * @notice Increases the user's stake for a giving lock date and writes a checkpoint. + * @param account The user address. + * @param lockedTS The lock date. + * @param value The value to add to the staked balance. + * */ + function _increaseUserStake( + address account, + uint256 lockedTS, + uint96 value + ) internal { + uint32 nCheckpoints = numUserStakingCheckpoints[account][lockedTS]; + uint96 staked = userStakingCheckpoints[account][lockedTS][nCheckpoints - 1].stake; + uint96 newStake = add96(staked, value, "Staking::_increaseUserStake: staked amount overflow"); + _writeUserCheckpoint(account, lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Decreases the user's stake for a giving lock date and writes a checkpoint. + * @param account The user address. + * @param lockedTS The lock date. + * @param value The value to substract to the staked balance. + * */ + function _decreaseUserStake( + address account, + uint256 lockedTS, + uint96 value + ) internal { + uint32 nCheckpoints = numUserStakingCheckpoints[account][lockedTS]; + uint96 staked = userStakingCheckpoints[account][lockedTS][nCheckpoints - 1].stake; + uint96 newStake = sub96(staked, value, "Staking::_decreaseUserStake: staked amount underflow"); + _writeUserCheckpoint(account, lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Writes on storage the user stake. + * @param account The user address. + * @param lockedTS The lock date. + * @param nCheckpoints The number of checkpoints, to find out the last one index. + * @param newStake The new staked balance. + * */ + function _writeUserCheckpoint( + address account, + uint256 lockedTS, + uint32 nCheckpoints, + uint96 newStake + ) internal { + uint32 blockNumber = safe32(block.number, "Staking::_writeStakingCheckpoint: block number exceeds 32 bits"); + + if (nCheckpoints > 0 && userStakingCheckpoints[account][lockedTS][nCheckpoints - 1].fromBlock == blockNumber) { + userStakingCheckpoints[account][lockedTS][nCheckpoints - 1].stake = newStake; + } else { + userStakingCheckpoints[account][lockedTS][nCheckpoints] = Checkpoint(blockNumber, newStake); + numUserStakingCheckpoints[account][lockedTS] = nCheckpoints + 1; + } + } + + /** + * @notice Increases the delegatee's stake for a giving lock date and writes a checkpoint. + * @param delegatee The delegatee address. + * @param lockedTS The lock date. + * @param value The value to add to the staked balance. + * */ + function _increaseDelegateStake( + address delegatee, + uint256 lockedTS, + uint96 value + ) internal { + uint32 nCheckpoints = numDelegateStakingCheckpoints[delegatee][lockedTS]; + uint96 staked = delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].stake; + uint96 newStake = add96(staked, value, "Staking::_increaseDelegateStake: staked amount overflow"); + _writeDelegateCheckpoint(delegatee, lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Decreases the delegatee's stake for a giving lock date and writes a checkpoint. + * @param delegatee The delegatee address. + * @param lockedTS The lock date. + * @param value The value to substract to the staked balance. + * */ + function _decreaseDelegateStake( + address delegatee, + uint256 lockedTS, + uint96 value + ) internal { + uint32 nCheckpoints = numDelegateStakingCheckpoints[delegatee][lockedTS]; + uint96 staked = delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].stake; + uint96 newStake = 0; + // @dev We need to check delegate checkpoint value here, + // because we had an issue in `stake` function: + // delegate checkpoint wasn't updating for the second and next stakes for the same date + // if first stake was withdrawn completely and stake was delegated to the staker + // (no delegation to another address). + // @dev It can be greater than 0, but inconsistent after 3 transactions + if (staked > value) { + newStake = sub96(staked, value, "Staking::_decreaseDelegateStake: staked amount underflow"); + } + _writeDelegateCheckpoint(delegatee, lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Writes on storage the delegate stake. + * @param delegatee The delegate address. + * @param lockedTS The lock date. + * @param nCheckpoints The number of checkpoints, to find out the last one index. + * @param newStake The new staked balance. + * */ + function _writeDelegateCheckpoint( + address delegatee, + uint256 lockedTS, + uint32 nCheckpoints, + uint96 newStake + ) internal { + uint32 blockNumber = safe32(block.number, "Staking::_writeStakingCheckpoint: block number exceeds 32 bits"); + uint96 oldStake = delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].stake; + + if (nCheckpoints > 0 && delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].fromBlock == blockNumber) { + delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].stake = newStake; + } else { + delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints] = Checkpoint(blockNumber, newStake); + numDelegateStakingCheckpoints[delegatee][lockedTS] = nCheckpoints + 1; + } + emit DelegateStakeChanged(delegatee, lockedTS, oldStake, newStake); + } + + /** + * @notice Increases the total stake for a giving lock date and writes a checkpoint. + * @param lockedTS The lock date. + * @param value The value to add to the staked balance. + * */ + function _increaseDailyStake(uint256 lockedTS, uint96 value) internal { + uint32 nCheckpoints = numTotalStakingCheckpoints[lockedTS]; + uint96 staked = totalStakingCheckpoints[lockedTS][nCheckpoints - 1].stake; + uint96 newStake = add96(staked, value, "Staking::_increaseDailyStake: staked amount overflow"); + _writeStakingCheckpoint(lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Decreases the total stake for a giving lock date and writes a checkpoint. + * @param lockedTS The lock date. + * @param value The value to substract to the staked balance. + * */ + function _decreaseDailyStake(uint256 lockedTS, uint96 value) internal { + uint32 nCheckpoints = numTotalStakingCheckpoints[lockedTS]; + uint96 staked = totalStakingCheckpoints[lockedTS][nCheckpoints - 1].stake; + uint96 newStake = sub96(staked, value, "Staking::_decreaseDailyStake: staked amount underflow"); + _writeStakingCheckpoint(lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Writes on storage the total stake. + * @param lockedTS The lock date. + * @param nCheckpoints The number of checkpoints, to find out the last one index. + * @param newStake The new staked balance. + * */ + function _writeStakingCheckpoint( + uint256 lockedTS, + uint32 nCheckpoints, + uint96 newStake + ) internal { + uint32 blockNumber = safe32(block.number, "Staking::_writeStakingCheckpoint: block number exceeds 32 bits"); + + if (nCheckpoints > 0 && totalStakingCheckpoints[lockedTS][nCheckpoints - 1].fromBlock == blockNumber) { + totalStakingCheckpoints[lockedTS][nCheckpoints - 1].stake = newStake; + } else { + totalStakingCheckpoints[lockedTS][nCheckpoints] = Checkpoint(blockNumber, newStake); + numTotalStakingCheckpoints[lockedTS] = nCheckpoints + 1; + } + } +} diff --git a/contracts/Sovryn/Governance/Staking/Staking.sol b/contracts/Sovryn/Governance/Staking/Staking.sol new file mode 100644 index 0000000..71b4db3 --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/Staking.sol @@ -0,0 +1,718 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "./WeightedStaking.sol"; +import "../../../Interfaces/IStaking.sol"; +import "../../RSK/RSKAddrValidator.sol"; +import "../../../Interfaces/ITeamVesting.sol"; +import "../../../Interfaces/IVesting.sol"; +import "../../Token/ApprovalReceiver.sol"; +import "../../../Openzeppelin/SafeMath.sol"; + +/** + * @title Staking contract. + * @notice Pay-in and pay-out function for staking and withdrawing tokens. + * Staking is delegated and vested: To gain voting power, SOV holders must + * stake their SOV for a given period of time. Aside from Bitocracy + * participation, there's a financially-rewarding reason for staking SOV. + * Tokenholders who stake their SOV receive staking rewards, a pro-rata share + * of the revenue that the platform generates from various transaction fees + * plus revenues from stakers who have a portion of their SOV slashed for + * early unstaking. + * */ +contract Staking is IStaking, WeightedStaking, ApprovalReceiver { + using SafeMath for uint256; + + /// @notice Constant used for computing the vesting dates. + uint256 constant FOUR_WEEKS = 4 weeks; + + /** + * @notice Stake the given amount for the given duration of time. + * @param amount The number of tokens to stake. + * @param until Timestamp indicating the date until which to stake. + * @param stakeFor The address to stake the tokens for or 0x0 if staking for oneself. + * @param delegatee The address of the delegatee or 0x0 if there is none. + * */ + function stake( + uint96 amount, + uint256 until, + address stakeFor, + address delegatee + ) external { + _stake(msg.sender, amount, until, stakeFor, delegatee, false); + } + + /** + * @notice Stake the given amount for the given duration of time. + * @dev This function will be invoked from receiveApproval + * @dev SOV.approveAndCall -> this.receiveApproval -> this.stakeWithApproval + * @param sender The sender of SOV.approveAndCall + * @param amount The number of tokens to stake. + * @param until Timestamp indicating the date until which to stake. + * @param stakeFor The address to stake the tokens for or 0x0 if staking for oneself. + * @param delegatee The address of the delegatee or 0x0 if there is none. + * */ + function stakeWithApproval( + address sender, + uint96 amount, + uint256 until, + address stakeFor, + address delegatee + ) public onlyThisContract { + _stake(sender, amount, until, stakeFor, delegatee, false); + } + + /** + * @notice Send sender's tokens to this contract and update its staked balance. + * @param sender The sender of the tokens. + * @param amount The number of tokens to send. + * @param until The date until which the tokens will be staked. + * @param stakeFor The beneficiary whose stake will be increased. + * @param delegatee The address of the delegatee or stakeFor if default 0x0. + * @param timeAdjusted Whether fixing date to stacking periods or not. + * */ + function _stake( + address sender, + uint96 amount, + uint256 until, + address stakeFor, + address delegatee, + bool timeAdjusted + ) internal { + require(amount > 0, "Staking::stake: amount of tokens to stake needs to be bigger than 0"); + + if (!timeAdjusted) { + until = timestampToLockDate(until); + } + require(until > block.timestamp, "Staking::timestampToLockDate: staking period too short"); + + /// @dev Stake for the sender if not specified otherwise. + if (stakeFor == address(0)) { + stakeFor = sender; + } + + /// @dev Delegate for stakeFor if not specified otherwise. + if (delegatee == address(0)) { + delegatee = stakeFor; + } + + /// @dev Do not stake longer than the max duration. + if (!timeAdjusted) { + uint256 latest = timestampToLockDate(block.timestamp + MAX_DURATION); + if (until > latest) until = latest; + } + + uint96 previousBalance = currentBalance(stakeFor, until); + + /// @dev Increase stake. + _increaseStake(sender, amount, stakeFor, until); + + // @dev Previous version wasn't working properly for the following case: + // delegate checkpoint wasn't updating for the second and next stakes for the same date + // if first stake was withdrawn completely and stake was delegated to the staker + // (no delegation to another address). + address previousDelegatee = delegates[stakeFor][until]; + if (previousDelegatee != delegatee) { + /// @dev Update delegatee. + delegates[stakeFor][until] = delegatee; + + /// @dev Decrease stake on previous balance for previous delegatee. + _decreaseDelegateStake(previousDelegatee, until, previousBalance); + + /// @dev Add previousBalance to amount. + amount = add96(previousBalance, amount, "Staking::stake: balance overflow"); + } + + /// @dev Increase stake. + _increaseDelegateStake(delegatee, until, amount); + emit DelegateChanged(stakeFor, until, previousDelegatee, delegatee); + } + + /** + * @notice Extend the staking duration until the specified date. + * @param previousLock The old unlocking timestamp. + * @param until The new unlocking timestamp in seconds. + * */ + function extendStakingDuration(uint256 previousLock, uint256 until) public { + until = timestampToLockDate(until); + require(previousLock <= until, "Staking::extendStakingDuration: cannot reduce the staking duration"); + + /// @dev Do not exceed the max duration, no overflow possible. + uint256 latest = timestampToLockDate(block.timestamp + MAX_DURATION); + if (until > latest) until = latest; + + /// @dev Update checkpoints. + /// @dev TODO James: Can reading stake at block.number -1 cause trouble with multiple tx in a block? + uint96 amount = _getPriorUserStakeByDate(msg.sender, previousLock, block.number - 1); + require(amount > 0, "Staking::extendStakingDuration: nothing staked until the previous lock date"); + _decreaseUserStake(msg.sender, previousLock, amount); + _increaseUserStake(msg.sender, until, amount); + _decreaseDailyStake(previousLock, amount); + _increaseDailyStake(until, amount); + + /// @dev Delegate might change: if there is already a delegate set for the until date, it will remain the delegate for this position + address delegateFrom = delegates[msg.sender][previousLock]; + address delegateTo = delegates[msg.sender][until]; + if (delegateTo == address(0)) { + delegateTo = delegateFrom; + delegates[msg.sender][until] = delegateFrom; + } + delegates[msg.sender][previousLock] = address(0); + _decreaseDelegateStake(delegateFrom, previousLock, amount); + _increaseDelegateStake(delegateTo, until, amount); + + emit ExtendedStakingDuration(msg.sender, previousLock, until); + } + + /** + * @notice Send sender's tokens to this contract and update its staked balance. + * @param sender The sender of the tokens. + * @param amount The number of tokens to send. + * @param stakeFor The beneficiary whose stake will be increased. + * @param until The date until which the tokens will be staked. + * */ + function _increaseStake( + address sender, + uint96 amount, + address stakeFor, + uint256 until + ) internal { + /// @dev Retrieve the SOV tokens. + bool success = SOVToken.transferFrom(sender, address(this), amount); + require(success); + + /// @dev Increase staked balance. + uint96 balance = currentBalance(stakeFor, until); + balance = add96(balance, amount, "Staking::increaseStake: balance overflow"); + + /// @dev Update checkpoints. + _increaseDailyStake(until, amount); + _increaseUserStake(stakeFor, until, amount); + + emit TokensStaked(stakeFor, amount, until, balance); + } + + /** + * @notice Stake tokens according to the vesting schedule. + * @param amount The amount of tokens to stake. + * @param cliff The time interval to the first withdraw. + * @param duration The staking duration. + * @param intervalLength The length of each staking interval when cliff passed. + * @param stakeFor The address to stake the tokens for or 0x0 if staking for oneself. + * @param delegatee The address of the delegatee or 0x0 if there is none. + * */ + function stakesBySchedule( + uint256 amount, + uint256 cliff, + uint256 duration, + uint256 intervalLength, + address stakeFor, + address delegatee + ) public { + /** + * @dev Stake them until lock dates according to the vesting schedule. + * Note: because staking is only possible in periods of 2 weeks, + * the total duration might end up a bit shorter than specified + * depending on the date of staking. + * */ + uint256 start = timestampToLockDate(block.timestamp + cliff); + if (duration > MAX_DURATION) { + duration = MAX_DURATION; + } + uint256 end = timestampToLockDate(block.timestamp + duration); + uint256 numIntervals = (end - start) / intervalLength + 1; + uint256 stakedPerInterval = amount / numIntervals; + /// @dev stakedPerInterval might lose some dust on rounding. Add it to the first staking date. + if (numIntervals >= 1) { + _stake(msg.sender, uint96(amount - stakedPerInterval * (numIntervals - 1)), start, stakeFor, delegatee, true); + } + /// @dev Stake the rest in 4 week intervals. + for (uint256 i = start + intervalLength; i <= end; i += intervalLength) { + /// @dev Stakes for itself, delegates to the owner. + _stake(msg.sender, uint96(stakedPerInterval), i, stakeFor, delegatee, true); + } + } + + /** + * @notice Withdraw the given amount of tokens if they are unlocked. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * @param receiver The receiver of the tokens. If not specified, send to the msg.sender + * */ + function withdraw( + uint96 amount, + uint256 until, + address receiver + ) public { + _withdraw(amount, until, receiver, false); + // @dev withdraws tokens for lock date 2 weeks later than given lock date if sender is a contract + // we need to check block.timestamp here + _withdrawNext(amount, until, receiver, false); + } + + /** + * @notice Withdraw the given amount of tokens. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * @param receiver The receiver of the tokens. If not specified, send to the msg.sender + * @dev Can be invoked only by whitelisted contract passed to governanceWithdrawVesting + * */ + function governanceWithdraw( + uint96 amount, + uint256 until, + address receiver + ) public { + require(vestingWhitelist[msg.sender], "unauthorized"); + + _withdraw(amount, until, receiver, true); + // @dev withdraws tokens for lock date 2 weeks later than given lock date if sender is a contract + // we don't need to check block.timestamp here + _withdrawNext(amount, until, receiver, true); + } + + /** + * @notice Withdraw tokens for vesting contract. + * @param vesting The address of Vesting contract. + * @param receiver The receiver of the tokens. If not specified, send to the msg.sender + * @dev Can be invoked only by whitelisted contract passed to governanceWithdrawVesting. + * */ + function governanceWithdrawVesting(address vesting, address receiver) public onlyAuthorized { + vestingWhitelist[vesting] = true; + ITeamVesting(vesting).governanceWithdrawTokens(receiver); + vestingWhitelist[vesting] = false; + + emit VestingTokensWithdrawn(vesting, receiver); + } + + /** + * @notice Send user' staked tokens to a receiver taking into account punishments. + * Sovryn encourages long-term commitment and thinking. When/if you unstake before + * the end of the staking period, a percentage of the original staking amount will + * be slashed. This amount is also added to the reward pool and is distributed + * between all other stakers. + * + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * @param receiver The receiver of the tokens. If not specified, send to the msg.sender + * @param isGovernance Whether all tokens (true) + * or just unlocked tokens (false). + * */ + function _withdraw( + uint96 amount, + uint256 until, + address receiver, + bool isGovernance + ) internal { + // @dev it's very unlikely some one will have 1/10**18 SOV staked in Vesting contract + // this check is a part of workaround for Vesting.withdrawTokens issue + if (amount == 1 && _isVestingContract()) { + return; + } + until = _adjustDateForOrigin(until); + _validateWithdrawParams(amount, until); + + /// @dev Determine the receiver. + if (receiver == address(0)) receiver = msg.sender; + + /// @dev Update the checkpoints. + _decreaseDailyStake(until, amount); + _decreaseUserStake(msg.sender, until, amount); + _decreaseDelegateStake(delegates[msg.sender][until], until, amount); + + /// @dev Early unstaking should be punished. + if (block.timestamp < until && !allUnlocked && !isGovernance) { + uint96 punishedAmount = _getPunishedAmount(amount, until); + amount -= punishedAmount; + + /// @dev punishedAmount can be 0 if block.timestamp are very close to 'until' + if (punishedAmount > 0) { + require(address(feeSharing) != address(0), "Staking::withdraw: FeeSharing address wasn't set"); + /// @dev Move punished amount to fee sharing. + /// @dev Approve transfer here and let feeSharing do transfer and write checkpoint. + SOVToken.approve(address(feeSharing), punishedAmount); + feeSharing.transferTokens(address(SOVToken), punishedAmount); + } + } + + /// @dev transferFrom + bool success = SOVToken.transfer(receiver, amount); + require(success, "Staking::withdraw: Token transfer failed"); + + emit TokensWithdrawn(msg.sender, receiver, amount); + } + + // @dev withdraws tokens for lock date 2 weeks later than given lock date + function _withdrawNext( + uint96 amount, + uint256 until, + address receiver, + bool isGovernance + ) internal { + if (_isVestingContract()) { + uint256 nextLock = until.add(TWO_WEEKS); + if (isGovernance || block.timestamp >= nextLock) { + uint96 stake = _getPriorUserStakeByDate(msg.sender, nextLock, block.number - 1); + if (stake > 0) { + _withdraw(stake, nextLock, receiver, isGovernance); + } + } + } + } + + /** + * @notice Get available and punished amount for withdrawing. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * */ + function getWithdrawAmounts(uint96 amount, uint256 until) public view returns (uint96, uint96) { + _validateWithdrawParams(amount, until); + uint96 punishedAmount = _getPunishedAmount(amount, until); + return (amount - punishedAmount, punishedAmount); + } + + /** + * @notice Get punished amount for withdrawing. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * */ + function _getPunishedAmount(uint96 amount, uint256 until) internal view returns (uint96) { + uint256 date = timestampToLockDate(block.timestamp); + uint96 weight = computeWeightByDate(until, date); /// @dev (10 - 1) * WEIGHT_FACTOR + weight = weight * weightScaling; + return (amount * weight) / WEIGHT_FACTOR / 100; + } + + /** + * @notice Validate withdraw parameters. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * */ + function _validateWithdrawParams(uint96 amount, uint256 until) internal view { + require(amount > 0, "Staking::withdraw: amount of tokens to be withdrawn needs to be bigger than 0"); + uint96 balance = _getPriorUserStakeByDate(msg.sender, until, block.number - 1); + require(amount <= balance, "Staking::withdraw: not enough balance"); + } + + /** + * @notice Get the current balance of an account locked until a certain date. + * @param account The user address. + * @param lockDate The lock date. + * @return The stake amount. + * */ + function currentBalance(address account, uint256 lockDate) internal view returns (uint96) { + return userStakingCheckpoints[account][lockDate][numUserStakingCheckpoints[account][lockDate] - 1].stake; + } + + /** + * @notice Get the number of staked tokens held by the user account. + * @dev Iterate checkpoints adding up stakes. + * @param account The address of the account to get the balance of. + * @return The number of tokens held. + * */ + function balanceOf(address account) public view returns (uint96 balance) { + for (uint256 i = kickoffTS; i <= block.timestamp + MAX_DURATION; i += TWO_WEEKS) { + balance = add96(balance, currentBalance(account, i), "Staking::balanceOf: overflow"); + } + } + + /** + * @notice Delegate votes from `msg.sender` which are locked until lockDate to `delegatee`. + * @param delegatee The address to delegate votes to. + * @param lockDate the date if the position to delegate. + * */ + function delegate(address delegatee, uint256 lockDate) public { + _delegate(msg.sender, delegatee, lockDate); + // @dev delegates tokens for lock date 2 weeks later than given lock date + // if message sender is a contract + _delegateNext(msg.sender, delegatee, lockDate); + } + + /** + * @notice Delegates votes from signatory to a delegatee account. + * Voting with EIP-712 Signatures. + * + * Voting power can be delegated to any address, and then can be used to + * vote on proposals. A key benefit to users of by-signature functionality + * is that they can create a signed vote transaction for free, and have a + * trusted third-party spend rBTC(or ETH) on gas fees and write it to the + * blockchain for them. + * + * The third party in this scenario, submitting the SOV-holder’s signed + * transaction holds a voting power that is for only a single proposal. + * The signatory still holds the power to vote on their own behalf in + * the proposal if the third party has not yet published the signed + * transaction that was given to them. + * + * @dev The signature needs to be broken up into 3 parameters, known as + * v, r and s: + * const r = '0x' + sig.substring(2).substring(0, 64); + * const s = '0x' + sig.substring(2).substring(64, 128); + * const v = '0x' + sig.substring(2).substring(128, 130); + * + * @param delegatee The address to delegate votes to. + * @param lockDate The date until which the position is locked. + * @param nonce The contract state required to match the signature. + * @param expiry The time at which to expire the signature. + * @param v The recovery byte of the signature. + * @param r Half of the ECDSA signature pair. + * @param s Half of the ECDSA signature pair. + * */ + function delegateBySig( + address delegatee, + uint256 lockDate, + uint256 nonce, + uint256 expiry, + uint8 v, + bytes32 r, + bytes32 s + ) public { + /** + * @dev The DOMAIN_SEPARATOR is a hash that uniquely identifies a + * smart contract. It is built from a string denoting it as an + * EIP712 Domain, the name of the token contract, the version, + * the chainId in case it changes, and the address that the + * contract is deployed at. + * */ + bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))); + + /// @dev GovernorAlpha uses BALLOT_TYPEHASH, while Staking uses DELEGATION_TYPEHASH + bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, lockDate, nonce, expiry)); + + bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); + address signatory = ecrecover(digest, v, r, s); + + /// @dev Verify address is not null and PK is not null either. + require(RSKAddrValidator.checkPKNotZero(signatory), "Staking::delegateBySig: invalid signature"); + require(nonce == nonces[signatory]++, "Staking::delegateBySig: invalid nonce"); + require(now <= expiry, "Staking::delegateBySig: signature expired"); + _delegate(signatory, delegatee, lockDate); + // @dev delegates tokens for lock date 2 weeks later than given lock date + // if message sender is a contract + _delegateNext(signatory, delegatee, lockDate); + } + + /** + * @notice Get the current votes balance for a user account. + * @param account The address to get votes balance. + * @dev This is a wrapper to simplify arguments. The actual computation is + * performed on WeightedStaking parent contract. + * @return The number of current votes for a user account. + * */ + function getCurrentVotes(address account) external view returns (uint96) { + return getPriorVotes(account, block.number - 1, block.timestamp); + } + + /** + * @notice Get the current number of tokens staked for a day. + * @param lockedTS The timestamp to get the staked tokens for. + * */ + function getCurrentStakedUntil(uint256 lockedTS) external view returns (uint96) { + uint32 nCheckpoints = numTotalStakingCheckpoints[lockedTS]; + return nCheckpoints > 0 ? totalStakingCheckpoints[lockedTS][nCheckpoints - 1].stake : 0; + } + + /** + * @notice Set new delegatee. Move from user's current delegate to a new + * delegatee the stake balance. + * @param delegator The user address to move stake balance from its current delegatee. + * @param delegatee The new delegatee. The address to move stake balance to. + * @param lockedTS The lock date. + * */ + function _delegate( + address delegator, + address delegatee, + uint256 lockedTS + ) internal { + address currentDelegate = delegates[delegator][lockedTS]; + uint96 delegatorBalance = currentBalance(delegator, lockedTS); + delegates[delegator][lockedTS] = delegatee; + + emit DelegateChanged(delegator, lockedTS, currentDelegate, delegatee); + + _moveDelegates(currentDelegate, delegatee, delegatorBalance, lockedTS); + } + + // @dev delegates tokens for lock date 2 weeks later than given lock date + // if message sender is a contract + function _delegateNext( + address delegator, + address delegatee, + uint256 lockedTS + ) internal { + if (_isVestingContract()) { + uint256 nextLock = lockedTS.add(TWO_WEEKS); + address currentDelegate = delegates[delegator][nextLock]; + if (currentDelegate != delegatee) { + _delegate(delegator, delegatee, nextLock); + } + + // @dev workaround for the issue with a delegation of the latest stake + uint256 endDate = IVesting(msg.sender).endDate(); + nextLock = lockedTS.add(FOUR_WEEKS); + if (nextLock == endDate) { + currentDelegate = delegates[delegator][nextLock]; + if (currentDelegate != delegatee) { + _delegate(delegator, delegatee, nextLock); + } + } + } + } + + /** + * @notice Move an amount of delegate stake from a source address to a + * destination address. + * @param srcRep The address to get the staked amount from. + * @param dstRep The address to send the staked amount to. + * @param amount The staked amount to move. + * @param lockedTS The lock date. + * */ + function _moveDelegates( + address srcRep, + address dstRep, + uint96 amount, + uint256 lockedTS + ) internal { + if (srcRep != dstRep && amount > 0) { + if (srcRep != address(0)) _decreaseDelegateStake(srcRep, lockedTS, amount); + + if (dstRep != address(0)) _increaseDelegateStake(dstRep, lockedTS, amount); + } + } + + /** + * @notice Retrieve CHAIN_ID of the executing chain. + * + * Chain identifier (chainID) introduced in EIP-155 protects transaction + * included into one chain from being included into another chain. + * Basically, chain identifier is an integer number being used in the + * processes of signing transactions and verifying transaction signatures. + * + * @dev As of version 0.5.12, Solidity includes an assembly function + * chainid() that provides access to the new CHAINID opcode. + * + * TODO: chainId is included in block. So you can get chain id like + * block timestamp or block number: block.chainid; + * */ + function getChainId() internal pure returns (uint256) { + uint256 chainId; + assembly { + chainId := chainid() + } + return chainId; + } + + /** + * @notice Allow the owner to set a new staking contract. + * As a consequence it allows the stakers to migrate their positions + * to the new contract. + * @dev Doesn't have any influence as long as migrateToNewStakingContract + * is not implemented. + * @param _newStakingContract The address of the new staking contract. + * */ + function setNewStakingContract(address _newStakingContract) public onlyOwner { + require(_newStakingContract != address(0), "can't reset the new staking contract to 0"); + newStakingContract = _newStakingContract; + } + + /** + * @notice Allow the owner to set a fee sharing proxy contract. + * We need it for unstaking with slashing. + * @param _feeSharing The address of FeeSharingProxy contract. + * */ + function setFeeSharing(address _feeSharing) public onlyOwner { + require(_feeSharing != address(0), "FeeSharing address shouldn't be 0"); + feeSharing = IFeeSharingProxy(_feeSharing); + } + + /** + * @notice Allow the owner to set weight scaling. + * We need it for unstaking with slashing. + * @param _weightScaling The weight scaling. + * */ + function setWeightScaling(uint96 _weightScaling) public onlyOwner { + require( + MIN_WEIGHT_SCALING <= _weightScaling && _weightScaling <= MAX_WEIGHT_SCALING, + "weight scaling doesn't belong to range [1, 9]" + ); + weightScaling = _weightScaling; + } + + /** + * @notice Allow a staker to migrate his positions to the new staking contract. + * @dev Staking contract needs to be set before by the owner. + * Currently not implemented, just needed for the interface. + * In case it's needed at some point in the future, + * the implementation needs to be changed first. + * */ + function migrateToNewStakingContract() public { + require(newStakingContract != address(0), "there is no new staking contract set"); + /// @dev implementation: + /// @dev Iterate over all possible lock dates from now until now + MAX_DURATION. + /// @dev Read the stake & delegate of the msg.sender + /// @dev If stake > 0, stake it at the new contract until the lock date with the current delegate. + } + + /** + * @notice Allow the owner to unlock all tokens in case the staking contract + * is going to be replaced + * Note: Not reversible on purpose. once unlocked, everything is unlocked. + * The owner should not be able to just quickly unlock to withdraw his own + * tokens and lock again. + * @dev Last resort. + * */ + function unlockAllTokens() public onlyOwner { + allUnlocked = true; + emit TokensUnlocked(SOVToken.balanceOf(address(this))); + } + + /** + * @notice Get list of stakes for a user account. + * @param account The address to get stakes. + * @return The arrays of dates and stakes. + * */ + function getStakes(address account) public view returns (uint256[] memory dates, uint96[] memory stakes) { + uint256 latest = timestampToLockDate(block.timestamp + MAX_DURATION); + + /// @dev Calculate stakes. + uint256 count = 0; + /// @dev We need to iterate from first possible stake date after deployment to the latest from current time. + for (uint256 i = kickoffTS + TWO_WEEKS; i <= latest; i += TWO_WEEKS) { + if (currentBalance(account, i) > 0) { + count++; + } + } + dates = new uint256[](count); + stakes = new uint96[](count); + + /// @dev We need to iterate from first possible stake date after deployment to the latest from current time. + uint256 j = 0; + for (uint256 i = kickoffTS + TWO_WEEKS; i <= latest; i += TWO_WEEKS) { + uint96 balance = currentBalance(account, i); + if (balance > 0) { + dates[j] = i; + stakes[j] = balance; + j++; + } + } + } + + /** + * @notice Overrides default ApprovalReceiver._getToken function to + * register SOV token on this contract. + * @return The address of SOV token. + * */ + function _getToken() internal view returns (address) { + return address(SOVToken); + } + + /** + * @notice Overrides default ApprovalReceiver._getSelectors function to + * register stakeWithApproval selector on this contract. + * @return The array of registered selectors on this contract. + * */ + function _getSelectors() internal view returns (bytes4[] memory) { + bytes4[] memory selectors = new bytes4[](1); + selectors[0] = this.stakeWithApproval.selector; + return selectors; + } +} diff --git a/contracts/Sovryn/Governance/Staking/StakingProxy.sol b/contracts/Sovryn/Governance/Staking/StakingProxy.sol new file mode 100644 index 0000000..4ea138f --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/StakingProxy.sol @@ -0,0 +1,22 @@ +pragma solidity ^0.5.17; + +import "./StakingStorage.sol"; +import "../../Proxy/UpgradableProxy.sol"; + +/** + * @title Staking Proxy contract. + * @dev Staking contract should be upgradable, use UpgradableProxy. + * StakingStorage is deployed with the upgradable functionality + * by using this contract instead, that inherits from UpgradableProxy + * the possibility of being enhanced and re-deployed. + * */ +contract StakingProxy is StakingStorage, UpgradableProxy { + /** + * @notice Construct a new staking contract. + * @param SOV The address of the SOV token address. + */ + constructor(address SOV) public { + SOVToken = IERC20(SOV); + kickoffTS = block.timestamp; + } +} diff --git a/contracts/Sovryn/Governance/Staking/StakingStorage.sol b/contracts/Sovryn/Governance/Staking/StakingStorage.sol new file mode 100644 index 0000000..a3126d1 --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/StakingStorage.sol @@ -0,0 +1,127 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; + +/** + * @title Staking Storage contact. + * @notice Just the storage part of stacking contract, no functions, + * only constant, variables and required structures (mappings). + * Used by StackingProxy and Checkpoints contracts. + * + * What is SOV staking? + * The purpose of the SOV token is to provide a pseudonymous, + * censorship-resistant mechanism for governing the parameters of the Sovryn + * protocol, while aligning the incentives of protocol governors with the + * long-term success of the protocol. Any SOV token holder can choose to + * stake (lock up) their tokens for a fixed period of time in return for + * voting rights in the Bitocracy. Stakers are further incentivised through + * fee and slashing rewards. + * */ +contract StakingStorage is Ownable { + /// @notice 2 weeks in seconds. + uint256 constant TWO_WEEKS = 1209600; + + /// @notice The maximum possible voting weight before adding +1 (actually 10, but need 9 for computation). + uint96 public constant MAX_VOTING_WEIGHT = 9; + + /// @notice weight is multiplied with this factor (for allowing decimals, like 1.2x). + /// @dev MAX_VOTING_WEIGHT * WEIGHT_FACTOR needs to be < 792, because there are 100,000,000 SOV with 18 decimals + uint96 public constant WEIGHT_FACTOR = 10; + + /// @notice The maximum duration to stake tokens for. + uint256 public constant MAX_DURATION = 1092 days; + + /// @notice The maximum duration ^2 + uint96 constant MAX_DURATION_POW_2 = 1092 * 1092; + + /// @notice Default weight scaling. + uint96 constant DEFAULT_WEIGHT_SCALING = 3; + + /// @notice Range for weight scaling. + uint96 constant MIN_WEIGHT_SCALING = 1; + uint96 constant MAX_WEIGHT_SCALING = 9; + + /// @notice The timestamp of contract creation. Base for the staking period calculation. + uint256 public kickoffTS; + + string name = "SOVStaking"; + + /// @notice The token to be staked. + IERC20 public SOVToken; + + /// @notice A record of each accounts delegate. + mapping(address => mapping(uint256 => address)) public delegates; + + /// @notice If this flag is set to true, all tokens are unlocked immediately. + bool public allUnlocked = false; + + /// @notice The EIP-712 typehash for the contract's domain. + bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); + + /// @notice The EIP-712 typehash for the delegation struct used by the contract. + bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 lockDate,uint256 nonce,uint256 expiry)"); + + /// @notice Used for stake migrations to a new staking contract with a different storage structure. + address public newStakingContract; + + /*************************** Checkpoints *******************************/ + + /// @notice A checkpoint for marking the stakes from a given block + struct Checkpoint { + uint32 fromBlock; + uint96 stake; + } + + /// @notice A record of tokens to be unstaked at a given time in total. + /// For total voting power computation. Voting weights get adjusted bi-weekly. + /// @dev totalStakingCheckpoints[date][index] is a checkpoint. + mapping(uint256 => mapping(uint32 => Checkpoint)) public totalStakingCheckpoints; + + /// @notice The number of total staking checkpoints for each date. + /// @dev numTotalStakingCheckpoints[date] is a number. + mapping(uint256 => uint32) public numTotalStakingCheckpoints; + + /// @notice A record of tokens to be unstaked at a given time which were delegated to a certain address. + /// For delegatee voting power computation. Voting weights get adjusted bi-weekly. + /// @dev delegateStakingCheckpoints[delegatee][date][index] is a checkpoint. + mapping(address => mapping(uint256 => mapping(uint32 => Checkpoint))) public delegateStakingCheckpoints; + + /// @notice The number of total staking checkpoints for each date per delegate. + /// @dev numDelegateStakingCheckpoints[delegatee][date] is a number. + mapping(address => mapping(uint256 => uint32)) public numDelegateStakingCheckpoints; + + /// @notice A record of tokens to be unstaked at a given time which per user address (address -> lockDate -> stake checkpoint) + /// @dev userStakingCheckpoints[user][date][index] is a checkpoint. + mapping(address => mapping(uint256 => mapping(uint32 => Checkpoint))) public userStakingCheckpoints; + + /// @notice The number of total staking checkpoints for each date per user. + /// @dev numUserStakingCheckpoints[user][date] is a number. + mapping(address => mapping(uint256 => uint32)) public numUserStakingCheckpoints; + + /// @notice A record of states for signing / validating signatures + /// @dev nonces[user] is a number. + mapping(address => uint256) public nonces; + + /*************************** Slashing *******************************/ + + /// @notice the address of FeeSharingProxy contract, we need it for unstaking with slashing. + IFeeSharingProxy public feeSharing; + + /// @notice used for weight scaling when unstaking with slashing. + uint96 public weightScaling = DEFAULT_WEIGHT_SCALING; + + /// @notice List of vesting contracts, tokens for these contracts won't be slashed if unstaked by governance. + /// @dev vestingWhitelist[contract] is true/false. + mapping(address => bool) public vestingWhitelist; + + /// @dev user => flag whether user has admin role. + /// @dev multisig should be an admin, admin can invoke only governanceWithdrawVesting function, + /// this function works only with Team Vesting contracts + mapping(address => bool) public admins; + + /// @dev vesting contract code hash => flag whether it's registered code hash + mapping(bytes32 => bool) public vestingCodeHashes; +} diff --git a/contracts/Sovryn/Governance/Staking/WeightedStaking.sol b/contracts/Sovryn/Governance/Staking/WeightedStaking.sol new file mode 100644 index 0000000..d35f4e5 --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/WeightedStaking.sol @@ -0,0 +1,447 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "./Checkpoints.sol"; +import "../../../Openzeppelin/Address.sol"; + +/** + * @title Weighted Staking contract. + * @notice Computation of power and votes used by FeeSharingProxy and + * GovernorAlpha and Staking contracts w/ mainly 3 public functions: + * + getPriorTotalVotingPower => Total voting power. + * + getPriorVotes => Delegatee voting power. + * + getPriorWeightedStake => User Weighted Stake. + * Staking contract inherits WeightedStaking. + * FeeSharingProxy and GovernorAlpha invoke Staking instance functions. + * */ +contract WeightedStaking is Checkpoints { + using Address for address payable; + + /** + * @dev Throws if called by any account other than the owner or admin. + */ + modifier onlyAuthorized() { + require(isOwner() || admins[msg.sender], "unauthorized"); + _; + } + + /************* TOTAL VOTING POWER COMPUTATION ************************/ + + /** + * @notice Compute the total voting power at a given time. + * @param time The timestamp for which to calculate the total voting power. + * @return The total voting power at the given time. + * */ + function getPriorTotalVotingPower(uint32 blockNumber, uint256 time) public view returns (uint96 totalVotingPower) { + /// @dev Start the computation with the exact or previous unlocking date (voting weight remians the same until the next break point). + uint256 start = timestampToLockDate(time); + uint256 end = start + MAX_DURATION; + + /// @dev Max 78 iterations. + for (uint256 i = start; i <= end; i += TWO_WEEKS) { + totalVotingPower = add96( + totalVotingPower, + _totalPowerByDate(i, start, blockNumber), + "WeightedStaking::getPriorTotalVotingPower: overflow on total voting power computation" + ); + } + } + + /** + * @notice Compute the voting power for a specific date. + * Power = stake * weight + * @param date The staking date to compute the power for. + * @param startDate The date for which we need to know the power of the stake. + * @param blockNumber The block number, needed for checkpointing. + * */ + function _totalPowerByDate( + uint256 date, + uint256 startDate, + uint256 blockNumber + ) internal view returns (uint96 power) { + uint96 weight = computeWeightByDate(date, startDate); + uint96 staked = getPriorTotalStakesForDate(date, blockNumber); + /// @dev weight is multiplied by some factor to allow decimals. + power = mul96(staked, weight, "WeightedStaking::_totalPowerByDate: multiplication overflow") / WEIGHT_FACTOR; + } + + /** + * @notice Determine the prior number of stake for an unlocking date as of a block number. + * @dev Block number must be a finalized block or else this function will + * revert to prevent misinformation. + * TODO: WeightedStaking::getPriorTotalStakesForDate should probably better + * be internal instead of a public function. + * @param date The date to check the stakes for. + * @param blockNumber The block number to get the vote balance at. + * @return The number of votes the account had as of the given block. + * */ + function getPriorTotalStakesForDate(uint256 date, uint256 blockNumber) public view returns (uint96) { + require(blockNumber < block.number, "WeightedStaking::getPriorTotalStakesForDate: not yet determined"); + + uint32 nCheckpoints = numTotalStakingCheckpoints[date]; + if (nCheckpoints == 0) { + return 0; + } + + // First check most recent balance + if (totalStakingCheckpoints[date][nCheckpoints - 1].fromBlock <= blockNumber) { + return totalStakingCheckpoints[date][nCheckpoints - 1].stake; + } + + // Next check implicit zero balance + if (totalStakingCheckpoints[date][0].fromBlock > blockNumber) { + return 0; + } + + uint32 lower = 0; + uint32 upper = nCheckpoints - 1; + while (upper > lower) { + uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow + Checkpoint memory cp = totalStakingCheckpoints[date][center]; + if (cp.fromBlock == blockNumber) { + return cp.stake; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return totalStakingCheckpoints[date][lower].stake; + } + + /****************************** DELEGATED VOTING POWER COMPUTATION ************************/ + + /** + * @notice Determine the prior number of votes for a delegatee as of a block number. + * Iterate through checkpoints adding up voting power. + * @dev Block number must be a finalized block or else this function will revert + * to prevent misinformation. + * Used for Voting, not for fee sharing. + * @param account The address of the account to check. + * @param blockNumber The block number to get the vote balance at. + * @return The number of votes the delegatee had as of the given block. + * */ + function getPriorVotes( + address account, + uint256 blockNumber, + uint256 date + ) public view returns (uint96 votes) { + /// @dev If date is not an exact break point, start weight computation from the previous break point (alternative would be the next). + uint256 start = timestampToLockDate(date); + uint256 end = start + MAX_DURATION; + + /// @dev Max 78 iterations. + for (uint256 i = start; i <= end; i += TWO_WEEKS) { + votes = add96( + votes, + _totalPowerByDateForDelegatee(account, i, start, blockNumber), + "WeightedStaking::getPriorVotes: overflow on total voting power computation" + ); + } + } + + /** + * @notice Compute the voting power for a specific date. + * Power = stake * weight + * @param date The staking date to compute the power for. + * @param startDate The date for which we need to know the power of the stake. + * @param blockNumber The block number, needed for checkpointing. + * */ + function _totalPowerByDateForDelegatee( + address account, + uint256 date, + uint256 startDate, + uint256 blockNumber + ) internal view returns (uint96 power) { + uint96 weight = computeWeightByDate(date, startDate); + uint96 staked = getPriorStakeByDateForDelegatee(account, date, blockNumber); + power = mul96(staked, weight, "WeightedStaking::_totalPowerByDateForDelegatee: multiplication overflow") / WEIGHT_FACTOR; + } + + /** + * @notice Determine the prior number of stake for an account as of a block number. + * @dev Block number must be a finalized block or else this function will + * revert to prevent misinformation. + * TODO: WeightedStaking::getPriorStakeByDateForDelegatee should probably better + * be internal instead of a public function. + * @param account The address of the account to check. + * @param blockNumber The block number to get the vote balance at. + * @return The number of votes the account had as of the given block. + * */ + function getPriorStakeByDateForDelegatee( + address account, + uint256 date, + uint256 blockNumber + ) public view returns (uint96) { + require(blockNumber < block.number, "WeightedStaking::getPriorStakeByDateForDelegatee: not yet determined"); + + uint32 nCheckpoints = numDelegateStakingCheckpoints[account][date]; + if (nCheckpoints == 0) { + return 0; + } + + /// @dev First check most recent balance. + if (delegateStakingCheckpoints[account][date][nCheckpoints - 1].fromBlock <= blockNumber) { + return delegateStakingCheckpoints[account][date][nCheckpoints - 1].stake; + } + + /// @dev Next check implicit zero balance. + if (delegateStakingCheckpoints[account][date][0].fromBlock > blockNumber) { + return 0; + } + + uint32 lower = 0; + uint32 upper = nCheckpoints - 1; + while (upper > lower) { + uint32 center = upper - (upper - lower) / 2; /// @dev ceil, avoiding overflow. + Checkpoint memory cp = delegateStakingCheckpoints[account][date][center]; + if (cp.fromBlock == blockNumber) { + return cp.stake; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return delegateStakingCheckpoints[account][date][lower].stake; + } + + /*************************** User Weighted Stake computation for fee sharing *******************************/ + + /** + * @notice Determine the prior weighted stake for an account as of a block number. + * Iterate through checkpoints adding up voting power. + * @dev Block number must be a finalized block or else this function will + * revert to prevent misinformation. + * Used for fee sharing, not voting. + * TODO: WeightedStaking::getPriorWeightedStake is using the variable name "votes" + * to add up token stake, and that could be misleading. + * + * @param account The address of the account to check. + * @param blockNumber The block number to get the vote balance at. + * @return The weighted stake the account had as of the given block. + * */ + function getPriorWeightedStake( + address account, + uint256 blockNumber, + uint256 date + ) public view returns (uint96 votes) { + /// @dev If date is not an exact break point, start weight computation from the previous break point (alternative would be the next). + uint256 start = timestampToLockDate(date); + uint256 end = start + MAX_DURATION; + + /// @dev Max 78 iterations. + for (uint256 i = start; i <= end; i += TWO_WEEKS) { + uint96 weightedStake = weightedStakeByDate(account, i, start, blockNumber); + if (weightedStake > 0) { + votes = add96(votes, weightedStake, "WeightedStaking::getPriorWeightedStake: overflow on total weight computation"); + } + } + } + + /** + * @notice Compute the voting power for a specific date. + * Power = stake * weight + * TODO: WeightedStaking::weightedStakeByDate should probably better + * be internal instead of a public function. + * @param date The staking date to compute the power for. + * @param startDate The date for which we need to know the power of the stake. + * @param blockNumber The block number, needed for checkpointing. + * */ + function weightedStakeByDate( + address account, + uint256 date, + uint256 startDate, + uint256 blockNumber + ) public view returns (uint96 power) { + uint96 staked = _getPriorUserStakeByDate(account, date, blockNumber); + if (staked > 0) { + uint96 weight = computeWeightByDate(date, startDate); + power = mul96(staked, weight, "WeightedStaking::weightedStakeByDate: multiplication overflow") / WEIGHT_FACTOR; + } else { + power = 0; + } + } + + /** + * @notice Determine the prior number of stake for an account until a + * certain lock date as of a block number. + * @dev Block number must be a finalized block or else this function + * will revert to prevent misinformation. + * @param account The address of the account to check. + * @param date The lock date. + * @param blockNumber The block number to get the vote balance at. + * @return The number of votes the account had as of the given block. + * */ + function getPriorUserStakeByDate( + address account, + uint256 date, + uint256 blockNumber + ) external view returns (uint96) { + uint96 priorStake = _getPriorUserStakeByDate(account, date, blockNumber); + // @dev we need to modify function in order to workaround issue with Vesting.withdrawTokens: + // return 1 instead of 0 if message sender is a contract. + if (priorStake == 0 && _isVestingContract()) { + priorStake = 1; + } + return priorStake; + } + + /** + * @notice Determine the prior number of stake for an account until a + * certain lock date as of a block number. + * @dev All functions of Staking contract use this internal version, + * we need to modify public function in order to workaround issue with Vesting.withdrawTokens: + * return 1 instead of 0 if message sender is a contract. + * */ + function _getPriorUserStakeByDate( + address account, + uint256 date, + uint256 blockNumber + ) internal view returns (uint96) { + require(blockNumber < block.number, "WeightedStaking::getPriorUserStakeAndDate: not yet determined"); + + date = _adjustDateForOrigin(date); + uint32 nCheckpoints = numUserStakingCheckpoints[account][date]; + if (nCheckpoints == 0) { + return 0; + } + + /// @dev First check most recent balance. + if (userStakingCheckpoints[account][date][nCheckpoints - 1].fromBlock <= blockNumber) { + return userStakingCheckpoints[account][date][nCheckpoints - 1].stake; + } + + /// @dev Next check implicit zero balance. + if (userStakingCheckpoints[account][date][0].fromBlock > blockNumber) { + return 0; + } + + uint32 lower = 0; + uint32 upper = nCheckpoints - 1; + while (upper > lower) { + uint32 center = upper - (upper - lower) / 2; /// @dev ceil, avoiding overflow. + Checkpoint memory cp = userStakingCheckpoints[account][date][center]; + if (cp.fromBlock == blockNumber) { + return cp.stake; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return userStakingCheckpoints[account][date][lower].stake; + } + + /**************** SHARED FUNCTIONS *********************/ + + /** + * @notice Compute the weight for a specific date. + * @param date The unlocking date. + * @param startDate We compute the weight for the tokens staked until 'date' on 'startDate'. + * */ + function computeWeightByDate(uint256 date, uint256 startDate) public pure returns (uint96 weight) { + require(date >= startDate, "WeightedStaking::computeWeightByDate: date needs to be bigger than startDate"); + uint256 remainingTime = (date - startDate); + require(MAX_DURATION >= remainingTime, "Staking::computeWeightByDate:remaining time can't be bigger than max duration"); + /// @dev x = max days - remaining days + uint96 x = uint96(MAX_DURATION - remainingTime) / (1 days); + /// @dev w = (m^2 - x^2)/m^2 +1 (multiplied by the weight factor) + weight = add96( + WEIGHT_FACTOR, + mul96( + MAX_VOTING_WEIGHT * WEIGHT_FACTOR, + sub96(MAX_DURATION_POW_2, x * x, "underflow on weight calculation"), + "multiplication overflow on weight computation" + ) / MAX_DURATION_POW_2, + "overflow on weight computation" + ); + } + + /** + * @notice Unstaking is possible every 2 weeks only. This means, to + * calculate the key value for the staking checkpoints, we need to + * map the intended timestamp to the closest available date. + * @param timestamp The unlocking timestamp. + * @return The actual unlocking date (might be up to 2 weeks shorter than intended). + * */ + function timestampToLockDate(uint256 timestamp) public view returns (uint256 lockDate) { + require(timestamp >= kickoffTS, "WeightedStaking::timestampToLockDate: timestamp lies before contract creation"); + /** + * @dev If staking timestamp does not match any of the unstaking dates + * , set the lockDate to the closest one before the timestamp. + * E.g. Passed timestamps lies 7 weeks after kickoff -> only stake for 6 weeks. + * */ + uint256 periodFromKickoff = (timestamp - kickoffTS) / TWO_WEEKS; + lockDate = periodFromKickoff * TWO_WEEKS + kickoffTS; + } + + function _adjustDateForOrigin(uint256 date) internal view returns (uint256) { + uint256 adjustedDate = timestampToLockDate(date); + //origin vesting contracts have different dates + //we need to add 2 weeks to get end of period (by default, it's start) + if (adjustedDate != date) { + date = adjustedDate + TWO_WEEKS; + } + return date; + } + + /** + * @notice Add account to ACL. + * @param _admin The addresses of the account to grant permissions. + * */ + function addAdmin(address _admin) public onlyOwner { + admins[_admin] = true; + emit AdminAdded(_admin); + } + + /** + * @notice Remove account from ACL. + * @param _admin The addresses of the account to revoke permissions. + * */ + function removeAdmin(address _admin) public onlyOwner { + admins[_admin] = false; + emit AdminRemoved(_admin); + } + + /** + * @notice Add vesting contract's code hash to a map of code hashes. + * @param vesting The address of Vesting contract. + * @dev We need it to use _isVestingContract() function instead of isContract() + */ + function addContractCodeHash(address vesting) public onlyAuthorized { + bytes32 codeHash = _getCodeHash(vesting); + vestingCodeHashes[codeHash] = true; + emit ContractCodeHashAdded(codeHash); + } + + /** + * @notice Add vesting contract's code hash to a map of code hashes. + * @param vesting The address of Vesting contract. + * @dev We need it to use _isVestingContract() function instead of isContract() + */ + function removeContractCodeHash(address vesting) public onlyAuthorized { + bytes32 codeHash = _getCodeHash(vesting); + vestingCodeHashes[codeHash] = false; + emit ContractCodeHashRemoved(codeHash); + } + + /** + * @notice Return flag whether message sender is a registered vesting contract. + */ + function _isVestingContract() internal view returns (bool) { + bytes32 codeHash = _getCodeHash(msg.sender); + return vestingCodeHashes[codeHash]; + } + + /** + * @notice Return hash of contract code + */ + function _getCodeHash(address _contract) internal view returns (bytes32) { + bytes32 codeHash; + assembly { + codeHash := extcodehash(_contract) + } + return codeHash; + } +} diff --git a/contracts/Sovryn/Governance/Vesting/TeamVesting.sol b/contracts/Sovryn/Governance/Vesting/TeamVesting.sol new file mode 100644 index 0000000..ccb857c --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/TeamVesting.sol @@ -0,0 +1,55 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../Staking/Staking.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; +import "../../../Interfaces/IVesting.sol"; +import "../../Token/ApprovalReceiver.sol"; +import "./VestingStorage.sol"; +import "../../Proxy/Proxy.sol"; + +/** + * @title Team Vesting Contract. + * + * @notice A regular vesting contract, but the owner (governance) is able to + * withdraw earlier without a slashing. + * + * @dev Vesting contracts shouldn't be upgradable, + * use Proxy instead of UpgradableProxy. + * */ +contract TeamVesting is VestingStorage, Proxy { + /** + * @notice Setup the vesting schedule. + * @param _logic The address of logic contract. + * @param _SOV The SOV token address. + * @param _tokenOwner The owner of the tokens. + * @param _cliff The time interval to the first withdraw in seconds. + * @param _duration The total duration in seconds. + * */ + constructor( + address _logic, + address _SOV, + address _stakingAddress, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharingProxy + ) public { + require(_SOV != address(0), "SOV address invalid"); + require(_stakingAddress != address(0), "staking address invalid"); + require(_tokenOwner != address(0), "token owner address invalid"); + require(_duration >= _cliff, "duration must be bigger than or equal to the cliff"); + require(_feeSharingProxy != address(0), "feeSharingProxy address invalid"); + + _setImplementation(_logic); + SOV = IERC20(_SOV); + staking = Staking(_stakingAddress); + require(_duration <= staking.MAX_DURATION(), "duration may not exceed the max duration"); + tokenOwner = _tokenOwner; + cliff = _cliff; + duration = _duration; + feeSharingProxy = IFeeSharingProxy(_feeSharingProxy); + } +} diff --git a/contracts/Sovryn/Governance/Vesting/Vesting.sol b/contracts/Sovryn/Governance/Vesting/Vesting.sol new file mode 100644 index 0000000..cd3573d --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/Vesting.sol @@ -0,0 +1,39 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "./TeamVesting.sol"; + +/** + * @title Vesting Contract. + * @notice Team tokens and investor tokens are vested. Therefore, a smart + * contract needs to be developed to enforce the vesting schedule. + * + * @dev TODO add tests for governanceWithdrawTokens. + * */ +contract Vesting is TeamVesting { + /** + * @notice Setup the vesting schedule. + * @param _logic The address of logic contract. + * @param _SOV The SOV token address. + * @param _tokenOwner The owner of the tokens. + * @param _cliff The time interval to the first withdraw in seconds. + * @param _duration The total duration in seconds. + * */ + constructor( + address _logic, + address _SOV, + address _stakingAddress, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharingProxy + ) public TeamVesting(_logic, _SOV, _stakingAddress, _tokenOwner, _cliff, _duration, _feeSharingProxy) {} + + /** + * @dev We need to add this implementation to prevent proxy call VestingLogic.governanceWithdrawTokens + * @param receiver The receiver of the token withdrawal. + * */ + function governanceWithdrawTokens(address receiver) public { + revert("operation not supported"); + } +} diff --git a/contracts/Sovryn/Governance/Vesting/VestingFactory.sol b/contracts/Sovryn/Governance/Vesting/VestingFactory.sol new file mode 100644 index 0000000..30af066 --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/VestingFactory.sol @@ -0,0 +1,79 @@ +pragma solidity ^0.5.17; + +import "../../../Openzeppelin/Ownable.sol"; +import "./Vesting.sol"; +import "./TeamVesting.sol"; +import "../../../Interfaces/IVestingFactory.sol"; + +/** + * @title Vesting Factory: Contract to deploy vesting contracts + * of two types: vesting (TokenHolder) and team vesting (Multisig). + * @notice Factory pattern allows to create multiple instances + * of the same contract and keep track of them easier. + * */ +contract VestingFactory is IVestingFactory, Ownable { + address public vestingLogic; + + constructor(address _vestingLogic) public { + require(_vestingLogic != address(0), "invalid vesting logic address"); + vestingLogic = _vestingLogic; + } + + /** + * @notice Deploys Vesting contract. + * @param _SOV the address of SOV token. + * @param _staking The address of staking contract. + * @param _tokenOwner The owner of the tokens. + * @param _cliff The time interval to the first withdraw in seconds. + * @param _duration The total duration in seconds. + * @param _feeSharing The address of fee sharing contract. + * @param _vestingOwner The address of an owner of vesting contract. + * @return The vesting contract address. + * */ + function deployVesting( + address _SOV, + address _staking, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharing, + address _vestingOwner + ) + external + onlyOwner /// @dev owner - VestingRegistry + returns (address) + { + address vesting = address(new Vesting(vestingLogic, _SOV, _staking, _tokenOwner, _cliff, _duration, _feeSharing)); + Ownable(vesting).transferOwnership(_vestingOwner); + return vesting; + } + + /** + * @notice Deploys Team Vesting contract. + * @param _SOV The address of SOV token. + * @param _staking The address of staking contract. + * @param _tokenOwner The owner of the tokens. + * @param _cliff The time interval to the first withdraw in seconds. + * @param _duration The total duration in seconds. + * @param _feeSharing The address of fee sharing contract. + * @param _vestingOwner The address of an owner of vesting contract. + * @return The vesting contract address. + * */ + function deployTeamVesting( + address _SOV, + address _staking, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharing, + address _vestingOwner + ) + external + onlyOwner //owner - VestingRegistry + returns (address) + { + address vesting = address(new TeamVesting(vestingLogic, _SOV, _staking, _tokenOwner, _cliff, _duration, _feeSharing)); + Ownable(vesting).transferOwnership(_vestingOwner); + return vesting; + } +} diff --git a/contracts/Sovryn/Governance/Vesting/VestingLogic.sol b/contracts/Sovryn/Governance/Vesting/VestingLogic.sol new file mode 100644 index 0000000..b39f4c5 --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/VestingLogic.sol @@ -0,0 +1,220 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../Staking/Staking.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; +import "../../../Interfaces/IVesting.sol"; +import "../../Token/ApprovalReceiver.sol"; +import "./VestingStorage.sol"; + +/** + * @title Vesting Logic contract. + * @notice Staking, delegating and withdrawal functionality. + * @dev Deployed by a VestingFactory contract. + * */ +contract VestingLogic is IVesting, VestingStorage, ApprovalReceiver { + /* Events */ + + event TokensStaked(address indexed caller, uint256 amount); + event VotesDelegated(address indexed caller, address delegatee); + event TokensWithdrawn(address indexed caller, address receiver); + event DividendsCollected(address indexed caller, address loanPoolToken, address receiver, uint32 maxCheckpoints); + event MigratedToNewStakingContract(address indexed caller, address newStakingContract); + + /* Modifiers */ + + /** + * @dev Throws if called by any account other than the token owner or the contract owner. + */ + modifier onlyOwners() { + require(msg.sender == tokenOwner || isOwner(), "unauthorized"); + _; + } + + /** + * @dev Throws if called by any account other than the token owner. + */ + modifier onlyTokenOwner() { + require(msg.sender == tokenOwner, "unauthorized"); + _; + } + + /* Functions */ + + /** + * @notice Stakes tokens according to the vesting schedule. + * @param _amount The amount of tokens to stake. + * */ + function stakeTokens(uint256 _amount) public { + _stakeTokens(msg.sender, _amount); + } + + /** + * @notice Stakes tokens according to the vesting schedule. + * @dev This function will be invoked from receiveApproval. + * @dev SOV.approveAndCall -> this.receiveApproval -> this.stakeTokensWithApproval + * @param _sender The sender of SOV.approveAndCall + * @param _amount The amount of tokens to stake. + * */ + function stakeTokensWithApproval(address _sender, uint256 _amount) public onlyThisContract { + _stakeTokens(_sender, _amount); + } + + /** + * @notice Stakes tokens according to the vesting schedule. Low level function. + * @dev Once here the allowance of tokens is taken for granted. + * @param _sender The sender of tokens to stake. + * @param _amount The amount of tokens to stake. + * */ + function _stakeTokens(address _sender, uint256 _amount) internal { + /// @dev Maybe better to allow staking unil the cliff was reached. + if (startDate == 0) { + startDate = staking.timestampToLockDate(block.timestamp); + } + endDate = staking.timestampToLockDate(block.timestamp + duration); + + /// @dev Transfer the tokens to this contract. + bool success = SOV.transferFrom(_sender, address(this), _amount); + require(success); + + /// @dev Allow the staking contract to access them. + SOV.approve(address(staking), _amount); + + staking.stakesBySchedule(_amount, cliff, duration, FOUR_WEEKS, address(this), tokenOwner); + + emit TokensStaked(_sender, _amount); + } + + /** + * @notice Delegate votes from `msg.sender` which are locked until lockDate + * to `delegatee`. + * @param _delegatee The address to delegate votes to. + * */ + function delegate(address _delegatee) public onlyTokenOwner { + require(_delegatee != address(0), "delegatee address invalid"); + + /// @dev Withdraw for each unlocked position. + /// @dev Don't change FOUR_WEEKS to TWO_WEEKS, a lot of vestings already deployed with FOUR_WEEKS + /// workaround found, but it doesn't work with TWO_WEEKS + for (uint256 i = startDate + cliff; i <= endDate; i += FOUR_WEEKS) { + staking.delegate(_delegatee, i); + } + emit VotesDelegated(msg.sender, _delegatee); + } + + /** + * @notice Withdraws all tokens from the staking contract and + * forwards them to an address specified by the token owner. + * @param receiver The receiving address. + * @dev Can be called only by owner. + * */ + function governanceWithdrawTokens(address receiver) public { + require(msg.sender == address(staking), "unauthorized"); + + _withdrawTokens(receiver, true); + } + + /** + * @notice Withdraws unlocked tokens from the staking contract and + * forwards them to an address specified by the token owner. + * @param receiver The receiving address. + * */ + function withdrawTokens(address receiver) public onlyOwners { + _withdrawTokens(receiver, false); + } + + /** + * @notice Withdraws tokens from the staking contract and forwards them + * to an address specified by the token owner. Low level function. + * @dev Once here the caller permission is taken for granted. + * @param receiver The receiving address. + * @param isGovernance Whether all tokens (true) + * or just unlocked tokens (false). + * */ + function _withdrawTokens(address receiver, bool isGovernance) internal { + require(receiver != address(0), "receiver address invalid"); + + uint96 stake; + + /// @dev Usually we just need to iterate over the possible dates until now. + uint256 end; + + /// @dev In the unlikely case that all tokens have been unlocked early, + /// allow to withdraw all of them. + if (staking.allUnlocked() || isGovernance) { + end = endDate; + } else { + end = block.timestamp; + } + + /// @dev Withdraw for each unlocked position. + /// @dev Don't change FOUR_WEEKS to TWO_WEEKS, a lot of vestings already deployed with FOUR_WEEKS + /// workaround found, but it doesn't work with TWO_WEEKS + for (uint256 i = startDate + cliff; i <= end; i += FOUR_WEEKS) { + /// @dev Read amount to withdraw. + stake = staking.getPriorUserStakeByDate(address(this), i, block.number - 1); + + /// @dev Withdraw if > 0 + if (stake > 0) { + if (isGovernance) { + staking.governanceWithdraw(stake, i, receiver); + } else { + staking.withdraw(stake, i, receiver); + } + } + } + + emit TokensWithdrawn(msg.sender, receiver); + } + + /** + * @notice Collect dividends from fee sharing proxy. + * @param _loanPoolToken The loan pool token address. + * @param _maxCheckpoints Maximum number of checkpoints to be processed. + * @param _receiver The receiver of tokens or msg.sender + * */ + function collectDividends( + address _loanPoolToken, + uint32 _maxCheckpoints, + address _receiver + ) public onlyOwners { + require(_receiver != address(0), "receiver address invalid"); + + /// @dev Invokes the fee sharing proxy. + feeSharingProxy.withdraw(_loanPoolToken, _maxCheckpoints, _receiver); + + emit DividendsCollected(msg.sender, _loanPoolToken, _receiver, _maxCheckpoints); + } + + /** + * @notice Allows the owners to migrate the positions + * to a new staking contract. + * */ + function migrateToNewStakingContract() public onlyOwners { + staking.migrateToNewStakingContract(); + staking = Staking(staking.newStakingContract()); + emit MigratedToNewStakingContract(msg.sender, address(staking)); + } + + /** + * @notice Overrides default ApprovalReceiver._getToken function to + * register SOV token on this contract. + * @return The address of SOV token. + * */ + function _getToken() internal view returns (address) { + return address(SOV); + } + + /** + * @notice Overrides default ApprovalReceiver._getSelectors function to + * register stakeTokensWithApproval selector on this contract. + * @return The array of registered selectors on this contract. + * */ + function _getSelectors() internal view returns (bytes4[] memory) { + bytes4[] memory selectors = new bytes4[](1); + selectors[0] = this.stakeTokensWithApproval.selector; + return selectors; + } +} diff --git a/contracts/Sovryn/Governance/Vesting/VestingRegistry3.sol b/contracts/Sovryn/Governance/Vesting/VestingRegistry3.sol new file mode 100644 index 0000000..cc893b4 --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/VestingRegistry3.sol @@ -0,0 +1,200 @@ +pragma solidity ^0.5.17; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../../../Interfaces/IStaking.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; +import "../../../Interfaces/IVestingFactory.sol"; +import "../../../Interfaces/IVesting.sol"; +import "../../../Interfaces/ITeamVesting.sol"; +import "../../../Openzeppelin/SafeMath.sol"; + +contract VestingRegistry3 is Ownable { + using SafeMath for uint256; + + IVestingFactory public vestingFactory; + + ///@notice the SOV token contract + address public SOV; + + ///@notice the staking contract address + address public staking; + //@notice fee sharing proxy + address public feeSharingProxy; + //@notice the vesting owner (e.g. governance timelock address) + address public vestingOwner; + + //TODO add to the documentation: address can have only one vesting of each type + //user => vesting type => vesting contract + mapping(address => mapping(uint256 => address)) public vestingContracts; + + //user => flag whether user has admin role + mapping(address => bool) public admins; + + enum VestingType { + TeamVesting, //MultisigVesting + Vesting //TokenHolderVesting + } + + event SOVTransferred(address indexed receiver, uint256 amount); + event VestingCreated(address indexed tokenOwner, address vesting, uint256 cliff, uint256 duration, uint256 amount); + event TeamVestingCreated(address indexed tokenOwner, address vesting, uint256 cliff, uint256 duration, uint256 amount); + event TokensStaked(address indexed vesting, uint256 amount); + event AdminAdded(address admin); + event AdminRemoved(address admin); + + constructor( + address _vestingFactory, + address _SOV, + address _staking, + address _feeSharingProxy, + address _vestingOwner + ) public { + require(_SOV != address(0), "SOV address invalid"); + require(_staking != address(0), "staking address invalid"); + require(_feeSharingProxy != address(0), "feeSharingProxy address invalid"); + require(_vestingOwner != address(0), "vestingOwner address invalid"); + + _setVestingFactory(_vestingFactory); + + SOV = _SOV; + staking = _staking; + feeSharingProxy = _feeSharingProxy; + vestingOwner = _vestingOwner; + } + + /** + * @dev Throws if called by any account other than the owner or admin. + */ + modifier onlyAuthorized() { + require(isOwner() || admins[msg.sender], "unauthorized"); + _; + } + + function addAdmin(address _admin) public onlyOwner { + admins[_admin] = true; + emit AdminAdded(_admin); + } + + function removeAdmin(address _admin) public onlyOwner { + admins[_admin] = false; + emit AdminRemoved(_admin); + } + + /** + * @notice sets vesting factory address + * @param _vestingFactory the address of vesting factory contract + */ + function setVestingFactory(address _vestingFactory) public onlyOwner { + _setVestingFactory(_vestingFactory); + } + + function _setVestingFactory(address _vestingFactory) internal { + require(_vestingFactory != address(0), "vestingFactory address invalid"); + vestingFactory = IVestingFactory(_vestingFactory); + } + + /** + * @notice transfers SOV tokens to given address + * @param _receiver the address of the SOV receiver + * @param _amount the amount to be transferred + */ + function transferSOV(address _receiver, uint256 _amount) public onlyOwner { + require(_receiver != address(0), "receiver address invalid"); + require(_amount != 0, "amount invalid"); + + IERC20(SOV).transfer(_receiver, _amount); + emit SOVTransferred(_receiver, _amount); + } + + /** + * @notice creates Vesting contract + * @param _tokenOwner the owner of the tokens + * @param _amount the amount to be staked + * @param _cliff the cliff in seconds + * @param _duration the total duration in seconds + */ + function createVesting( + address _tokenOwner, + uint256 _amount, + uint256 _cliff, + uint256 _duration + ) public onlyAuthorized { + address vesting = _getOrCreateVesting(_tokenOwner, _cliff, _duration); + emit VestingCreated(_tokenOwner, vesting, _cliff, _duration, _amount); + } + + /** + * @notice creates Team Vesting contract + * @param _tokenOwner the owner of the tokens + * @param _amount the amount to be staked + * @param _cliff the cliff in seconds + * @param _duration the total duration in seconds + */ + function createTeamVesting( + address _tokenOwner, + uint256 _amount, + uint256 _cliff, + uint256 _duration + ) public onlyAuthorized { + address vesting = _getOrCreateTeamVesting(_tokenOwner, _cliff, _duration); + emit TeamVestingCreated(_tokenOwner, vesting, _cliff, _duration, _amount); + } + + /** + * @notice stakes tokens according to the vesting schedule + * @param _vesting the address of Vesting contract + * @param _amount the amount of tokens to stake + */ + function stakeTokens(address _vesting, uint256 _amount) public onlyAuthorized { + require(_vesting != address(0), "vesting address invalid"); + require(_amount > 0, "amount invalid"); + + IERC20(SOV).approve(_vesting, _amount); + IVesting(_vesting).stakeTokens(_amount); + emit TokensStaked(_vesting, _amount); + } + + /** + * @notice returns vesting contract address for the given token owner + * @param _tokenOwner the owner of the tokens + */ + function getVesting(address _tokenOwner) public view returns (address) { + return vestingContracts[_tokenOwner][uint256(VestingType.Vesting)]; + } + + /** + * @notice returns team vesting contract address for the given token owner + * @param _tokenOwner the owner of the tokens + */ + function getTeamVesting(address _tokenOwner) public view returns (address) { + return vestingContracts[_tokenOwner][uint256(VestingType.TeamVesting)]; + } + + function _getOrCreateVesting( + address _tokenOwner, + uint256 _cliff, + uint256 _duration + ) internal returns (address) { + uint256 type_ = uint256(VestingType.Vesting); + if (vestingContracts[_tokenOwner][type_] == address(0)) { + //TODO Owner of OwnerVesting contracts - the same address as tokenOwner + address vesting = vestingFactory.deployVesting(SOV, staking, _tokenOwner, _cliff, _duration, feeSharingProxy, _tokenOwner); + vestingContracts[_tokenOwner][type_] = vesting; + } + return vestingContracts[_tokenOwner][type_]; + } + + function _getOrCreateTeamVesting( + address _tokenOwner, + uint256 _cliff, + uint256 _duration + ) internal returns (address) { + uint256 type_ = uint256(VestingType.TeamVesting); + if (vestingContracts[_tokenOwner][type_] == address(0)) { + address vesting = vestingFactory.deployTeamVesting(SOV, staking, _tokenOwner, _cliff, _duration, feeSharingProxy, vestingOwner); + vestingContracts[_tokenOwner][type_] = vesting; + } + return vestingContracts[_tokenOwner][type_]; + } +} diff --git a/contracts/Sovryn/Governance/Vesting/VestingStorage.sol b/contracts/Sovryn/Governance/Vesting/VestingStorage.sol new file mode 100644 index 0000000..4598133 --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/VestingStorage.sol @@ -0,0 +1,43 @@ +pragma solidity ^0.5.17; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../Staking/Staking.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; + +/** + * @title Vesting Storage Contract. + * + * @notice This contract is just the storage required for vesting. + * It is parent of VestingLogic and TeamVesting. + * + * @dev Use Ownable as a parent to align storage structure for Logic and Proxy contracts. + * */ +contract VestingStorage is Ownable { + /// @notice The SOV token contract. + IERC20 public SOV; + + /// @notice The staking contract address. + Staking public staking; + + /// @notice The owner of the vested tokens. + address public tokenOwner; + + /// @notice Fee sharing Proxy. + IFeeSharingProxy public feeSharingProxy; + + /// @notice The cliff. After this time period the tokens begin to unlock. + uint256 public cliff; + + /// @notice The duration. After this period all tokens will have been unlocked. + uint256 public duration; + + /// @notice The start date of the vesting. + uint256 public startDate; + + /// @notice The end date of the vesting. + uint256 public endDate; + + /// @notice Constant used for computing the vesting dates. + uint256 constant FOUR_WEEKS = 4 weeks; +} diff --git a/contracts/Sovryn/Helper/ErrorDecoder.sol b/contracts/Sovryn/Helper/ErrorDecoder.sol new file mode 100644 index 0000000..4602304 --- /dev/null +++ b/contracts/Sovryn/Helper/ErrorDecoder.sol @@ -0,0 +1,53 @@ +pragma solidity ^0.5.17; + +/** + * @title Base contract to properly handle returned data on failed calls + * @dev On EVM if the return data length of a call is less than 68, + * then the transaction fails silently without a revert message! + * + * As described in the Solidity documentation + * https://solidity.readthedocs.io/en/v0.5.17/control-structures.html#revert + * the revert reason is an ABI-encoded string consisting of: + * 0x08c379a0 // Function selector (method id) for "Error(string)" signature + * 0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset + * 0x000000000000000000000000000000000000000000000000000000000000001a // String length + * 0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data + * + * Another example, debug data from test: + * 0x08c379a0 + * 0000000000000000000000000000000000000000000000000000000000000020 + * 0000000000000000000000000000000000000000000000000000000000000034 + * 54696d656c6f636b3a3a73657444656c61793a2044656c6179206d7573742065 + * 7863656564206d696e696d756d2064656c61792e000000000000000000000000 + * + * Parsed into: + * Data offset: 20 + * Length: 34 + * Error message: + * 54696d656c6f636b3a3a73657444656c61793a2044656c6179206d7573742065 + * 7863656564206d696e696d756d2064656c61792e000000000000000000000000 + */ +contract ErrorDecoder { + uint256 constant ERROR_MESSAGE_SHIFT = 68; // EVM silent revert error string length + + /** + * @notice Concats two error strings taking into account ERROR_MESSAGE_SHIFT. + * @param str1 First string, usually a hardcoded context written by dev. + * @param str2 Second string, usually the error message from the reverted call. + * @return The concatenated error string + */ + function _addErrorMessage(string memory str1, string memory str2) internal pure returns (string memory) { + bytes memory bytesStr1 = bytes(str1); + bytes memory bytesStr2 = bytes(str2); + string memory str12 = new string(bytesStr1.length + bytesStr2.length - ERROR_MESSAGE_SHIFT); + bytes memory bytesStr12 = bytes(str12); + uint256 j = 0; + for (uint256 i = 0; i < bytesStr1.length; i++) { + bytesStr12[j++] = bytesStr1[i]; + } + for (uint256 i = ERROR_MESSAGE_SHIFT; i < bytesStr2.length; i++) { + bytesStr12[j++] = bytesStr2[i]; + } + return string(bytesStr12); + } +} diff --git a/contracts/Sovryn/Helper/SafeMath96.sol b/contracts/Sovryn/Helper/SafeMath96.sol new file mode 100644 index 0000000..f6b3827 --- /dev/null +++ b/contracts/Sovryn/Helper/SafeMath96.sol @@ -0,0 +1,113 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +/** + * @title SafeMath96 contract. + * @notice Improved Solidity's arithmetic operations with added overflow checks. + * @dev SafeMath96 uses uint96, unsigned integers of 96 bits length, so every + * integer from 0 to 2^96-1 can be operated. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * SafeMath restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this contract instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * */ +contract SafeMath96 { + function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { + require(n < 2**32, errorMessage); + return uint32(n); + } + + function safe64(uint256 n, string memory errorMessage) internal pure returns (uint64) { + require(n < 2**64, errorMessage); + return uint64(n); + } + + function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) { + require(n < 2**96, errorMessage); + return uint96(n); + } + + /** + * @notice Adds two unsigned integers, reverting on overflow. + * @dev Counterpart to Solidity's `+` operator. + * @param a First integer. + * @param b Second integer. + * @param errorMessage The revert message on overflow. + * @return The safe addition a+b. + * */ + function add96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + uint96 c = a + b; + require(c >= a, errorMessage); + return c; + } + + /** + * @notice Substracts two unsigned integers, reverting on underflow. + * @dev Counterpart to Solidity's `-` operator. + * @param a First integer. + * @param b Second integer. + * @param errorMessage The revert message on underflow. + * @return The safe substraction a-b. + * */ + function sub96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + require(b <= a, errorMessage); + return a - b; + } + + /** + * @notice Multiplies two unsigned integers, reverting on overflow. + * @dev Counterpart to Solidity's `*` operator. + * @param a First integer. + * @param b Second integer. + * @param errorMessage The revert message on overflow. + * @return The safe product a*b. + * */ + function mul96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + if (a == 0) { + return 0; + } + + uint96 c = a * b; + require(c / a == b, errorMessage); + + return c; + } + + /** + * @notice Divides two unsigned integers, reverting on overflow. + * @dev Counterpart to Solidity's `/` operator. + * @param a First integer. + * @param b Second integer. + * @param errorMessage The revert message on overflow. + * @return The safe division a/b. + * */ + function div96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + // Solidity only automatically asserts when dividing by 0 + require(b > 0, errorMessage); + uint96 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } +} diff --git a/contracts/Sovryn/Mockup/FeeSharingProxyMockup.sol b/contracts/Sovryn/Mockup/FeeSharingProxyMockup.sol new file mode 100644 index 0000000..3f779dc --- /dev/null +++ b/contracts/Sovryn/Mockup/FeeSharingProxyMockup.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.5.17; + +import "../Governance/FeeSharingProxy.sol"; + +contract FeeSharingProxyMockup is FeeSharingProxy { + struct TestData { + address loanPoolToken; + uint32 maxCheckpoints; + address receiver; + } + + TestData public testData; + + constructor(IProtocol _protocol, IStaking _staking) public FeeSharingProxy(_protocol, _staking) {} + + function withdraw( + address _loanPoolToken, + uint32 _maxCheckpoints, + address _receiver + ) public { + testData = TestData(_loanPoolToken, _maxCheckpoints, _receiver); + } +} diff --git a/contracts/Sovryn/MultiSigWallet.sol b/contracts/Sovryn/Multisig/MultiSigWallet.sol similarity index 100% rename from contracts/Sovryn/MultiSigWallet.sol rename to contracts/Sovryn/Multisig/MultiSigWallet.sol diff --git a/contracts/Sovryn/Proxy/Proxy.sol b/contracts/Sovryn/Proxy/Proxy.sol new file mode 100644 index 0000000..be885c7 --- /dev/null +++ b/contracts/Sovryn/Proxy/Proxy.sol @@ -0,0 +1,125 @@ +pragma solidity ^0.5.17; + +/** + * @title Base Proxy contract. + * @notice The proxy performs delegated calls to the contract implementation + * it is pointing to. This way upgradable contracts are possible on blockchain. + * + * Delegating proxy contracts are widely used for both upgradeability and gas + * savings. These proxies rely on a logic contract (also known as implementation + * contract or master copy) that is called using delegatecall. This allows + * proxies to keep a persistent state (storage and balance) while the code is + * delegated to the logic contract. + * + * Proxy contract is meant to be inherited and its internal functions + * _setImplementation and _setProxyOwner to be called when upgrades become + * neccessary. + * + * The loan token (iToken) contract as well as the protocol contract act as + * proxies, delegating all calls to underlying contracts. Therefore, if you + * want to interact with them using web3, you need to use the ABIs from the + * contracts containing the actual logic or the interface contract. + * ABI for LoanToken contracts: LoanTokenLogicStandard + * ABI for Protocol contract: ISovryn + * + * @dev UpgradableProxy is the contract that inherits Proxy and wraps these + * functions. + * */ +contract Proxy { + bytes32 private constant KEY_IMPLEMENTATION = keccak256("key.implementation"); + bytes32 private constant KEY_OWNER = keccak256("key.proxy.owner"); + + event OwnershipTransferred(address indexed _oldOwner, address indexed _newOwner); + event ImplementationChanged(address indexed _oldImplementation, address indexed _newImplementation); + + /** + * @notice Set sender as an owner. + * */ + constructor() public { + _setProxyOwner(msg.sender); + } + + /** + * @notice Throw error if called not by an owner. + * */ + modifier onlyProxyOwner() { + require(msg.sender == getProxyOwner(), "Proxy:: access denied"); + _; + } + + /** + * @notice Set address of the implementation. + * @param _implementation Address of the implementation. + * */ + function _setImplementation(address _implementation) internal { + require(_implementation != address(0), "Proxy::setImplementation: invalid address"); + emit ImplementationChanged(getImplementation(), _implementation); + + bytes32 key = KEY_IMPLEMENTATION; + assembly { + sstore(key, _implementation) + } + } + + /** + * @notice Return address of the implementation. + * @return Address of the implementation. + * */ + function getImplementation() public view returns (address _implementation) { + bytes32 key = KEY_IMPLEMENTATION; + assembly { + _implementation := sload(key) + } + } + + /** + * @notice Set address of the owner. + * @param _owner Address of the owner. + * */ + function _setProxyOwner(address _owner) internal { + require(_owner != address(0), "Proxy::setProxyOwner: invalid address"); + emit OwnershipTransferred(getProxyOwner(), _owner); + + bytes32 key = KEY_OWNER; + assembly { + sstore(key, _owner) + } + } + + /** + * @notice Return address of the owner. + * @return Address of the owner. + * */ + function getProxyOwner() public view returns (address _owner) { + bytes32 key = KEY_OWNER; + assembly { + _owner := sload(key) + } + } + + /** + * @notice Fallback function performs a delegate call + * to the actual implementation address is pointing this proxy. + * Returns whatever the implementation call returns. + * */ + function() external payable { + address implementation = getImplementation(); + require(implementation != address(0), "Proxy::(): implementation not found"); + + assembly { + let pointer := mload(0x40) + calldatacopy(pointer, 0, calldatasize) + let result := delegatecall(gas, implementation, pointer, calldatasize, 0, 0) + let size := returndatasize + returndatacopy(pointer, 0, size) + + switch result + case 0 { + revert(pointer, size) + } + default { + return(pointer, size) + } + } + } +} diff --git a/contracts/Sovryn/Proxy/UpgradableProxy.sol b/contracts/Sovryn/Proxy/UpgradableProxy.sol new file mode 100644 index 0000000..e875335 --- /dev/null +++ b/contracts/Sovryn/Proxy/UpgradableProxy.sol @@ -0,0 +1,39 @@ +pragma solidity ^0.5.17; + +import "./Proxy.sol"; + +/** + * @title Upgradable Proxy contract. + * @notice A disadvantage of the immutable ledger is that nobody can change the + * source code of a smart contract after it’s been deployed. In order to fix + * bugs or introduce new features, smart contracts need to be upgradable somehow. + * + * Although it is not possible to upgrade the code of an already deployed smart + * contract, it is possible to set-up a proxy contract architecture that will + * allow to use new deployed contracts as if the main logic had been upgraded. + * + * A proxy architecture pattern is such that all message calls go through a + * Proxy contract that will redirect them to the latest deployed contract logic. + * To upgrade, a new version of the contract is deployed, and the Proxy is + * updated to reference the new contract address. + * */ +contract UpgradableProxy is Proxy { + /** + * @notice Set address of the implementation. + * @dev Wrapper for _setImplementation that exposes the function + * as public for owner to be able to set a new version of the + * contract as current pointing implementation. + * @param _implementation Address of the implementation. + * */ + function setImplementation(address _implementation) public onlyProxyOwner { + _setImplementation(_implementation); + } + + /** + * @notice Set address of the owner. + * @param _owner Address of the owner. + * */ + function setProxyOwner(address _owner) public onlyProxyOwner { + _setProxyOwner(_owner); + } +} diff --git a/contracts/Sovryn/RSK/RSKAddrValidator.sol b/contracts/Sovryn/RSK/RSKAddrValidator.sol new file mode 100644 index 0000000..26703d7 --- /dev/null +++ b/contracts/Sovryn/RSK/RSKAddrValidator.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier:MIT +pragma solidity ^0.5.17; + +library RSKAddrValidator { + /* + * @param addr it is an address to check that it does not originates from + * signing with PK = ZERO. RSK has a small difference in which @ZERO_PK_ADDR is + * also an address from PK = ZERO. So we check for both of them. + * */ + function checkPKNotZero(address addr) internal pure returns (bool) { + return (addr != 0xdcc703c0E500B653Ca82273B7BFAd8045D85a470 && addr != address(0)); + } + + /* + * Safely compares two addresses, checking they do not originate from + * a zero private key. + * */ + function safeEquals(address addr1, address addr2) internal pure returns (bool) { + return (addr1 == addr2 && addr1 != 0xdcc703c0E500B653Ca82273B7BFAd8045D85a470 && addr1 != address(0)); + } +} diff --git a/contracts/Sovryn/Token/ApprovalReceiver.sol b/contracts/Sovryn/Token/ApprovalReceiver.sol new file mode 100644 index 0000000..841b09c --- /dev/null +++ b/contracts/Sovryn/Token/ApprovalReceiver.sol @@ -0,0 +1,105 @@ +pragma solidity ^0.5.17; + +import "../Helper/ErrorDecoder.sol"; +import "../../Interfaces/IApproveAndCall.sol"; + +/** + * @title Base contract for receiving approval from SOV token. + */ +contract ApprovalReceiver is ErrorDecoder, IApproveAndCall { + modifier onlyThisContract() { + // Accepts calls only from receiveApproval function. + require(msg.sender == address(this), "unauthorized"); + _; + } + + /** + * @notice Receives approval from SOV token. + * @param _data The data will be used for low level call. + */ + function receiveApproval( + address _sender, + uint256 _amount, + address _token, + bytes calldata _data + ) external { + // Accepts calls only from SOV token. + require(msg.sender == _getToken(), "unauthorized"); + require(msg.sender == _token, "unauthorized"); + + // Only allowed methods. + bool isAllowed = false; + bytes4[] memory selectors = _getSelectors(); + bytes4 sig = _getSig(_data); + for (uint256 i = 0; i < selectors.length; i++) { + if (sig == selectors[i]) { + isAllowed = true; + break; + } + } + require(isAllowed, "method is not allowed"); + + // Check sender and amount. + address sender; + uint256 amount; + (, sender, amount) = abi.decode(abi.encodePacked(bytes28(0), _data), (bytes32, address, uint256)); + require(sender == _sender, "sender mismatch"); + require(amount == _amount, "amount mismatch"); + + _call(_data); + } + + /** + * @notice Returns token address, only this address can be a sender for receiveApproval. + * @dev Should be overridden in child contracts, otherwise error will be thrown. + * @return By default, 0x. When overriden, the token address making the call. + */ + function _getToken() internal view returns (address) { + return address(0); + } + + /** + * @notice Returns list of function selectors allowed to be invoked. + * @dev Should be overridden in child contracts, otherwise error will be thrown. + * @return By default, empty array. When overriden, allowed selectors. + */ + function _getSelectors() internal view returns (bytes4[] memory) { + return new bytes4[](0); + } + + /** + * @notice Makes call and reverts w/ enhanced error message. + * @param _data Error message as bytes. + */ + function _call(bytes memory _data) internal { + (bool success, bytes memory returnData) = address(this).call(_data); + if (!success) { + if (returnData.length <= ERROR_MESSAGE_SHIFT) { + revert("receiveApproval: Transaction execution reverted."); + } else { + revert(_addErrorMessage("receiveApproval: ", string(returnData))); + } + } + } + + /** + * @notice Extracts the called function selector, a hash of the signature. + * @dev The first four bytes of the call data for a function call specifies + * the function to be called. It is the first (left, high-order in big-endian) + * four bytes of the Keccak-256 (SHA-3) hash of the signature of the function. + * Solidity doesn't yet support a casting of byte[4] to bytes4. + * Example: + * msg.data: + * 0xcdcd77c000000000000000000000000000000000000000000000000000000000000 + * 000450000000000000000000000000000000000000000000000000000000000000001 + * selector (or method ID): 0xcdcd77c0 + * signature: baz(uint32,bool) + * @param _data The msg.data from the low level call. + * @return sig First 4 bytes of msg.data i.e. the selector, hash of the signature. + */ + function _getSig(bytes memory _data) internal pure returns (bytes4 sig) { + assembly { + sig := mload(add(_data, 32)) + } + } +} diff --git a/contracts/Sovryn/Token/Token.sol b/contracts/Sovryn/Token/Token.sol new file mode 100644 index 0000000..f261f73 --- /dev/null +++ b/contracts/Sovryn/Token/Token.sol @@ -0,0 +1,60 @@ +pragma solidity ^0.5.17; + +import "../../Openzeppelin/ERC20Detailed.sol"; +import "../../Openzeppelin/ERC20.sol"; +import "../../Openzeppelin/Ownable.sol"; +import "../../Interfaces/IApproveAndCall.sol"; + +/** + * @title Token is an ERC-20 token contract. + * + * @notice This contract accounts for all holders' balances. + * + * @dev This contract represents a token with dynamic supply. + * The owner of the token contract can mint/burn tokens to/from any account + * based upon previous governance voting and approval. + * */ +contract Token is ERC20, ERC20Detailed, Ownable { + string constant NAME = "Test Token"; + string constant SYMBOL = "TEST"; + uint8 constant DECIMALS = 18; + + /** + * @notice Constructor called on deployment, initiates the contract. + * @dev On deployment, some amount of tokens will be minted for the owner. + * @param _initialAmount The amount of tokens to be minted on contract creation. + * */ + constructor(uint256 _initialAmount) public ERC20Detailed(NAME, SYMBOL, DECIMALS) { + if (_initialAmount != 0) { + _mint(msg.sender, _initialAmount); + } + } + + /** + * @notice Creates new tokens and sends them to the recipient. + * @dev Don't create more than 2^96/10 tokens before updating the governance first. + * @param _account The recipient address to get the minted tokens. + * @param _amount The amount of tokens to be minted. + * */ + function mint(address _account, uint256 _amount) public onlyOwner { + _mint(_account, _amount); + } + + /** + * @notice Approves and then calls the receiving contract. + * Useful to encapsulate sending tokens to a contract in one call. + * Solidity has no native way to send tokens to contracts. + * ERC-20 tokens require approval to be spent by third parties, such as a contract in this case. + * @param _spender The contract address to spend the tokens. + * @param _amount The amount of tokens to be sent. + * @param _data Parameters for the contract call, such as endpoint signature. + * */ + function approveAndCall( + address _spender, + uint256 _amount, + bytes memory _data + ) public { + approve(_spender, _amount); + IApproveAndCall(_spender).receiveApproval(msg.sender, _amount, address(this), _data); + } +} From c6fe74090446ab90e93b7a8cdf1bdecc64822a3b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:14:38 +0530 Subject: [PATCH 091/112] Removed unwanted files --- contracts/Testhelpers/IApproveAndCall.sol | 21 -------- contracts/Testhelpers/Token.sol | 60 ----------------------- tests/integration/locked.test.js | 0 tests/integration/vesting.test.js | 0 tests/unit-lockedfund/event.test.js | 0 tests/unit-lockedfund/owner.test.js | 0 tests/unit-lockedfund/state.test.js | 0 tests/unit-lockedfund/user.test.js | 0 tests/unit-origins/event.test.js | 0 tests/unit-origins/owner.test.js | 0 tests/unit-origins/state.test.js | 0 tests/unit-origins/user.test.js | 0 tests/unit-origins/whitelister.test.js | 0 13 files changed, 81 deletions(-) delete mode 100644 contracts/Testhelpers/IApproveAndCall.sol delete mode 100644 contracts/Testhelpers/Token.sol delete mode 100644 tests/integration/locked.test.js delete mode 100644 tests/integration/vesting.test.js delete mode 100644 tests/unit-lockedfund/event.test.js delete mode 100644 tests/unit-lockedfund/owner.test.js delete mode 100644 tests/unit-lockedfund/state.test.js delete mode 100644 tests/unit-lockedfund/user.test.js delete mode 100644 tests/unit-origins/event.test.js delete mode 100644 tests/unit-origins/owner.test.js delete mode 100644 tests/unit-origins/state.test.js delete mode 100644 tests/unit-origins/user.test.js delete mode 100644 tests/unit-origins/whitelister.test.js diff --git a/contracts/Testhelpers/IApproveAndCall.sol b/contracts/Testhelpers/IApproveAndCall.sol deleted file mode 100644 index 55c7284..0000000 --- a/contracts/Testhelpers/IApproveAndCall.sol +++ /dev/null @@ -1,21 +0,0 @@ -pragma solidity ^0.5.17; - -/** - * @title Interface for contract governance/ApprovalReceiver.sol - * @dev Interfaces are used to cast a contract address into a callable instance. - */ -interface IApproveAndCall { - /** - * @notice Receives approval from SOV token. - * @param _sender The sender of SOV.approveAndCall function. - * @param _amount The amount was approved. - * @param _token The address of token. - * @param _data The data will be used for low level call. - * */ - function receiveApproval( - address _sender, - uint256 _amount, - address _token, - bytes calldata _data - ) external; -} diff --git a/contracts/Testhelpers/Token.sol b/contracts/Testhelpers/Token.sol deleted file mode 100644 index fc015bc..0000000 --- a/contracts/Testhelpers/Token.sol +++ /dev/null @@ -1,60 +0,0 @@ -pragma solidity ^0.5.17; - -import "../Openzeppelin/ERC20Detailed.sol"; -import "../Openzeppelin/ERC20.sol"; -import "../Openzeppelin/Ownable.sol"; -import "./IApproveAndCall.sol"; - -/** - * @title Token is an ERC-20 token contract. - * - * @notice This contract accounts for all holders' balances. - * - * @dev This contract represents a token with dynamic supply. - * The owner of the token contract can mint/burn tokens to/from any account - * based upon previous governance voting and approval. - * */ -contract Token is ERC20, ERC20Detailed, Ownable { - string constant NAME = "Test Token"; - string constant SYMBOL = "TEST"; - uint8 constant DECIMALS = 18; - - /** - * @notice Constructor called on deployment, initiates the contract. - * @dev On deployment, some amount of tokens will be minted for the owner. - * @param _initialAmount The amount of tokens to be minted on contract creation. - * */ - constructor(uint256 _initialAmount) public ERC20Detailed(NAME, SYMBOL, DECIMALS) { - if (_initialAmount != 0) { - _mint(msg.sender, _initialAmount); - } - } - - /** - * @notice Creates new tokens and sends them to the recipient. - * @dev Don't create more than 2^96/10 tokens before updating the governance first. - * @param _account The recipient address to get the minted tokens. - * @param _amount The amount of tokens to be minted. - * */ - function mint(address _account, uint256 _amount) public onlyOwner { - _mint(_account, _amount); - } - - /** - * @notice Approves and then calls the receiving contract. - * Useful to encapsulate sending tokens to a contract in one call. - * Solidity has no native way to send tokens to contracts. - * ERC-20 tokens require approval to be spent by third parties, such as a contract in this case. - * @param _spender The contract address to spend the tokens. - * @param _amount The amount of tokens to be sent. - * @param _data Parameters for the contract call, such as endpoint signature. - * */ - function approveAndCall( - address _spender, - uint256 _amount, - bytes memory _data - ) public { - approve(_spender, _amount); - IApproveAndCall(_spender).receiveApproval(msg.sender, _amount, address(this), _data); - } -} diff --git a/tests/integration/locked.test.js b/tests/integration/locked.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/integration/vesting.test.js b/tests/integration/vesting.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit-lockedfund/event.test.js b/tests/unit-lockedfund/event.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit-lockedfund/owner.test.js b/tests/unit-lockedfund/owner.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit-lockedfund/state.test.js b/tests/unit-lockedfund/state.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit-lockedfund/user.test.js b/tests/unit-lockedfund/user.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit-origins/event.test.js b/tests/unit-origins/event.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit-origins/owner.test.js b/tests/unit-origins/owner.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit-origins/state.test.js b/tests/unit-origins/state.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit-origins/user.test.js b/tests/unit-origins/user.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit-origins/whitelister.test.js b/tests/unit-origins/whitelister.test.js deleted file mode 100644 index e69de29..0000000 From 146e0597fcdca53e574306ac249ad30bb0913fd9 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:15:05 +0530 Subject: [PATCH 092/112] Mainnet JSON Updated --- scripts/values/mainnet.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/values/mainnet.json b/scripts/values/mainnet.json index e805153..f2b6a1e 100644 --- a/scripts/values/mainnet.json +++ b/scripts/values/mainnet.json @@ -8,7 +8,7 @@ ], "multisig": "0x8f2608FA847A37989Df18E008ed476569AfE21D0", "initialAdmin": "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", - "originsWhitelisters": [ + "originsVerifiers": [ "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222" ], "depositAddress": "", From 17e9bae8aa58a479448b5d538b1e18baf77006cc Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:15:17 +0530 Subject: [PATCH 093/112] Testnet JSON Updated --- scripts/values/testnet.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index 343b700..b5f5025 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -8,7 +8,7 @@ ], "multisig": "0x8f2608FA847A37989Df18E008ed476569AfE21D0", "initialAdmin": "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", - "originsWhitelisters": [ + "originsVerifiers": [ "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222" ], "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", @@ -41,7 +41,7 @@ "maximumAmount": "75000000000000000", "tokensForSale": "20000000", "saleStartTimestamp": "1624492800", - "saleEnd": "172800", + "saleEnd": "259200", "unlockedBP": "5000", "vestOrLockCliff": "1", "vestOrLockDuration": "11", @@ -54,13 +54,19 @@ } ], "toVerify": [ + "0x531FFAb0A033707f3794222b9ba6c64D0099374A", "0x54b8Aef719B63Ef9354b618AC1828b71EE6e496D", "0xa41f08993b6d4dE3281F31492F7a93D6F403806B", "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", "0x7d20eaa96aDbFe158C222210E7A8c05c44Da9d15", "0x2bD2201bfe156a71EB0d02837172FFc237218505", - "0xA987a709f4A93eC25738FeC0F8d6189260459ed7" + "0xA987a709f4A93eC25738FeC0F8d6189260459ed7", + "0xAB3d3DB6c8AF12B47a249451AAAde546a1A617Ea", + "0x48343139f46EA80422F7820cC0eBE5B77bbB1818", + "0xCB1857547a18837155694b4E267d3C64e677A2Ed", + "0x01e1205a5c3B6ffa3859Ab8E18134763132A422A" + ], "verified": [] } \ No newline at end of file From 879c3d095bdf2dc01c42d350cd489c8f88b271a4 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:15:56 +0530 Subject: [PATCH 094/112] LockedFund Tests Added --- tests/LockedFund/admin.test.js | 172 +++++++++++++++ tests/LockedFund/creator.test.js | 129 +++++++++++ tests/LockedFund/event.test.js | 319 +++++++++++++++++++++++++++ tests/LockedFund/state.test.js | 365 +++++++++++++++++++++++++++++++ tests/LockedFund/user.test.js | 225 +++++++++++++++++++ 5 files changed, 1210 insertions(+) create mode 100644 tests/LockedFund/admin.test.js create mode 100644 tests/LockedFund/creator.test.js create mode 100644 tests/LockedFund/event.test.js create mode 100644 tests/LockedFund/state.test.js create mode 100644 tests/LockedFund/user.test.js diff --git a/tests/LockedFund/admin.test.js b/tests/LockedFund/admin.test.js new file mode 100644 index 0000000..a2bc350 --- /dev/null +++ b/tests/LockedFund/admin.test.js @@ -0,0 +1,172 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +contract("LockedFund (Admin Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin]); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address); + }); + + it("Admin should be able to add another admin.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + }); + + it("Admin should not be able to add zero address as another admin.", async () => { + await expectRevert(lockedFund.addAdmin(zeroAddress, { from: admin }), "LockedFund: Invalid Address."); + }); + + it("Admin should not be able to add another admin more than once.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + await expectRevert(lockedFund.addAdmin(newAdmin, { from: admin }), "LockedFund: Address is already admin."); + }); + + it("Admin should be able to remove an admin.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + await lockedFund.removeAdmin(newAdmin, { from: admin }); + }); + + it("Admin should not be able to call removeAdmin() with a normal user address.", async () => { + await expectRevert(lockedFund.removeAdmin(userOne, { from: admin }), "LockedFund: Address is not an admin."); + }); + + it("Admin should be able to change the vestingRegistry.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + }); + + it("Admin should not be able to change the vestingRegistry as a zero address.", async () => { + await expectRevert( + lockedFund.changeVestingRegistry(zeroAddress, { from: admin }), + "LockedFund: Vesting registry address is invalid." + ); + }); + + it("Admin should be able to change the waited timestamp.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + await lockedFund.changeWaitedTS(newWaitedTS, { from: admin }); + }); + + it("Admin should not be able to change the waited TS as zero.", async () => { + await expectRevert(lockedFund.changeWaitedTS(zero, { from: admin }), "LockedFund: Waited TS cannot be zero."); + }); + + it("Admin should be able to deposit using depositVested().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + }); + + it("Admin should not be able to deposit with the duration as zero.", async () => { + let value = randomValue(); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, zero, zeroBasisPoint, { from: admin }), + "LockedFund: Duration cannot be zero." + ); + }); + + it("Admin should not be able to deposit with the duration higher than max allowed.", async () => { + let value = randomValue(); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, 100, zeroBasisPoint, { from: admin }), + "LockedFund: Duration is too long." + ); + }); + + it("Admin should not be able to deposit with basis point higher than max allowed.", async () => { + let value = randomValue(); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, duration, invalidBasisPoint, { from: admin }), + "LockedFund: Basis Point has to be less than 10000." + ); + }); +}); diff --git a/tests/LockedFund/creator.test.js b/tests/LockedFund/creator.test.js new file mode 100644 index 0000000..ec2b87c --- /dev/null +++ b/tests/LockedFund/creator.test.js @@ -0,0 +1,129 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +contract("LockedFund (Creator Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin]); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address); + }); + + it("Creator should not be able to add another admin.", async () => { + await expectRevert(lockedFund.addAdmin(newAdmin, { from: creator }), "LockedFund: Only admin can call this."); + }); + + it("Creator should not be able to remove an admin.", async () => { + await expectRevert(lockedFund.removeAdmin(newAdmin, { from: creator }), "LockedFund: Only admin can call this."); + }); + + it("Creator should not be able to change the vestingRegistry.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await expectRevert( + lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: creator }), + "LockedFund: Only admin can call this." + ); + }); + + it("Creator should not be able to change the waited timestamp.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + await expectRevert(lockedFund.changeWaitedTS(newWaitedTS, { from: creator }), "LockedFund: Only admin can call this."); + }); + + it("Creator should not be able to deposit using depositVested().", async () => { + let value = randomValue(); + token.mint(creator, value, { from: creator }); + token.approve(lockedFund.address, value, { from: creator }); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: creator }), + "LockedFund: Only admin can call this." + ); + }); +}); diff --git a/tests/LockedFund/event.test.js b/tests/LockedFund/event.test.js new file mode 100644 index 0000000..04e5a55 --- /dev/null +++ b/tests/LockedFund/event.test.js @@ -0,0 +1,319 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + expectEvent, + constants, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +contract("LockedFund (Events)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin]); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address); + }); + + it("Adding another admin should emit AdminAdded.", async () => { + let txReceipt = await lockedFund.addAdmin(newAdmin, { from: admin }); + expectEvent(txReceipt, "AdminAdded", { + _initiator: admin, + _newAdmin: newAdmin, + }); + }); + + it("Removing another admin should emit AdminRemoved.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + let txReceipt = await lockedFund.removeAdmin(newAdmin, { from: admin }); + expectEvent(txReceipt, "AdminRemoved", { + _initiator: admin, + _removedAdmin: newAdmin, + }); + }); + + it("Changing the vestingRegistry should emit VestingRegistryUpdated.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + let txReceipt = await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + expectEvent(txReceipt, "VestingRegistryUpdated", { + _initiator: admin, + _vestingRegistry: newVestingRegistry.address, + }); + }); + + it("Changing the waited timestamp should emit WaitedTSUpdated.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + let txReceipt = await lockedFund.changeWaitedTS(newWaitedTS, { from: admin }); + expectEvent(txReceipt, "WaitedTSUpdated", { + _initiator: admin, + _waitedTS: new BN(newWaitedTS), + }); + }); + + it("Depositing using depositVested() should emit VestedDeposited.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + let txReceipt = await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + expectEvent(txReceipt, "VestedDeposited", { + _initiator: admin, + _userAddress: userOne, + _amount: new BN(value), + _cliff: new BN(cliff), + _duration: new BN(duration), + _basisPoint: new BN(zeroBasisPoint), + }); + }); + + it("Withdrawing waited unlocked balance using withdrawWaitedUnlockedBalance() should emit Withdrawn.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + let txReceipt = await lockedFund.withdrawWaitedUnlockedBalance(zeroAddress, { from: userOne }); + expectEvent(txReceipt, "Withdrawn", { + _initiator: userOne, + _userAddress: userOne, + _amount: new BN(Math.floor(value/2)), + }); + }); + + it("Withdrawing waited unlocked balance to another wallet using withdrawWaitedUnlockedBalance() should emit Withdrawn.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + let txReceipt = await lockedFund.withdrawWaitedUnlockedBalance(userTwo, { from: userOne }); + expectEvent(txReceipt, "Withdrawn", { + _initiator: userOne, + _userAddress: userTwo, + _amount: new BN(Math.floor(value/2)), + }); + }); + + it("Creating vesting and staking vested balance using createVestingAndStake() should emit VestingCreated and TokenStaked.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + let txReceipt = await lockedFund.createVestingAndStake({ from: userOne }); + let vestingAddress = await vestingRegistry.getVesting(userOne); + expectEvent(txReceipt, "VestingCreated", { + _initiator: userOne, + _userAddress: userOne, + _vesting: vestingAddress, + }); + expectEvent(txReceipt, "TokenStaked", { + _initiator: userOne, + _vesting: vestingAddress, + _amount: new BN(value), + }); + }); + + it("Creating vesting using createVesting() should emit VestingCreated.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + let txReceipt = await lockedFund.createVesting({ from: userOne }); + let vestingAddress = await vestingRegistry.getVesting(userOne); + expectEvent(txReceipt, "VestingCreated", { + _initiator: userOne, + _userAddress: userOne, + _vesting: vestingAddress, + }); + }); + + it("Staking vested balance using stakeTokens() should emit TokenStaked.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + let vestingAddress = await vestingRegistry.getVesting(userOne); + let txReceipt = await lockedFund.stakeTokens({ from: userOne }); + expectEvent(txReceipt, "TokenStaked", { + _initiator: userOne, + _vesting: vestingAddress, + _amount: new BN(value), + }); + }); + + it("Wthdrawing waited unlocked balance, creating vesting and staking vested balance using withdrawAndStakeTokens() should emit Withdrawn, VestingCreated and TokenStaked.", async () => { + vestingFactory = await VestingFactory.new(vestingLogic.address); + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(newVestingRegistry.address); + await newVestingRegistry.addAdmin(lockedFund.address); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + let txReceipt = await lockedFund.withdrawAndStakeTokens(zeroAddress, { from: userOne }); + expectEvent(txReceipt, "Withdrawn", { + _initiator: userOne, + _userAddress: userOne, + _amount: new BN(Math.floor(value/2)), + }); + let vestingAddress = await newVestingRegistry.getVesting(userOne); + expectEvent(txReceipt, "VestingCreated", { + _initiator: userOne, + _userAddress: userOne, + _vesting: vestingAddress, + }); + expectEvent(txReceipt, "TokenStaked", { + _initiator: userOne, + _vesting: vestingAddress, + _amount: new BN(Math.ceil(value/2)), + }); + }); + + it("Withdrawing waited unlocked balance to any wallet, creating vesting and staking vested balance using withdrawAndStakeTokens() should emit Withdrawn, VestingCreated and TokenStaked.", async () => { + vestingFactory = await VestingFactory.new(vestingLogic.address); + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(newVestingRegistry.address); + await newVestingRegistry.addAdmin(lockedFund.address); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + let txReceipt = await lockedFund.withdrawAndStakeTokens(userTwo, { from: userOne }); + expectEvent(txReceipt, "Withdrawn", { + _initiator: userOne, + _userAddress: userTwo, + _amount: new BN(Math.floor(value/2)), + }); + let vestingAddress = await newVestingRegistry.getVesting(userOne); + expectEvent(txReceipt, "VestingCreated", { + _initiator: userOne, + _userAddress: userOne, + _vesting: vestingAddress, + }); + expectEvent(txReceipt, "TokenStaked", { + _initiator: userOne, + _vesting: vestingAddress, + _amount: new BN(Math.ceil(value/2)), + }); + }); + + // This test should be correct, but the problem is with Smart Contract. There should be a initiator parameter for _withdrawWaitedUnlockedBalance() + // it("Any user triggering withdraw of waited unlocked balance of another user, creating vesting and staking vested balance for them using withdrawAndStakeTokensFrom() should emit Withdrawn, VestingCreated and TokenStaked..", async () => { + // let value = randomValue(); + // token.mint(admin, value, { from: creator }); + // token.approve(lockedFund.address, value, { from: admin }); + // await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + // let txReceipt = await lockedFund.withdrawAndStakeTokensFrom(userOne, { from: userTwo }); + // console.log("User One:"+userOne); + // console.log("User Two:"+userTwo); + // expectEvent(txReceipt, "Withdrawn", { + // _initiator: userTwo, + // _userAddress: userOne, + // _amount: new BN(Math.floor(value/2)), + // }); + // let vestingAddress = await vestingRegistry.getVesting(userOne); + // expectEvent(txReceipt, "VestingCreated", { + // _initiator: userTwo, + // _userAddress: userOne, + // _vesting: vestingAddress, + // }); + // expectEvent(txReceipt, "TokenStaked", { + // _initiator: userTwo, + // _vesting: vestingAddress, + // _amount: new BN(Math.ceil(value/2)), + // }); + // }); + +}); diff --git a/tests/LockedFund/state.test.js b/tests/LockedFund/state.test.js new file mode 100644 index 0000000..683c370 --- /dev/null +++ b/tests/LockedFund/state.test.js @@ -0,0 +1,365 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + constants, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let fourWeeks = 4 * 7 * 24 * 60 * 60; +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +/** + * Function to check the contract state. + * + * @param contractInstance The contract instance. + * @param checkArray The items to be checked. + * @param userAddr The user address for any particular check. + * @param waitedTS Whether the waited unlock started or not. + * @param token The token address which is being locked, unlocked, vested, etc. + * @param cliff Wait period after which locked token starts unlocking, represented in 4 weeks duration. 2 means 8 weeks. + * @param duration Duration of the entire staking, represented similar to cliff. + * @param vestingRegistry The vesting registry address. + * @param vestedBalance The vested balance of the `userAddr`. + * @param lockedBalance The locked balance of the `userAddr`. + * @param waitedUnlockedBalance The waited unlocked balance of the `userAddr`. + * @param unlockedBalance The unlocked balance of the `userAddr`. + * @param isAdmin True if `userAddr` is an admin, false otherwise. + */ +async function checkStatus( + contractInstance, + checkArray, + userAddr, + waitedTS, + token, + cliff, + duration, + vestingRegistry, + vestedBalance, + lockedBalance, + waitedUnlockedBalance, + unlockedBalance, + isAdmin +) { + if (checkArray[0] == 1) { + let cValue = await contractInstance.waitedTS(); + assert.strictEqual(waitedTS, cValue.toNumber(), "The waited timestamp does not match."); + } + if (checkArray[1] == 1) { + let cValue = await contractInstance.token(); + assert.strictEqual(token, cValue, "The token does not match."); + } + if (checkArray[2] == 1) { + let cValue = await contractInstance.cliff(userAddr); + // console.log("cliff: "+cliff); + // console.log(cliff); + // console.log("cliff.toNumber(): "+cliff.toNumber()); + // console.log(cliff.toNumber()); + // console.log("cValue: "+cValue); + // console.log(cValue); + // console.log("cValue.toNumber(): "+cValue.toNumber()); + // console.log(cValue.toNumber()); + assert.strictEqual(cliff, cValue.toNumber() / fourWeeks, "The cliff does not match."); + } + if (checkArray[3] == 1) { + let cValue = await contractInstance.duration(userAddr); + assert.strictEqual(duration, cValue.toNumber() / fourWeeks, "The duration does not match."); + } + if (checkArray[4] == 1) { + let cValue = await contractInstance.vestingRegistry(); + assert.strictEqual(vestingRegistry, cValue, "The vesting registry does not match."); + } + if (checkArray[5] == 1) { + let cValue = await contractInstance.getVestedBalance(userAddr); + assert.equal(vestedBalance, cValue.toNumber(), "The vested balance does not match."); + } + if (checkArray[6] == 1) { + let cValue = await contractInstance.getLockedBalance(userAddr); + assert.equal(lockedBalance, cValue.toNumber(), "The locked balance does not match."); + } + if (checkArray[7] == 1) { + let cValue = await contractInstance.getWaitedUnlockedBalance(userAddr); + assert.equal(waitedUnlockedBalance, cValue.toNumber(), "The waited unlocked balance does not match."); + } + if (checkArray[8] == 1) { + let cValue = await contractInstance.getUnlockedBalance(userAddr); + assert.equal(unlockedBalance, cValue.toNumber(), "The unlocked balance does not match."); + } + if (checkArray[9] == 1) { + let cValue = await contractInstance.adminStatus(userAddr); + assert.equal(isAdmin, cValue, "The admin status does not match."); + } +} + +/** + * Function to get the current token balance in contract & wallet. + * It expects user address along with contract & token instances as parameters. + * + * @param addr The user/contract address. + * @param tokenContract The Token Contract. + * @param lockedFundContract The Locked Fund Contract. + * + * @return [Token Balance, Vested Balance, Locked Balance, Waited Unlocked Balance, Unlocked Balance]. + */ +async function getTokenBalances(addr, tokenContract, lockedFundContract) { + let tokenBal = await tokenContract.balanceOf(addr); + let vestedBal = await lockedFundContract.getVestedBalance(addr); + let lockedBal = await lockedFundContract.getLockedBalance(addr); + let waitedUnlockedBal = await lockedFundContract.getWaitedUnlockedBalance(addr); + let unlockedBal = await lockedFundContract.getUnlockedBalance(addr); + return [tokenBal, vestedBal, lockedBal, waitedUnlockedBal, unlockedBal]; +} + +/** + * Mints random token for user account and then approve a contract. + * + * @param tokenContract The Token Contract. + * @param userAddr User Address. + * @param toApprove User Address who is approved. + * + * @returns value The token amount which was minted by user. + */ +async function userMintAndApprove(tokenContract, userAddr, toApprove) { + let value = randomValue(); + await tokenContract.mint(userAddr, value); + await tokenContract.approve(toApprove, value, { from: userAddr }); + return value; +} + +contract("LockedFund (State Change)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin]); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address); + }); + + it("Admin should be able to add another admin.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], newAdmin, waitedTS, token.address, zero, zero, vestingRegistry.address, zero, zero, zero, zero, true); + }); + + it("Admin should be able to remove an admin.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], newAdmin, waitedTS, token.address, zero, zero, vestingRegistry.address, zero, zero, zero, zero, true); + await lockedFund.removeAdmin(newAdmin, { from: admin }); + await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], newAdmin, waitedTS, token.address, zero, zero, vestingRegistry.address, zero, zero, zero, zero, false); + }); + + it("Admin should be able to change the vestingRegistry.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], userOne, waitedTS, token.address, zero, zero, newVestingRegistry.address, zero, zero, zero, zero, false); + }); + + it("Admin should be able to change the waited timestamp.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + await lockedFund.changeWaitedTS(newWaitedTS, { from: admin }); + await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], userOne, newWaitedTS, token.address, zero, zero, vestingRegistry.address, zero, zero, zero, zero, false); + }); + + it("Admin should be able to deposit using depositVested().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + }); + + it("User should be able to withdraw waited unlocked balance using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + let oldBalances = await getTokenBalances(userOne, token, lockedFund); + await lockedFund.withdrawWaitedUnlockedBalance(zeroAddress, { from: userOne }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, zero, zero, false); + let newBalances = await getTokenBalances(userOne, token, lockedFund); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + }); + + it("User should be able to withdraw waited unlocked balance to any wallet using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + let oldBalances = await getTokenBalances(userTwo, token, lockedFund); + await lockedFund.withdrawWaitedUnlockedBalance(userTwo, { from: userOne }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, zero, zero, false); + let newBalances = await getTokenBalances(userTwo, token, lockedFund); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + }); + + it("User should be able to create vesting and stake vested balance using createVestingAndStake().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, value, zero, zero, zero, false); + await lockedFund.createVestingAndStake({ from: userOne }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, zero, zero, zero, zero, false); + }); + + it("User should be able to create vesting using createVesting().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, value, zero, zero, zero, false); + await lockedFund.createVesting({ from: userOne }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, value, zero, zero, zero, false); + }); + + it("User should be able to stake vested balance using stakeTokens().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, value, zero, zero, zero, false); + await lockedFund.stakeTokens({ from: userOne }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, zero, zero, zero, zero, false); + }); + + it("User should be able to withdraw waited unlocked balance, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { + vestingFactory = await VestingFactory.new(vestingLogic.address); + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(newVestingRegistry.address); + await newVestingRegistry.addAdmin(lockedFund.address); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, newVestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + let oldBalances = await getTokenBalances(userOne, token, lockedFund); + await lockedFund.withdrawAndStakeTokens(zeroAddress, { from: userOne }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, newVestingRegistry.address, zero, zero, zero, zero, false); + let newBalances = await getTokenBalances(userOne, token, lockedFund); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + }); + + it("User should be able to withdraw waited unlocked balance to any wallet, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { + vestingFactory = await VestingFactory.new(vestingLogic.address); + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(newVestingRegistry.address); + await newVestingRegistry.addAdmin(lockedFund.address); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, newVestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + let oldBalances = await getTokenBalances(userTwo, token, lockedFund); + await lockedFund.withdrawAndStakeTokens(userTwo, { from: userOne }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, newVestingRegistry.address, zero, zero, zero, zero, false); + let newBalances = await getTokenBalances(userTwo, token, lockedFund); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + }); + + it("Any user should be able to trigger withdraw waited unlocked balance of another user, create vesting and stake vested balance for them using withdrawAndStakeTokensFrom().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + let oldBalances = await getTokenBalances(userOne, token, lockedFund); + await lockedFund.withdrawAndStakeTokensFrom(userOne, { from: userTwo }); + await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, zero, zero, zero, zero, false); + let newBalances = await getTokenBalances(userOne, token, lockedFund); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + }); + +}); diff --git a/tests/LockedFund/user.test.js b/tests/LockedFund/user.test.js new file mode 100644 index 0000000..95bc876 --- /dev/null +++ b/tests/LockedFund/user.test.js @@ -0,0 +1,225 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +contract("LockedFund (User Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin]); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address); + }); + + it("User should not be able to add another admin.", async () => { + await expectRevert(lockedFund.addAdmin(newAdmin, { from: userOne }), "LockedFund: Only admin can call this."); + }); + + it("User should not be able to remove an admin.", async () => { + await expectRevert(lockedFund.removeAdmin(newAdmin, { from: userOne }), "LockedFund: Only admin can call this."); + }); + + it("User should not be able to change the vestingRegistry.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await expectRevert( + lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: userOne }), + "LockedFund: Only admin can call this." + ); + }); + + it("User should not be able to change the waited timestamp.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + await expectRevert(lockedFund.changeWaitedTS(newWaitedTS, { from: userOne }), "LockedFund: Only admin can call this."); + }); + + it("User should not be able to deposit using depositVested().", async () => { + let value = randomValue(); + token.mint(userOne, value, { from: creator }); + token.approve(lockedFund.address, value, { from: userOne }); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: userOne }), + "LockedFund: Only admin can call this." + ); + }); + + it("User should be able to withdraw waited unlocked balance using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await lockedFund.withdrawWaitedUnlockedBalance(zeroAddress, { from: userOne }); + }); + + it("User should be able to withdraw waited unlocked balance to any wallet using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await lockedFund.withdrawWaitedUnlockedBalance(userTwo, { from: userOne }); + }); + + it("User should not be able to withdraw waited unlocked balance before waitedTimestamp using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await lockedFund.changeWaitedTS(currentTimestamp() + 10000, { from: admin }); + await expectRevert( + lockedFund.withdrawWaitedUnlockedBalance(zeroAddress, { from: userOne }), + "LockedFund: Wait Timestamp not yet passed." + ); + }); + + it("User should be able to create vesting and stake vested balance using createVestingAndStake().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + await lockedFund.createVestingAndStake({ from: userOne }); + }); + + it("User should be able to create vesting using createVesting().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + await lockedFund.createVesting({ from: userOne }); + }); + + it("User should be able to stake vested balance using stakeTokens().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + await lockedFund.stakeTokens({ from: userOne }); + }); + + it("User should not be able to stake vested balance using stakeTokens() if vesting is not created previously.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); + await expectRevert(lockedFund.stakeTokens({ from: userOne }), "function call to a non-contract account"); + }); + + it("User should be able to withdraw waited unlocked balance, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await lockedFund.withdrawAndStakeTokens(zeroAddress, { from: userOne }); + }); + + it("User should be able to withdraw waited unlocked balance to any wallet, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await lockedFund.withdrawAndStakeTokens(userTwo, { from: userOne }); + }); + + it("Any user should be able to trigger withdraw waited unlocked balance of another user, create vesting and stake vested balance for them using withdrawAndStakeTokensFrom().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); + await lockedFund.withdrawAndStakeTokensFrom(userOne, { from: userTwo }); + }); + + it("User should not be able to create vesting and stake vested balance using createVestingAndStake() if cliff and duration is not set.", async () => { + await expectRevert(lockedFund.createVestingAndStake({ from: userTwo }), "LockedFund: Cliff and/or Duration not set."); + }); +}); From a53c281d10269fc37a3af31a81163e719839aa09 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:17:03 +0530 Subject: [PATCH 095/112] Action workflow updated --- .github/workflows/node.js.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 8d36afa..8c58ff4 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -25,4 +25,5 @@ jobs: - run: npm ci - run: npm run lint - run: npm run prettier-check - - run: npm run test + - run: npm run coverage + - run: cat coverage/lcov.info | coveralls From ba301ba2727a67d13a89b7277bc04a9825941fab Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:19:46 +0530 Subject: [PATCH 096/112] LockedFund Test Formatted --- tests/LockedFund/event.test.js | 13 +- tests/LockedFund/state.test.js | 363 ++++++++++++++++++++++++++++++--- 2 files changed, 341 insertions(+), 35 deletions(-) diff --git a/tests/LockedFund/event.test.js b/tests/LockedFund/event.test.js index 04e5a55..663981a 100644 --- a/tests/LockedFund/event.test.js +++ b/tests/LockedFund/event.test.js @@ -155,7 +155,7 @@ contract("LockedFund (Events)", (accounts) => { expectEvent(txReceipt, "Withdrawn", { _initiator: userOne, _userAddress: userOne, - _amount: new BN(Math.floor(value/2)), + _amount: new BN(Math.floor(value / 2)), }); }); @@ -168,7 +168,7 @@ contract("LockedFund (Events)", (accounts) => { expectEvent(txReceipt, "Withdrawn", { _initiator: userOne, _userAddress: userTwo, - _amount: new BN(Math.floor(value/2)), + _amount: new BN(Math.floor(value / 2)), }); }); @@ -239,7 +239,7 @@ contract("LockedFund (Events)", (accounts) => { expectEvent(txReceipt, "Withdrawn", { _initiator: userOne, _userAddress: userOne, - _amount: new BN(Math.floor(value/2)), + _amount: new BN(Math.floor(value / 2)), }); let vestingAddress = await newVestingRegistry.getVesting(userOne); expectEvent(txReceipt, "VestingCreated", { @@ -250,7 +250,7 @@ contract("LockedFund (Events)", (accounts) => { expectEvent(txReceipt, "TokenStaked", { _initiator: userOne, _vesting: vestingAddress, - _amount: new BN(Math.ceil(value/2)), + _amount: new BN(Math.ceil(value / 2)), }); }); @@ -274,7 +274,7 @@ contract("LockedFund (Events)", (accounts) => { expectEvent(txReceipt, "Withdrawn", { _initiator: userOne, _userAddress: userTwo, - _amount: new BN(Math.floor(value/2)), + _amount: new BN(Math.floor(value / 2)), }); let vestingAddress = await newVestingRegistry.getVesting(userOne); expectEvent(txReceipt, "VestingCreated", { @@ -285,7 +285,7 @@ contract("LockedFund (Events)", (accounts) => { expectEvent(txReceipt, "TokenStaked", { _initiator: userOne, _vesting: vestingAddress, - _amount: new BN(Math.ceil(value/2)), + _amount: new BN(Math.ceil(value / 2)), }); }); @@ -315,5 +315,4 @@ contract("LockedFund (Events)", (accounts) => { // _amount: new BN(Math.ceil(value/2)), // }); // }); - }); diff --git a/tests/LockedFund/state.test.js b/tests/LockedFund/state.test.js index 683c370..79bc2ac 100644 --- a/tests/LockedFund/state.test.js +++ b/tests/LockedFund/state.test.js @@ -208,14 +208,56 @@ contract("LockedFund (State Change)", (accounts) => { it("Admin should be able to add another admin.", async () => { await lockedFund.addAdmin(newAdmin, { from: admin }); - await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], newAdmin, waitedTS, token.address, zero, zero, vestingRegistry.address, zero, zero, zero, zero, true); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + newAdmin, + waitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + zero, + zero, + true + ); }); it("Admin should be able to remove an admin.", async () => { await lockedFund.addAdmin(newAdmin, { from: admin }); - await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], newAdmin, waitedTS, token.address, zero, zero, vestingRegistry.address, zero, zero, zero, zero, true); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + newAdmin, + waitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + zero, + zero, + true + ); await lockedFund.removeAdmin(newAdmin, { from: admin }); - await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], newAdmin, waitedTS, token.address, zero, zero, vestingRegistry.address, zero, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + newAdmin, + waitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); }); it("Admin should be able to change the vestingRegistry.", async () => { @@ -227,14 +269,42 @@ contract("LockedFund (State Change)", (accounts) => { creator // This should be Governance Timelock Contract. ); await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); - await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], userOne, waitedTS, token.address, zero, zero, newVestingRegistry.address, zero, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + zero, + zero, + newVestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); }); it("Admin should be able to change the waited timestamp.", async () => { let value = randomValue(); let newWaitedTS = waitedTS + value; await lockedFund.changeWaitedTS(newWaitedTS, { from: admin }); - await checkStatus(lockedFund, [1,1,0,0,1,1,1,1,1,1], userOne, newWaitedTS, token.address, zero, zero, vestingRegistry.address, zero, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + userOne, + newWaitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); }); it("Admin should be able to deposit using depositVested().", async () => { @@ -242,7 +312,21 @@ contract("LockedFund (State Change)", (accounts) => { token.mint(admin, value, { from: creator }); token.approve(lockedFund.address, value, { from: admin }); await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); }); it("User should be able to withdraw waited unlocked balance using withdrawWaitedUnlockedBalance().", async () => { @@ -250,12 +334,40 @@ contract("LockedFund (State Change)", (accounts) => { token.mint(admin, value, { from: creator }); token.approve(lockedFund.address, value, { from: admin }); await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); let oldBalances = await getTokenBalances(userOne, token, lockedFund); await lockedFund.withdrawWaitedUnlockedBalance(zeroAddress, { from: userOne }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + zero, + zero, + false + ); let newBalances = await getTokenBalances(userOne, token, lockedFund); - assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value / 2), "Token Balance not matching."); }); it("User should be able to withdraw waited unlocked balance to any wallet using withdrawWaitedUnlockedBalance().", async () => { @@ -263,12 +375,40 @@ contract("LockedFund (State Change)", (accounts) => { token.mint(admin, value, { from: creator }); token.approve(lockedFund.address, value, { from: admin }); await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); let oldBalances = await getTokenBalances(userTwo, token, lockedFund); await lockedFund.withdrawWaitedUnlockedBalance(userTwo, { from: userOne }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + zero, + zero, + false + ); let newBalances = await getTokenBalances(userTwo, token, lockedFund); - assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value / 2), "Token Balance not matching."); }); it("User should be able to create vesting and stake vested balance using createVestingAndStake().", async () => { @@ -276,9 +416,37 @@ contract("LockedFund (State Change)", (accounts) => { token.mint(admin, value, { from: creator }); token.approve(lockedFund.address, value, { from: admin }); await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, value, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + value, + zero, + zero, + zero, + false + ); await lockedFund.createVestingAndStake({ from: userOne }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, zero, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); }); it("User should be able to create vesting using createVesting().", async () => { @@ -286,9 +454,37 @@ contract("LockedFund (State Change)", (accounts) => { token.mint(admin, value, { from: creator }); token.approve(lockedFund.address, value, { from: admin }); await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, value, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + value, + zero, + zero, + zero, + false + ); await lockedFund.createVesting({ from: userOne }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, value, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + value, + zero, + zero, + zero, + false + ); }); it("User should be able to stake vested balance using stakeTokens().", async () => { @@ -296,9 +492,37 @@ contract("LockedFund (State Change)", (accounts) => { token.mint(admin, value, { from: creator }); token.approve(lockedFund.address, value, { from: admin }); await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, { from: admin }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, value, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + value, + zero, + zero, + zero, + false + ); await lockedFund.stakeTokens({ from: userOne }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, zero, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); }); it("User should be able to withdraw waited unlocked balance, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { @@ -317,12 +541,40 @@ contract("LockedFund (State Change)", (accounts) => { token.mint(admin, value, { from: creator }); token.approve(lockedFund.address, value, { from: admin }); await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, newVestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + newVestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); let oldBalances = await getTokenBalances(userOne, token, lockedFund); await lockedFund.withdrawAndStakeTokens(zeroAddress, { from: userOne }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, newVestingRegistry.address, zero, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + newVestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); let newBalances = await getTokenBalances(userOne, token, lockedFund); - assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value / 2), "Token Balance not matching."); }); it("User should be able to withdraw waited unlocked balance to any wallet, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { @@ -341,12 +593,40 @@ contract("LockedFund (State Change)", (accounts) => { token.mint(admin, value, { from: creator }); token.approve(lockedFund.address, value, { from: admin }); await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, newVestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + newVestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); let oldBalances = await getTokenBalances(userTwo, token, lockedFund); await lockedFund.withdrawAndStakeTokens(userTwo, { from: userOne }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, newVestingRegistry.address, zero, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + newVestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); let newBalances = await getTokenBalances(userTwo, token, lockedFund); - assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value / 2), "Token Balance not matching."); }); it("Any user should be able to trigger withdraw waited unlocked balance of another user, create vesting and stake vested balance for them using withdrawAndStakeTokensFrom().", async () => { @@ -354,12 +634,39 @@ contract("LockedFund (State Change)", (accounts) => { token.mint(admin, value, { from: creator }); token.approve(lockedFund.address, value, { from: admin }); await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, { from: admin }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, Math.ceil(value/2), zero, Math.floor(value/2), zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); let oldBalances = await getTokenBalances(userOne, token, lockedFund); await lockedFund.withdrawAndStakeTokensFrom(userOne, { from: userTwo }); - await checkStatus(lockedFund, [1,1,1,1,1,1,1,1,1,1], userOne, waitedTS, token.address, cliff, duration, vestingRegistry.address, zero, zero, zero, zero, false); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); let newBalances = await getTokenBalances(userOne, token, lockedFund); - assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value/2), "Token Balance not matching."); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value / 2), "Token Balance not matching."); }); - }); From 29eec84c498ea2aaf24101b024f041a46ca6a7e9 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 17:26:40 +0530 Subject: [PATCH 097/112] Github Action workflow updated --- .github/workflows/node.js.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 8c58ff4..11df15c 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -22,8 +22,12 @@ jobs: uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - - run: npm ci - - run: npm run lint + - name: Installing Packages + run: npm ci + - name: Checking Formatting + run: npm run lint - run: npm run prettier-check - - run: npm run coverage - - run: cat coverage/lcov.info | coveralls + - name: Code Coverage + run: npm run coverage + - name: Coveralls GitHub Action + uses: coverallsapp/github-action@v1.1.2 From 6b17eef105067c24b2ec63ab68b3bf12f56e9761 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 18:04:49 +0530 Subject: [PATCH 098/112] Github Action workflow updated --- .github/workflows/node.js.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 11df15c..5cca731 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -26,8 +26,10 @@ jobs: run: npm ci - name: Checking Formatting run: npm run lint - - run: npm run prettier-check + run: npm run prettier-check - name: Code Coverage run: npm run coverage - name: Coveralls GitHub Action uses: coverallsapp/github-action@v1.1.2 + with: + github-token: ${{ secrets.COVERALLS }} From cb8258315cddc5ea14cc99f8ac3015f21727f107 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 18:14:01 +0530 Subject: [PATCH 099/112] Github Action Updated --- .github/workflows/node.js.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 5cca731..2d504ef 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -25,8 +25,7 @@ jobs: - name: Installing Packages run: npm ci - name: Checking Formatting - run: npm run lint - run: npm run prettier-check + run: npm run lint && npm run prettier-check - name: Code Coverage run: npm run coverage - name: Coveralls GitHub Action From 0eba277ef15ae4b4f8ad12ae067bd3a218e906c5 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 18:23:09 +0530 Subject: [PATCH 100/112] Github Action Updated --- .github/workflows/node.js.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 2d504ef..8d62cae 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -26,9 +26,11 @@ jobs: run: npm ci - name: Checking Formatting run: npm run lint && npm run prettier-check - - name: Code Coverage - run: npm run coverage - - name: Coveralls GitHub Action - uses: coverallsapp/github-action@v1.1.2 - with: - github-token: ${{ secrets.COVERALLS }} + - name: Test Coverage + run: npm run test + # - name: Code Coverage + # run: npm run coverage + # - name: Coveralls GitHub Action + # uses: coverallsapp/github-action@v1.1.2 + # with: + # github-token: ${{ secrets.COVERALLS }} From 512973bdd590bf1e9e44c5dad7de9b568408d621 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 20:35:54 +0530 Subject: [PATCH 101/112] Testnet Contract Updated --- scripts/values/testnet.json | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index b5f5025..ab7e001 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -12,10 +12,10 @@ "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222" ], "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", - "waitedTimestamp": "1624579200", + "waitedTimestamp": "1624991400", "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509", - "origins": "0x127557B259949DFdD43dc18952217CA707eaFD02", - "lockedFund": "0x1DDAf77DE0c18af5dc9457C4DB83F13652618157", + "origins": "0x8D242d6fb0088aC8434c2069Bf3D498bCC7c0E47", + "lockedFund": "0x0188907C12ddE77ddD41500Ae7263aD6BF243B29", "tiers": [ { "DONT_DELETE_THIS": "This acts as the zero index entry in SC which has to be skipped." @@ -24,7 +24,7 @@ "minimumAmount": "1", "maximumAmount": "50000000000000000", "tokensForSale": "11508000", - "saleStartTimestamp": "1624233600", + "saleStartTimestamp": "1624473000", "saleEnd": "259200", "unlockedBP": "0", "vestOrLockCliff": "1", @@ -40,7 +40,7 @@ "minimumAmount": "1", "maximumAmount": "75000000000000000", "tokensForSale": "20000000", - "saleStartTimestamp": "1624492800", + "saleStartTimestamp": "1624732200", "saleEnd": "259200", "unlockedBP": "5000", "vestOrLockCliff": "1", @@ -58,7 +58,6 @@ "0x54b8Aef719B63Ef9354b618AC1828b71EE6e496D", "0xa41f08993b6d4dE3281F31492F7a93D6F403806B", "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", - "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", "0x7d20eaa96aDbFe158C222210E7A8c05c44Da9d15", "0x2bD2201bfe156a71EB0d02837172FFc237218505", "0xA987a709f4A93eC25738FeC0F8d6189260459ed7", @@ -66,7 +65,6 @@ "0x48343139f46EA80422F7820cC0eBE5B77bbB1818", "0xCB1857547a18837155694b4E267d3C64e677A2Ed", "0x01e1205a5c3B6ffa3859Ab8E18134763132A422A" - ], "verified": [] } \ No newline at end of file From cef8f16b1f230166838b0be5d3ec450b83f4f899 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 20:37:24 +0530 Subject: [PATCH 102/112] OriginsBase Contract Updated --- contracts/OriginsBase.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index 261db1c..fb81744 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -364,9 +364,11 @@ contract OriginsBase is OriginsEvents { /// @notice Checking if we have enough token for all tiers. If we have more, then we refund the extra. if (requiredBal > currentBal) { + totalTokenAllocationPerTier[_tierID] = requiredBal.sub(currentBal); bool txStatus = token.transferFrom(msg.sender, address(this), requiredBal.sub(currentBal)); require(txStatus, "OriginsBase: Not enough token supplied for Token Distribution."); } else { + totalTokenAllocationPerTier[_tierID] = currentBal.sub(requiredBal); bool txStatus = token.transfer(msg.sender, currentBal.sub(requiredBal)); require(txStatus, "OriginsBase: Admin didn't received the tokens correctly."); } @@ -578,10 +580,11 @@ contract OriginsBase is OriginsEvents { /// @notice If user is verified on address or does not need verification, the following steps will be taken. uint256 tokensBoughtByAddress = tokensBoughtByAddressOnTier[msg.sender][_tierID]; + uint256 boughtInAsset = tokensBoughtByAddress.div(tierDetails.depositRate); /// @notice Checking if the user already reached the maximum amount. require( - tokensBoughtByAddress < tierDetails.maxAmount.mul(tierDetails.depositRate), + boughtInAsset < tierDetails.maxAmount, "OriginsBase: User already bought maximum allowed." ); @@ -601,7 +604,6 @@ contract OriginsBase is OriginsEvents { /// @notice Checking what should be the allowed deposit amount. uint256 refund; - uint256 boughtInAsset = tokensBoughtByAddress.div(tierDetails.depositRate); if (tierDetails.maxAmount.sub(boughtInAsset) <= deposit) { refund = deposit.add(boughtInAsset).sub(tierDetails.maxAmount); deposit = tierDetails.maxAmount.sub(boughtInAsset); From e348ca6173c3f43073c71afa1b0d6ecea868f211 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 20:41:49 +0530 Subject: [PATCH 103/112] Origins Storage added the total token allocation --- contracts/OriginsStorage.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/OriginsStorage.sol b/contracts/OriginsStorage.sol index 50e7480..c082d0a 100644 --- a/contracts/OriginsStorage.sol +++ b/contracts/OriginsStorage.sol @@ -83,6 +83,8 @@ contract OriginsStorage { mapping(address => mapping(uint256 => uint256)) internal tokensBoughtByAddressOnTier; /// @notice Contains the number of unique wallets who participated in the sale in a particular Tier. mapping(uint256 => uint256) internal participatingWalletCountPerTier; + /// @notice Contains the amount of token allocation provided by the tier. + mapping(uint256 => uint256) internal totalTokenAllocationPerTier; /// @notice Contains the amount of tokens sold in a particular Tier. mapping(uint256 => uint256) internal tokensSoldPerTier; /// @notice Contains if a tier sale ended or not. From 1ac6c3b0b8aee88b5a7a711ea35947c03e750126 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 20:51:13 +0530 Subject: [PATCH 104/112] Development JSON Updated --- scripts/values/development.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/values/development.json b/scripts/values/development.json index 81dc788..a27c021 100644 --- a/scripts/values/development.json +++ b/scripts/values/development.json @@ -15,7 +15,7 @@ "waitedTimestamp": "1624317500", "vestingRegistry": "0xBE62193751BdFBc4976B22CCE09511AA0d40BF17", "origins": "0xB22691778D55F4B79F594264d14b71276Dca3C38", - "lockedFund": "0xE9f15545367F1eAcA292fa0D70E527c729701d9a", + "lockedFund": "0xeCF499458B913c4CeA7aADfF0F2ECCf30625B675", "tiers": [ { "DONT_DELETE_THIS": "This acts as the zero index entry in SC which has to be skipped." From 2bbfbd687d171e252f297977e5401ac2356cb53d Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 20:52:26 +0530 Subject: [PATCH 105/112] Added OriginsAdmin Tests --- tests/OriginsAdmin/creator.test.js | 45 +++++++++++++++++++ tests/OriginsAdmin/event.test.js | 62 +++++++++++++++++++++++++++ tests/OriginsAdmin/owner.test.js | 69 ++++++++++++++++++++++++++++++ tests/OriginsAdmin/state.test.js | 53 +++++++++++++++++++++++ 4 files changed, 229 insertions(+) create mode 100644 tests/OriginsAdmin/creator.test.js create mode 100644 tests/OriginsAdmin/event.test.js create mode 100644 tests/OriginsAdmin/owner.test.js create mode 100644 tests/OriginsAdmin/state.test.js diff --git a/tests/OriginsAdmin/creator.test.js b/tests/OriginsAdmin/creator.test.js new file mode 100644 index 0000000..9335f5c --- /dev/null +++ b/tests/OriginsAdmin/creator.test.js @@ -0,0 +1,45 @@ +const OriginsAdmin = artifacts.require("OriginsAdmin"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; + +contract("OriginsAdmin (Owner Functions)", (accounts) => { + let originsAdmin; + let creator, ownerOne, ownerTwo, ownerThree; + let verifierOne, verifierTwo, verifierThree, userOne; + + before("Initiating Accounts & Creating Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; + + // Creating the instance of OriginsAdmin Contract. + originsAdmin = await OriginsAdmin.new([ownerOne]); + }); + + it("Creator should not be able to add another owner.", async () => { + await expectRevert(originsAdmin.addOwner(ownerTwo, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to remove an owner.", async () => { + await expectRevert(originsAdmin.removeOwner(ownerTwo, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to add a verifier.", async () => { + await expectRevert(originsAdmin.addVerifier(verifierOne, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to remove a verifier.", async () => { + await expectRevert(originsAdmin.removeVerifier(verifierOne, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + +}); diff --git a/tests/OriginsAdmin/event.test.js b/tests/OriginsAdmin/event.test.js new file mode 100644 index 0000000..19a4718 --- /dev/null +++ b/tests/OriginsAdmin/event.test.js @@ -0,0 +1,62 @@ +const OriginsAdmin = artifacts.require("OriginsAdmin"); + +const { + BN, // Big Number support. + constants, + expectEvent, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; + +contract("OriginsAdmin (Owner Functions)", (accounts) => { + let originsAdmin; + let creator, ownerOne, ownerTwo, ownerThree; + let verifierOne, verifierTwo, verifierThree, userOne; + + before("Initiating Accounts & Creating Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; + + // Creating the instance of OriginsAdmin Contract. + originsAdmin = await OriginsAdmin.new([ownerOne]); + }); + + it("Adding another owner should emit OwnerAdded.", async () => { + let txReceipt = await originsAdmin.addOwner(ownerTwo, { from: ownerOne }); + expectEvent(txReceipt, "OwnerAdded", { + _initiator: ownerOne, + _newOwner: ownerTwo + }); + }); + + it("Remove an owner should emit OwnerRemoved.", async () => { + let txReceipt = await originsAdmin.removeOwner(ownerTwo, { from: ownerOne }); + expectEvent(txReceipt, "OwnerRemoved", { + _initiator: ownerOne, + _removedOwner: ownerTwo + }); + }); + + it("Adding a verifier should emit VerifierAdded.", async () => { + let txReceipt = await originsAdmin.addVerifier(verifierOne, { from: ownerOne }); + expectEvent(txReceipt, "VerifierAdded", { + _initiator: ownerOne, + _newVerifier: verifierOne + }); + }); + + it("Removing a verifier should emit VerifierRemoved.", async () => { + let txReceipt = await originsAdmin.removeVerifier(verifierOne, { from: ownerOne }); + expectEvent(txReceipt, "VerifierRemoved", { + _initiator: ownerOne, + _removedVerifier: verifierOne + }); + }); + +}); diff --git a/tests/OriginsAdmin/owner.test.js b/tests/OriginsAdmin/owner.test.js new file mode 100644 index 0000000..b7c24c5 --- /dev/null +++ b/tests/OriginsAdmin/owner.test.js @@ -0,0 +1,69 @@ +const OriginsAdmin = artifacts.require("OriginsAdmin"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; + +contract("OriginsAdmin (Owner Functions)", (accounts) => { + let originsAdmin; + let creator, ownerOne, ownerTwo, ownerThree; + let verifierOne, verifierTwo, verifierThree, userOne; + + before("Initiating Accounts & Creating Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; + + // Creating the instance of OriginsAdmin Contract. + originsAdmin = await OriginsAdmin.new([ownerOne]); + }); + + it("Owner should be able to add another owner.", async () => { + await originsAdmin.addOwner(ownerTwo, { from: ownerOne }); + }); + + it("Owner should not be able to add zero address as another owner.", async () => { + await expectRevert(originsAdmin.addOwner(zeroAddress, { from: ownerOne }), "OriginsAdmin: Invalid Address."); + }); + + it("Owner should not be able to add another owner more than once.", async () => { + await expectRevert(originsAdmin.addOwner(ownerTwo, { from: ownerOne }), "OriginsAdmin: Address is already an owner."); + }); + + it("Owner should be able to remove an owner.", async () => { + await originsAdmin.removeOwner(ownerTwo, { from: ownerOne }); + }); + + it("Owner should not be able to call removeOwner() with a normal user address.", async () => { + await expectRevert(originsAdmin.removeOwner(userOne, { from: ownerOne }), "OriginsAdmin: Address is not an owner."); + }); + + it("Owner should be able to add a verifier.", async () => { + await originsAdmin.addVerifier(verifierOne, { from: ownerOne }); + }); + + it("Owner should not be able to add zero address as a verifier.", async () => { + await expectRevert(originsAdmin.addVerifier(zeroAddress, { from: ownerOne }), "OriginsAdmin: Invalid Address."); + }); + + it("Owner should not be able to add another verifier more than once.", async () => { + await expectRevert(originsAdmin.addVerifier(verifierOne, { from: ownerOne }), "OriginsAdmin: Address is already a verifier."); + }); + + it("Owner should be able to remove a verifier.", async () => { + await originsAdmin.removeVerifier(verifierOne, { from: ownerOne }); + }); + + it("Owner should not be able to call removeVerifier() with a normal user address.", async () => { + await expectRevert(originsAdmin.removeVerifier(userOne, { from: ownerOne }), "OriginsAdmin: Address is not a verifier."); + }); + +}); diff --git a/tests/OriginsAdmin/state.test.js b/tests/OriginsAdmin/state.test.js new file mode 100644 index 0000000..512627f --- /dev/null +++ b/tests/OriginsAdmin/state.test.js @@ -0,0 +1,53 @@ +const OriginsAdmin = artifacts.require("OriginsAdmin"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; + +contract("OriginsAdmin (Owner Functions)", (accounts) => { + let originsAdmin; + let creator, ownerOne, ownerTwo, ownerThree; + let verifierOne, verifierTwo, verifierThree, userOne; + + before("Initiating Accounts & Creating Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; + + // Creating the instance of OriginsAdmin Contract. + originsAdmin = await OriginsAdmin.new([ownerOne]); + }); + + it("Owner should be able to add another owner.", async () => { + await originsAdmin.addOwner(ownerTwo, { from: ownerOne }); + let isAdmin = await originsAdmin.checkOwner(ownerTwo); + assert.strictEqual(isAdmin, true, "Owner status not udpated correctly.") + }); + + it("Owner should be able to remove an owner.", async () => { + await originsAdmin.removeOwner(ownerTwo, { from: ownerOne }); + let isAdmin = await originsAdmin.checkOwner(ownerTwo); + assert.strictEqual(isAdmin, false, "Owner status not udpated correctly.") + }); + + it("Owner should be able to add a verifier.", async () => { + await originsAdmin.addVerifier(verifierOne, { from: ownerOne }); + let isVerifier = await originsAdmin.checkVerifier(verifierOne); + assert.strictEqual(isVerifier, true, "Verifier status not udpated correctly.") + }); + + it("Owner should be able to remove a verifier.", async () => { + await originsAdmin.removeVerifier(verifierOne, { from: ownerOne }); + let isVerifier = await originsAdmin.checkVerifier(verifierOne); + assert.strictEqual(isVerifier, false, "Verifier status not udpated correctly.") + }); + +}); From 1068ec592e1d13c79e8f14c245dff7a4378227e7 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 20:55:57 +0530 Subject: [PATCH 106/112] OriginsAdmin Tests Formatted --- tests/OriginsAdmin/creator.test.js | 5 ++--- tests/OriginsAdmin/event.test.js | 15 +++++++-------- tests/OriginsAdmin/owner.test.js | 5 ++--- tests/OriginsAdmin/state.test.js | 21 ++++++++++----------- 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/tests/OriginsAdmin/creator.test.js b/tests/OriginsAdmin/creator.test.js index 9335f5c..fcae399 100644 --- a/tests/OriginsAdmin/creator.test.js +++ b/tests/OriginsAdmin/creator.test.js @@ -15,14 +15,14 @@ let zeroAddress = constants.ZERO_ADDRESS; contract("OriginsAdmin (Owner Functions)", (accounts) => { let originsAdmin; let creator, ownerOne, ownerTwo, ownerThree; - let verifierOne, verifierTwo, verifierThree, userOne; + let verifierOne, verifierTwo, verifierThree, userOne; before("Initiating Accounts & Creating Contract Instance.", async () => { // Checking if we have enough accounts to test. assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; - // Creating the instance of OriginsAdmin Contract. + // Creating the instance of OriginsAdmin Contract. originsAdmin = await OriginsAdmin.new([ownerOne]); }); @@ -41,5 +41,4 @@ contract("OriginsAdmin (Owner Functions)", (accounts) => { it("Creator should not be able to remove a verifier.", async () => { await expectRevert(originsAdmin.removeVerifier(verifierOne, { from: creator }), "OriginsAdmin: Only owner can call this function."); }); - }); diff --git a/tests/OriginsAdmin/event.test.js b/tests/OriginsAdmin/event.test.js index 19a4718..15041d1 100644 --- a/tests/OriginsAdmin/event.test.js +++ b/tests/OriginsAdmin/event.test.js @@ -3,7 +3,7 @@ const OriginsAdmin = artifacts.require("OriginsAdmin"); const { BN, // Big Number support. constants, - expectEvent, + expectEvent, expectRevert, // Assertions for transactions that should fail. } = require("@openzeppelin/test-helpers"); @@ -16,14 +16,14 @@ let zeroAddress = constants.ZERO_ADDRESS; contract("OriginsAdmin (Owner Functions)", (accounts) => { let originsAdmin; let creator, ownerOne, ownerTwo, ownerThree; - let verifierOne, verifierTwo, verifierThree, userOne; + let verifierOne, verifierTwo, verifierThree, userOne; before("Initiating Accounts & Creating Contract Instance.", async () => { // Checking if we have enough accounts to test. assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; - // Creating the instance of OriginsAdmin Contract. + // Creating the instance of OriginsAdmin Contract. originsAdmin = await OriginsAdmin.new([ownerOne]); }); @@ -31,7 +31,7 @@ contract("OriginsAdmin (Owner Functions)", (accounts) => { let txReceipt = await originsAdmin.addOwner(ownerTwo, { from: ownerOne }); expectEvent(txReceipt, "OwnerAdded", { _initiator: ownerOne, - _newOwner: ownerTwo + _newOwner: ownerTwo, }); }); @@ -39,7 +39,7 @@ contract("OriginsAdmin (Owner Functions)", (accounts) => { let txReceipt = await originsAdmin.removeOwner(ownerTwo, { from: ownerOne }); expectEvent(txReceipt, "OwnerRemoved", { _initiator: ownerOne, - _removedOwner: ownerTwo + _removedOwner: ownerTwo, }); }); @@ -47,7 +47,7 @@ contract("OriginsAdmin (Owner Functions)", (accounts) => { let txReceipt = await originsAdmin.addVerifier(verifierOne, { from: ownerOne }); expectEvent(txReceipt, "VerifierAdded", { _initiator: ownerOne, - _newVerifier: verifierOne + _newVerifier: verifierOne, }); }); @@ -55,8 +55,7 @@ contract("OriginsAdmin (Owner Functions)", (accounts) => { let txReceipt = await originsAdmin.removeVerifier(verifierOne, { from: ownerOne }); expectEvent(txReceipt, "VerifierRemoved", { _initiator: ownerOne, - _removedVerifier: verifierOne + _removedVerifier: verifierOne, }); }); - }); diff --git a/tests/OriginsAdmin/owner.test.js b/tests/OriginsAdmin/owner.test.js index b7c24c5..f413de2 100644 --- a/tests/OriginsAdmin/owner.test.js +++ b/tests/OriginsAdmin/owner.test.js @@ -15,14 +15,14 @@ let zeroAddress = constants.ZERO_ADDRESS; contract("OriginsAdmin (Owner Functions)", (accounts) => { let originsAdmin; let creator, ownerOne, ownerTwo, ownerThree; - let verifierOne, verifierTwo, verifierThree, userOne; + let verifierOne, verifierTwo, verifierThree, userOne; before("Initiating Accounts & Creating Contract Instance.", async () => { // Checking if we have enough accounts to test. assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; - // Creating the instance of OriginsAdmin Contract. + // Creating the instance of OriginsAdmin Contract. originsAdmin = await OriginsAdmin.new([ownerOne]); }); @@ -65,5 +65,4 @@ contract("OriginsAdmin (Owner Functions)", (accounts) => { it("Owner should not be able to call removeVerifier() with a normal user address.", async () => { await expectRevert(originsAdmin.removeVerifier(userOne, { from: ownerOne }), "OriginsAdmin: Address is not a verifier."); }); - }); diff --git a/tests/OriginsAdmin/state.test.js b/tests/OriginsAdmin/state.test.js index 512627f..a3536e4 100644 --- a/tests/OriginsAdmin/state.test.js +++ b/tests/OriginsAdmin/state.test.js @@ -15,39 +15,38 @@ let zeroAddress = constants.ZERO_ADDRESS; contract("OriginsAdmin (Owner Functions)", (accounts) => { let originsAdmin; let creator, ownerOne, ownerTwo, ownerThree; - let verifierOne, verifierTwo, verifierThree, userOne; + let verifierOne, verifierTwo, verifierThree, userOne; before("Initiating Accounts & Creating Contract Instance.", async () => { // Checking if we have enough accounts to test. assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; - // Creating the instance of OriginsAdmin Contract. + // Creating the instance of OriginsAdmin Contract. originsAdmin = await OriginsAdmin.new([ownerOne]); }); it("Owner should be able to add another owner.", async () => { await originsAdmin.addOwner(ownerTwo, { from: ownerOne }); - let isAdmin = await originsAdmin.checkOwner(ownerTwo); - assert.strictEqual(isAdmin, true, "Owner status not udpated correctly.") + let isAdmin = await originsAdmin.checkOwner(ownerTwo); + assert.strictEqual(isAdmin, true, "Owner status not udpated correctly."); }); it("Owner should be able to remove an owner.", async () => { await originsAdmin.removeOwner(ownerTwo, { from: ownerOne }); - let isAdmin = await originsAdmin.checkOwner(ownerTwo); - assert.strictEqual(isAdmin, false, "Owner status not udpated correctly.") + let isAdmin = await originsAdmin.checkOwner(ownerTwo); + assert.strictEqual(isAdmin, false, "Owner status not udpated correctly."); }); it("Owner should be able to add a verifier.", async () => { await originsAdmin.addVerifier(verifierOne, { from: ownerOne }); - let isVerifier = await originsAdmin.checkVerifier(verifierOne); - assert.strictEqual(isVerifier, true, "Verifier status not udpated correctly.") + let isVerifier = await originsAdmin.checkVerifier(verifierOne); + assert.strictEqual(isVerifier, true, "Verifier status not udpated correctly."); }); it("Owner should be able to remove a verifier.", async () => { await originsAdmin.removeVerifier(verifierOne, { from: ownerOne }); - let isVerifier = await originsAdmin.checkVerifier(verifierOne); - assert.strictEqual(isVerifier, false, "Verifier status not udpated correctly.") + let isVerifier = await originsAdmin.checkVerifier(verifierOne); + assert.strictEqual(isVerifier, false, "Verifier status not udpated correctly."); }); - }); From 1e24f0fa72de87bed43d11002cef43cbf96b551b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 21:11:03 +0530 Subject: [PATCH 107/112] Updated OriginsBase --- contracts/OriginsBase.sol | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol index fb81744..6349bd7 100644 --- a/contracts/OriginsBase.sol +++ b/contracts/OriginsBase.sol @@ -364,11 +364,11 @@ contract OriginsBase is OriginsEvents { /// @notice Checking if we have enough token for all tiers. If we have more, then we refund the extra. if (requiredBal > currentBal) { - totalTokenAllocationPerTier[_tierID] = requiredBal.sub(currentBal); + totalTokenAllocationPerTier[_tierID] = totalTokenAllocationPerTier[_tierID].add(requiredBal.sub(currentBal)); bool txStatus = token.transferFrom(msg.sender, address(this), requiredBal.sub(currentBal)); require(txStatus, "OriginsBase: Not enough token supplied for Token Distribution."); } else { - totalTokenAllocationPerTier[_tierID] = currentBal.sub(requiredBal); + totalTokenAllocationPerTier[_tierID] = totalTokenAllocationPerTier[_tierID].sub(currentBal.sub(requiredBal)); bool txStatus = token.transfer(msg.sender, currentBal.sub(requiredBal)); require(txStatus, "OriginsBase: Admin didn't received the tokens correctly."); } @@ -583,10 +583,7 @@ contract OriginsBase is OriginsEvents { uint256 boughtInAsset = tokensBoughtByAddress.div(tierDetails.depositRate); /// @notice Checking if the user already reached the maximum amount. - require( - boughtInAsset < tierDetails.maxAmount, - "OriginsBase: User already bought maximum allowed." - ); + require(boughtInAsset < tierDetails.maxAmount, "OriginsBase: User already bought maximum allowed."); /// @notice Checking which deposit type is selected. uint256 deposit; @@ -806,6 +803,15 @@ contract OriginsBase is OriginsEvents { return participatingWalletCountPerTier[_tierID]; } + /** + * @notice Function to read total token allocation per tier. + * @param _tierID The tier ID for which the metrics has to be checked. + * @return The amount of tokens allocation on that tier. + */ + function getTotalTokenAllocationPerTier(uint256 _tierID) external view returns (uint256) { + return totalTokenAllocationPerTier[_tierID]; + } + /** * @notice Function to read tokens sold per tier. * @param _tierID The tier ID for which the sold metrics has to be checked. From 678fe3c1959cefb1f6ecb94bdbcba23766a572a6 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 21:11:30 +0530 Subject: [PATCH 108/112] LockedFund Script Updated --- scripts/deployLockedFund.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/scripts/deployLockedFund.py b/scripts/deployLockedFund.py index b3e3db8..84a0136 100644 --- a/scripts/deployLockedFund.py +++ b/scripts/deployLockedFund.py @@ -57,7 +57,7 @@ def choice(): if(selection == 1): deployLockedFund() elif(selection == 2): - addLockedFundAsAdmin() + addLockedFundAsVestingAdmin() elif(selection == 3): addOriginsAsAdmin() elif(selection == 4): @@ -90,20 +90,16 @@ def deployLockedFund(): print("=============================================================") lockedFund = acct.deploy(LockedFund, waitedTS, token, vestingRegistry, adminList) - + values['lockedFund'] = str(lockedFund.address) print("\nLocked Fund Deployed.") - print("\nAdding LockedFund as an admin of Vesting Registry.") - - vestingRegistry = Contract.from_abi("VestingRegistry3", address=values['vestingRegistry'], abi=VestingRegistry3.abi, owner=acct) - vestingRegistry.addAdmin(lockedFund.address) - print("\nAdded Locked Fund:",lockedFund.address,"as the admin of Vesting Registry:", values['vestingRegistry']) + addLockedFundAsVestingAdmin() + updateWaitedTS() - values['lockedFund'] = str(lockedFund) writeToJSON() # ========================================================================================================================================= -def addLockedFundAsAdmin(): +def addLockedFundAsVestingAdmin(): vestingRegistry = Contract.from_abi("VestingRegistry3", address=values['vestingRegistry'], abi=VestingRegistry3.abi, owner=acct) print("\nAdding LockedFund as an admin of Vesting Registry.") vestingRegistry.addAdmin(values['lockedFund']) From 329dbae300b41522a575764737877087ccf1a054 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 21:12:50 +0530 Subject: [PATCH 109/112] Origins Script Updated --- scripts/deployOrigins.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/deployOrigins.py b/scripts/deployOrigins.py index 7f29b98..2c2fe73 100644 --- a/scripts/deployOrigins.py +++ b/scripts/deployOrigins.py @@ -135,7 +135,6 @@ def deployOrigins(): updateLockedFund() lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) - print("\nAdding Origins as an admin to LockedFund...\n") lockedFund.addAdmin(values['origins']) print("Added Origins as", values['origins'], " as an admin of Locked Fund.") @@ -143,9 +142,13 @@ def deployOrigins(): addMyselfAsVerifier() getOwnerList() - getVerifierList() + # For easy deployment uncomment below three lines. + # createNewTier() + # createNewTier() + # verifyWallet() + # ========================================================================================================================================= def updateDepositAddress(): origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) From 1b4ae24fbf09ec5d624c5150c1f1bc5dc8a57dcd Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 21:13:35 +0530 Subject: [PATCH 110/112] OriginsBase Tests Added --- tests/OriginsBase/creator.test.js | 202 ++++++++++++++++ tests/OriginsBase/owner.test.js | 312 ++++++++++++++++++++++++ tests/OriginsBase/state.test.js | 371 +++++++++++++++++++++++++++++ tests/OriginsBase/user.test.js | 259 ++++++++++++++++++++ tests/OriginsBase/verifier.test.js | 206 ++++++++++++++++ 5 files changed, 1350 insertions(+) create mode 100644 tests/OriginsBase/creator.test.js create mode 100644 tests/OriginsBase/owner.test.js create mode 100644 tests/OriginsBase/state.test.js create mode 100644 tests/OriginsBase/user.test.js create mode 100644 tests/OriginsBase/verifier.test.js diff --git a/tests/OriginsBase/creator.test.js b/tests/OriginsBase/creator.test.js new file mode 100644 index 0000000..667561b --- /dev/null +++ b/tests/OriginsBase/creator.test.js @@ -0,0 +1,202 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const OriginsBase = artifacts.require("OriginsBase"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); +const { current } = require("@openzeppelin/test-helpers/src/balance"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); +let depositTypeRBTC = 0; +let depositTypeToken = 1; +let saleEndDurationOrTSNone = 0; +let saleEndDurationOrTSUntilSupply = 1; +let saleEndDurationOrTSDuration = 2; +let saleEndDurationOrTSTimestamp = 3; +let verificationTypeNone = 0; +let verificationTypeEveryone = 1; +let verificationTypeByAddress = 2; +let transferTypeNone = 0; +let transferTypeUnlocked = 1; +let transferTypeWaitedUnlock = 2; +let transferTypeVested = 3; +let transferTypeLocked = 4; +let firstVerificationType = verificationTypeByAddress; +let [firstDepositRate, firstDepositToken, firstDepositType] = [100, zeroAddress, depositTypeRBTC]; +let firstMinAmount = 1; +let firstMaxAmount = new BN(50000); +let firstRemainingTokens = new BN(5000000); +let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; +let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; +let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +/** + * Mints random token for user account and then approve a contract. + * + * @param tokenContract The Token Contract. + * @param userAddr User Address. + * @param toApprove User Address who is approved. + * + * @returns value The token amount which was minted by user. + */ + async function userMintAndApprove(tokenContract, userAddr, toApprove) { + let value = randomValue(); + await tokenContract.mint(userAddr, value); + await tokenContract.approve(toApprove, value, { from: userAddr }); + return value; +} + +contract("OriginsBase (Creator Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + + // Setting Verifier in Origins. + await originsBase.addVerifier(verifier, { from: owner }); + + // Minting new tokens, Approving Origins and creating a new tier. + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + }); + + // beforeEach("Creating New OriginsBase Contract Instance.", async () => { + // }); + + it("Creator should not be able to set deposit address.", async () => { + await expectRevert(originsBase.setDepositAddress(newDepositAddr, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to set Locked Fund Contract.", async () => { + let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + await expectRevert(originsBase.setLockedFund(newLockedFund.address, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to add a new tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: creator }); + await expectRevert(originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to set Tier Deposit Parameters.", async () => { + await expectRevert(originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to set Tier Token Limit Parameters.", async () => { + await expectRevert(originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to set Tier Token Amount Parameters.", async () => { + await expectRevert(originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to set Tier Vest or Lock Parameters.", async () => { + await expectRevert(originsBase.setTierVestOrLock(tierCount, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, secondUnlockedBP, secondTransferType, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to set Tier Time Parameters.", async () => { + await expectRevert(originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to verify a single address to a single tier.", async () => { + await expectRevert(originsBase.addressVerification(userOne, tierCount, { from: creator }), "OriginsAdmin: Only verifier can call this function."); + }); + + it("Creator should not be able to verify a single address to a multiple tier.", async () => { + tierCount = 3; + await expectRevert(originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount-1, tierCount-2], { from: creator }), "OriginsAdmin: Only verifier can call this function."); + }); + + it("Creator should not be able to verify a multiple address to a single tier.", async () => { + await expectRevert(originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: creator }), "OriginsAdmin: Only verifier can call this function."); + }); + + it("Creator should not be able to verify a multiple address to a multiple tier.", async () => { + tierCount = 3; + await expectRevert(originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount-1, tierCount-2], { from: creator }), "OriginsAdmin: Only verifier can call this function."); + }); + +}); diff --git a/tests/OriginsBase/owner.test.js b/tests/OriginsBase/owner.test.js new file mode 100644 index 0000000..5dc465e --- /dev/null +++ b/tests/OriginsBase/owner.test.js @@ -0,0 +1,312 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const OriginsBase = artifacts.require("OriginsBase"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); +const { current } = require("@openzeppelin/test-helpers/src/balance"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); +let depositTypeRBTC = 0; +let depositTypeToken = 1; +let saleEndDurationOrTSNone = 0; +let saleEndDurationOrTSUntilSupply = 1; +let saleEndDurationOrTSDuration = 2; +let saleEndDurationOrTSTimestamp = 3; +let verificationTypeNone = 0; +let verificationTypeEveryone = 1; +let verificationTypeByAddress = 2; +let transferTypeNone = 0; +let transferTypeUnlocked = 1; +let transferTypeWaitedUnlock = 2; +let transferTypeVested = 3; +let transferTypeLocked = 4; +let firstVerificationType = verificationTypeByAddress; +let [firstDepositRate, firstDepositToken, firstDepositType] = [100, zeroAddress, depositTypeRBTC]; +let firstMinAmount = 1; +let firstMaxAmount = new BN(50000); +let firstRemainingTokens = new BN(6000000); +let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; +let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; +let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +/** + * Mints random token for user account and then approve a contract. + * + * @param tokenContract The Token Contract. + * @param userAddr User Address. + * @param toApprove User Address who is approved. + * + * @returns value The token amount which was minted by user. + */ + async function userMintAndApprove(tokenContract, userAddr, toApprove) { + let value = randomValue(); + await tokenContract.mint(userAddr, value); + await tokenContract.approve(toApprove, value, { from: userAddr }); + return value; +} + +contract("OriginsBase (Admin Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + }); + + beforeEach("Creating New OriginsBase Contract Instance.", async () => { + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + }); + + it("Owner should be able to set deposit address.", async () => { + await originsBase.setDepositAddress(newDepositAddr, { from: owner }); + }); + + it("Owner should not be able to add zero address as deposit address.", async () => { + await expectRevert(originsBase.setDepositAddress(zeroAddress, { from: owner }), "OriginsBase: Deposit Address cannot be zero."); + }); + + it("Owner should be able to set Locked Fund Contract.", async () => { + let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + await originsBase.setLockedFund(newLockedFund.address, { from: owner }); + }); + + it("Owner should not be able to add zero address as Locked Fund Contract.", async () => { + await expectRevert(originsBase.setLockedFund(zeroAddress, { from: owner }), "OriginsBase: Locked Fund Address cannot be zero."); + }); + + it("Owner should be able to add a new tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + }); + + it("Owner should be able to set Tier Verification Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await originsBase.setTierVerification(1, secondVerificationType, { from: owner }); + }); + + it("Owner should be able to set Tier Deposit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await originsBase.setTierDeposit(1, secondDepositRate, secondDepositToken, secondDepositType, { from: owner }); + }); + + it("Owner should not be able to set Tier Deposit Parameters with deposit rate as zero.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await expectRevert(originsBase.setTierDeposit(1, zero, secondDepositToken, secondDepositType, { from: owner }), "OriginsBase: Deposit Rate cannot be zero."); + }); + + it("Owner should not be able to set Tier Deposit Parameters with deposit token as zero address if deposit type is Token.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await expectRevert(originsBase.setTierDeposit(1, secondDepositRate, zeroAddress, depositTypeToken, { from: owner }), "OriginsBase: Deposit Token Address cannot be zero."); + }); + + it("Owner should be able to set Tier Token Limit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await originsBase.setTierTokenLimit(1, secondMinAmount, secondMaxAmount, { from: owner }); + }); + + it("Owner should not be able to set Tier Token Limit Parameters with minimum is greater than maximum amount.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await expectRevert(originsBase.setTierTokenLimit(1, secondMaxAmount, secondMinAmount, { from: owner }), "OriginsBase: Min Amount cannot be higher than Max Amount."); + }); + + it("Owner should be able to set Tier Token Amount Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await token.mint(owner, secondRemainingTokens); + await token.approve(originsBase.address, secondRemainingTokens, { from: owner }); + await originsBase.setTierTokenAmount(1, secondRemainingTokens, { from: owner }); + }); + + it("Owner should not be able to set Tier Token Amount Parameters with remaining token as zero.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await expectRevert(originsBase.setTierTokenAmount(1, zero, { from: owner }), "OriginsBase: Total token to sell should be higher than zero."); + }); + + it("Owner should not be able to set Tier Token Amount Parameters with max allowed is higher than remaining token.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await expectRevert(originsBase.setTierTokenAmount(1, 1, { from: owner }), "OriginsBase: Max Amount to buy should not be higher than token availability."); + }); + + it("Owner should be able to set Tier Vest or Lock Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await originsBase.setTierVestOrLock(1, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, secondUnlockedBP, secondTransferType, { from: owner }); + }); + + it("Owner should not be able to set Tier Vest or Lock Parameters with cliff higher than duration.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await expectRevert(originsBase.setTierVestOrLock(1, secondVestOfLockDuration, secondVestOrLockCliff, waitedTS, secondUnlockedBP, secondTransferType, { from: owner }), "OriginsBase: Cliff has to be <= duration."); + }); + + it("Owner should not be able to set Tier Vest or Lock Parameters with cliff higher than duration.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await expectRevert(originsBase.setTierVestOrLock(1, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, invalidBasisPoint, secondTransferType, { from: owner }), "OriginsBase: The basis point cannot be higher than 10K."); + }); + + it("Owner should be able to set Tier Time Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await originsBase.setTierTime(1, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: owner }); + }); + + it("Owner should not be able to set Tier Time Parameters with sale start timestamp is higher than sale end timestamp.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await expectRevert(originsBase.setTierTime(1, secondSaleStartTS, secondSaleStartTS, saleEndDurationOrTSTimestamp, { from: owner }), "OriginsBase: The sale start TS cannot be after sale end TS."); + }); + + it("Owner should not be able to set Tier Time Parameters with sale start timestamp is higher than sale end timestamp.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await expectRevert(originsBase.setTierTime(1, currentTimestamp() - 1000, currentTimestamp() - 100, saleEndDurationOrTSTimestamp, { from: owner }), "OriginsBase: The sale end duration cannot be past already."); + }); + + it("Owner should be able to withdraw the sale deposit to deposit address.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 20000; + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + amount = 20000; + await token.mint(userThree, amount); + await token.approve(originsBase.address, amount, { from: userThree }); + await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); + await originsBase.withdrawSaleDeposit({ from: owner }); + }); + + it("Owner should be able to withdraw the sale deposit to own address if deposit address is not set.", async () => { + originsBase = await OriginsBase.new([owner], token.address, zeroAddress); + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + await lockedFund.addAdmin(originsBase.address, { from: owner }); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 20000; + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + amount = 20000; + await token.mint(userThree, amount); + await token.approve(originsBase.address, amount, { from: userThree }); + await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); + await originsBase.withdrawSaleDeposit({ from: owner }); + }); + +}); diff --git a/tests/OriginsBase/state.test.js b/tests/OriginsBase/state.test.js new file mode 100644 index 0000000..7cd6a8e --- /dev/null +++ b/tests/OriginsBase/state.test.js @@ -0,0 +1,371 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const OriginsBase = artifacts.require("OriginsBase"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + balance, + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); +const { current } = require("@openzeppelin/test-helpers/src/balance"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); +let depositTypeRBTC = 0; +let depositTypeToken = 1; +let saleEndDurationOrTSNone = 0; +let saleEndDurationOrTSUntilSupply = 1; +let saleEndDurationOrTSDuration = 2; +let saleEndDurationOrTSTimestamp = 3; +let verificationTypeNone = 0; +let verificationTypeEveryone = 1; +let verificationTypeByAddress = 2; +let transferTypeNone = 0; +let transferTypeUnlocked = 1; +let transferTypeWaitedUnlock = 2; +let transferTypeVested = 3; +let transferTypeLocked = 4; +let firstVerificationType = verificationTypeByAddress; +let [firstDepositRate, firstDepositToken, firstDepositType] = [100, zeroAddress, depositTypeRBTC]; +let firstMinAmount = 1; +let firstMaxAmount = new BN(50000); +let firstRemainingTokens = new BN(6000000); +let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; +let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; +let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +/** + * Mints random token for user account and then approve a contract. + * + * @param tokenContract The Token Contract. + * @param userAddr User Address. + * @param toApprove User Address who is approved. + * + * @returns value The token amount which was minted by user. + */ +async function userMintAndApprove(tokenContract, userAddr, toApprove) { + let value = randomValue(); + await tokenContract.mint(userAddr, value); + await tokenContract.approve(toApprove, value, { from: userAddr }); + return value; +} + +/** + * Checks Tier Details. + */ +async function checkTier(_originsBase, _tierCount, _minAmount, _maxAmount, _remainingTokens, _saleStartTS, _saleEnd, _unlockedTokenWithdrawTS, _unlockedBP, _vestOrLockCliff, _vestOrLockDuration, _depositRate, _depositToken, _depositType, _verificationType, _saleEndDurationOrTS, _transferType) { + let tierPartA = await _originsBase.readTierPartA(_tierCount) + let tierPartB = await _originsBase.readTierPartB(_tierCount) + assert(tierPartA._minAmount.eq(new BN(_minAmount)), "Minimum Amount is not correctly set."); + assert(tierPartA._maxAmount.eq(new BN(_maxAmount)), "Maximum Amount is not correctly set."); + assert(tierPartA._remainingTokens.eq(new BN(_remainingTokens)), "Remaining Token is not correctly set."); + assert(tierPartA._saleStartTS.eq(new BN(_saleStartTS)), "Sale Start TS is not correctly set."); + if(tierPartB._saleEndDurationOrTS == saleEndDurationOrTSDuration) { + assert(tierPartA._saleEnd.eq(new BN(_saleStartTS+_saleEnd)), "Sale End TS is not correctly set."); + } + else if(tierPartB._saleEndDurationOrTS == saleEndDurationOrTSTimestamp) { + assert(tierPartA._saleEnd.eq(new BN(_saleEnd)), "Sale End TS is not correctly set."); + } + assert(tierPartA._unlockedTokenWithdrawTS.eq(new BN(_unlockedTokenWithdrawTS)), "Unlocked Token Withdraw TS is not correctly set."); + assert(tierPartA._unlockedBP.eq(new BN(_unlockedBP)), "Unlocked Basis Point is not correctly set."); + assert(tierPartA._vestOrLockCliff.eq(new BN(_vestOrLockCliff)), "Vest or Lock Cliff is not correctly set."); + assert(tierPartA._vestOrLockDuration.eq(new BN(_vestOrLockDuration)), "Vest or Lock Duration is not correctly set."); + assert(tierPartA._depositRate.eq(new BN(_depositRate)), "Deposit Rate is not correctly set."); + assert.strictEqual(tierPartB._depositToken, _depositToken, "Deposit Token is not correctly set."); + assert(tierPartB._depositType.eq(new BN(_depositType)), "Deposit Type is not correctly set."); + assert(tierPartB._verificationType.eq(new BN(_verificationType)), "Verification Type is not correctly set."); + assert(tierPartB._saleEndDurationOrTS.eq(new BN(_saleEndDurationOrTS)), "Sale End Duration or TS is not correctly set."); + assert(tierPartB._transferType.eq(new BN(_transferType)), "Transfer Type is not correctly set."); +} + +contract("OriginsBase (State Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + + // Setting Verifier in Origins. + await originsBase.addVerifier(verifier, { from: owner }); + + // Creating a new tier. + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + + }); + + beforeEach("Creating New OriginsBase Contract Instance.", async () => { + }); + + it("Setting a deposit address should update the state.", async () => { + await originsBase.setDepositAddress(newDepositAddr, { from: owner }); + let cDepositAddr = await originsBase.getDepositAddress(); + assert.strictEqual(cDepositAddr, newDepositAddr, "Deposit Address is not correctly set."); + + // Resetting it for other tests. + await originsBase.setDepositAddress(depositAddr, { from: owner }); + }); + + it("Setting Locked Fund Contract should update the state.", async () => { + let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + await originsBase.setLockedFund(newLockedFund.address, { from: owner }); + let cLockedFund = await originsBase.getLockDetails(); + assert.strictEqual(cLockedFund, newLockedFund.address, "Locked Fund Contract is not correctly set."); + + // Resetting it for other tests. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + }); + + it("Adding a new tier should update the state correctly.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType); + }); + + it("Owner should be able to set Tier Verification Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierVerification(tierCount, secondVerificationType, { from: owner }); + await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, secondVerificationType, firstSaleEndDurationOrTS, firstTransferType); + }); + + it("Owner should be able to set Tier Deposit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: owner }); + await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, secondDepositRate, secondDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType); + }); + + it("Owner should be able to set Tier Token Limit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: owner }); + await checkTier(originsBase, tierCount, secondMinAmount, secondMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType); + }); + + it("Owner should be able to set Tier Token Amount Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await token.mint(owner, secondRemainingTokens); + await token.approve(originsBase.address, secondRemainingTokens, { from: owner }); + await originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: owner }); + await checkTier(originsBase, tierCount, zero, firstMaxAmount, secondRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType); + }); + + it("Owner should be able to set Tier Vest or Lock Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierVestOrLock(tierCount, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, secondUnlockedBP, secondTransferType, { from: owner }); + await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, waitedTS, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, secondTransferType); + }); + + it("Owner should be able to set Tier Time Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: owner }); + await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, secondSaleStartTS, secondSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, secondSaleEndDurationOrTS, firstTransferType); + }); + + it("Verifier should be able to verify a single address to a single tier.", async () => { + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("Verifier should be able to verify a single address to a multiple tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount-1, tierCount-2], { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userOne, tierCount-1); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userOne, tierCount-2); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("Verifier should be able to verify a multiple address to a single tier.", async () => { + await originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userTwo, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userThree, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("Verifier should be able to verify a multiple address to a multiple tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount-1, tierCount-2], { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userTwo, tierCount-1); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userThree, tierCount-2); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("User should be able to buy tokens.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + let userVestedBalance = await lockedFund.getVestedBalance(userOne); + assert(userVestedBalance.eq(new BN(amount).mul(new BN(firstDepositRate))), "User Vesting Balance is wrong."); + }); + + it("User should be able to buy tokens multiple times until max asset amount reaches.", async () => { + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + let userVestedBalance = await lockedFund.getVestedBalance(userOne); + assert(userVestedBalance.eq(new BN(amount).mul(new BN(4)).mul(new BN(firstDepositRate))), "User Vesting Balance is wrong."); + }); + + it("User should be refunded the extra after the max reaches.", async () => { + let amount = 20000; + let oldBalance = await balance.current(userOne); + let tx = await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + let gasUsed = tx.receipt.gasUsed; + let gasPrice = (await web3.eth.getTransaction(tx.tx)).gasPrice; + let newBalance = await balance.current(userOne); + newBalance = newBalance.add(new BN(gasUsed).mul(new BN(gasPrice))); + let userVestedBalance = await lockedFund.getVestedBalance(userOne); + assert(oldBalance.sub(newBalance).eq(new BN(10000)), "User not returned enough."); + assert(userVestedBalance.eq(firstMaxAmount.mul(new BN(firstDepositRate))), "User Vested Balance is wrong."); + }); + + it("Owner should be able to withdraw the sale deposit to deposit address.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 20000; + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + amount = 20000; + await token.mint(userThree, amount); + await token.approve(originsBase.address, amount, { from: userThree }); + await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); + let oldBalance = await balance.current(depositAddr); + await originsBase.withdrawSaleDeposit({ from: owner }); + let newBalance = await balance.current(depositAddr); + assert(newBalance.sub(oldBalance).eq(new BN(60000)), "Admin did not received the total sale proceedings."); + }); + +}); diff --git a/tests/OriginsBase/user.test.js b/tests/OriginsBase/user.test.js new file mode 100644 index 0000000..703fc75 --- /dev/null +++ b/tests/OriginsBase/user.test.js @@ -0,0 +1,259 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const OriginsBase = artifacts.require("OriginsBase"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. + time +} = require("@openzeppelin/test-helpers"); +const { current } = require("@openzeppelin/test-helpers/src/balance"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); +let depositTypeRBTC = 0; +let depositTypeToken = 1; +let saleEndDurationOrTSNone = 0; +let saleEndDurationOrTSUntilSupply = 1; +let saleEndDurationOrTSDuration = 2; +let saleEndDurationOrTSTimestamp = 3; +let verificationTypeNone = 0; +let verificationTypeEveryone = 1; +let verificationTypeByAddress = 2; +let transferTypeNone = 0; +let transferTypeUnlocked = 1; +let transferTypeWaitedUnlock = 2; +let transferTypeVested = 3; +let transferTypeLocked = 4; +let firstVerificationType = verificationTypeByAddress; +let [firstDepositRate, firstDepositToken, firstDepositType] = [100, zeroAddress, depositTypeRBTC]; +let firstMinAmount = 1; +let firstMaxAmount = new BN(50000); +let firstRemainingTokens = new BN(6000000); +let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; +let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; +let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +/** + * Mints random token for user account and then approve a contract. + * + * @param tokenContract The Token Contract. + * @param userAddr User Address. + * @param toApprove User Address who is approved. + * + * @returns value The token amount which was minted by user. + */ + async function userMintAndApprove(tokenContract, userAddr, toApprove) { + let value = randomValue(); + await tokenContract.mint(userAddr, value); + await tokenContract.approve(toApprove, value, { from: userAddr }); + return value; +} + +contract("OriginsBase (Admin Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + + // Setting Verifier in Origins. + await originsBase.addVerifier(verifier, { from: owner }); + + // Creating a new tier. + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + }); + + beforeEach("Creating New OriginsBase Contract Instance.", async () => { + }); + + it("User should be able to buy tokens.", async () => { + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + }); + + it("User should be able to buy tokens multiple times until max asset amount reaches.", async () => { + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + }); + + it("User should be allowed to buy until the max reaches.", async () => { + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: User already bought maximum allowed."); + }); + + it("User should not be allowed to buy if sale start time is not set.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, zero, currentTimestamp()+1000, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, saleEndDurationOrTSDuration, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + let amount = 10000; + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: Sale has not started yet."); + }); + + it("User should not be allowed to buy if the token sale has ended.", async () => { + let amount = 100; + await token.mint(owner, amount); + await token.approve(originsBase.address, amount, { from: owner }); + await originsBase.createTier(amount, amount, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, 1, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await expectRevert(originsBase.buy(tierCount, zero, { from: userTwo, value: amount }), "OriginsBase: Sale ended."); + }); + + it("User should not be allowed to buy if sale end is not set.", async () => { + let amount = randomValue(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount}), "OriginsBase: Sale not allowed."); + }); + + it("User should not be allowed to buy if total tokens are sold.", async () => { + let amount = 100; + await token.mint(owner, amount); + await token.approve(originsBase.address, amount, { from: owner }); + await originsBase.createTier(amount/2, amount, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, 1, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount/2 }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount/2 }); + await expectRevert(originsBase.buy(tierCount, zero, { from: userThree, value: amount/2 }), "OriginsBase: Sale ended."); + }); + + it("User should not be allowed to buy if Verification is not set.", async () => { + let amount = randomValue(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeNone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount}), "OriginsBase: No one is allowed for sale."); + }); + + it("If verification is done by address, user should only be allowed if it is done by verified address.", async () => { + let amount = randomValue(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount}), "OriginsBase: User not approved for sale."); + }); + + it("User should not be allowed to buy once the max reaches even if there is remaining tokens.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + let amount = 25000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 5000; + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: User already bought maximum allowed."); + // Though any other user can still buy. + amount = 5000; + await token.approve(originsBase.address, amount, { from: userTwo }); + }); + + it("User should not be allowed to buy tokens with zero deposit in RBTC", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: zero }), "OriginsBase: Amount cannot be zero."); + }); + + it("User should not be allowed to buy with assets deposited less than minimum allowed.", async () => { + let amount = 1000; + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierTokenLimit(tierCount, 10000, firstMaxAmount, { from: owner }) + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: Deposit is less than minimum allowed."); + }); + +}); diff --git a/tests/OriginsBase/verifier.test.js b/tests/OriginsBase/verifier.test.js new file mode 100644 index 0000000..a1e2765 --- /dev/null +++ b/tests/OriginsBase/verifier.test.js @@ -0,0 +1,206 @@ +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const OriginsBase = artifacts.require("OriginsBase"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. +} = require("@openzeppelin/test-helpers"); +const { current } = require("@openzeppelin/test-helpers/src/balance"); + +const { assert } = require("chai"); + +// Some constants we would be using in the contract. +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. +let zeroBasisPoint = 0; +let twentyBasisPoint = 2000; +let fiftyBasisPoint = 5000; +let hundredBasisPoint = 10000; +let invalidBasisPoint = 10001; +let waitedTS = currentTimestamp(); +let depositTypeRBTC = 0; +let depositTypeToken = 1; +let saleEndDurationOrTSNone = 0; +let saleEndDurationOrTSUntilSupply = 1; +let saleEndDurationOrTSDuration = 2; +let saleEndDurationOrTSTimestamp = 3; +let verificationTypeNone = 0; +let verificationTypeEveryone = 1; +let verificationTypeByAddress = 2; +let transferTypeNone = 0; +let transferTypeUnlocked = 1; +let transferTypeWaitedUnlock = 2; +let transferTypeVested = 3; +let transferTypeLocked = 4; +let firstVerificationType = verificationTypeByAddress; +let [firstDepositRate, firstDepositToken, firstDepositType] = [100, zeroAddress, depositTypeRBTC]; +let firstMinAmount = 1; +let firstMaxAmount = new BN(50000); +let firstRemainingTokens = new BN(6000000); +let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; +let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; +let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +function currentTimestamp() { + return Math.floor(Date.now() / 1000); +} + +/** + * Mints random token for user account and then approve a contract. + * + * @param tokenContract The Token Contract. + * @param userAddr User Address. + * @param toApprove User Address who is approved. + * + * @returns value The token amount which was minted by user. + */ + async function userMintAndApprove(tokenContract, userAddr, toApprove) { + let value = randomValue(); + await tokenContract.mint(userAddr, value); + await tokenContract.approve(toApprove, value, { from: userAddr }); + return value; +} + +contract("OriginsBase (Verifier Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + // Creating the instance of Test Token. + token = await Token.new(zero); + + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address); + staking = await StakingProxy.new(token.address); + await staking.setImplementation(stakingLogic.address); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new(); + vestingFactory = await VestingFactory.new(vestingLogic.address); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(vestingRegistry.address); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + + // Setting Verifier in Origins. + await originsBase.addVerifier(verifier, { from: owner }); + }); + + beforeEach("Creating New OriginsBase Contract Instance.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); + tierCount = await originsBase.getTierCount(); + }); + + it("Verifier should not be able to set deposit address.", async () => { + await expectRevert(originsBase.setDepositAddress(newDepositAddr, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Verifier should not be able to set Locked Fund Contract.", async () => { + let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + await expectRevert(originsBase.setLockedFund(newLockedFund.address, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Verifier should not be able to add a new tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await expectRevert(originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Verifier should not be able to set Tier Deposit Parameters.", async () => { + await expectRevert(originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Verifier should not be able to set Tier Token Limit Parameters.", async () => { + await expectRevert(originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Verifier should not be able to set Tier Token Amount Parameters.", async () => { + await expectRevert(originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Verifier should not be able to set Tier Vest or Lock Parameters.", async () => { + await expectRevert(originsBase.setTierVestOrLock(tierCount, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, secondUnlockedBP, secondTransferType, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Verifier should not be able to set Tier Time Parameters.", async () => { + await expectRevert(originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Verifier should be able to verify a single address to a single tier.", async () => { + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + }); + + it("Verifier should not be able to verify a zero address to a single tier.", async () => { + await expectRevert(originsBase.addressVerification(zeroAddress, tierCount, { from: verifier }), "OriginsBase: Address to be verified cannot be zero."); + }); + + it("Verifier should be able to verify a single address to a multiple tier.", async () => { + await originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount-1, tierCount-2], { from: verifier }); + }); + + it("Verifier should be able to verify a multiple address to a single tier.", async () => { + await originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: verifier }); + }); + + it("Verifier should be able to verify a multiple address to a multiple tier.", async () => { + await originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount-1, tierCount-2], { from: verifier }); + }); + + it("Verifier should not be able to verify a multiple address of length x to a multiple tier of length y, where x != y.", async () => { + await expectRevert(originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount-1], { from: verifier }), "OriginsBase: Address and Tier Array length mismatch."); + }); + +}); From a8a1fceec80082503a66f2ee1bad850fb060cc35 Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 21:17:05 +0530 Subject: [PATCH 111/112] Testnet JSON Updated --- scripts/values/testnet.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/values/testnet.json b/scripts/values/testnet.json index ab7e001..077152b 100644 --- a/scripts/values/testnet.json +++ b/scripts/values/testnet.json @@ -14,7 +14,7 @@ "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", "waitedTimestamp": "1624991400", "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509", - "origins": "0x8D242d6fb0088aC8434c2069Bf3D498bCC7c0E47", + "origins": "0xf4963730a7A1E1aA06E01A0C70Ae465Ba7C4a9E3", "lockedFund": "0x0188907C12ddE77ddD41500Ae7263aD6BF243B29", "tiers": [ { From 75e5475be7e2fa2a896ef6ba5750b5d003f80f7b Mon Sep 17 00:00:00 2001 From: Franklin Richards Date: Thu, 24 Jun 2021 21:17:53 +0530 Subject: [PATCH 112/112] OriginsBase Test Formatted --- tests/OriginsBase/creator.test.js | 203 ++++++-- tests/OriginsBase/owner.test.js | 652 +++++++++++++++++------ tests/OriginsBase/state.test.js | 812 +++++++++++++++++++++-------- tests/OriginsBase/user.test.js | 405 ++++++++++---- tests/OriginsBase/verifier.test.js | 203 ++++++-- 5 files changed, 1680 insertions(+), 595 deletions(-) diff --git a/tests/OriginsBase/creator.test.js b/tests/OriginsBase/creator.test.js index 667561b..4ba6bc4 100644 --- a/tests/OriginsBase/creator.test.js +++ b/tests/OriginsBase/creator.test.js @@ -49,7 +49,37 @@ let firstMaxAmount = new BN(50000); let firstRemainingTokens = new BN(5000000); let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; -let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; +let [ + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondVerificationType, + secondSaleEndDurationOrTS, + secondTransferType, +] = [ + 1, + new BN(75000), + new BN(10000000), + currentTimestamp(), + 86400, + 5000, + 1, + 11, + 50, + zeroAddress, + depositTypeRBTC, + verificationTypeEveryone, + saleEndDurationOrTSDuration, + transferTypeVested, +]; /** * Function to create a random value. @@ -80,7 +110,7 @@ function currentTimestamp() { * * @returns value The token amount which was minted by user. */ - async function userMintAndApprove(tokenContract, userAddr, toApprove) { +async function userMintAndApprove(tokenContract, userAddr, toApprove) { let value = randomValue(); await tokenContract.mint(userAddr, value); await tokenContract.approve(toApprove, value, { from: userAddr }); @@ -90,7 +120,7 @@ function currentTimestamp() { contract("OriginsBase (Creator Functions)", (accounts) => { let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; - let tierCount; + let tierCount; before("Initiating Accounts & Creating Test Contract Instance.", async () => { // Checking if we have enough accounts to test. @@ -121,7 +151,7 @@ contract("OriginsBase (Creator Functions)", (accounts) => { ); vestingFactory.transferOwnership(vestingRegistry.address); - // Creating the instance of LockedFund Contract. + // Creating the instance of LockedFund Contract. lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); // Creating the instance of OriginsBase Contract. @@ -130,73 +160,146 @@ contract("OriginsBase (Creator Functions)", (accounts) => { // Setting lockedFund in Origins. await originsBase.setLockedFund(lockedFund.address, { from: owner }); - // Added Origins as an admin of LockedFund. - await lockedFund.addAdmin(originsBase.address, { from: owner }); + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); - // Setting Verifier in Origins. + // Setting Verifier in Origins. await originsBase.addVerifier(verifier, { from: owner }); - // Minting new tokens, Approving Origins and creating a new tier. - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - }); + // Minting new tokens, Approving Origins and creating a new tier. + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + }); // beforeEach("Creating New OriginsBase Contract Instance.", async () => { // }); it("Creator should not be able to set deposit address.", async () => { - await expectRevert(originsBase.setDepositAddress(newDepositAddr, { from: creator }), "OriginsAdmin: Only owner can call this function."); + await expectRevert( + originsBase.setDepositAddress(newDepositAddr, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); }); it("Creator should not be able to set Locked Fund Contract.", async () => { let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); - await expectRevert(originsBase.setLockedFund(newLockedFund.address, { from: creator }), "OriginsAdmin: Only owner can call this function."); + await expectRevert( + originsBase.setLockedFund(newLockedFund.address, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); }); - it("Creator should not be able to add a new tier.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: creator }); - await expectRevert(originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: creator }), "OriginsAdmin: Only owner can call this function."); - }); - - it("Creator should not be able to set Tier Deposit Parameters.", async () => { - await expectRevert(originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: creator }), "OriginsAdmin: Only owner can call this function."); - }); + it("Creator should not be able to add a new tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: creator }); + await expectRevert( + originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: creator } + ), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Creator should not be able to set Tier Token Limit Parameters.", async () => { - await expectRevert(originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: creator }), "OriginsAdmin: Only owner can call this function."); - }); + it("Creator should not be able to set Tier Deposit Parameters.", async () => { + await expectRevert( + originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Creator should not be able to set Tier Token Amount Parameters.", async () => { - await expectRevert(originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: creator }), "OriginsAdmin: Only owner can call this function."); - }); + it("Creator should not be able to set Tier Token Limit Parameters.", async () => { + await expectRevert( + originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Creator should not be able to set Tier Vest or Lock Parameters.", async () => { - await expectRevert(originsBase.setTierVestOrLock(tierCount, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, secondUnlockedBP, secondTransferType, { from: creator }), "OriginsAdmin: Only owner can call this function."); - }); + it("Creator should not be able to set Tier Token Amount Parameters.", async () => { + await expectRevert( + originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Creator should not be able to set Tier Time Parameters.", async () => { - await expectRevert(originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: creator }), "OriginsAdmin: Only owner can call this function."); - }); + it("Creator should not be able to set Tier Vest or Lock Parameters.", async () => { + await expectRevert( + originsBase.setTierVestOrLock( + tierCount, + secondVestOrLockCliff, + secondVestOfLockDuration, + waitedTS, + secondUnlockedBP, + secondTransferType, + { from: creator } + ), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Creator should not be able to verify a single address to a single tier.", async () => { - await expectRevert(originsBase.addressVerification(userOne, tierCount, { from: creator }), "OriginsAdmin: Only verifier can call this function."); - }); + it("Creator should not be able to set Tier Time Parameters.", async () => { + await expectRevert( + originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Creator should not be able to verify a single address to a multiple tier.", async () => { - tierCount = 3; - await expectRevert(originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount-1, tierCount-2], { from: creator }), "OriginsAdmin: Only verifier can call this function."); - }); + it("Creator should not be able to verify a single address to a single tier.", async () => { + await expectRevert( + originsBase.addressVerification(userOne, tierCount, { from: creator }), + "OriginsAdmin: Only verifier can call this function." + ); + }); - it("Creator should not be able to verify a multiple address to a single tier.", async () => { - await expectRevert(originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: creator }), "OriginsAdmin: Only verifier can call this function."); - }); + it("Creator should not be able to verify a single address to a multiple tier.", async () => { + tierCount = 3; + await expectRevert( + originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount - 1, tierCount - 2], { from: creator }), + "OriginsAdmin: Only verifier can call this function." + ); + }); - it("Creator should not be able to verify a multiple address to a multiple tier.", async () => { - tierCount = 3; - await expectRevert(originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount-1, tierCount-2], { from: creator }), "OriginsAdmin: Only verifier can call this function."); - }); + it("Creator should not be able to verify a multiple address to a single tier.", async () => { + await expectRevert( + originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: creator }), + "OriginsAdmin: Only verifier can call this function." + ); + }); + it("Creator should not be able to verify a multiple address to a multiple tier.", async () => { + tierCount = 3; + await expectRevert( + originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount - 1, tierCount - 2], { + from: creator, + }), + "OriginsAdmin: Only verifier can call this function." + ); + }); }); diff --git a/tests/OriginsBase/owner.test.js b/tests/OriginsBase/owner.test.js index 5dc465e..e236215 100644 --- a/tests/OriginsBase/owner.test.js +++ b/tests/OriginsBase/owner.test.js @@ -49,7 +49,37 @@ let firstMaxAmount = new BN(50000); let firstRemainingTokens = new BN(6000000); let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; -let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; +let [ + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondVerificationType, + secondSaleEndDurationOrTS, + secondTransferType, +] = [ + 1, + new BN(75000), + new BN(10000000), + currentTimestamp(), + 86400, + 5000, + 1, + 11, + 50, + zeroAddress, + depositTypeRBTC, + verificationTypeEveryone, + saleEndDurationOrTSDuration, + transferTypeVested, +]; /** * Function to create a random value. @@ -80,7 +110,7 @@ function currentTimestamp() { * * @returns value The token amount which was minted by user. */ - async function userMintAndApprove(tokenContract, userAddr, toApprove) { +async function userMintAndApprove(tokenContract, userAddr, toApprove) { let value = randomValue(); await tokenContract.mint(userAddr, value); await tokenContract.approve(toApprove, value, { from: userAddr }); @@ -90,7 +120,7 @@ function currentTimestamp() { contract("OriginsBase (Admin Functions)", (accounts) => { let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; - let tierCount; + let tierCount; before("Initiating Accounts & Creating Test Contract Instance.", async () => { // Checking if we have enough accounts to test. @@ -121,7 +151,7 @@ contract("OriginsBase (Admin Functions)", (accounts) => { ); vestingFactory.transferOwnership(vestingRegistry.address); - // Creating the instance of LockedFund Contract. + // Creating the instance of LockedFund Contract. lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); }); @@ -132,8 +162,8 @@ contract("OriginsBase (Admin Functions)", (accounts) => { // Setting lockedFund in Origins. await originsBase.setLockedFund(lockedFund.address, { from: owner }); - // Added Origins as an admin of LockedFund. - await lockedFund.addAdmin(originsBase.address, { from: owner }); + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); }); it("Owner should be able to set deposit address.", async () => { @@ -153,160 +183,462 @@ contract("OriginsBase (Admin Functions)", (accounts) => { await expectRevert(originsBase.setLockedFund(zeroAddress, { from: owner }), "OriginsBase: Locked Fund Address cannot be zero."); }); - it("Owner should be able to add a new tier.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - }); - - it("Owner should be able to set Tier Verification Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await originsBase.setTierVerification(1, secondVerificationType, { from: owner }); - }); - - it("Owner should be able to set Tier Deposit Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await originsBase.setTierDeposit(1, secondDepositRate, secondDepositToken, secondDepositType, { from: owner }); - }); - - it("Owner should not be able to set Tier Deposit Parameters with deposit rate as zero.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await expectRevert(originsBase.setTierDeposit(1, zero, secondDepositToken, secondDepositType, { from: owner }), "OriginsBase: Deposit Rate cannot be zero."); - }); - - it("Owner should not be able to set Tier Deposit Parameters with deposit token as zero address if deposit type is Token.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await expectRevert(originsBase.setTierDeposit(1, secondDepositRate, zeroAddress, depositTypeToken, { from: owner }), "OriginsBase: Deposit Token Address cannot be zero."); - }); - - it("Owner should be able to set Tier Token Limit Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await originsBase.setTierTokenLimit(1, secondMinAmount, secondMaxAmount, { from: owner }); - }); - - it("Owner should not be able to set Tier Token Limit Parameters with minimum is greater than maximum amount.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await expectRevert(originsBase.setTierTokenLimit(1, secondMaxAmount, secondMinAmount, { from: owner }), "OriginsBase: Min Amount cannot be higher than Max Amount."); - }); - - it("Owner should be able to set Tier Token Amount Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await token.mint(owner, secondRemainingTokens); - await token.approve(originsBase.address, secondRemainingTokens, { from: owner }); - await originsBase.setTierTokenAmount(1, secondRemainingTokens, { from: owner }); - }); - - it("Owner should not be able to set Tier Token Amount Parameters with remaining token as zero.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await expectRevert(originsBase.setTierTokenAmount(1, zero, { from: owner }), "OriginsBase: Total token to sell should be higher than zero."); - }); - - it("Owner should not be able to set Tier Token Amount Parameters with max allowed is higher than remaining token.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await expectRevert(originsBase.setTierTokenAmount(1, 1, { from: owner }), "OriginsBase: Max Amount to buy should not be higher than token availability."); - }); - - it("Owner should be able to set Tier Vest or Lock Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await originsBase.setTierVestOrLock(1, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, secondUnlockedBP, secondTransferType, { from: owner }); - }); - - it("Owner should not be able to set Tier Vest or Lock Parameters with cliff higher than duration.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await expectRevert(originsBase.setTierVestOrLock(1, secondVestOfLockDuration, secondVestOrLockCliff, waitedTS, secondUnlockedBP, secondTransferType, { from: owner }), "OriginsBase: Cliff has to be <= duration."); - }); - - it("Owner should not be able to set Tier Vest or Lock Parameters with cliff higher than duration.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await expectRevert(originsBase.setTierVestOrLock(1, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, invalidBasisPoint, secondTransferType, { from: owner }), "OriginsBase: The basis point cannot be higher than 10K."); - }); - - it("Owner should be able to set Tier Time Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await originsBase.setTierTime(1, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: owner }); - }); - - it("Owner should not be able to set Tier Time Parameters with sale start timestamp is higher than sale end timestamp.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await expectRevert(originsBase.setTierTime(1, secondSaleStartTS, secondSaleStartTS, saleEndDurationOrTSTimestamp, { from: owner }), "OriginsBase: The sale start TS cannot be after sale end TS."); - }); - - it("Owner should not be able to set Tier Time Parameters with sale start timestamp is higher than sale end timestamp.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await expectRevert(originsBase.setTierTime(1, currentTimestamp() - 1000, currentTimestamp() - 100, saleEndDurationOrTSTimestamp, { from: owner }), "OriginsBase: The sale end duration cannot be past already."); - }); - - it("Owner should be able to withdraw the sale deposit to deposit address.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - let amount = 20000; - await token.mint(userOne, amount); - await token.approve(originsBase.address, amount, { from: userOne }); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - amount = 20000; - await token.mint(userTwo, amount); - await token.approve(originsBase.address, amount, { from: userTwo }); - await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); - amount = 20000; - await token.mint(userThree, amount); - await token.approve(originsBase.address, amount, { from: userThree }); - await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); - await originsBase.withdrawSaleDeposit({ from: owner }); - }); - - it("Owner should be able to withdraw the sale deposit to own address if deposit address is not set.", async () => { + it("Owner should be able to add a new tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + }); + + it("Owner should be able to set Tier Verification Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierVerification(1, secondVerificationType, { from: owner }); + }); + + it("Owner should be able to set Tier Deposit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierDeposit(1, secondDepositRate, secondDepositToken, secondDepositType, { from: owner }); + }); + + it("Owner should not be able to set Tier Deposit Parameters with deposit rate as zero.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierDeposit(1, zero, secondDepositToken, secondDepositType, { from: owner }), + "OriginsBase: Deposit Rate cannot be zero." + ); + }); + + it("Owner should not be able to set Tier Deposit Parameters with deposit token as zero address if deposit type is Token.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierDeposit(1, secondDepositRate, zeroAddress, depositTypeToken, { from: owner }), + "OriginsBase: Deposit Token Address cannot be zero." + ); + }); + + it("Owner should be able to set Tier Token Limit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierTokenLimit(1, secondMinAmount, secondMaxAmount, { from: owner }); + }); + + it("Owner should not be able to set Tier Token Limit Parameters with minimum is greater than maximum amount.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTokenLimit(1, secondMaxAmount, secondMinAmount, { from: owner }), + "OriginsBase: Min Amount cannot be higher than Max Amount." + ); + }); + + it("Owner should be able to set Tier Token Amount Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await token.mint(owner, secondRemainingTokens); + await token.approve(originsBase.address, secondRemainingTokens, { from: owner }); + await originsBase.setTierTokenAmount(1, secondRemainingTokens, { from: owner }); + }); + + it("Owner should not be able to set Tier Token Amount Parameters with remaining token as zero.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTokenAmount(1, zero, { from: owner }), + "OriginsBase: Total token to sell should be higher than zero." + ); + }); + + it("Owner should not be able to set Tier Token Amount Parameters with max allowed is higher than remaining token.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTokenAmount(1, 1, { from: owner }), + "OriginsBase: Max Amount to buy should not be higher than token availability." + ); + }); + + it("Owner should be able to set Tier Vest or Lock Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierVestOrLock( + 1, + secondVestOrLockCliff, + secondVestOfLockDuration, + waitedTS, + secondUnlockedBP, + secondTransferType, + { from: owner } + ); + }); + + it("Owner should not be able to set Tier Vest or Lock Parameters with cliff higher than duration.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierVestOrLock( + 1, + secondVestOfLockDuration, + secondVestOrLockCliff, + waitedTS, + secondUnlockedBP, + secondTransferType, + { from: owner } + ), + "OriginsBase: Cliff has to be <= duration." + ); + }); + + it("Owner should not be able to set Tier Vest or Lock Parameters with cliff higher than duration.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierVestOrLock( + 1, + secondVestOrLockCliff, + secondVestOfLockDuration, + waitedTS, + invalidBasisPoint, + secondTransferType, + { from: owner } + ), + "OriginsBase: The basis point cannot be higher than 10K." + ); + }); + + it("Owner should be able to set Tier Time Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierTime(1, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: owner }); + }); + + it("Owner should not be able to set Tier Time Parameters with sale start timestamp is higher than sale end timestamp.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTime(1, secondSaleStartTS, secondSaleStartTS, saleEndDurationOrTSTimestamp, { from: owner }), + "OriginsBase: The sale start TS cannot be after sale end TS." + ); + }); + + it("Owner should not be able to set Tier Time Parameters with sale start timestamp is higher than sale end timestamp.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTime(1, currentTimestamp() - 1000, currentTimestamp() - 100, saleEndDurationOrTSTimestamp, { from: owner }), + "OriginsBase: The sale end duration cannot be past already." + ); + }); + + it("Owner should be able to withdraw the sale deposit to deposit address.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 20000; + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + amount = 20000; + await token.mint(userThree, amount); + await token.approve(originsBase.address, amount, { from: userThree }); + await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); + await originsBase.withdrawSaleDeposit({ from: owner }); + }); + + it("Owner should be able to withdraw the sale deposit to own address if deposit address is not set.", async () => { originsBase = await OriginsBase.new([owner], token.address, zeroAddress); await originsBase.setLockedFund(lockedFund.address, { from: owner }); - await lockedFund.addAdmin(originsBase.address, { from: owner }); - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - let amount = 20000; - await token.mint(userOne, amount); - await token.approve(originsBase.address, amount, { from: userOne }); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - amount = 20000; - await token.mint(userTwo, amount); - await token.approve(originsBase.address, amount, { from: userTwo }); - await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); - amount = 20000; - await token.mint(userThree, amount); - await token.approve(originsBase.address, amount, { from: userThree }); - await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); - await originsBase.withdrawSaleDeposit({ from: owner }); - }); - + await lockedFund.addAdmin(originsBase.address, { from: owner }); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 20000; + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + amount = 20000; + await token.mint(userThree, amount); + await token.approve(originsBase.address, amount, { from: userThree }); + await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); + await originsBase.withdrawSaleDeposit({ from: owner }); + }); }); diff --git a/tests/OriginsBase/state.test.js b/tests/OriginsBase/state.test.js index 7cd6a8e..91bd2f1 100644 --- a/tests/OriginsBase/state.test.js +++ b/tests/OriginsBase/state.test.js @@ -10,7 +10,7 @@ const VestingRegistry = artifacts.require("VestingRegistry3"); const { BN, // Big Number support. - balance, + balance, constants, expectRevert, // Assertions for transactions that should fail. } = require("@openzeppelin/test-helpers"); @@ -50,7 +50,37 @@ let firstMaxAmount = new BN(50000); let firstRemainingTokens = new BN(6000000); let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; -let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; +let [ + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondVerificationType, + secondSaleEndDurationOrTS, + secondTransferType, +] = [ + 1, + new BN(75000), + new BN(10000000), + currentTimestamp(), + 86400, + 5000, + 1, + 11, + 50, + zeroAddress, + depositTypeRBTC, + verificationTypeEveryone, + saleEndDurationOrTSDuration, + transferTypeVested, +]; /** * Function to create a random value. @@ -91,35 +121,52 @@ async function userMintAndApprove(tokenContract, userAddr, toApprove) { /** * Checks Tier Details. */ -async function checkTier(_originsBase, _tierCount, _minAmount, _maxAmount, _remainingTokens, _saleStartTS, _saleEnd, _unlockedTokenWithdrawTS, _unlockedBP, _vestOrLockCliff, _vestOrLockDuration, _depositRate, _depositToken, _depositType, _verificationType, _saleEndDurationOrTS, _transferType) { - let tierPartA = await _originsBase.readTierPartA(_tierCount) - let tierPartB = await _originsBase.readTierPartB(_tierCount) - assert(tierPartA._minAmount.eq(new BN(_minAmount)), "Minimum Amount is not correctly set."); - assert(tierPartA._maxAmount.eq(new BN(_maxAmount)), "Maximum Amount is not correctly set."); - assert(tierPartA._remainingTokens.eq(new BN(_remainingTokens)), "Remaining Token is not correctly set."); - assert(tierPartA._saleStartTS.eq(new BN(_saleStartTS)), "Sale Start TS is not correctly set."); - if(tierPartB._saleEndDurationOrTS == saleEndDurationOrTSDuration) { - assert(tierPartA._saleEnd.eq(new BN(_saleStartTS+_saleEnd)), "Sale End TS is not correctly set."); - } - else if(tierPartB._saleEndDurationOrTS == saleEndDurationOrTSTimestamp) { - assert(tierPartA._saleEnd.eq(new BN(_saleEnd)), "Sale End TS is not correctly set."); - } - assert(tierPartA._unlockedTokenWithdrawTS.eq(new BN(_unlockedTokenWithdrawTS)), "Unlocked Token Withdraw TS is not correctly set."); - assert(tierPartA._unlockedBP.eq(new BN(_unlockedBP)), "Unlocked Basis Point is not correctly set."); - assert(tierPartA._vestOrLockCliff.eq(new BN(_vestOrLockCliff)), "Vest or Lock Cliff is not correctly set."); - assert(tierPartA._vestOrLockDuration.eq(new BN(_vestOrLockDuration)), "Vest or Lock Duration is not correctly set."); - assert(tierPartA._depositRate.eq(new BN(_depositRate)), "Deposit Rate is not correctly set."); - assert.strictEqual(tierPartB._depositToken, _depositToken, "Deposit Token is not correctly set."); - assert(tierPartB._depositType.eq(new BN(_depositType)), "Deposit Type is not correctly set."); - assert(tierPartB._verificationType.eq(new BN(_verificationType)), "Verification Type is not correctly set."); - assert(tierPartB._saleEndDurationOrTS.eq(new BN(_saleEndDurationOrTS)), "Sale End Duration or TS is not correctly set."); - assert(tierPartB._transferType.eq(new BN(_transferType)), "Transfer Type is not correctly set."); +async function checkTier( + _originsBase, + _tierCount, + _minAmount, + _maxAmount, + _remainingTokens, + _saleStartTS, + _saleEnd, + _unlockedTokenWithdrawTS, + _unlockedBP, + _vestOrLockCliff, + _vestOrLockDuration, + _depositRate, + _depositToken, + _depositType, + _verificationType, + _saleEndDurationOrTS, + _transferType +) { + let tierPartA = await _originsBase.readTierPartA(_tierCount); + let tierPartB = await _originsBase.readTierPartB(_tierCount); + assert(tierPartA._minAmount.eq(new BN(_minAmount)), "Minimum Amount is not correctly set."); + assert(tierPartA._maxAmount.eq(new BN(_maxAmount)), "Maximum Amount is not correctly set."); + assert(tierPartA._remainingTokens.eq(new BN(_remainingTokens)), "Remaining Token is not correctly set."); + assert(tierPartA._saleStartTS.eq(new BN(_saleStartTS)), "Sale Start TS is not correctly set."); + if (tierPartB._saleEndDurationOrTS == saleEndDurationOrTSDuration) { + assert(tierPartA._saleEnd.eq(new BN(_saleStartTS + _saleEnd)), "Sale End TS is not correctly set."); + } else if (tierPartB._saleEndDurationOrTS == saleEndDurationOrTSTimestamp) { + assert(tierPartA._saleEnd.eq(new BN(_saleEnd)), "Sale End TS is not correctly set."); + } + assert(tierPartA._unlockedTokenWithdrawTS.eq(new BN(_unlockedTokenWithdrawTS)), "Unlocked Token Withdraw TS is not correctly set."); + assert(tierPartA._unlockedBP.eq(new BN(_unlockedBP)), "Unlocked Basis Point is not correctly set."); + assert(tierPartA._vestOrLockCliff.eq(new BN(_vestOrLockCliff)), "Vest or Lock Cliff is not correctly set."); + assert(tierPartA._vestOrLockDuration.eq(new BN(_vestOrLockDuration)), "Vest or Lock Duration is not correctly set."); + assert(tierPartA._depositRate.eq(new BN(_depositRate)), "Deposit Rate is not correctly set."); + assert.strictEqual(tierPartB._depositToken, _depositToken, "Deposit Token is not correctly set."); + assert(tierPartB._depositType.eq(new BN(_depositType)), "Deposit Type is not correctly set."); + assert(tierPartB._verificationType.eq(new BN(_verificationType)), "Verification Type is not correctly set."); + assert(tierPartB._saleEndDurationOrTS.eq(new BN(_saleEndDurationOrTS)), "Sale End Duration or TS is not correctly set."); + assert(tierPartB._transferType.eq(new BN(_transferType)), "Transfer Type is not correctly set."); } contract("OriginsBase (State Functions)", (accounts) => { let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; - let tierCount; + let tierCount; before("Initiating Accounts & Creating Test Contract Instance.", async () => { // Checking if we have enough accounts to test. @@ -150,222 +197,551 @@ contract("OriginsBase (State Functions)", (accounts) => { ); vestingFactory.transferOwnership(vestingRegistry.address); - // Creating the instance of LockedFund Contract. + // Creating the instance of LockedFund Contract. lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); - // Creating the instance of OriginsBase Contract. + // Creating the instance of OriginsBase Contract. originsBase = await OriginsBase.new([owner], token.address, depositAddr); // Setting lockedFund in Origins. await originsBase.setLockedFund(lockedFund.address, { from: owner }); - // Added Origins as an admin of LockedFund. - await lockedFund.addAdmin(originsBase.address, { from: owner }); + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); - // Setting Verifier in Origins. + // Setting Verifier in Origins. await originsBase.addVerifier(verifier, { from: owner }); - // Creating a new tier. - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - - await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + // Creating a new tier. + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); - }); + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + }); - beforeEach("Creating New OriginsBase Contract Instance.", async () => { - }); + beforeEach("Creating New OriginsBase Contract Instance.", async () => {}); it("Setting a deposit address should update the state.", async () => { await originsBase.setDepositAddress(newDepositAddr, { from: owner }); - let cDepositAddr = await originsBase.getDepositAddress(); - assert.strictEqual(cDepositAddr, newDepositAddr, "Deposit Address is not correctly set."); + let cDepositAddr = await originsBase.getDepositAddress(); + assert.strictEqual(cDepositAddr, newDepositAddr, "Deposit Address is not correctly set."); - // Resetting it for other tests. + // Resetting it for other tests. await originsBase.setDepositAddress(depositAddr, { from: owner }); }); it("Setting Locked Fund Contract should update the state.", async () => { let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); await originsBase.setLockedFund(newLockedFund.address, { from: owner }); - let cLockedFund = await originsBase.getLockDetails(); - assert.strictEqual(cLockedFund, newLockedFund.address, "Locked Fund Contract is not correctly set."); + let cLockedFund = await originsBase.getLockDetails(); + assert.strictEqual(cLockedFund, newLockedFund.address, "Locked Fund Contract is not correctly set."); - // Resetting it for other tests. - await originsBase.setLockedFund(lockedFund.address, { from: owner }); + // Resetting it for other tests. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + }); + + it("Adding a new tier should update the state correctly.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + zero, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); }); - it("Adding a new tier should update the state correctly.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType); - }); - - it("Owner should be able to set Tier Verification Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.setTierVerification(tierCount, secondVerificationType, { from: owner }); - await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, secondVerificationType, firstSaleEndDurationOrTS, firstTransferType); - }); - - it("Owner should be able to set Tier Deposit Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: owner }); - await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, secondDepositRate, secondDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType); - }); - - it("Owner should be able to set Tier Token Limit Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: owner }); - await checkTier(originsBase, tierCount, secondMinAmount, secondMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType); - }); - - it("Owner should be able to set Tier Token Amount Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await token.mint(owner, secondRemainingTokens); - await token.approve(originsBase.address, secondRemainingTokens, { from: owner }); - await originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: owner }); - await checkTier(originsBase, tierCount, zero, firstMaxAmount, secondRemainingTokens, firstSaleStartTS, firstSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType); - }); - - it("Owner should be able to set Tier Vest or Lock Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.setTierVestOrLock(tierCount, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, secondUnlockedBP, secondTransferType, { from: owner }); - await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, waitedTS, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, secondTransferType); - }); - - it("Owner should be able to set Tier Time Parameters.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: owner }); - await checkTier(originsBase, tierCount, zero, firstMaxAmount, firstRemainingTokens, secondSaleStartTS, secondSaleEnd, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositToken, firstDepositType, firstVerificationType, secondSaleEndDurationOrTS, firstTransferType); - }); - - it("Verifier should be able to verify a single address to a single tier.", async () => { - await originsBase.addressVerification(userOne, tierCount, { from: verifier }); - let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - }); - - it("Verifier should be able to verify a single address to a multiple tier.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount-1, tierCount-2], { from: verifier }); - let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - currentStatus = await originsBase.isAddressApproved(userOne, tierCount-1); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - currentStatus = await originsBase.isAddressApproved(userOne, tierCount-2); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - }); - - it("Verifier should be able to verify a multiple address to a single tier.", async () => { - await originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: verifier }); - let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - currentStatus = await originsBase.isAddressApproved(userTwo, tierCount); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - currentStatus = await originsBase.isAddressApproved(userThree, tierCount); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - }); - - it("Verifier should be able to verify a multiple address to a multiple tier.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount-1, tierCount-2], { from: verifier }); - let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - currentStatus = await originsBase.isAddressApproved(userTwo, tierCount-1); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - currentStatus = await originsBase.isAddressApproved(userThree, tierCount-2); - assert.strictEqual(currentStatus, true, "Address Verification invalid"); - }); - - it("User should be able to buy tokens.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.addressVerification(userOne, tierCount, { from: verifier }); - let amount = 10000; - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - let userVestedBalance = await lockedFund.getVestedBalance(userOne); - assert(userVestedBalance.eq(new BN(amount).mul(new BN(firstDepositRate))), "User Vesting Balance is wrong."); - }); - - it("User should be able to buy tokens multiple times until max asset amount reaches.", async () => { - let amount = 10000; - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - let userVestedBalance = await lockedFund.getVestedBalance(userOne); - assert(userVestedBalance.eq(new BN(amount).mul(new BN(4)).mul(new BN(firstDepositRate))), "User Vesting Balance is wrong."); - }); - - it("User should be refunded the extra after the max reaches.", async () => { - let amount = 20000; - let oldBalance = await balance.current(userOne); - let tx = await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - let gasUsed = tx.receipt.gasUsed; - let gasPrice = (await web3.eth.getTransaction(tx.tx)).gasPrice; - let newBalance = await balance.current(userOne); - newBalance = newBalance.add(new BN(gasUsed).mul(new BN(gasPrice))); - let userVestedBalance = await lockedFund.getVestedBalance(userOne); - assert(oldBalance.sub(newBalance).eq(new BN(10000)), "User not returned enough."); - assert(userVestedBalance.eq(firstMaxAmount.mul(new BN(firstDepositRate))), "User Vested Balance is wrong."); - }); - - it("Owner should be able to withdraw the sale deposit to deposit address.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - let amount = 20000; - await token.mint(userOne, amount); - await token.approve(originsBase.address, amount, { from: userOne }); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - amount = 20000; - await token.mint(userTwo, amount); - await token.approve(originsBase.address, amount, { from: userTwo }); - await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); - amount = 20000; - await token.mint(userThree, amount); - await token.approve(originsBase.address, amount, { from: userThree }); - await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); - let oldBalance = await balance.current(depositAddr); - await originsBase.withdrawSaleDeposit({ from: owner }); - let newBalance = await balance.current(depositAddr); - assert(newBalance.sub(oldBalance).eq(new BN(60000)), "Admin did not received the total sale proceedings."); - }); + it("Owner should be able to set Tier Verification Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierVerification(tierCount, secondVerificationType, { from: owner }); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + zero, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + secondVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); + }); + it("Owner should be able to set Tier Deposit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: owner }); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + zero, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + secondDepositRate, + secondDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Owner should be able to set Tier Token Limit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: owner }); + await checkTier( + originsBase, + tierCount, + secondMinAmount, + secondMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + zero, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Owner should be able to set Tier Token Amount Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await token.mint(owner, secondRemainingTokens); + await token.approve(originsBase.address, secondRemainingTokens, { from: owner }); + await originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: owner }); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + secondRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + zero, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Owner should be able to set Tier Vest or Lock Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierVestOrLock( + tierCount, + secondVestOrLockCliff, + secondVestOfLockDuration, + waitedTS, + secondUnlockedBP, + secondTransferType, + { from: owner } + ); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + waitedTS, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + secondTransferType + ); + }); + + it("Owner should be able to set Tier Time Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: owner }); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + zero, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + secondSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Verifier should be able to verify a single address to a single tier.", async () => { + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("Verifier should be able to verify a single address to a multiple tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount - 1, tierCount - 2], { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userOne, tierCount - 1); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userOne, tierCount - 2); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("Verifier should be able to verify a multiple address to a single tier.", async () => { + await originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userTwo, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userThree, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("Verifier should be able to verify a multiple address to a multiple tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount - 1, tierCount - 2], { + from: verifier, + }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userTwo, tierCount - 1); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userThree, tierCount - 2); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("User should be able to buy tokens.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + let userVestedBalance = await lockedFund.getVestedBalance(userOne); + assert(userVestedBalance.eq(new BN(amount).mul(new BN(firstDepositRate))), "User Vesting Balance is wrong."); + }); + + it("User should be able to buy tokens multiple times until max asset amount reaches.", async () => { + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + let userVestedBalance = await lockedFund.getVestedBalance(userOne); + assert(userVestedBalance.eq(new BN(amount).mul(new BN(4)).mul(new BN(firstDepositRate))), "User Vesting Balance is wrong."); + }); + + it("User should be refunded the extra after the max reaches.", async () => { + let amount = 20000; + let oldBalance = await balance.current(userOne); + let tx = await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + let gasUsed = tx.receipt.gasUsed; + let gasPrice = (await web3.eth.getTransaction(tx.tx)).gasPrice; + let newBalance = await balance.current(userOne); + newBalance = newBalance.add(new BN(gasUsed).mul(new BN(gasPrice))); + let userVestedBalance = await lockedFund.getVestedBalance(userOne); + assert(oldBalance.sub(newBalance).eq(new BN(10000)), "User not returned enough."); + assert(userVestedBalance.eq(firstMaxAmount.mul(new BN(firstDepositRate))), "User Vested Balance is wrong."); + }); + + it("Owner should be able to withdraw the sale deposit to deposit address.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 20000; + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + amount = 20000; + await token.mint(userThree, amount); + await token.approve(originsBase.address, amount, { from: userThree }); + await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); + let oldBalance = await balance.current(depositAddr); + await originsBase.withdrawSaleDeposit({ from: owner }); + let newBalance = await balance.current(depositAddr); + assert(newBalance.sub(oldBalance).eq(new BN(60000)), "Admin did not received the total sale proceedings."); + }); }); diff --git a/tests/OriginsBase/user.test.js b/tests/OriginsBase/user.test.js index 703fc75..6f83e64 100644 --- a/tests/OriginsBase/user.test.js +++ b/tests/OriginsBase/user.test.js @@ -12,7 +12,7 @@ const { BN, // Big Number support. constants, expectRevert, // Assertions for transactions that should fail. - time + time, } = require("@openzeppelin/test-helpers"); const { current } = require("@openzeppelin/test-helpers/src/balance"); @@ -50,7 +50,37 @@ let firstMaxAmount = new BN(50000); let firstRemainingTokens = new BN(6000000); let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; -let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; +let [ + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondVerificationType, + secondSaleEndDurationOrTS, + secondTransferType, +] = [ + 1, + new BN(75000), + new BN(10000000), + currentTimestamp(), + 86400, + 5000, + 1, + 11, + 50, + zeroAddress, + depositTypeRBTC, + verificationTypeEveryone, + saleEndDurationOrTSDuration, + transferTypeVested, +]; /** * Function to create a random value. @@ -81,7 +111,7 @@ function currentTimestamp() { * * @returns value The token amount which was minted by user. */ - async function userMintAndApprove(tokenContract, userAddr, toApprove) { +async function userMintAndApprove(tokenContract, userAddr, toApprove) { let value = randomValue(); await tokenContract.mint(userAddr, value); await tokenContract.approve(toApprove, value, { from: userAddr }); @@ -91,7 +121,7 @@ function currentTimestamp() { contract("OriginsBase (Admin Functions)", (accounts) => { let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; - let tierCount; + let tierCount; before("Initiating Accounts & Creating Test Contract Instance.", async () => { // Checking if we have enough accounts to test. @@ -122,138 +152,285 @@ contract("OriginsBase (Admin Functions)", (accounts) => { ); vestingFactory.transferOwnership(vestingRegistry.address); - // Creating the instance of LockedFund Contract. + // Creating the instance of LockedFund Contract. lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); - // Creating the instance of OriginsBase Contract. + // Creating the instance of OriginsBase Contract. originsBase = await OriginsBase.new([owner], token.address, depositAddr); // Setting lockedFund in Origins. await originsBase.setLockedFund(lockedFund.address, { from: owner }); - // Added Origins as an admin of LockedFund. - await lockedFund.addAdmin(originsBase.address, { from: owner }); + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); - // Setting Verifier in Origins. + // Setting Verifier in Origins. await originsBase.addVerifier(verifier, { from: owner }); - // Creating a new tier. - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - }); - - beforeEach("Creating New OriginsBase Contract Instance.", async () => { + // Creating a new tier. + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); }); - it("User should be able to buy tokens.", async () => { - await originsBase.addressVerification(userOne, tierCount, { from: verifier }); - let amount = 10000; - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - }); + beforeEach("Creating New OriginsBase Contract Instance.", async () => {}); - it("User should be able to buy tokens multiple times until max asset amount reaches.", async () => { - let amount = 10000; - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - }); + it("User should be able to buy tokens.", async () => { + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + }); - it("User should be allowed to buy until the max reaches.", async () => { - let amount = 10000; - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: User already bought maximum allowed."); - }); + it("User should be able to buy tokens multiple times until max asset amount reaches.", async () => { + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + }); - it("User should not be allowed to buy if sale start time is not set.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, zero, currentTimestamp()+1000, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, saleEndDurationOrTSDuration, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - let amount = 10000; - await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: Sale has not started yet."); - }); + it("User should be allowed to buy until the max reaches.", async () => { + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await expectRevert( + originsBase.buy(tierCount, zero, { from: userOne, value: amount }), + "OriginsBase: User already bought maximum allowed." + ); + }); - it("User should not be allowed to buy if the token sale has ended.", async () => { - let amount = 100; - await token.mint(owner, amount); - await token.approve(originsBase.address, amount, { from: owner }); - await originsBase.createTier(amount, amount, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, 1, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - await expectRevert(originsBase.buy(tierCount, zero, { from: userTwo, value: amount }), "OriginsBase: Sale ended."); - }); + it("User should not be allowed to buy if sale start time is not set.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + zero, + currentTimestamp() + 1000, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + saleEndDurationOrTSDuration, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 10000; + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: Sale has not started yet."); + }); - it("User should not be allowed to buy if sale end is not set.", async () => { - let amount = randomValue(); - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, zero, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount}), "OriginsBase: Sale not allowed."); - }); + it("User should not be allowed to buy if the token sale has ended.", async () => { + let amount = 100; + await token.mint(owner, amount); + await token.approve(originsBase.address, amount, { from: owner }); + await originsBase.createTier( + amount, + amount, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + 1, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await expectRevert(originsBase.buy(tierCount, zero, { from: userTwo, value: amount }), "OriginsBase: Sale ended."); + }); - it("User should not be allowed to buy if total tokens are sold.", async () => { - let amount = 100; - await token.mint(owner, amount); - await token.approve(originsBase.address, amount, { from: owner }); - await originsBase.createTier(amount/2, amount, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, 1, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount/2 }); - await originsBase.buy(tierCount, zero, { from: userTwo, value: amount/2 }); - await expectRevert(originsBase.buy(tierCount, zero, { from: userThree, value: amount/2 }), "OriginsBase: Sale ended."); - }); + it("User should not be allowed to buy if sale end is not set.", async () => { + let amount = randomValue(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + zero, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: Sale not allowed."); + }); - it("User should not be allowed to buy if Verification is not set.", async () => { - let amount = randomValue(); - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeNone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount}), "OriginsBase: No one is allowed for sale."); - }); + it("User should not be allowed to buy if total tokens are sold.", async () => { + let amount = 100; + await token.mint(owner, amount); + await token.approve(originsBase.address, amount, { from: owner }); + await originsBase.createTier( + amount / 2, + amount, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + 1, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount / 2 }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount / 2 }); + await expectRevert(originsBase.buy(tierCount, zero, { from: userThree, value: amount / 2 }), "OriginsBase: Sale ended."); + }); - it("If verification is done by address, user should only be allowed if it is done by verified address.", async () => { - let amount = randomValue(); - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount}), "OriginsBase: User not approved for sale."); - }); + it("User should not be allowed to buy if Verification is not set.", async () => { + let amount = randomValue(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeNone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: No one is allowed for sale."); + }); - it("User should not be allowed to buy once the max reaches even if there is remaining tokens.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - let amount = 25000; - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); - amount = 5000; - await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: User already bought maximum allowed."); - // Though any other user can still buy. - amount = 5000; - await token.approve(originsBase.address, amount, { from: userTwo }); - }); + it("If verification is done by address, user should only be allowed if it is done by verified address.", async () => { + let amount = randomValue(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: User not approved for sale."); + }); - it("User should not be allowed to buy tokens with zero deposit in RBTC", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: zero }), "OriginsBase: Amount cannot be zero."); - }); + it("User should not be allowed to buy once the max reaches even if there is remaining tokens.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 25000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 5000; + await expectRevert( + originsBase.buy(tierCount, zero, { from: userOne, value: amount }), + "OriginsBase: User already bought maximum allowed." + ); + // Though any other user can still buy. + amount = 5000; + await token.approve(originsBase.address, amount, { from: userTwo }); + }); - it("User should not be allowed to buy with assets deposited less than minimum allowed.", async () => { - let amount = 1000; - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, verificationTypeEveryone, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); - await originsBase.setTierTokenLimit(tierCount, 10000, firstMaxAmount, { from: owner }) - await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: Deposit is less than minimum allowed."); - }); + it("User should not be allowed to buy tokens with zero deposit in RBTC", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: zero }), "OriginsBase: Amount cannot be zero."); + }); + it("User should not be allowed to buy with assets deposited less than minimum allowed.", async () => { + let amount = 1000; + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierTokenLimit(tierCount, 10000, firstMaxAmount, { from: owner }); + await expectRevert( + originsBase.buy(tierCount, zero, { from: userOne, value: amount }), + "OriginsBase: Deposit is less than minimum allowed." + ); + }); }); diff --git a/tests/OriginsBase/verifier.test.js b/tests/OriginsBase/verifier.test.js index a1e2765..b0583b0 100644 --- a/tests/OriginsBase/verifier.test.js +++ b/tests/OriginsBase/verifier.test.js @@ -49,7 +49,37 @@ let firstMaxAmount = new BN(50000); let firstRemainingTokens = new BN(6000000); let [firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstTransferType] = [0, 1, 11, transferTypeVested]; let [firstSaleStartTS, firstSaleEnd, firstSaleEndDurationOrTS] = [currentTimestamp(), 86400, saleEndDurationOrTSDuration]; -let [secondMinAmount, secondMaxAmount, secondRemainingTokens, secondSaleStartTS, secondSaleEnd, secondUnlockedBP, secondVestOrLockCliff, secondVestOfLockDuration, secondDepositRate, secondDepositToken, secondDepositType, secondVerificationType, secondSaleEndDurationOrTS, secondTransferType] = [1, new BN(75000), new BN(10000000), currentTimestamp(), 86400, 5000, 1, 11, 50, zeroAddress, depositTypeRBTC, verificationTypeEveryone, saleEndDurationOrTSDuration, transferTypeVested]; +let [ + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondVerificationType, + secondSaleEndDurationOrTS, + secondTransferType, +] = [ + 1, + new BN(75000), + new BN(10000000), + currentTimestamp(), + 86400, + 5000, + 1, + 11, + 50, + zeroAddress, + depositTypeRBTC, + verificationTypeEveryone, + saleEndDurationOrTSDuration, + transferTypeVested, +]; /** * Function to create a random value. @@ -80,7 +110,7 @@ function currentTimestamp() { * * @returns value The token amount which was minted by user. */ - async function userMintAndApprove(tokenContract, userAddr, toApprove) { +async function userMintAndApprove(tokenContract, userAddr, toApprove) { let value = randomValue(); await tokenContract.mint(userAddr, value); await tokenContract.approve(toApprove, value, { from: userAddr }); @@ -90,7 +120,7 @@ function currentTimestamp() { contract("OriginsBase (Verifier Functions)", (accounts) => { let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; - let tierCount; + let tierCount; before("Initiating Accounts & Creating Test Contract Instance.", async () => { // Checking if we have enough accounts to test. @@ -121,7 +151,7 @@ contract("OriginsBase (Verifier Functions)", (accounts) => { ); vestingFactory.transferOwnership(vestingRegistry.address); - // Creating the instance of LockedFund Contract. + // Creating the instance of LockedFund Contract. lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); // Creating the instance of OriginsBase Contract. @@ -130,77 +160,144 @@ contract("OriginsBase (Verifier Functions)", (accounts) => { // Setting lockedFund in Origins. await originsBase.setLockedFund(lockedFund.address, { from: owner }); - // Added Origins as an admin of LockedFund. - await lockedFund.addAdmin(originsBase.address, { from: owner }); + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); - // Setting Verifier in Origins. + // Setting Verifier in Origins. await originsBase.addVerifier(verifier, { from: owner }); - }); + }); beforeEach("Creating New OriginsBase Contract Instance.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: owner }); - tierCount = await originsBase.getTierCount(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); }); it("Verifier should not be able to set deposit address.", async () => { - await expectRevert(originsBase.setDepositAddress(newDepositAddr, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + await expectRevert( + originsBase.setDepositAddress(newDepositAddr, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); }); it("Verifier should not be able to set Locked Fund Contract.", async () => { let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); - await expectRevert(originsBase.setLockedFund(newLockedFund.address, { from: verifier }), "OriginsAdmin: Only owner can call this function."); + await expectRevert( + originsBase.setLockedFund(newLockedFund.address, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); }); - it("Verifier should not be able to add a new tier.", async () => { - await token.mint(owner, firstRemainingTokens); - await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); - await expectRevert(originsBase.createTier(firstMaxAmount, firstRemainingTokens, firstSaleStartTS, firstSaleEnd, firstUnlockedBP, firstVestOrLockCliff, firstVestOfLockDuration, firstDepositRate, firstDepositType, firstVerificationType, firstSaleEndDurationOrTS, firstTransferType, { from: verifier }), "OriginsAdmin: Only owner can call this function."); - }); - - it("Verifier should not be able to set Tier Deposit Parameters.", async () => { - await expectRevert(originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: verifier }), "OriginsAdmin: Only owner can call this function."); - }); + it("Verifier should not be able to add a new tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await expectRevert( + originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: verifier } + ), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Verifier should not be able to set Tier Token Limit Parameters.", async () => { - await expectRevert(originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: verifier }), "OriginsAdmin: Only owner can call this function."); - }); + it("Verifier should not be able to set Tier Deposit Parameters.", async () => { + await expectRevert( + originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Verifier should not be able to set Tier Token Amount Parameters.", async () => { - await expectRevert(originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: verifier }), "OriginsAdmin: Only owner can call this function."); - }); + it("Verifier should not be able to set Tier Token Limit Parameters.", async () => { + await expectRevert( + originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Verifier should not be able to set Tier Vest or Lock Parameters.", async () => { - await expectRevert(originsBase.setTierVestOrLock(tierCount, secondVestOrLockCliff, secondVestOfLockDuration, waitedTS, secondUnlockedBP, secondTransferType, { from: verifier }), "OriginsAdmin: Only owner can call this function."); - }); + it("Verifier should not be able to set Tier Token Amount Parameters.", async () => { + await expectRevert( + originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Verifier should not be able to set Tier Time Parameters.", async () => { - await expectRevert(originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: verifier }), "OriginsAdmin: Only owner can call this function."); - }); + it("Verifier should not be able to set Tier Vest or Lock Parameters.", async () => { + await expectRevert( + originsBase.setTierVestOrLock( + tierCount, + secondVestOrLockCliff, + secondVestOfLockDuration, + waitedTS, + secondUnlockedBP, + secondTransferType, + { from: verifier } + ), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Verifier should be able to verify a single address to a single tier.", async () => { - await originsBase.addressVerification(userOne, tierCount, { from: verifier }); - }); + it("Verifier should not be able to set Tier Time Parameters.", async () => { + await expectRevert( + originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); - it("Verifier should not be able to verify a zero address to a single tier.", async () => { - await expectRevert(originsBase.addressVerification(zeroAddress, tierCount, { from: verifier }), "OriginsBase: Address to be verified cannot be zero."); - }); + it("Verifier should be able to verify a single address to a single tier.", async () => { + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + }); - it("Verifier should be able to verify a single address to a multiple tier.", async () => { - await originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount-1, tierCount-2], { from: verifier }); - }); + it("Verifier should not be able to verify a zero address to a single tier.", async () => { + await expectRevert( + originsBase.addressVerification(zeroAddress, tierCount, { from: verifier }), + "OriginsBase: Address to be verified cannot be zero." + ); + }); - it("Verifier should be able to verify a multiple address to a single tier.", async () => { - await originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: verifier }); - }); + it("Verifier should be able to verify a single address to a multiple tier.", async () => { + await originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount - 1, tierCount - 2], { from: verifier }); + }); - it("Verifier should be able to verify a multiple address to a multiple tier.", async () => { - await originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount-1, tierCount-2], { from: verifier }); - }); + it("Verifier should be able to verify a multiple address to a single tier.", async () => { + await originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: verifier }); + }); - it("Verifier should not be able to verify a multiple address of length x to a multiple tier of length y, where x != y.", async () => { - await expectRevert(originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount-1], { from: verifier }), "OriginsBase: Address and Tier Array length mismatch."); - }); + it("Verifier should be able to verify a multiple address to a multiple tier.", async () => { + await originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount - 1, tierCount - 2], { + from: verifier, + }); + }); + it("Verifier should not be able to verify a multiple address of length x to a multiple tier of length y, where x != y.", async () => { + await expectRevert( + originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount - 1], { from: verifier }), + "OriginsBase: Address and Tier Array length mismatch." + ); + }); });