0 txs
375.8k calls
constructor
No constructor.
functions
accPnlPerToken
viewfunction accPnlPerToken() view returns (int256)
accPnlPerTokenUsed
viewfunction accPnlPerTokenUsed() view returns (int256)
accRewardsPerToken
viewfunction accRewardsPerToken() view returns (uint256)
admin
viewfunction admin() view returns (address)
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
assetsToDeplete
viewfunction assetsToDeplete() view returns (uint256)
availableAssets
viewfunction availableAssets() view returns (uint256)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
collateralConfig
viewfunction collateralConfig() view returns (uint128 precision, uint128 precisionDelta)
collateralizationP
viewfunction collateralizationP() view returns (uint256)
convertToAssets
viewfunction convertToAssets(uint256 shares) view returns (uint256)
convertToShares
viewfunction convertToShares(uint256 assets) view returns (uint256)
currentEpoch
viewfunction currentEpoch() view returns (uint256)
currentEpochPositiveOpenPnl
viewfunction currentEpochPositiveOpenPnl() view returns (uint256)
currentEpochStart
viewfunction currentEpochStart() view returns (uint256)
currentMaxSupply
viewfunction currentMaxSupply() view returns (uint256)
dailyAccPnlDelta
viewfunction dailyAccPnlDelta() view returns (int256)
dailyMintedGns
viewfunction dailyMintedGns() view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
getLockedDeposit
viewfunction getLockedDeposit(uint256 depositId) view returns (tuple)
getTotalDepleted
viewfunction getTotalDepleted() view returns (uint256 assets, uint256 gns)
getTotalDiscounts
viewfunction getTotalDiscounts() view returns (uint256 unlocked, uint256 locked)
getTotalRefilled
viewfunction getTotalRefilled() view returns (uint256 assets, uint256 gns)
gnsPriceProvider
viewfunction gnsPriceProvider() view returns (address addr, bytes signature)
gnsToken
viewfunction gnsToken() view returns (address)
gnsTokenToAssetsPrice
viewfunction gnsTokenToAssetsPrice() view returns (uint256 price)
lastDailyAccPnlDeltaReset
viewfunction lastDailyAccPnlDeltaReset() view returns (uint256)
lastDailyMintedGnsReset
viewfunction lastDailyMintedGnsReset() view returns (uint256)
lastMaxSupplyUpdate
viewfunction lastMaxSupplyUpdate() view returns (uint256)
lockDiscountP
viewfunction lockDiscountP(uint256 collatP, uint256 lockDuration) view returns (uint256)
lockedDepositNft
viewfunction lockedDepositNft() view returns (address)
lockedDeposits
viewfunction lockedDeposits(uint256) view returns (address owner, uint256 shares, uint256 assetsDeposited, uint256 assetsDiscount, uint256 atTimestamp, uint256 lockDuration)
lockedDepositsCount
viewfunction lockedDepositsCount() view returns (uint256)
lossesBurnP
viewfunction lossesBurnP() view returns (uint256)
manager
viewfunction manager() view returns (address)
marketCap
viewfunction marketCap() view returns (uint256)
maxAccOpenPnlDelta
viewfunction maxAccOpenPnlDelta() view returns (uint256)
maxAccPnlPerToken
viewfunction maxAccPnlPerToken() view returns (uint256)
maxDailyAccPnlDelta
viewfunction maxDailyAccPnlDelta() view returns (uint256)
maxDeposit
viewfunction maxDeposit(address owner) view returns (uint256)
maxDiscountP
viewfunction maxDiscountP() view returns (uint256)
maxDiscountThresholdP
viewfunction maxDiscountThresholdP() view returns (uint256)
maxGnsSupplyMintDailyP
viewfunction maxGnsSupplyMintDailyP() view returns (uint256)
maxMint
viewfunction maxMint(address) view returns (uint256)
maxRedeem
viewfunction maxRedeem(address owner) view returns (uint256)
maxSupplyIncreaseDailyP
viewfunction maxSupplyIncreaseDailyP() view returns (uint256)
maxWithdraw
viewfunction maxWithdraw(address owner) view returns (uint256)
MIN_LOCK_DURATION
viewfunction MIN_LOCK_DURATION() view returns (uint256)
name
viewfunction name() view returns (string)
openTradesPnlFeed
viewfunction openTradesPnlFeed() view returns (address)
owner
viewfunction owner() view returns (address)
pnlHandler
viewfunction pnlHandler() view returns (address)
previewDeposit
viewfunction previewDeposit(uint256 assets) view returns (uint256)
previewMint
viewfunction previewMint(uint256 shares) view returns (uint256)
previewRedeem
viewfunction previewRedeem(uint256 shares) view returns (uint256)
previewWithdraw
viewfunction previewWithdraw(uint256 assets) view returns (uint256)
shareToAssetsPrice
viewfunction shareToAssetsPrice() view returns (uint256)
symbol
viewfunction symbol() view returns (string)
totalAssets
viewfunction totalAssets() view returns (uint256)
totalClosedPnl
viewfunction totalClosedPnl() view returns (int256)
totalDeposited
viewfunction totalDeposited() view returns (uint256)
totalLiability
viewfunction totalLiability() view returns (int256)
totalRewards
viewfunction totalRewards() view returns (uint256)
totalSharesBeingWithdrawn
viewfunction totalSharesBeingWithdrawn(address owner) view returns (uint256 shares)
totalSupply
viewfunction totalSupply() view returns (uint256)
tvl
viewfunction tvl() view returns (uint256)
withdrawEpochsTimelock
viewfunction withdrawEpochsTimelock() view returns (uint256)
withdrawLockThresholdsP
viewfunction withdrawLockThresholdsP(uint256) view returns (uint256)
withdrawRequests
viewfunction withdrawRequests(address, uint256) view returns (uint256)
approve
nonpayablefunction approve(address spender, uint256 amount) returns (bool)
cancelWithdrawRequest
nonpayablefunction cancelWithdrawRequest(uint256 shares, address owner, uint256 unlockEpoch)
decreaseAllowance
nonpayablefunction decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)
deplete
nonpayablefunction deplete(uint256 assets)
deposit
nonpayablefunction deposit(uint256 assets, address receiver) returns (uint256)
depositWithDiscountAndLock
nonpayablefunction depositWithDiscountAndLock(uint256 assets, uint256 lockDuration, address receiver) returns (uint256)
distributeReward
nonpayablefunction distributeReward(uint256 assets)
increaseAllowance
nonpayablefunction increaseAllowance(address spender, uint256 addedValue) returns (bool)
initialize
nonpayablefunction initialize(tuple _meta, tuple _contractAddresses, uint256 _MIN_LOCK_DURATION, uint256 _maxAccOpenPnlDelta, uint256 _maxDailyAccPnlDelta, uint256[2] _withdrawLockThresholdsP, uint256 _maxSupplyIncreaseDailyP, uint256 _lossesBurnP, uint256 _maxGnsSupplyMintDailyP, uint256 _maxDiscountP, uint256 _maxDiscountThresholdP)
initializeV3
nonpayablefunction initializeV3()
makeWithdrawRequest
nonpayablefunction makeWithdrawRequest(uint256 shares, address owner)
mint
nonpayablefunction mint(uint256 shares, address receiver) returns (uint256)
mintWithDiscountAndLock
nonpayablefunction mintWithDiscountAndLock(uint256 shares, uint256 lockDuration, address receiver) returns (uint256)
receiveAssets
nonpayablefunction receiveAssets(uint256 assets, address user, bool _burn)
redeem
nonpayablefunction redeem(uint256 shares, address receiver, address owner) returns (uint256)
refill
nonpayablefunction refill(uint256 assets)
renounceOwnership
nonpayablefunction renounceOwnership()
sendAssets
nonpayablefunction sendAssets(uint256 assets, address receiver)
transfer
nonpayablefunction transfer(address to, uint256 amount) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 amount) returns (bool)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
tryNewOpenPnlRequestOrEpoch
nonpayablefunction tryNewOpenPnlRequestOrEpoch()
tryResetDailyAccPnlDelta
nonpayablefunction tryResetDailyAccPnlDelta()
tryUpdateCurrentMaxSupply
nonpayablefunction tryUpdateCurrentMaxSupply()
unlockDeposit
nonpayablefunction unlockDeposit(uint256 depositId, address receiver)
updateAccPnlPerTokenUsed
nonpayablefunction updateAccPnlPerTokenUsed(uint256 prevPositiveOpenPnl, uint256 newPositiveOpenPnl) returns (uint256)
updateAdmin
nonpayablefunction updateAdmin(address newValue)
updateGnsPriceProvider
nonpayablefunction updateGnsPriceProvider(tuple newValue)
updateLossesBurnP
nonpayablefunction updateLossesBurnP(uint256 newValue)
updateManager
nonpayablefunction updateManager(address newValue)
updateMaxAccOpenPnlDelta
nonpayablefunction updateMaxAccOpenPnlDelta(uint256 newValue)
updateMaxDailyAccPnlDelta
nonpayablefunction updateMaxDailyAccPnlDelta(uint256 newValue)
updateMaxDiscountP
nonpayablefunction updateMaxDiscountP(uint256 newValue)
updateMaxDiscountThresholdP
nonpayablefunction updateMaxDiscountThresholdP(uint256 newValue)
updateMaxGnsSupplyMintDailyP
nonpayablefunction updateMaxGnsSupplyMintDailyP(uint256 newValue)
updateMaxSupplyIncreaseDailyP
nonpayablefunction updateMaxSupplyIncreaseDailyP(uint256 newValue)
updateOpenTradesPnlFeed
nonpayablefunction updateOpenTradesPnlFeed(address newValue)
updatePnlHandler
nonpayablefunction updatePnlHandler(address newValue)
updateWithdrawLockThresholdsP
nonpayablefunction updateWithdrawLockThresholdsP(uint256[2] newValue)
withdraw
nonpayablefunction withdraw(uint256 assets, address receiver, address owner) returns (uint256)
events
AccPnlPerTokenUsedUpdated
event AccPnlPerTokenUsedUpdated(address indexed sender, uint256 indexed newEpoch, uint256 prevPositiveOpenPnl, uint256 newPositiveOpenPnl, uint256 newEpochPositiveOpenPnl, int256 newAccPnlPerTokenUsed)
AdminUpdated
event AdminUpdated(address newValue)
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
AssetsReceived
event AssetsReceived(address indexed sender, address indexed user, uint256 assets, uint256 assetsLessDeplete, bool burn)
AssetsSent
event AssetsSent(address indexed sender, address indexed receiver, uint256 assets)
CurrentMaxSupplyUpdated
event CurrentMaxSupplyUpdated(uint256 newValue)
DailyAccPnlDeltaReset
event DailyAccPnlDeltaReset()
Depleted
event Depleted(address indexed sender, uint256 assets, uint256 amountGns)
Deposit
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares)
DepositLocked
event DepositLocked(address indexed sender, address indexed owner, uint256 depositId, (address owner, uint256 shares, uint256 assetsDeposited, uint256 assetsDiscount, uint256 atTimestamp, uint256 lockDuration) d)
DepositUnlocked
event DepositUnlocked(address indexed sender, address indexed receiver, address indexed owner, uint256 depositId, (address owner, uint256 shares, uint256 assetsDeposited, uint256 assetsDiscount, uint256 atTimestamp, uint256 lockDuration) d)
GnsPriceProviderUpdated
event GnsPriceProviderUpdated((address addr, bytes signature) newValue)
Initialized
event Initialized(uint8 version)
LossesBurnPUpdated
event LossesBurnPUpdated(uint256 newValue)
ManagerUpdated
event ManagerUpdated(address newValue)
MaxAccOpenPnlDeltaUpdated
event MaxAccOpenPnlDeltaUpdated(uint256 newValue)
MaxDailyAccPnlDeltaUpdated
event MaxDailyAccPnlDeltaUpdated(uint256 newValue)
MaxDiscountPUpdated
event MaxDiscountPUpdated(uint256 newValue)
MaxDiscountThresholdPUpdated
event MaxDiscountThresholdPUpdated(uint256 newValue)
MaxGnsSupplyMintDailyPUpdated
event MaxGnsSupplyMintDailyPUpdated(uint256 newValue)
MaxSupplyIncreaseDailyPUpdated
event MaxSupplyIncreaseDailyPUpdated(uint256 newValue)
OpenTradesPnlFeedCallFailed
event OpenTradesPnlFeedCallFailed()
OpenTradesPnlFeedUpdated
event OpenTradesPnlFeedUpdated(address newValue)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PnlHandlerUpdated
event PnlHandlerUpdated(address newValue)
Refilled
event Refilled(address indexed sender, uint256 assets, uint256 amountGns)
RewardDistributed
event RewardDistributed(address indexed sender, uint256 assets)
ShareToAssetsPriceUpdated
event ShareToAssetsPriceUpdated(uint256 newValue)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Withdraw
event Withdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares)
WithdrawCanceled
event WithdrawCanceled(address indexed sender, address indexed owner, uint256 shares, uint256 currEpoch, uint256 indexed unlockEpoch)
WithdrawLockThresholdsPUpdated
event WithdrawLockThresholdsPUpdated(uint256[2] newValue)
WithdrawRequested
event WithdrawRequested(address indexed sender, address indexed owner, uint256 shares, uint256 currEpoch, uint256 indexed unlockEpoch)
errors
AboveInflationLimit
error AboveInflationLimit()
AboveMax
error AboveMax()
AddressZero
error AddressZero()
BelowMin
error BelowMin()
BytesZero
error BytesZero()
EndOfEpoch
error EndOfEpoch()
ERC4626ExceededMaxDeposit
error ERC4626ExceededMaxDeposit()
ERC4626ExceededMaxMint
error ERC4626ExceededMaxMint()
ERC4626ExceededMaxRedeem
error ERC4626ExceededMaxRedeem()
ERC4626ExceededMaxWithdraw
error ERC4626ExceededMaxWithdraw()
GnsPriceCallFailed
error GnsPriceCallFailed()
GnsTokenPriceZero
error GnsTokenPriceZero()
MaxDailyPnl
error MaxDailyPnl()
NoActiveDiscount
error NoActiveDiscount()
NoDiscount
error NoDiscount()
NotAllowed
error NotAllowed()
NotEnoughAssets
error NotEnoughAssets()
NotUnderCollateralized
error NotUnderCollateralized()
NotUnlocked
error NotUnlocked()
OnlyManager
error OnlyManager()
OnlyPnlFeed
error OnlyPnlFeed()
OnlyTradingPnlHandler
error OnlyTradingPnlHandler()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
PendingWithdrawal
error PendingWithdrawal()
PriceZero
error PriceZero()
ValueZero
error ValueZero()
WrongValue
error WrongValue()
WrongValues
error WrongValues()
creation bytecode
0x608060405234801561001057600080fd5b50615fcd80620000216000396000f3fe6080604052600436106104e15760003560e01c8063940a4e451161027f578063940a4e4514610b0357806394bf804d14610b2357806395d89b4114610b43578063979abb2514610b5857806397b76dff14610b78578063a457c2d714610b98578063a50043a014610bb8578063a8abe90514610bd8578063a8de021d14610bf8578063a9059cbb14610c18578063ad00a5a414610c38578063b224e73514610c58578063b3c4850a14610c6e578063b3d7f6b914610c8e578063b460af9414610cae578063b54bf9c914610cce578063b82c589914610cee578063ba08765214610d7f578063be216e8314610d9f578063c4c1416914610db4578063c63384ab14610dd4578063c63d75b614610de9578063c6e6f59214610e09578063c726601014610e29578063ca9d07ba14610e41578063cb7f2c3914610e61578063ce96cb7714610e81578063ce9e1b2114610ea1578063cf39c2db14610ec1578063d1e08c2014610ee1578063d229b2dd14610f01578063d272df1014610f21578063d8bdfd4814610f41578063d905777e14610f56578063db0447d514610f76578063dd62ed3e14610f8c578063ddd65e3114610fac578063e065600514610fc2578063e2f273bd14610fd8578063e5328e0614610ff8578063e66a6e3b1461100d578063e71d13271461102d578063e783967614611045578063e7899c06146110b5578063e8e43110146110ca578063ea5f2bba146110ea578063ef8b30f714610e09578063f0a7744614611100578063f2fde38b14611116578063f5521eaa14611136578063f851a44014611156578063f8fb10f714611176578063faf33f291461118c578063fe0b6d90146111a2578063ff50abdc146111c257600080fd5b806301e1d114146104ed5780630344e8a31461051557806306fdde031461053757806307a2d13a14610559578063095ea7b3146105795780630a28a477146105a95780630dfb5287146105c95780630e15561a146105de5780630fc29349146105f45780630fcc6f311461060a578063104aeef81461062057806318160ddd146106365780631f91f2871461064b5780631fc8d0991461067857806320124bce1461068d57806320e70a56146106a2578063215e2fae146106c257806322b2ef85146106d857806323b872dd146106ee5780632c135b931461070e578063313ce5671461072357806338d52e0f1461074a57806338e454b11461075f57806339509351146107745780633b418c1e146107945780633cc77527146107aa578063402d267d146107c0578063481c6a75146107e05780634cdad506146105595780634ea0ddf714610800578063545088471461081657806355d2cd4b1461083657806358aba00f14610858578063596f0bc5146108785780635a6953d31461089b5780635c0ab4de146108bb5780635e93f8601461090657806361a8c8c41461091c5780636445ec001461093257806366d8ecf1146109475780636ce7dcc91461095d5780636d6ca3191461097d5780636e553f65146109b55780636ee432f2146109d557806370a08231146109f5578063715018a614610a155780637361a54414610a2a57806375cd9da914610a4a5780637667180814610a6057806378b4330f14610a7657806379431d9c14610a8c5780637dfc692214610aac5780637fcff2af14610ac25780638c46562914610ad85780638da5cb5b14610aee57600080fd5b366104e857005b600080fd5b3480156104f957600080fd5b506105026111d8565b6040519081526020015b60405180910390f35b34801561052157600080fd5b5061053561053036600461529d565b61124f565b005b34801561054357600080fd5b5061054c6115ed565b60405161050c919061531d565b34801561056557600080fd5b50610502610574366004615330565b61167f565b34801561058557600080fd5b50610599610594366004615349565b611692565b604051901515815260200161050c565b3480156105b557600080fd5b506105026105c4366004615330565b6116aa565b3480156105d557600080fd5b506105356116b7565b3480156105ea57600080fd5b5061050260ef5481565b34801561060057600080fd5b5061050260f05481565b34801561061657600080fd5b5061050260ee5481565b34801561062c57600080fd5b5061050260e55481565b34801561064257600080fd5b50603554610502565b34801561065757600080fd5b5060ce5461066b906001600160a01b031681565b60405161050c9190615375565b34801561068457600080fd5b50610502611772565b34801561069957600080fd5b50610502611884565b3480156106ae57600080fd5b506105356106bd366004615389565b6118c1565b3480156106ce57600080fd5b5061050260e85481565b3480156106e457600080fd5b5061050260e65481565b3480156106fa57600080fd5b506105996107093660046153a6565b611946565b34801561071a57600080fd5b506105026119a1565b34801561072f57600080fd5b506107386119b8565b60405160ff909116815260200161050c565b34801561075657600080fd5b5061066b6119c2565b34801561076b57600080fd5b506105356119d1565b34801561078057600080fd5b5061059961078f366004615349565b611a85565b3480156107a057600080fd5b5061050260d45481565b3480156107b657600080fd5b5061050260d95481565b3480156107cc57600080fd5b506105026107db366004615389565b611aa7565b3480156107ec57600080fd5b5060cb5461066b906001600160a01b031681565b34801561080c57600080fd5b5061050260de5481565b34801561082257600080fd5b50610535610831366004615330565b611abc565b34801561084257600080fd5b5060f35460f4545b60405161050c9291906153e7565b34801561086457600080fd5b50610535610873366004615389565b611b2c565b34801561088457600080fd5b5061088d611bf8565b60405161050c9291906153f5565b3480156108a757600080fd5b5060cd5461066b906001600160a01b031681565b3480156108c757600080fd5b5060f9546108e6906001600160801b0380821691600160801b90041682565b604080516001600160801b0393841681529290911660208301520161050c565b34801561091257600080fd5b5061050260e05481565b34801561092857600080fd5b5061050260e35481565b34801561093e57600080fd5b50610535611c99565b34801561095357600080fd5b5061050260ea5481565b34801561096957600080fd5b50610535610978366004615330565b611d3a565b34801561098957600080fd5b50610502610998366004615349565b60e760209081526000928352604080842090915290825290205481565b3480156109c157600080fd5b506105026109d036600461529d565b611eb8565b3480156109e157600080fd5b506105026109f0366004615330565b611f1c565b348015610a0157600080fd5b50610502610a10366004615389565b611f33565b348015610a2157600080fd5b50610535611f4e565b348015610a3657600080fd5b50610502610a45366004615419565b611f60565b348015610a5657600080fd5b5061050260d85481565b348015610a6c57600080fd5b5061050260e25481565b348015610a8257600080fd5b5061050260d15481565b348015610a9857600080fd5b5060ca5461066b906001600160a01b031681565b348015610ab857600080fd5b5061050260db5481565b348015610ace57600080fd5b5061050260df5481565b348015610ae457600080fd5b5061050260eb5481565b348015610afa57600080fd5b5061066b61213b565b348015610b0f57600080fd5b50610535610b1e366004615330565b61214a565b348015610b2f57600080fd5b50610502610b3e36600461529d565b612228565b348015610b4f57600080fd5b5061054c612282565b348015610b6457600080fd5b50610535610b73366004615330565b612291565b348015610b8457600080fd5b50610535610b93366004615449565b612301565b348015610ba457600080fd5b50610599610bb3366004615349565b6124b6565b348015610bc457600080fd5b50610535610bd336600461548b565b61253c565b348015610be457600080fd5b50610535610bf336600461529d565b612667565b348015610c0457600080fd5b50610535610c1336600461579a565b612824565b348015610c2457600080fd5b50610599610c33366004615349565b612c55565b348015610c4457600080fd5b50610502610c53366004615389565b612c9f565b348015610c6457600080fd5b5061050260e15481565b348015610c7a57600080fd5b50610502610c8936600461585f565b612d1e565b348015610c9a57600080fd5b50610502610ca9366004615330565b612dd6565b348015610cba57600080fd5b50610502610cc936600461588d565b612de3565b348015610cda57600080fd5b50610535610ce93660046158c4565b612e85565b348015610cfa57600080fd5b50610d48610d09366004615330565b60e9602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039094169492939192909186565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161050c565b348015610d8b57600080fd5b50610502610d9a36600461588d565b612f44565b348015610dab57600080fd5b50610502612fda565b348015610dc057600080fd5b50610535610dcf366004615330565b612ff2565b348015610de057600080fd5b50610502613062565b348015610df557600080fd5b50610502610e04366004615389565b6130d3565b348015610e1557600080fd5b50610502610e24366004615330565b613102565b348015610e3557600080fd5b5060f25460f15461084a565b348015610e4d57600080fd5b50610535610e5c366004615330565b61310f565b348015610e6d57600080fd5b5060c95461066b906001600160a01b031681565b348015610e8d57600080fd5b50610502610e9c366004615389565b61342b565b348015610ead57600080fd5b50610535610ebc366004615330565b613439565b348015610ecd57600080fd5b50610535610edc366004615330565b6134a9565b348015610eed57600080fd5b50610502610efc366004615419565b613519565b348015610f0d57600080fd5b50610535610f1c366004615389565b6135ae565b348015610f2d57600080fd5b50610535610f3c366004615330565b613628565b348015610f4d57600080fd5b50610502613665565b348015610f6257600080fd5b50610502610f71366004615389565b613709565b348015610f8257600080fd5b5061050260d75481565b348015610f9857600080fd5b50610502610fa73660046158f8565b6137c2565b348015610fb857600080fd5b5061050260dd5481565b348015610fce57600080fd5b5061050260ec5481565b348015610fe457600080fd5b50610535610ff3366004615389565b6137ed565b34801561100457600080fd5b506105026138b9565b34801561101957600080fd5b5061053561102836600461529d565b6138d5565b34801561103957600080fd5b5060f55460f65461084a565b34801561105157600080fd5b50611065611060366004615330565b613a73565b60405161050c919081516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0918201519181019190915260c00190565b3480156110c157600080fd5b50610535613b17565b3480156110d657600080fd5b506105026110e536600461585f565b613b62565b3480156110f657600080fd5b5061050260dc5481565b34801561110c57600080fd5b5061050260d35481565b34801561112257600080fd5b50610535611131366004615389565b613c0f565b34801561114257600080fd5b50610535611151366004615926565b613c91565b34801561116257600080fd5b5060cc5461066b906001600160a01b031681565b34801561118257600080fd5b5061050260da5481565b34801561119857600080fd5b5061050260e45481565b3480156111ae57600080fd5b506105356111bd366004615330565b613cfb565b3480156111ce57600080fd5b5061050260ed5481565b6065546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611209903090600401615375565b602060405180830381865afa158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a9190615942565b905090565b600082815260e960205260408120903360ca546040516331a9108f60e11b8152600481018790529192506000916001600160a01b0390911690636352211e90602401602060405180830381865afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d2919061595b565b9050816001600160a01b0316816001600160a01b03161415801561136c575060ca5460405163020604bf60e21b8152600481018790526001600160a01b0384811692169063081812fc90602401602060405180830381865afa15801561133c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611360919061595b565b6001600160a01b031614155b80156113eb575060ca5460405163e985e9c560e01b81526001600160a01b03838116600483015284811660248301529091169063e985e9c590604401602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190615978565b155b1561140957604051631eb49d6d60e11b815260040160405180910390fd5b8260050154836004015461141d91906159ab565b42101561143d5760405163fa68006560e01b815260040160405180910390fd5b60f95460009061148490611464906001600160801b0380821691600160801b9004166159be565b6001600160801b031661147660355490565b600387015491906001613d6b565b90508060de600082825461149891906159e9565b909155506114a69050612fda565b60de5413156114c857604051630de1bf7560e21b815260040160405180910390fd5b60ca54604051630852cd8d60e31b8152600481018890526001600160a01b03909116906342966c6890602401600060405180830381600087803b15801561150e57600080fd5b505af1158015611522573d6000803e3d6000fd5b505050508060dd600082825461153891906159e9565b909155506115469050613dca565b836003015460f0600082825461155c91906159e9565b9091555050600384015460f18054600090611578908490615a09565b9250508190555061158e30868660010154613e26565b816001600160a01b0316856001600160a01b0316846001600160a01b03167fe37405a4f414fe3119839681cc26ea3462fc575fd2f81734417e52144d3f34b989886040516115dd929190615a1c565b60405180910390a4505050505050565b6060603680546115fc90615a66565b80601f016020809104026020016040519081016040528092919081815260200182805461162890615a66565b80156116755780601f1061164a57610100808354040283529160200191611675565b820191906000526020600020905b81548152906001019060200180831161165857829003601f168201915b5050505050905090565b600061168c826000613fb8565b92915050565b6000336116a0818585613ff9565b5060019392505050565b600061168c82600161411d565b60ce5460408051600481526024810182526020810180516001600160e01b031663bef35b7960e01b17905290516000926001600160a01b0316916116fa91615a9a565b6000604051808303816000865af19150503d8060008114611737576040519150601f19603f3d011682016040523d82523d6000602084013e61173c565b606091505b505090508061176f576040517f46f2d6138acb3be39ad6ae5c9279b648c2a2c68743d0ddc18cc3a81cedecebd590600090a15b50565b60cf54600090819081906001600160a01b031661178f60d0615ab6565b6117976119c2565b6040516024016117a79190615375565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516117e59190615a9a565b600060405180830381855afa9150503d8060008114611820576040519150601f19603f3d011682016040523d82523d6000602084013e611825565b606091505b50915091508161184857604051636f083c9360e11b815260040160405180910390fd5b8080602001905181019061185c9190615942565b92508260000361187f57604051633411242960e01b815260040160405180910390fd5b505090565b6000670de0b6b3a764000061189860355490565b60dd546118a3612fda565b6118ad9190615b08565b6118b79190615b28565b61124a9190615b55565b6118c9614139565b6001600160a01b0381166118f057604051639fabe1c160e01b815260040160405180910390fd5b60ce80546001600160a01b0319166001600160a01b0383161790556040517f01776d11c598ace30615fd841ba9a298e4c2e05117ffe017350f6c82f90ec65b9061193b908390615375565b60405180910390a150565b60008161195285611f33565b61195c9190615a09565b61196585612c9f565b11156119845760405163423023f160e01b815260040160405180910390fd5b61198f843384614198565b6116a0848484613e26565b9392505050565b6000670de0b6b3a764000060dc546118ad60355490565b600061124a61420c565b6065546001600160a01b031690565b600054600390610100900460ff161580156119f3575060005460ff8083169116105b611a185760405162461bcd60e51b8152600401611a0f90615b69565b60405180910390fd5b6000805461ffff191660ff831617610100179055611a3c611a376119c2565b614226565b80516020918201516001600160801b03908116600160801b0291161760f9556000805461ff001916905560405160ff83168152600080516020615f58833981519152910161193b565b6000336116a0818585611a9883836137c2565b611aa291906159ab565b613ff9565b600061168c611ab5836130d3565b6000613fb8565b611ac46142e3565b611ad7600a670de0b6b3a7640000615b55565b811015611af7576040516310906acb60e01b815260040160405180910390fd5b60d48190556040518181527f3f492ea436011f4e8f9e72a79808bac0d090849accb8de654f74ab6d30d825cb9060200161193b565b611b34614139565b6001600160a01b038116611b5b57604051639fabe1c160e01b815260040160405180910390fd5b611b6361213b565b6001600160a01b0316816001600160a01b03161480611b8f575060cc546001600160a01b038281169116145b15611bad57604051632635240760e21b815260040160405180910390fd5b60cb80546001600160a01b0319166001600160a01b0383161790556040517f2c1c11af44aa5608f1dca38c00275c30ea091e02417d36e70e9a1538689c433d9061193b908390615375565b60cf805460d080546001600160a01b039092169291611c1690615a66565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4290615a66565b8015611c8f5780601f10611c6457610100808354040283529160200191611c8f565b820191906000526020600020905b815481529060010190602001808311611c7257829003601f168201915b5050505050905082565b6201518060e65442611cab9190615a09565b10611d3857611cc3670de0b6b3a76400006064615b28565b60d754611cd9670de0b6b3a76400006064615b28565b611ce391906159ab565b603554611cf09190615b28565b611cfa9190615b55565b60e58190554260e6556040519081527fd103db6eec024592fa6d47db028ec6408076ac4762eb021a6e52b525828bab9b906020015b60405180910390a15b565b60ea54811115611d5d57604051630ad1e31b60e01b815260040160405180910390fd5b8060ea6000828254611d6f9190615a09565b909155505060f954600090611db090611d9e906402540be40090600160801b90046001600160801b0316615b28565b611da6611772565b8491906001613d6b565b90506000611dbc614317565b60c95490915033906001600160a01b0316639dc29fac83611ddd5782611ddf565b305b856040518363ffffffff1660e01b8152600401611dfd929190615bb7565b600060405180830381600087803b158015611e1757600080fd5b505af1158015611e2b573d6000803e3d6000fd5b505050508360f36000828254611e4191906159ab565b925050819055508260f46000828254611e5a91906159ab565b90915550829050611e6f57611e6f818561433d565b806001600160a01b03167f1fb4f167278bb29c47ac4fd58ca1586b0626b52807f2991ef78abdbb97bb43338585604051611eaa9291906153e7565b60405180910390a250505050565b600082611ec481614387565b611ecd83611aa7565b841115611eed5760405163577e19eb60e11b815260040160405180910390fd5b6000611ef885613102565b9050611f06818660016143cb565b611f12338587846144a5565b91505b5092915050565b60d58160028110611f2c57600080fd5b0154905081565b6001600160a01b031660009081526033602052604090205490565b611f56614139565b611d38600061450c565b60ce5460009033906001600160a01b03168114611f905760405163231f644160e11b815260040160405180910390fd5b6000611f9c8585615b08565b90506000611fa960355490565b60f95460de54919250600091612017916001600160801b0316908490611fcd612fda565b611fd79190615b08565b611fe19190615b28565b611feb9190615b55565b60f95460d3546001600160801b0390911690612008908690615b28565b6120129190615b55565b61455e565b90508083136120265782612028565b805b60f9549093508290612043906001600160801b031685615bd0565b61204d9190615c00565b60de600082825461205e91906159e9565b909155505060f95461208090600160801b90046001600160801b031684615c00565b60f0600082825461209191906159e9565b909155505060de5460dd556120a4613dca565b60e280549060006120b483615c2e565b90915550504260e3556120c783886159e9565b60e4556120d2611c99565b60e25460e45460dd54604080518b8152602081018b90529081019290925260608201526001600160a01b038616907f115621a72d6f59323a1d752b116219634bc004cadb85d6bdc8e7eb254905722d9060800160405180910390a3505060e45495945050505050565b6097546001600160a01b031690565b3361215e612156614574565b82308561457e565b60355460f9546001600160801b038082169161218391600160801b9091041685615b28565b61218d9190615b28565b6121979190615b55565b60df60008282546121a891906159ab565b909155506121b69050613dca565b8160ef60008282546121c891906159ab565b925050819055508160ed60008282546121e191906159ab565b90915550506040518281526001600160a01b038216907fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea69060200160405180910390a25050565b60008261223481614387565b61223d836130d3565b84111561225d576040516334f87ee160e11b815260040160405180910390fd5b600061226885612dd6565b9050612276858260016143cb565b611f12338583886144a5565b6060603780546115fc90615a66565b6122996142e3565b6122ac670de0b6b3a7640000600a615b28565b8111156122cc57604051630ad1e31b60e01b815260040160405180910390fd5b60da8190556040518181527f62412ddbb9ad43638b3b9f4506160bc417a547fd57bfacef427820562bcc15609060200161193b565b3361231561230d614574565b82308761457e565b838280156123255750600060dd54125b80156123335750600060de54125b1561238f5760006064670de0b6b3a764000060d854886123539190615b28565b61235d9190615b55565b6123679190615b55565b90508060ea600082825461237b91906159ab565b9091555061238b90508183615a09565b9150505b600061239a60355490565b60f9546001600160801b03808216916123bc91600160801b9091041685615b28565b6123c69190615b28565b6123d09190615b55565b90508060de60008282546123e49190615b08565b909155506123f29050613b17565b8060e060008282546124049190615b08565b925050819055508160f0600082825461241d9190615b08565b925050819055508160ee60008282546124369190615b08565b9091555061244490506116b7565b61244c611c99565b846001600160a01b0316836001600160a01b03167f880fe06824513817ee064877273ecb3a0971f6b4a734b167159e0e0cd67476bd8885886040516124a69392919092835260208301919091521515604082015260600190565b60405180910390a3505050505050565b600033816124c482866137c2565b9050838110156125245760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401611a0f565b6125318286868403613ff9565b506001949350505050565b6001600160a01b038216600090815260e76020908152604080832084845290915290205483111561258057604051630ad1e31b60e01b815260040160405180910390fd5b33600061258d84836137c2565b9050836001600160a01b0316826001600160a01b0316141580156125b857508015806125b857508481105b156125d657604051631eb49d6d60e11b815260040160405180910390fd5b6001600160a01b038416600090815260e76020908152604080832086845290915281208054879290612609908490615a09565b9250508190555082846001600160a01b0316836001600160a01b03167f443ccdbbbde35bd48740a9ea14c47318b735db4631ed1ebcdaaaa9f4636c84ea8860e2546040516126589291906153e7565b60405180910390a45050505050565b60ce5460408051632e3fbb9960e21b815290516000926001600160a01b03169163b8feee649160048083019260209291908290030181865afa1580156126b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d59190615942565b11156126f45760405163a73449b960e01b815260040160405180910390fd5b33600061270183836137c2565b9050826001600160a01b0316826001600160a01b03161415801561272c575080158061272c57508381105b1561274a57604051631eb49d6d60e11b815260040160405180910390fd5b61275383611f33565b8461275d85612c9f565b61276791906159ab565b111561278657604051630ad1e31b60e01b815260040160405180910390fd5b6000612790613665565b60e25461279d91906159ab565b6001600160a01b038516600090815260e7602090815260408083208484529091528120805492935087929091906127d59084906159ab565b9250508190555080846001600160a01b0316846001600160a01b03167f21b8e5e36008677ea26efbbc967e568e01b127f731ed0fda0a8685fda37d0d5f8860e2546040516126589291906153e7565b600054610100900460ff16158080156128445750600054600160ff909116105b806128655750612853306145e9565b158015612865575060005460ff166001145b6128815760405162461bcd60e51b8152600401611a0f90615b69565b6000805460ff1916600117905580156128a4576000805461ff0019166101001790555b8a516001600160a01b0316158015906128c9575060208b01516001600160a01b031615155b80156128e1575060408b01516001600160a01b031615155b80156128f9575060608b01516001600160a01b031615155b801561291f57508a604001516001600160a01b03168b602001516001600160a01b031614155b801561294557508a606001516001600160a01b03168b604001516001600160a01b031614155b801561295d575060808b01516001600160a01b031615155b8015612975575060a08b01516001600160a01b031615155b801561298d575060c08b01516001600160a01b031615155b80156129a5575060e08b01516001600160a01b031615155b80156129bf57506101008b0151516001600160a01b031615155b80156129d5575060008b61010001516020015151115b80156129f357506129ef600a670de0b6b3a7640000615b55565b8810155b8015612a03575086516020880151115b8015612a215750612a1d670de0b6b3a76400006032615b28565b8611155b8015612a3f5750612a3b670de0b6b3a76400006019615b28565b8511155b8015612a5d5750612a596014670de0b6b3a7640000615b55565b8411155b8015612a7b5750612a77670de0b6b3a7640000600a615b28565b8311155b8015612a995750612a95670de0b6b3a76400006064615b28565b8210155b612ab65760405163bd95487760e01b815260040160405180910390fd5b612ac88c600001518d602001516145f8565b8a51612ad39061462d565b612adb61465d565b612ae88b6020015161450c565b60808b015160c980546001600160a01b03199081166001600160a01b039384161790915560a08d015160ca8054831691841691909117905560408d015160cb8054831691841691909117905560608d015160cc8054831691841691909117905560c08d015160cd8054831691841691909117905560e08d015160ce805483169184169190911790556101008d0151805160cf80549093169316929092178155602082015160d090612b999082615cad565b50505060d18a905560d389905560d4889055612bb860d58860026151e5565b5060d786905560d885905560d984905560da83905560db829055670de0b6b3a764000060dc55600160e28190554260e3556040805160608101825260038082526002602083015291810192909252612c129160d291615223565b508015612c47576000805461ff001916905560405160018152600080516020615f588339815191529060200160405180910390a15b505050505050505050505050565b60003382612c6282611f33565b612c6c9190615a09565b612c7582612c9f565b1115612c945760405163423023f160e01b815260040160405180910390fd5b6116a0818585613e26565b60e2546000905b60d2600081548110612cba57612cba615c47565b906000526020600020015460e254612cd291906159ab565b8111612d18576001600160a01b038316600090815260e760209081526040808320848452909152902054612d0690836159ab565b9150612d1181615c2e565b9050612ca6565b50919050565b600083612d2a81614387565b83612d348161468c565b612d3d846130d3565b861115612d5d57604051630ad1e31b60e01b815260040160405180910390fd5b6000612d6887612dd6565b9050612dcb81612d7f612d79613062565b89613519565b612d92670de0b6b3a76400006064615b28565b612d9c91906159ab565b612daf670de0b6b3a76400006064615b28565b612db99085615b28565b612dc39190615b55565b8989896146f7565b979650505050505050565b600061168c826001613fb8565b600083612def81614387565b612df88361342b565b851115612e18576040516322640cab60e21b815260040160405180910390fd5b6000612e23866116aa565b6001600160a01b038516600090815260e76020908152604080832060e2548452909152812080549293508392909190612e5d908490615a09565b90915550612e6f9050818760006143cb565b612e7c3386868985614893565b95945050505050565b612e8d6142e3565b80516001600160a01b0316612eb557604051639fabe1c160e01b815260040160405180910390fd5b806020015151600003612edb576040516391a0152960e01b815260040160405180910390fd5b805160cf80546001600160a01b0319166001600160a01b03909216919091178155602082015182919060d090612f119082615cad565b509050507f2763c7adb1b7018e25499ef5553ec78e35bb46be6384b393861c35d501825dce8160405161193b9190615d6c565b600083612f5081614387565b612f5983613709565b851115612f7957604051631f610d9760e21b815260040160405180910390fd5b6001600160a01b038316600090815260e76020908152604080832060e254845290915281208054879290612fae908490615a09565b9091555060009050612fbf8661167f565b9050612fcd868260006143cb565b612e7c338686848a614893565b600060df54670de0b6b3a764000061124a91906159ab565b612ffa6142e3565b61300d6014670de0b6b3a7640000615b55565b81111561302d57604051630ad1e31b60e01b815260040160405180910390fd5b60d98190556040518181527f66ee70a6a35d8163de2516f1e2f30b75155c34b6f85704fc3fc7ea30d590322c9060200161193b565b60008061306d612fda565b905080670de0b6b3a7640000600060dd54136130a15760dd5461309290600019615bd0565b61309c90846159ab565b6130ae565b60dd546130ae9084615a09565b6130b9906064615b28565b6130c39190615b28565b6130cd9190615b55565b91505090565b60008060dd54136130e65760001961168c565b6130f560e55461201260355490565b60e55461168c9190615a09565b600061168c82600061411d565b600060dd541361313257604051637c7a1c4760e01b815260040160405180910390fd5b600061313d60355490565b9050670de0b6b3a76400008160dd546131569190615b28565b6131609190615b55565b82111561318057604051630ad1e31b60e01b815260040160405180910390fd5b6201518060ec54426131929190615a09565b106131a157600060eb554260ec555b60006131ab611772565b60f9546402540be400906131cf90600160801b90046001600160801b031686615b28565b6131d99190615b28565b6131e39190615b55565b90508060eb60008282546131f791906159ab565b925050819055506064670de0b6b3a764000060c960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561325c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132809190615942565b60d95461328d9190615b28565b6132979190615b55565b6132a19190615b55565b60eb5411156132c357604051631ef6784960e21b815260040160405180910390fd5b60006132cd614317565b905033816132e8576132e86132e0614574565b82308861457e565b6000846132fd670de0b6b3a764000088615b28565b6133079190615b55565b90508060de600082825461331b9190615b08565b925050819055508060dd60008282546133349190615b08565b909155506133429050613dca565b8560f5600082825461335491906159ab565b925050819055508360f6600082825461336d91906159ab565b909155505060c9546001600160a01b03166340c10f198461338e5783613390565b305b866040518363ffffffff1660e01b81526004016133ae929190615bb7565b600060405180830381600087803b1580156133c857600080fd5b505af11580156133dc573d6000803e3d6000fd5b50505050816001600160a01b03167f19aee2c21e4d63823896cb2a77a3e61197dda70b1043a55fca38aa8d75c0edd3878660405161341b9291906153e7565b60405180910390a2505050505050565b600061168c611ab583613709565b6134416142e3565b613454670de0b6b3a76400006019615b28565b81111561347457604051630ad1e31b60e01b815260040160405180910390fd5b60d88190556040518181527fc4a0569383a33078b4dbc3e6c6c38c52e7e97b219ea9e04d1b58c2745e4d2bb49060200161193b565b6134b16142e3565b6134c4670de0b6b3a76400006064615b28565b8110156134e4576040516310906acb60e01b815260040160405180910390fd5b60db8190556040518181527fc3d15eac433007c433395eb171cde0d63e1c539dae45c0ae13358aebdfa36a519060200161193b565b60006301e1338082613534670de0b6b3a76400006064615b28565b8511156135965760db5485111561354c57600061359a565b61355f670de0b6b3a76400006064615b28565b60db5461356c9190615a09565b8560db5461357a9190615a09565b60da546135879190615b28565b6135919190615b55565b61359a565b60da545b6135a49190615b28565b61199a9190615b55565b6135b6614139565b6001600160a01b0381166135dd57604051639fabe1c160e01b815260040160405180910390fd5b60cd80546001600160a01b0319166001600160a01b0383161790556040517feb2ba7073d8ab13643a6179f01ba04f1b7a13d7f13e1f441bbaa78efca23b4649061193b908390615375565b613630614139565b60d38190556040518181527fe1234c40b9946a154de19c53ced4025fa9a4a656cc61779e91d0a9c791529c6b9060200161193b565b600080613670613062565b9050600061368b82612012670de0b6b3a76400006064615b28565b6136959083615a09565b60d65490915081116136e25760d55481116136ce5760d26000815481106136be576136be615c47565b9060005260206000200154613702565b60d26001815481106136be576136be615c47565b60d26002815481106136f6576136f6615c47565b90600052602060002001545b9250505090565b60ce5460408051632e3fbb9960e21b815290516000926001600160a01b03169163b8feee649160048083019260209291908290030181865afa158015613753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137779190615942565b1561378357600061168c565b6001600160a01b038216600090815260e76020908152604080832060e254845290915290205461168c9060016137b860355490565b6120129190615a09565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6137f56142e3565b6001600160a01b03811661381c57604051639fabe1c160e01b815260040160405180910390fd5b61382461213b565b6001600160a01b0316816001600160a01b03161480613850575060cb546001600160a01b038281169116145b1561386e57604051632635240760e21b815260040160405180910390fd5b60cc80546001600160a01b0319166001600160a01b0383161790556040517f54e4612788f90384e6843298d7854436f3a585b2c3831ab66abf1de63bfa6c2d9061193b908390615375565b6000670de0b6b3a76400006138cd60355490565b6118ad612fda565b60cd5433906001600160a01b03168114613902576040516305f2713d60e31b815260040160405180910390fd5b60f95460009061394590613929906001600160801b0380821691600160801b9004166159be565b6001600160801b031661393b60355490565b8691906001613d6b565b90508060de600082825461395991906159e9565b909155506139679050612fda565b60de54131561398957604051630de1bf7560e21b815260040160405180910390fd5b613991613b17565b8060e060008282546139a391906159e9565b909155505060d45460e05413156139cd576040516375b071b760e01b815260040160405180910390fd5b8360f060008282546139df91906159e9565b925050819055508360ee60008282546139f891906159e9565b90915550613a0690506116b7565b613a0e611c99565b613a20613a19614574565b848661491a565b826001600160a01b0316826001600160a01b03167f17ffe64fb2212f31d60284d6471e06abb7db8d66f0a60f9b884b29f1597d05da86604051613a6591815260200190565b60405180910390a350505050565b613ab56040518060c0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b50600090815260e96020908152604091829020825160c08101845281546001600160a01b03168152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015260059091015460a082015290565b6201518060e15442613b299190615a09565b10611d3857600060e08190554260e1556040517fa047de172c12fcf40e0ff45a86ac45befb232ae644862699ef140a8c5f763b419190a1565b600083613b6e81614387565b83613b788161468c565b6000613b8d670de0b6b3a76400006064615b28565b613b9e613b98613062565b88613519565b613bb1670de0b6b3a76400006064615b28565b613bbb91906159ab565b613bc59089615b28565b613bcf9190615b55565b9050613bda85611aa7565b811115613bfa57604051630ad1e31b60e01b815260040160405180910390fd5b612dcb8188613c0884613102565b89896146f7565b613c17614139565b6001600160a01b038116613c41576000604051631e4fbdf760e01b8152600401611a0f9190615375565b60cb546001600160a01b0382811691161480613c6a575060cc546001600160a01b038281169116145b15613c8857604051632635240760e21b815260040160405180910390fd5b61176f8161450c565b613c99614139565b8051602082015111613cbe5760405163bd95487760e01b815260040160405180910390fd5b613ccb60d58260026151e5565b507f8472b50e25b52d8de564f9719bd793b18d83cf59ce4d309e211fb6a4fdc148118160405161193b9190615d99565b613d036142e3565b613d16670de0b6b3a76400006032615b28565b811115613d3657604051630ad1e31b60e01b815260040160405180910390fd5b60d78190556040518181527f484c943d66ffcec2016496d14da4bca3a349f387e1208e697f274612de7299c19060200161193b565b600080613d79868686614939565b90506001836002811115613d8f57613d8f615dca565b148015613dac575060008480613da757613da7615b3f565b868809115b15613dbf57613dbc6001826159ab565b90505b90505b949350505050565b600060dd5413613ddb576000613ddf565b60dd545b613de7612fda565b613df19190615a09565b60dc8190556040519081527f547c25b7a5677a006ff044a0e4b5e699598339825e7b42d3dc645117ceee805090602001611d2f565b6001600160a01b038316613e8a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611a0f565b6001600160a01b038216613eec5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611a0f565b6001600160a01b03831660009081526033602052604090205481811015613f645760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401611a0f565b6001600160a01b038085166000818152603360205260408082208686039055928616808252908390208054860190559151600080516020615f7883398151915290613a659086815260200190565b50505050565b600060001983148015613fd55750670de0b6b3a764000060dc5410155b15613fe157508161168c565b60dc5461199a908490670de0b6b3a764000085613d6b565b6001600160a01b03831661405b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611a0f565b6001600160a01b0382166140bc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611a0f565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60dc5460009061199a908490670de0b6b3a76400009085613d6b565b3361414261213b565b6001600160a01b031614611d385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611a0f565b60006141a484846137c2565b90506000198114613fb257818110156141ff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401611a0f565b613fb28484848403613ff9565b60008060655461124a9190600160a01b900460ff16615de0565b60408051808201909152600080825260208201526000826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561427a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061429e9190615df9565b60ff1690506142ae81600a615f00565b6001600160801b031682526142c4816012615a09565b6142cf90600a615f00565b6001600160801b0316602083015250919050565b60cb546001600160a01b0316336001600160a01b031614611d385760405163605919ad60e11b815260040160405180910390fd5b60c9546000906001600160a01b031661432e6119c2565b6001600160a01b031614905090565b60006143476119c2565b905061435281614a23565b156143735761436e6001600160a01b0382168484619c40614a5a565b505050565b61436e6001600160a01b0382168484614b34565b60dc546000036143aa57604051637294708f60e11b815260040160405180910390fd5b8060000361176f57604051630b13e60d60e31b815260040160405180910390fd5b60006143d660355490565b9050600060de54121561442157816143f7576143f28482615a09565b614401565b61440184826159ab565b8160de5461440f9190615bd0565b6144199190615c00565b60de55614476565b600060de54131561447657816144395760001961443c565b60015b8160f0548661444b9190615bd0565b6144559190615c00565b61445f9190615bd0565b60f0600082825461447091906159e9565b90915550505b8161448e578260ed546144899190615a09565b61449c565b8260ed5461449c91906159ab565b60ed5550505050565b6065546144bd906001600160a01b031685308561457e565b6144c78382614b48565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051613a659291906153e7565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081831061456d578161199a565b5090919050565b600061124a6119c2565b6040516001600160a01b0380851660248301528316604482015260648101829052613fb29085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614bf7565b6001600160a01b03163b151590565b600054610100900460ff1661461f5760405162461bcd60e51b8152600401611a0f90615f0c565b6146298282614ccc565b5050565b600054610100900460ff166146545760405162461bcd60e51b8152600401611a0f90615f0c565b61176f81614d0c565b600054610100900460ff166146845760405162461bcd60e51b8152600401611a0f90615f0c565b611d38614d91565b60da546000036146af576040516350725e4f60e01b815260040160405180910390fd5b60d1548110156146d2576040516310906acb60e01b815260040160405180910390fd5b6301e1338081111561176f57604051630ad1e31b60e01b815260040160405180910390fd5b60008486116147195760405163a4e993e160e01b815260040160405180910390fd5b600060e86000815461472a90615c2e565b91829055509050600061473d8789615a09565b600083815260e96020526040902080546001600160a01b0319166001600160a01b0387161781556001808201899055600282018a90556003820183905542600483015560058201889055919250906147989088908a906143cb565b336147a581308b8b6144a5565b8260f260008282546147b791906159ab565b925050819055508260f160008282546147d091906159ab565b909155505060ca546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906148079089908890600401615bb7565b600060405180830381600087803b15801561482157600080fd5b505af1158015614835573d6000803e3d6000fd5b505083546040516001600160a01b03918216935090841691507f5d26cdffbd8401ba2a961d2094f7f008ee7bd735ac02a949721ee0fd0f0d5afc9061487d9088908790615a1c565b60405180910390a3509198975050505050505050565b826001600160a01b0316856001600160a01b0316146148b7576148b7838683614198565b6148c18382614dc1565b6148cb848361433d565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db85856040516126589291906153e7565b61436e8363a9059cbb60e01b84846040516024016145b2929190615bb7565b60008080600019858709858702925082811083820303915050806000036149735783828161496957614969615b3f565b049250505061199a565b8084116149ba5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401611a0f565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b60006001600160a01b0382161580159061168c5750614a40614ee3565b6001600160a01b0316826001600160a01b03161492915050565b604051632e1a7d4d60e01b8152600481018390526001600160a01b03851690632e1a7d4d90602401600060405180830381600087803b158015614a9c57600080fd5b505af1158015614ab0573d6000803e3d6000fd5b505050506000806000806000868887f190508015614ace5750613fb2565b846001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015614b0957600080fd5b505af1158015614b1d573d6000803e3d6000fd5b5050505050614b2d858585614b34565b5050505050565b61436e6001600160a01b038416838361491a565b6001600160a01b038216614b9e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611a0f565b8060356000828254614bb091906159ab565b90915550506001600160a01b038216600081815260336020908152604080832080548601905551848152600080516020615f78833981519152910160405180910390a35050565b6000614c4c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614f939092919063ffffffff16565b9050805160001480614c6d575080806020019051810190614c6d9190615978565b61436e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611a0f565b600054610100900460ff16614cf35760405162461bcd60e51b8152600401611a0f90615f0c565b6036614cff8382615cad565b50603761436e8282615cad565b600054610100900460ff16614d335760405162461bcd60e51b8152600401611a0f90615f0c565b600080614d3f83614fa2565b9150915081614d4f576012614d51565b805b606580546001600160a01b039095166001600160a01b031960ff93909316600160a01b02929092166001600160a81b031990951694909417179092555050565b600054610100900460ff16614db85760405162461bcd60e51b8152600401611a0f90615f0c565b611d383361450c565b6001600160a01b038216614e215760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401611a0f565b6001600160a01b03821660009081526033602052604090205481811015614e955760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401611a0f565b6001600160a01b0383166000818152603360209081526040808320868603905560358054879003905551858152919291600080516020615f78833981519152910160405180910390a3505050565b600061a4b14603614f0757507382af49447d8a07e3bd95bd0d56f35241523fbab190565b6121054603614f1c57506006602160991b0190565b6181734603614f3957506e0f7e000644657dc9417b185962645a90565b60894603614f5a5750730d500b1d8e8ef31e21c99d1db9a6444d3adf127090565b62066eee4603614f7d575073980b62da83eff3d4576c647993b0c1d7faf17c7390565b617a694603614f8d57506101a590565b50600090565b6060613dc2848460008561507e565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000918291829182916001600160a01b03871691614fe991615a9a565b600060405180830381855afa9150503d8060008114615024576040519150601f19603f3d011682016040523d82523d6000602084013e615029565b606091505b509150915081801561503d57506020815110155b15615071576000818060200190518101906150589190615942565b905060ff811161506f576001969095509350505050565b505b5060009485945092505050565b6060824710156150df5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611a0f565b600080866001600160a01b031685876040516150fb9190615a9a565b60006040518083038185875af1925050503d8060008114615138576040519150601f19603f3d011682016040523d82523d6000602084013e61513d565b606091505b5091509150612dcb87838387606083156151b65782516000036151af57615163856145e9565b6151af5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611a0f565b5081613dc2565b613dc283838151156151cb5781518083602001fd5b8060405162461bcd60e51b8152600401611a0f919061531d565b8260028101928215615213579160200282015b828111156152135782518255916020019190600101906151f8565b5061521f929150615263565b5090565b828054828255906000526020600020908101928215615213579160200282015b82811115615213578251829060ff16905591602001919060010190615243565b5b8082111561521f5760008155600101615264565b6001600160a01b038116811461176f57600080fd5b803561529881615278565b919050565b600080604083850312156152b057600080fd5b8235915060208301356152c281615278565b809150509250929050565b60005b838110156152e85781810151838201526020016152d0565b50506000910152565b600081518084526153098160208601602086016152cd565b601f01601f19169290920160200192915050565b60208152600061199a60208301846152f1565b60006020828403121561534257600080fd5b5035919050565b6000806040838503121561535c57600080fd5b823561536781615278565b946020939093013593505050565b6001600160a01b0391909116815260200190565b60006020828403121561539b57600080fd5b813561199a81615278565b6000806000606084860312156153bb57600080fd5b83356153c681615278565b925060208401356153d681615278565b929592945050506040919091013590565b918252602082015260400190565b6001600160a01b0383168152604060208201819052600090613dc2908301846152f1565b6000806040838503121561542c57600080fd5b50508035926020909101359150565b801515811461176f57600080fd5b60008060006060848603121561545e57600080fd5b83359250602084013561547081615278565b915060408401356154808161543b565b809150509250925092565b6000806000606084860312156154a057600080fd5b8335925060208401356153d681615278565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156154ea576154ea6154b2565b60405290565b60405161012081016001600160401b03811182821017156154ea576154ea6154b2565b60006001600160401b038084111561552d5761552d6154b2565b604051601f8501601f19908116603f01168101908282118183101715615555576155556154b2565b8160405280935085815286868601111561556e57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261559957600080fd5b61199a83833560208501615513565b6000604082840312156155ba57600080fd5b6155c26154c8565b905081356001600160401b03808211156155db57600080fd5b6155e785838601615588565b835260208401359150808211156155fd57600080fd5b5061560a84828501615588565b60208301525092915050565b60006040828403121561562857600080fd5b6156306154c8565b9050813561563d81615278565b815260208201356001600160401b0381111561565857600080fd5b8201601f8101841361566957600080fd5b61560a84823560208401615513565b6000610120828403121561568b57600080fd5b6156936154f0565b905061569e8261528d565b81526156ac6020830161528d565b60208201526156bd6040830161528d565b60408201526156ce6060830161528d565b60608201526156df6080830161528d565b60808201526156f060a0830161528d565b60a082015261570160c0830161528d565b60c082015261571260e0830161528d565b60e0820152610100828101356001600160401b0381111561573257600080fd5b61573e85828601615616565b82840152505092915050565b600082601f83011261575b57600080fd5b6157636154c8565b80604084018581111561577557600080fd5b845b8181101561578f578035845260209384019301615777565b509095945050505050565b60008060008060008060008060008060006101808c8e0312156157bc57600080fd5b6001600160401b038c358110156157d257600080fd5b6157df8e8e358f016155a8565b9b508060208e013511156157f257600080fd5b506158038d60208e01358e01615678565b995060408c0135985060608c0135975060808c013596506158278d60a08e0161574a565b9a9d999c50979a9699959895975050505060e08401359361010081013593610120820135935061014082013592506101609091013590565b60008060006060848603121561587457600080fd5b8335925060208401359150604084013561548081615278565b6000806000606084860312156158a257600080fd5b8335925060208401356158b481615278565b9150604084013561548081615278565b6000602082840312156158d657600080fd5b81356001600160401b038111156158ec57600080fd5b613dc284828501615616565b6000806040838503121561590b57600080fd5b823561591681615278565b915060208301356152c281615278565b60006040828403121561593857600080fd5b61199a838361574a565b60006020828403121561595457600080fd5b5051919050565b60006020828403121561596d57600080fd5b815161199a81615278565b60006020828403121561598a57600080fd5b815161199a8161543b565b634e487b7160e01b600052601160045260246000fd5b8082018082111561168c5761168c615995565b6001600160801b038181168382160280821691908281146159e1576159e1615995565b505092915050565b80820182811260008312801582168215821617156159e1576159e1615995565b8181038181111561168c5761168c615995565b91825280546001600160a01b03166020830152600181015460408301526002810154606083015260038101546080830152600481015460a08301526005015460c082015260e00190565b600181811c90821680615a7a57607f821691505b602082108103612d1857634e487b7160e01b600052602260045260246000fd5b60008251615aac8184602087016152cd565b9190910192915050565b6000615ac28254615a66565b82601f821115615ad85783600052602060002090505b546001600160e01b031980821693506004831015615b005780818460040360031b1b83161693505b505050919050565b8181036000831280158383131683831282161715611f1557611f15615995565b808202811582820484141761168c5761168c615995565b634e487b7160e01b600052601260045260246000fd5b600082615b6457615b64615b3f565b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160a01b03929092168252602082015260400190565b80820260008212600160ff1b84141615615bec57615bec615995565b818105831482151761168c5761168c615995565b600082615c0f57615c0f615b3f565b600160ff1b821460001984141615615c2957615c29615995565b500590565b600060018201615c4057615c40615995565b5060010190565b634e487b7160e01b600052603260045260246000fd5b601f82111561436e576000816000526020600020601f850160051c81016020861015615c865750805b601f850160051c820191505b81811015615ca557828155600101615c92565b505050505050565b81516001600160401b03811115615cc657615cc66154b2565b615cda81615cd48454615a66565b84615c5d565b602080601f831160018114615d0f5760008415615cf75750858301515b600019600386901b1c1916600185901b178555615ca5565b600085815260208120601f198616915b82811015615d3e57888601518255948401946001909101908401615d1f565b5085821015615d5c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282516001600160a01b031682820152820151604080830152600090613dc260608401826152f1565b60408101818360005b6002811015615dc1578151835260209283019290910190600101615da2565b50505092915050565b634e487b7160e01b600052602160045260246000fd5b60ff818116838216019081111561168c5761168c615995565b600060208284031215615e0b57600080fd5b815160ff8116811461199a57600080fd5b600181815b80851115615e57578160001904821115615e3d57615e3d615995565b80851615615e4a57918102915b93841c9390800290615e21565b509250929050565b600082615e6e5750600161168c565b81615e7b5750600061168c565b8160018114615e915760028114615e9b57615eb7565b600191505061168c565b60ff841115615eac57615eac615995565b50506001821b61168c565b5060208310610133831016604e8410600b8410161715615eda575081810a61168c565b615ee48383615e1c565b8060001904821115615ef857615ef8615995565b029392505050565b600061199a8383615e5f565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fe7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220dbb75fa659abbd63799a72e49869d6c8e2fcb17e117f5fb0f4a88b572af77c8264736f6c63430008170033