0 txs
803.4k calls
constructor
constructor()
functions
getAccFundingFeesLong
viewfunction getAccFundingFeesLong(uint16 pairIndex) view returns (int256)
getAccFundingFeesShort
viewfunction getAccFundingFeesShort(uint16 pairIndex) view returns (int256)
getAccFundingFeesUpdateBlock
viewfunction getAccFundingFeesUpdateBlock(uint16 pairIndex) view returns (uint256)
getAccRolloverFees
viewfunction getAccRolloverFees(uint16 pairIndex) view returns (uint256)
getAccRolloverFeesUpdateBlock
viewfunction getAccRolloverFeesUpdateBlock(uint16 pairIndex) view returns (uint256)
getFrSpringFactor
viewfunction getFrSpringFactor(uint16 pairIndex) view returns (uint64)
getHillFunctionParams
viewfunction getHillFunctionParams(uint16 pairIndex) view returns (int256, uint16, uint16)
getOpeningFee
viewfunction getOpeningFee(uint16 pairIndex, int256 leveragedPositionSize, uint32 leverage, int256 oiDelta) view returns (uint256 devFee, uint256 vaultFee)
getPendingAccFundingFees
viewfunction getPendingAccFundingFees(uint16 pairIndex) view returns (int256, int256, int64, int256)
getPendingAccRolloverFees
viewfunction getPendingAccRolloverFees(uint16 pairIndex) view returns (uint256)
getRolloverFeePerBlock
viewfunction getRolloverFeePerBlock(uint16 pairIndex) view returns (uint256)
getTradeFundingFee
viewfunction getTradeFundingFee(address trader, uint16 pairIndex, uint8 index, bool long, uint256 collateral, uint32 leverage) view returns (int256, int256)
getTradeFundingFeePure
purefunction getTradeFundingFeePure(int256 accFundingFeesPerOi, int256 endAccFundingFeesPerOi, uint256 collateral, uint32 leverage) pure returns (int256)
getTradeInitialAccFundingFeesPerOi
viewfunction getTradeInitialAccFundingFeesPerOi(address trader, uint16 pairIndex, uint8 index) view returns (int256)
getTradeInitialAccRolloverFeesPerCollateral
viewfunction getTradeInitialAccRolloverFeesPerCollateral(address trader, uint16 pairIndex, uint8 index) view returns (uint256)
getTradeLiquidationMargin
viewfunction getTradeLiquidationMargin(uint256 collateral, uint32 leverage, uint32 maxLeverage) view returns (uint256)
getTradeLiquidationPrice
viewfunction getTradeLiquidationPrice(address trader, uint16 pairIndex, uint8 index, uint256 openPrice, bool long, uint256 collateral, uint32 leverage, uint32 maxLeverage) view returns (uint256)
getTradeLiquidationPricePure
viewfunction getTradeLiquidationPricePure(uint256 openPrice, bool long, uint256 collateral, uint32 leverage, uint256 rolloverFee, int256 fundingFee, uint32 maxLeverage) view returns (uint256)
getTradeRolloverFee
viewfunction getTradeRolloverFee(address trader, uint16 pairIndex, uint8 index, uint256 collateral, uint32 leverage) view returns (uint256)
getTradeRolloverFeePure
purefunction getTradeRolloverFeePure(uint256 accRolloverFeesPerCollateral, uint256 endAccRolloverFeesPerCollateral, uint256 collateral, uint32 leverage) pure returns (uint256)
getTradeValuePure
purefunction getTradeValuePure(uint256 collateral, int256 percentProfit, uint256 rolloverFee, int256 fundingFee, uint256 liqMarginValue) pure returns (uint256)
liqMarginThresholdP
viewfunction liqMarginThresholdP() view returns (uint8)
manager
viewfunction manager() view returns (address)
maxNegativePnlOnOpenP
viewfunction maxNegativePnlOnOpenP() view returns (uint8)
pairFundingFees
viewfunction pairFundingFees(uint16 pairIndex) view returns (int256 accPerOiLong, int256 accPerOiShort, int64 lastFundingRate, int64 hillInflectionPoint, uint64 maxFundingFeePerBlock, uint64 springFactor, uint32 lastUpdateBlock, uint16 hillPosScale, uint16 hillNegScale, uint16 sFactorUpScaleP, uint16 sFactorDownScaleP, int256 lastOiDelta)
pairOpeningFees
viewfunction pairOpeningFees(uint16 pairIndex) view returns (uint32 makerFeeP, uint32 takerFeeP, uint32 usageFeeP, uint16 utilizationThresholdP, uint16 makerMaxLeverage, uint8 vaultFeePercent)
pairRolloverFees
viewfunction pairRolloverFees(uint16 pairIndex) view returns (uint256 accPerOi, uint64 rolloverFeePerBlock, uint64 maxRolloverFeePerBlock, uint32 maxRolloverVolatility, uint32 lastUpdateBlock, uint16 rolloverFeeSlope)
registry
viewfunction registry() view returns (address)
tradeInitialAccFees
viewfunction tradeInitialAccFees(address trader, uint16 pairIndex, uint8 tradeIndex) view returns (uint256 rollover, int256 funding, bool openedAfterUpdate)
getTradeValue
nonpayablefunction getTradeValue(address trader, uint16 pairIndex, uint8 index, bool long, uint256 collateral, uint32 leverage, int256 percentProfit, uint32 maxLeverage) returns (uint256 tradeValue, uint256 liqMarginValue, uint256 r, int256 f)
initialize
nonpayablefunction initialize(address _registry, address _manager, uint256 _liqMarginThresholdP, uint256 _maxNegativePnlOnOpenP)
initializeV2
nonpayablefunction initializeV2(tuple[] value)
initializeV3
nonpayablefunction initializeV3(uint256 _liqMarginThresholdP, uint256 _maxNegativePnlOnOpenP)
setHillFunctionParams
nonpayablefunction setHillFunctionParams(uint16 pairIndex, int256 hillInflectionPoint, uint256 hillPosScale, uint256 hillNegScale)
setHillFunctionParamsArray
nonpayablefunction setHillFunctionParamsArray(uint16[] indices, int256[] hillInflectionPoints, uint256[] hillPosScales, uint256[] hillNegScales)
setLiqMarginThresholdP
nonpayablefunction setLiqMarginThresholdP(uint256 value)
setManager
nonpayablefunction setManager(address _manager)
setMaxFundingFeePerBlock
nonpayablefunction setMaxFundingFeePerBlock(uint16 pairIndex, uint256 value)
setMaxFundingFeePerBlockArray
nonpayablefunction setMaxFundingFeePerBlockArray(uint16[] indices, uint256[] values)
setMaxNegativePnlOnOpenP
nonpayablefunction setMaxNegativePnlOnOpenP(uint256 value)
setMaxRolloverFeePerBlock
nonpayablefunction setMaxRolloverFeePerBlock(uint16 pairIndex, uint256 value)
setMaxRolloverFeePerBlockArray
nonpayablefunction setMaxRolloverFeePerBlockArray(uint16[] indices, uint256[] values)
setMaxRolloverVolatility
nonpayablefunction setMaxRolloverVolatility(uint16 pairIndex, uint256 value)
setMaxRolloverVolatilityArray
nonpayablefunction setMaxRolloverVolatilityArray(uint16[] indices, uint256[] values)
setPairFundingFees
nonpayablefunction setPairFundingFees(uint16 pairIndex, tuple value)
setPairFundingFeesArray
nonpayablefunction setPairFundingFeesArray(uint16[] indices, tuple[] values)
setPairOpeningFees
nonpayablefunction setPairOpeningFees(uint16 pairIndex, tuple value)
setPairOpeningFeesArray
nonpayablefunction setPairOpeningFeesArray(uint16[] indices, tuple[] values)
setPairOpeningVaultFeePercent
nonpayablefunction setPairOpeningVaultFeePercent(uint16 pairIndex, uint8 value)
setPairOpeningVaultFeePercentArray
nonpayablefunction setPairOpeningVaultFeePercentArray(uint16[] indices, uint8[] values)
setPairRolloverFees
nonpayablefunction setPairRolloverFees(uint16 pairIndex, tuple value)
setPairRolloverFeesArray
nonpayablefunction setPairRolloverFeesArray(uint16[] indices, tuple[] values)
setRolloverFeePerBlock
nonpayablefunction setRolloverFeePerBlock(uint16 pairIndex, uint256 volatility)
setRolloverFeePerBlockArray
nonpayablefunction setRolloverFeePerBlockArray(uint16[] indices, uint256[] values)
setRolloverFeeSlope
nonpayablefunction setRolloverFeeSlope(uint16 pairIndex, uint256 value)
setRolloverFeeSlopeArray
nonpayablefunction setRolloverFeeSlopeArray(uint16[] indices, uint256[] values)
storeTradeInitialAccFees
nonpayablefunction storeTradeInitialAccFees(uint256 tradeId, address trader, uint16 pairIndex, uint8 index, bool long)
events
AccFundingFeesStored
event AccFundingFeesStored(uint16 indexed pairIndex, int256 valueLong, int256 valueShort, int64 lastFundingRate, int64 velocity)
AccFundingFeesStoredV2
event AccFundingFeesStoredV2(uint16 indexed pairIndex, int256 valueLong, int256 valueShort, int256 lastOiDelta, int64 lastFundingRate)
AccRolloverFeesStored
event AccRolloverFeesStored(uint16 indexed pairIndex, uint256 value)
FeesCharged
event FeesCharged(uint256 indexed orderId, uint256 indexed tradeId, address indexed trader, uint256 rolloverFees, int256 fundingFees)
FundingFeeSlopeUpdated
event FundingFeeSlopeUpdated(uint16 indexed pairIndex, uint256 value)
HillParamsUpdated
event HillParamsUpdated(uint16 indexed pairIndex, int256 hillInflectionPoint, uint256 hillPosScale, uint256 hillNegScale)
Initialized
event Initialized(uint64 version)
LastVelocityUpdated
event LastVelocityUpdated(uint16 indexed pairIndex, int64 value)
LiqMarginThresholdPUpdated
event LiqMarginThresholdPUpdated(uint256 value)
LiqThresholdPUpdated
event LiqThresholdPUpdated(uint256 value)
ManagerUpdated
event ManagerUpdated(address value)
MaxFundingFeePerBlockUpdated
event MaxFundingFeePerBlockUpdated(uint16 indexed pairIndex, uint256 value)
MaxFundingFeeVelocityUpdated
event MaxFundingFeeVelocityUpdated(uint16 indexed pairIndex, uint256 value)
MaxNegativePnlOnOpenPUpdated
event MaxNegativePnlOnOpenPUpdated(uint256 value)
MaxRolloverFeePerBlockUpdated
event MaxRolloverFeePerBlockUpdated(uint16 indexed pairIndex, uint256 value)
MaxRolloverFeeSlopeUpdated
event MaxRolloverFeeSlopeUpdated(uint16 indexed pairIndex, uint256 value)
MaxRolloverVolatilityUpdated
event MaxRolloverVolatilityUpdated(uint16 indexed pairIndex, uint256 value)
PairFundingFeesUpdated
event PairFundingFeesUpdated(uint16 indexed pairIndex, (int256 accPerOiLong, int256 accPerOiShort, int64 lastFundingRate, int64 lastVelocity, uint64 maxFundingFeePerBlock, uint64 maxFundingFeeVelocity, uint32 lastUpdateBlock, uint16 fundingFeeSlope) value)
PairFundingFeesUpdatedV2
event PairFundingFeesUpdatedV2(uint16 indexed pairIndex, (int256 accPerOiLong, int256 accPerOiShort, int64 lastFundingRate, int64 hillInflectionPoint, uint64 maxFundingFeePerBlock, uint64 springFactor, uint32 lastUpdateBlock, uint16 hillPosScale, uint16 hillNegScale, uint16 sFactorUpScaleP, uint16 sFactorDownScaleP, int256 lastOiDelta) value)
PairOpeningFeesUpdated
event PairOpeningFeesUpdated(uint16 indexed pairIndex, (uint32 makerFeeP, uint32 takerFeeP, uint32 usageFeeP, uint16 utilizationThresholdP, uint16 makerMaxLeverage, uint8 vaultFeePercent) value)
PairRolloverFeesUpdated
event PairRolloverFeesUpdated(uint16 indexed pairIndex, (uint256 accPerOi, uint64 rolloverFeePerBlock, uint64 maxRolloverFeePerBlock, uint32 maxRolloverVolatility, uint32 lastUpdateBlock, uint16 rolloverFeeSlope) value)
RolloverFeePerBlockUpdated
event RolloverFeePerBlockUpdated(uint16 indexed pairIndex, uint256 value, uint256 volatility)
TradeInitialAccFeesStored
event TradeInitialAccFeesStored(uint256 indexed tradeId, address indexed trader, uint16 indexed pairIndex, uint8 index, uint256 rollover, int256 funding)
VaultFeePercentUpdated
event VaultFeePercentUpdated(uint16 indexed pairIndex, uint8 value)
errors
InvalidInitialization
error InvalidInitialization()
NotCallbacks
error NotCallbacks(address a)
NotGov
error NotGov(address a)
NotInitializing
error NotInitializing()
NotManager
error NotManager(address a)
SafeCastOverflowedIntDowncast
error SafeCastOverflowedIntDowncast(uint8 bits, int256 value)
SafeCastOverflowedIntToUint
error SafeCastOverflowedIntToUint(int256 value)
SafeCastOverflowedUintDowncast
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)
SafeCastOverflowedUintToInt
error SafeCastOverflowedUintToInt(uint256 value)
WrongParams
error WrongParams()
creation bytecode
0x60808060405234620000bd577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c16620000ae57506001600160401b036002600160401b03198282160162000068575b6040516149ce9081620000c38239f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a138808062000058565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80629d87e414612ef1578063045b6dfc14612eb0578063136888b914612dee57806316623cc414612d2e5780632954bde914612ce657806334cd431a14612c1e5780633e845e0514612ab4578063435ecd2a1461282b578063461c0b1e146127b1578063481c6a751461278857806349e420be14612753578063501153401461271257806352d9ceca146126ee5780635741fc27146125e55780635b152961146125a75780635b60b2a51461239e5780636269f5d3146122dc5780636355a74f146122a757806365611391146121c157806368a6c0cc1461213d57806368d0376314611edf5780636d4ee39914611e0657806376c9942714611de25780637884274f14611dbe5780637b10399914611d955780637b13320714611c9c5780637f46e33014611b3957806380f6cfc214611b1557806382a9e53014611af25780638532f6db14611ac65780638784f9d8146118b95780638c4205ad1461188d5780638e0e38c1146118245780638f306244146117575780639533cb40146116b75780639becf5f714611679578063a66e9991146115cc578063a8e537911461133b578063aad7aa8f14610f08578063badd34cc14610e94578063c22ff7bf14610e6a578063c6398d2d14610ddc578063c64d8bd314610cba578063cec669c814610a8b578063cfd0681214610a06578063d0ebdbe7146109db578063d5ce50a11461096f578063dae9316a14610937578063dd28707114610900578063df776dcf1461084f578063e57dd73c14610633578063eb446a5d146105a6578063eb990c591461043f578063ebc01793146103e5578063ef6c7292146103aa578063fcd13fb1146103695763fdbd95661461028e57600080fd5b346103645761029c366130ed565b916102a8939193614176565b8281036103525760005b8181106102bb57005b6102ce6102c982848661343a565b6133ec565b906102da81868861343a565b356102e3614176565b6406a50bb9718111610352577f03e9bea74ebea59c7ce49462baefba8cb125c2e7f51fabecaeb911b4b18263118361031c6001956141ed565b61ffff610328846142e6565b9116928360005261034560209260048452876040600020016133fb565b604051908152a2016102b2565b604051635863f78960e01b8152600490fd5b600080fd5b346103645760203660031901126103645761ffff61038561308c565b16600052600460205260206001600160401b0360016040600020015416604051908152f35b346103645760203660031901126103645761ffff6103c661308c565b166000526003602052602060026040600020015460c01c604051908152f35b3461036457602036600319011261036457606061ffff8061040461308c565b1660005260036020526040600020906003600283015460401c60070b920154604051928352818160201c16602084015260301c166040820152f35b34610364576080366003190112610364576004356001600160a01b03818116918290036103645761046e613201565b916000805160206149798339815191529283549260ff8460401c1615936001600160401b0381168015908161059e575b6001149081610594575b15908161058b575b506105795767ffffffffffffffff19811660011786558461055a575b50821590811561054f575b5061035257600080546001600160a01b0319169092179091556104f9906148fc565b6105046044356143d7565b61050f6064356147c4565b61051557005b805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b9050811615856104d7565b68ffffffffffffffffff191668010000000000000001178555856104cc565b60405163f92ee8a960e01b8152600490fd5b905015876104b0565b303b1591506104a8565b86915061049e565b34610364576040366003190112610364576105bf61308c565b6024356105ca614176565b6416262714cf81116103525760207fe22d15e875b30a3996cb58b0d48ec7fa07062ac68d1895b80c0cb0601a4fff74916106038461432a565b61062a61ffff610612836142e6565b9516948560005260038452600260406000200161367b565b604051908152a2005b34610364576080366003190112610364576001600160401b03600435818111610364576106649036906004016130bd565b6024358381116103645761067c9036906004016130bd565b92604435858111610364576106959036906004016130bd565b919095606435908111610364576106b09036906004016130bd565b90946106ba614176565b868114801590610845575b801561083b575b6103525760005b8181106106dc57005b6106ea6102c982848761343a565b906106f6818a8961343a565b359161070382888d61343a565b359061071083878c61343a565b359061071a614176565b670de0b6b3a764000061072c86614319565b118015610831575b8015610827575b610352576001947f5f0697ef06a1d5ab171244734ec92f423d93c40a9a03d432e2af3f657c1706df9261ffff8361077360609561432a565b16948560005260036108126020918083526107ee6040600020916107c361079989614456565b600285019081549060401b6001600160401b0360401b16906001600160401b0360401b1916179055565b6107cc86614485565b920191829065ffff0000000082549160201b169065ffff000000001916179055565b6107f785614485565b61ffff60301b82549160301b169061ffff60301b1916179055565b6040519384528301526040820152a2016106d3565b5060fa821161073b565b5060fa8311610734565b50818114156106cc565b50838114156106c5565b3461036457604036600319011261036457600080516020614979833981519152805460ff8160401c1680156108ec575b6105795768ffffffffffffffffff1916680100000000000000031781556108a76004356143d7565b6108b26024356147c4565b805460ff60401b19169055604051600381527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b5060036001600160401b038216101561087f565b3461036457606036600319011261036457602061092f61091e6131a1565b6109266131b4565b90600435614116565b604051908152f35b346103645760203660031901126103645761ffff61095361308c565b1660005260036020526020600160406000200154604051908152f35b34610364576060366003190112610364576109886131eb565b61099061309d565b610998613217565b9160018060a01b0316600052600560205261ffff6040600020911660005260205260ff604060002091166000526020526020600160406000200154604051908152f35b3461036457602036600319011261036457610a046109f76131eb565b6109ff614176565b6148fc565b005b3461036457606036600319011261036457610a1f6131eb565b610a2761309d565b610a2f613217565b9160018060a01b0316600052600560205261ffff6040600020911660005260205260ff604060002091166000526020526060604060002080549060ff600260018301549201541690604051928352602083015215156040820152f35b3461036457610a9936613227565b91610aa5939193614176565b8281036103525760005b818110610ab857005b610ac66102c982848661343a565b90610ad2818688613fb6565b610ada614176565b6298968063ffffffff610aef6060840161330a565b16118015610c98575b8015610c7e575b8015610c64575b610352577f658b7e99eddf4a030f30d69deab82353dfd53b49a1929f620b8a7dd6e110df6c60c061ffff858160019716600052600460205263ffffffff876040600020015460a01c16610c56575b818116600052600460205281610c476040600020610b9d8a610b7860608b0161330a565b9201805463ffffffff60801b191660809390931b63ffffffff60801b16929092178255565b6040880197610bb4610bae8a61335d565b836133fb565b610be160a0820192610bc5846133ec565b815461ffff60c01b191660c09190911b61ffff60c01b16179055565b6040519881358a52610c0e610bf860208401613426565b916001600160401b0380931660208d0152613426565b1660408a015263ffffffff610c25606083016131da565b1660608a015263ffffffff610c3d60808093016131da565b16908901526130ae565b1660a08601521692a201610aaf565b610c5f816141ed565b610b54565b506103e861ffff610c7760a084016133ec565b1611610b06565b50606461ffff610c9060a084016133ec565b161115610aff565b506406a50bb9716001600160401b03610cb36040840161335d565b1611610af8565b3461036457610100366003190112610364576080610cd66131eb565b610cde61309d565b80610ce7613217565b92610d9e84610cf4613146565b610d92610d8960843593848094610d30610d0c613168565b80978195610d29610d1b6131c7565b9f610d24614843565b61432a565b8d8d6137e7565b998a9960018060a01b031660005260209c8d916005835261ffff6040600020911692836000525260ff604060002091166000528d5260016040600020015491600014610dc65760005260038c5260406000205490614023565b96879284614116565b93849260c435906140cd565b9381851115610dbd575b60405194855284015260408301526060820152f35b60009450610da8565b60005260038c5260016040600020015490614023565b3461036457604036600319011261036457610df561308c565b6024359060ff82169081830361036457610e0d614176565b60648211610352577f9f4894085cf90beb7f90a25265bfcccf92ba8d01412098f3b87307609591b1ee9161062a61ffff6020931694856000526002845260406000209081549060ff60801b9060801b169060ff60801b1916179055565b346103645760a036600319011261036457602061092f6084356064356044356024356004356140cd565b346103645760203660031901126103645760c061ffff80610eb361308c565b16600052600260205260ff60406000205463ffffffff92604051938083168552808360201c1660208601528260401c166040850152808260601c1660608501528160701c16608084015260801c1660a0820152f35b34610364576020366003190112610364576004356001600160401b03811161036457610f3890369060040161328d565b6000805160206149798339815191525460ff8160401c168015611327575b6105795768ffffffffffffffffff191668010000000000000002176000805160206149798339815191525560005b8161ffff821610156112d3576416262714cf6001600160401b03610fb86080610fb261ffff861687896140bc565b0161335d565b161180156112a4575b8015611253575b8015611234575b8015611214575b80156111f3575b80156111d2575b6103525761ffff81166000526111586003806020526110bc6040600020916110a26110196080610fb261ffff89168a8c6140bc565b61102760028601918261367b565b61106e611044606061103e61ffff8b168c8e6140bc565b0161366d565b825460409190911b67ffffffffffffffff60401b1667ffffffffffffffff60401b19909116178255565b61108260a0610fb261ffff8a168b8d6140bc565b81546001600160c01b031660c09190911b6001600160c01b031916179055565b6107cc60e06110b661ffff8816898b6140bc565b016133ec565b6110f36110d46101006110b661ffff8716888a6140bc565b825467ffff000000000000191660309190911b61ffff60301b16178255565b61112761110b6101206110b661ffff8716888a6140bc565b825461ffff60401b191660409190911b61ffff60401b16178255565b61113c6101406110b661ffff861687896140bc565b815461ffff60501b191660509190911b61ffff60501b16179055565b61116761ffff821683856140bc565b7ff9554bc3ab2f3efb751f09e7c0acea04ae3f375814288324a6bc5d3762fed2816040518061119b61ffff861694826136b4565b0390a26111a78161432a565b61ffff8091169081146111bc57600101610f84565b634e487b7160e01b600052601160045260246000fd5b5061271061ffff6111ec6101406110b683861687896140bc565b1611610fe4565b5061271061ffff61120d6101206110b683861687896140bc565b1610610fdd565b5060fa61ffff61122d6101006110b683861687896140bc565b1611610fd6565b5060fa61ffff61124c60e06110b683861687896140bc565b1611610fcf565b50670de0b6b3a764000061271061129d6001600160401b0361127f60a0610fb261ffff8816898b6140bc565b1661ffff6112966101206110b68389168a8c6140bc565b16906135fd565b0411610fc8565b50670de0b6b3a76400006112cd6112c5606061103e61ffff861687896140bc565b60070b614319565b11610fc1565b60ff60401b196000805160206149798339815191525416600080516020614979833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160028152a1005b5060026001600160401b0382161015610f56565b34610364576040366003190112610364576001600160401b036004358181116103645761136c9036906004016130bd565b916024358181116103645761138590369060040161328d565b929093611390614176565b8381036103525760005b8181106113a357005b6113b16102c982848661343a565b906113bd8187896140bc565b6113c5614176565b60808101906416262714cf876113da8461335d565b161180156115ad575b8015611578575b801561155f575b8015611545575b801561152a575b801561150f575b610352576114f77ff9554bc3ab2f3efb751f09e7c0acea04ae3f375814288324a6bc5d3762fed281916114eb8661149161ffff600199169687600052611476600261146d6003938460205260406000209485019663ffffffff885416611500575b5061335d565b9201918261367b565b6114856110446060870161366d565b61108260a0860161335d565b6114be6114a060e085016133ec565b825465ffff00000000191660209190911b65ffff0000000016178255565b6114ce6110d461010085016133ec565b6114de61110b61012085016133ec565b61113c61014084016133ec565b604051918291826136b4565b0390a20161139a565b6115099061432a565b38611467565b5061271061ffff61152361014084016133ec565b1611611406565b5061271061ffff61153e61012084016133ec565b16106113ff565b5060fa61ffff61155861010084016133ec565b16116113f8565b5060fa61ffff61157160e084016133ec565b16116113f1565b50670de0b6b3a76400006127106115a68961159560a0860161335d565b1661ffff61129661012087016133ec565b04116113ea565b50670de0b6b3a76400006115c66112c56060840161366d565b116113e3565b34610364576040366003190112610364576115e561308c565b6024356115f0614176565b6103e88111801561166e575b6103525760207f97f1253cb8d407fc87eb16a3db47c297690cc455b6f481b88c294dd7e52f91399161162d846141ed565b61062a61ffff61163c83614485565b951660008181526004855260409020600101805461ffff60c01b191660c09790971b61ffff60c01b1696909617909555565b5060648111156115fc565b346103645760203660031901126103645761ffff61169561308c565b166000526003602052602063ffffffff60036040600020015416604051908152f35b34610364576040366003190112610364576116d061308c565b6024356116db614176565b6298968081116103525760207fe6a31a328db1c177c061dcddad9db8237fdfe555f6ae66012e0addf821531a6191611712846141ed565b61062a61ffff611721836148cc565b951660008181526004855260409020600101805463ffffffff60801b191660809790971b63ffffffff60801b1696909617909555565b346103645760c03660031901126103645760406117726131eb565b61181061177d61309d565b91611786613217565b61178e613146565b90611797613168565b9260018060a01b031660005260056020528560002061ffff861660005260205260ff8660002091166000526020526117fb856000209486516117d881613795565b865481528760ff600260018a015499602085019a8b520154161515910152613869565b96519315905061181d57505b60843591614023565b9082519182526020820152f35b9050611807565b346103645760603660031901126103645761183d6131eb565b61184561309d565b61184d613217565b9160018060a01b0316600052600560205261ffff6040600020911660005260205260ff604060002091166000526020526020604060002054604051908152f35b3461036457608036600319011261036457602061092f6118ab61317b565b60443560243560043561407c565b34610364576118c7366130ed565b916118d3939193614297565b8281036103525760005b8181106118e657005b6118f46102c982848661343a565b9061190081868861343a565b35611909614297565b61ffff8316600052600460205260016040600020015463ffffffff608091821c168210156103525761193a846141ed565b61ffff8416600052600460205260016040600020015490606461196c61ffff8460c01c1663ffffffff85851c166135fd565b0461ffff606319818560c01c1601116111bc5760019583611a2e611a0c611a07611a026040976119fd6119f78c60646119f1817fb19763dc11316a255bce1f35828ad3e1aaa80db820ab60280123b04de25eecf79f61ffff9e8f6119db92816063199160c01c160116906135fd565b049563ffffffff8c8f8160c01c16921c166135fd565b0461361a565b916135c8565b613610565b613627565b61426e565b611a2863ffffffff611a22878660c01c16613644565b1661426e565b90613460565b906000821215611a6a575b505081811660005260046020526001600160401b03878460002001541694835195865260208601521692a2016118dd565b611a8f620f4240916001600160401b03611a86611a95956142c3565b91881c166135fd565b046142e6565b82821660005260046020526001600160401b0388856000200191166001600160401b03198254161790558b80611a39565b3461036457608036600319011261036457602061092f611ae461317b565b604435602435600435614023565b3461036457602036600319011261036457602061092f611b1061308c565b613fc6565b3461036457600036600319011261036457602060ff60015460a81c16604051908152f35b34610364576080366003190112610364576040611b5461308c565b60243590611b606131b4565b91606435600080946000611b748585613491565b129081611c74575b5015611c5757506000611b98611b9284846134e5565b83613491565b12611c235750611bf7606492611bf161ffff611bb7620f424095614319565b925b1695866000526002602052611bd963ffffffff93848a60002054166135fd565b92876000526002602052886000205460201c166135fd565b90613637565b04049060005260026020526118106064611c1b60ff856000205460801c16846135fd565b04809261361a565b606492935080611bf161ffff611c51611c4c620f424096611c46611bf797614319565b956134e5565b614319565b96611bb9565b6064939450611bf79150611bf161ffff611c51620f424095614319565b905063ffffffff61ffff8087166000526002602052886000205460701c169116111587611b7c565b346103645760a036600319011261036457611cb5613201565b60443561ffff811691828203610364576064359060ff821680920361036457600190611cdf613137565b90611ce8614843565b611cf18561432a565b828060a01b031693846000526020906005825260406000208760005282526040600020856000528252611d28604060002091613fc6565b8082559215611d7d5786600052600382526040600020549384915b015560405193845283015260408201527fff76db7d9b9150d35d9fbd4b4298ff8f80294fac259c42525371502988491f45606060043592a4005b86600052600382528360406000200154938491611d43565b34610364576000366003190112610364576000546040516001600160a01b039091168152602090f35b3461036457602036600319011261036457611dd7614176565b610a046004356147c4565b3461036457600036600319011261036457602060ff60015460a01c16604051908152f35b3461036457611e14366130ed565b91611e20939193614176565b8281036103525760005b818110611e3357005b611e416102c982848661343a565b90611e4d81868861343a565b35611e56614176565b629896808111610352577fe6a31a328db1c177c061dcddad9db8237fdfe555f6ae66012e0addf821531a6183611e8d6001956141ed565b61ffff611e99846148cc565b91169283600052611ed260209260048452876040600020019081549063ffffffff60801b9060801b169063ffffffff60801b1916179055565b604051908152a201611e2a565b3461036457611eed36613227565b91611ef9939193614176565b8281036103525760005b818110611f0c57005b611f1a6102c982848661343a565b90611f26818688613fb6565b91611f2f614176565b63ffffffff629896808082611f438761330a565b1611908115612125575b811561210e575b5080156120f3575b80156120d9575b80156120c1575b6103525761ffff8092169182600052602091600283528160406000209382611f918961330a565b16928554828a019282611fa38561330a565b821b67ffffffff00000000169460408d01938d63ffffffff60401b611fc78761330a565b60401b16606082019861ffff60601b611fdf8b6133ec565b60601b16926080019b8c61ffff60701b90611ff9906133ec565b60701b16946001600160801b03191617171717178a5560a08d019961201d8b6135ba565b815460ff60801b191660809190911b60ff60801b16179055816040519d612043906131da565b168d5261204f906131da565b16908b015261205d906131da565b16604089015261206c906130ae565b16606087015261207b906130ae565b166080850152359260ff84168094036103645760c08160019560a07f3e901f4a36e7424e3d446d7e034ba9074127729e9026463350c0c2b5e71d2a13940152a201611f03565b50606460ff6120d260a087016135ba565b1611611f6a565b5061271061ffff6120ec608087016133ec565b1611611f63565b5061271061ffff612106606087016133ec565b161015611f5c565b90508161211d6040870161330a565b161189611f54565b809150826121356020880161330a565b161190611f4d565b346103645760403660031901126103645761215661308c565b602435612161614176565b6406a50bb97181116103525760207f03e9bea74ebea59c7ce49462baefba8cb125c2e7f51fabecaeb911b4b18263119161219a846141ed565b61062a61ffff6121a9836142e6565b951694856000526004845260016040600020016133fb565b34610364576121cf366130ed565b916121db939193614176565b8281036103525760005b8181106121ee57005b6121fc6102c982848661343a565b9061220881868861343a565b35612211614176565b6103e88111801561229c575b610352577f97f1253cb8d407fc87eb16a3db47c297690cc455b6f481b88c294dd7e52f91398361224e6001956141ed565b61ffff61225a84614485565b9116928360005261228f60209260048452876040600020019081549061ffff60c01b9060c01b169061ffff60c01b1916179055565b604051908152a2016121e5565b50606481111561221d565b346103645760203660031901126103645761ffff6122c361308c565b1660005260046020526020604060002054604051908152f35b346103645761010036600319011261036457602061092f6122fb6131eb565b61230361309d565b9061230c613217565b61238d612317613137565b9160a43591829161232661318e565b9384916123316131c7565b98612387848461234084613869565b50506001600160a01b038e16600090815260056020908152604080832061ffff8a168452825280832060ff8b16845290915290206001015491908d15612396575090614023565b986137e7565b92606435613501565b905090614023565b346103645760e0366003190112610364576123b761308c565b60c0366023190112610364576123cb614176565b63ffffffff6298968080826123de6132d1565b1611908115612593575b8115612580575b508015612569575b8015612553575b801561253f575b6103525761ffff809216918260005260026020526124b360406000208361242a6132d1565b1681549067ffffffff0000000061243f6132e4565b60201b1663ffffffff60401b6124536132f7565b60401b16906124606133ca565b9261ffff60701b61246f6133db565b60701b16946001600160801b0319161717179061ffff60601b9060601b16171781556124996135aa565b815460ff60801b191660809190911b60ff60801b16179055565b60405191806124c06131a1565b168352806124cc6131b4565b1660208401526124da61317b565b16604083015260843581811680910361036457606083015260a43590811680910361036457608082015260c43560ff8116809103610364578160c09160a07f3e901f4a36e7424e3d446d7e034ba9074127729e9026463350c0c2b5e71d2a13940152a2005b50606460ff61254c6135aa565b1611612405565b5061271061ffff6125626133db565b16116123fe565b5061271061ffff6125786133ca565b1610156123f7565b90508161258b6132f7565b1611836123ef565b8091508261259f6132e4565b1611906123e8565b346103645760203660031901126103645760806125ca6125c561308c565b613869565b91604051938452602084015260070b60408301526060820152f35b34610364576080366003190112610364576125fe61308c565b6024356044359160643591612611614176565b670de0b6b3a764000061262382614319565b1180156126e4575b80156126da575b610352577f5f0697ef06a1d5ab171244734ec92f423d93c40a9a03d432e2af3f657c1706df9261ffff8361266760609561432a565b16948560005260036020526126c760406000206126b061268686614456565b600283019081549060401b6001600160401b0360401b16906001600160401b0360401b1916179055565b6126be60036107cc85614485565b6107f784614485565b60405192835260208301526040820152a2005b5060fa8311612632565b5060fa841161262b565b3461036457602036600319011261036457612707614176565b610a046004356143d7565b346103645760a036600319011261036457602061092f6127306131eb565b61273861309d565b90612741613217565b612749613155565b92606435926137e7565b346103645760203660031901126103645761ffff61276f61308c565b1660005260036020526020604060002054604051908152f35b34610364576000366003190112610364576001546040516001600160a01b039091168152602090f35b346103645760203660031901126103645760c061ffff806127d061308c565b166000526004602052604060002090600182549201546001600160401b0363ffffffff9060405194855280831660208601528260401c166040850152808260801c1660608501528160a01c166080840152831c1660a0820152f35b34610364576101a03660031901126103645761284561308c565b610180806023193601126103645761285b614176565b6001600160401b03906416262714cf82612873613331565b16118015612a99575b8015612a6d575b8015612a58575b8015612a43575b8015612a2d575b8015612a17575b6103525761ffff918284169384600052600360205261291d60406000206128f4600382019163ffffffff9485845416612a08575b506128e1600261146d613331565b6128ec61104461365d565b611082613347565b6128ff6114a0613394565b61290a6110d46133a6565b61291561110b613382565b61113c6133b8565b60405191602435835260443560208401526064358060070b8091036103645760408401526084358060070b80910361036457606084015260a43581811680910361036457608084015260c4359081168091036103645760a083015260e4359081168091036103645760c0820152610104358381168091036103645760e08201526101243583811680910361036457610100820152610144358381168091036103645761012082015261016435928316809303610364577ff9554bc3ab2f3efb751f09e7c0acea04ae3f375814288324a6bc5d3762fed2819261014082015261018435610160820152a2005b612a119061432a565b896128d3565b5061271061ffff612a266133b8565b161161289f565b5061271061ffff612a3c613382565b1610612898565b5060fa61ffff612a516133a6565b1611612891565b5060fa61ffff612a66613394565b161161288a565b50670de0b6b3a7640000612710612a9284612a86613347565b1661ffff611296613382565b0411612883565b50670de0b6b3a7640000612aae6112c561365d565b1161287c565b3461036457604036600319011261036457612acd61308c565b60243590612ad9614297565b61ffff8082169283600052600460205263ffffffff928360016040600020015460801c1682101561035257612b0d906141ed565b8360005260046020526001604060002001546001600160401b0390848160801c1693808260c01c166064612b4182886135fd565b049060631981018381116111bc577fb19763dc11316a255bce1f35828ad3e1aaa80db820ab60280123b04de25eecf798611a22612bac611a07611a0260409c6119fd6119f78e60648f9d8c82612bb29f612ba590611a289f946119f19516906135fd565b04966135fd565b93613644565b6000811215612bdf575b5050508460005260046020526001836000200154169082519182526020820152a2005b612bf492620f424092611a86611a8f936142c3565b856000526004602052816001856000200191166001600160401b0319825416179055858181612bbc565b3461036457612c2c366130ed565b9092612c36614176565b8183036103525760005b838110612c4957005b612c576102c982868561343a565b90612c6b612c6682868961343a565b6135ba565b91612c74614176565b60ff831690606482116103525760019361ffff7f9f4894085cf90beb7f90a25265bfcccf92ba8d01412098f3b87307609591b1ee92169283600052612cd96020926002845260406000209081549060ff60801b9060801b169060ff60801b1916179055565b604051908152a201612c40565b346103645760e03660031901126103645760243580151581036103645761092f602091612d1161317b565b612d1961318e565b9160a435916084359160443590600435613501565b3461036457612d3c366130ed565b91612d48939193614176565b8281036103525760005b818110612d5b57005b612d696102c982848661343a565b90612d7581868861343a565b35612d7e614176565b6416262714cf8111610352577fe22d15e875b30a3996cb58b0d48ec7fa07062ac68d1895b80c0cb0601a4fff7483612db760019561432a565b61ffff612dc3846142e6565b91169283600052612de160209260038452600260406000200161367b565b604051908152a201612d52565b346103645760203660031901126103645761018061ffff80612e0e61308c565b16600052600360205260406000208054916001820154916002810154600460038301549201549360405195865260208601528060070b60408601528060401c60070b60608601526001600160401b038160801c16608086015260c01c60a085015263ffffffff811660c0850152818160201c1660e0850152818160301c16610100850152818160401c1661012085015260501c16610140830152610160820152f35b346103645760203660031901126103645761ffff612ecc61308c565b166000526004602052602063ffffffff60016040600020015460a01c16604051908152f35b346103645760e036600319011261036457612f0a61308c565b60c036602319011261036457612f1e614176565b63ffffffff6298968081612f306132be565b1611801561306e575b8015613058575b8015613042575b6103525761ffff808316928360005260046020528260016040600020015460a01c16613033575b50826000526004602052612fa66040600020612f8d6001610b786132be565b612f9e612f9861331b565b826133fb565b610bc5613371565b6040519160243583526044356001600160401b039081811680910361036457602085015260643590811680910361036457604084015280612fe5613155565b166060840152612ff3613168565b16608083015260c435908116809103610364578160c09160a07f658b7e99eddf4a030f30d69deab82353dfd53b49a1929f620b8a7dd6e110df6c940152a2005b61303c906141ed565b83612f6e565b506103e861ffff613051613371565b1611612f47565b50606461ffff613066613371565b161115612f40565b506406a50bb9716001600160401b0361308561331b565b1611612f39565b6004359061ffff8216820361036457565b6024359061ffff8216820361036457565b359061ffff8216820361036457565b9181601f84011215610364578235916001600160401b038311610364576020808501948460051b01011161036457565b6040600319820112610364576001600160401b03916004358381116103645782613119916004016130bd565b9390939260243591821161036457613133916004016130bd565b9091565b60843590811515820361036457565b60643590811515820361036457565b6084359063ffffffff8216820361036457565b60a4359063ffffffff8216820361036457565b6064359063ffffffff8216820361036457565b60c4359063ffffffff8216820361036457565b6024359063ffffffff8216820361036457565b6044359063ffffffff8216820361036457565b60e4359063ffffffff8216820361036457565b359063ffffffff8216820361036457565b600435906001600160a01b038216820361036457565b602435906001600160a01b038216820361036457565b6044359060ff8216820361036457565b6040600319820112610364576001600160401b036004358181116103645782613252916004016130bd565b9390939260243590838211610364578060238301121561036457816004013593841161036457602460c0850283010111610364576024019190565b9181601f84011215610364578235916001600160401b03831161036457602080850194610180850201011161036457565b60843563ffffffff811681036103645790565b60243563ffffffff811681036103645790565b60443563ffffffff811681036103645790565b60643563ffffffff811681036103645790565b3563ffffffff811681036103645790565b6064356001600160401b03811681036103645790565b60a4356001600160401b03811681036103645790565b60c4356001600160401b03811681036103645790565b356001600160401b03811681036103645790565b60c43561ffff811681036103645790565b6101443561ffff811681036103645790565b6101043561ffff811681036103645790565b6101243561ffff811681036103645790565b6101643561ffff811681036103645790565b60843561ffff811681036103645790565b60a43561ffff811681036103645790565b3561ffff811681036103645790565b805467ffffffffffffffff60401b191660409290921b67ffffffffffffffff60401b16919091179055565b35906001600160401b038216820361036457565b919081101561344a5760051b0190565b634e487b7160e01b600052603260045260246000fd5b818103929160001380158285131691841216176111bc57565b90620f4240918281029281840514901517156111bc57565b818102929160008212600160ff1b8214166111bc5781840514901517156111bc57565b81156134cf57600160ff1b81146000198314166111bc570590565b634e487b7160e01b600052601260045260246000fd5b919091600083820193841291129080158216911516176111bc57565b95613545919561353261354a959661353261352c611a07613537968b6135268b61426e565b9a614116565b87613460565b613460565b6135408761426e565b613491565b6134b4565b6064810290808205606414901517156111bc5763ffffffff613570921660030b906134b4565b9015613594576135326135829261426e565b600081131561358e5790565b50600090565b6135a06135a59261426e565b6134e5565b613582565b60c43560ff811681036103645790565b3560ff811681036103645790565b90620f4240918281029281840414901517156111bc57565b90670de0b6b3a7640000918281029281840414901517156111bc57565b818102929181159184041417156111bc57565b81156134cf570490565b919082039182116111bc57565b90620f424082018092116111bc57565b919082018092116111bc57565b9061271063ffffffff809316029182169182036111bc57565b6084358060070b81036103645790565b358060070b81036103645790565b805467ffffffffffffffff60801b191660809290921b67ffffffffffffffff60801b16919091179055565b35908160070b820361036457565b8135815260208083013590820152610180810192916136d5604082016136a6565b60070b60408301526136e9606082016136a6565b60070b60608301526136fd60808201613426565b6001600160401b03809116608084015261371960a08301613426565b1660a083015263ffffffff61373060c083016131da565b1660c083015261374260e082016130ae565b61ffff80911660e08401526101008161375c8285016130ae565b1690840152610120816137708285016130ae565b1690840152610140906137848284016130ae565b169083015261016080910135910152565b606081019081106001600160401b038211176137b057604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176137b057604052565b604061384f9161385596959460009160018060a01b03168252600560205282822061ffff8616835260205260ff83832091168252602052209160405161382c81613795565b604060ff6002865496878552600181015460208601520154161515910152613fc6565b9061407c565b90565b600160ff1b81146111bc5760000390565b9061ffff821660005260036020526040600020906040519061018082018281106001600160401b038211176137b057604052825491828152600460018501549485602084015260028101548060070b60408501528060401c60070b60608501526001600160401b038160801c16608085015260c01c60a084015261ffff600382015463ffffffff811660c0860152818160201c1660e0860152818160301c16610100860152818160401c1661012086015260501c1661014084015201546101608201528290849560018060a01b036000541660405190630d2020dd60e01b82526d74726164696e6753746f7261676560901b6004830152602082602481845afa918215613ebc57600092613f91575b50602060249160405192838092630d2020dd60e01b8252661bdc195b941b9b60ca1b60048301525afa908115613ebc57602491602091600091613f64575b506040516353851c8f60e11b815261ffff8616600482015292839182906001600160a01b03165afa908115613ebc57600091613f32575b50604051637a52327360e01b815261ffff84166004820152600260248201526020816044816001600160a01b0387165afa8015613ebc57600090613efe575b613a36915061426e565b604051637a52327360e01b815261ffff85166004820152600060248201529092906020816044816001600160a01b0386165afa8015613ebc578391600091613ec8575b50604464e8d4a51000670de0b6b3a7640000613a9d60209561354061ffff9661426e565b0505966040519485938492637a52327360e01b84521660048301526001602483015260018060a01b03165afa908115613ebc57600091613e82575b50670de0b6b3a7640000613af8613b229361354064e8d4a510009461426e565b05059182841315613e7b5783905b80821315613e7457505b613545613b1d8486613460565b613479565b95613b3f613b2e6144b3565b63ffffffff60c0870151169061361a565b606085015160070b6001600160401b036080870151169061ffff60e0880151169161ffff61010089015116918b60b80260b881058d036111bc57613b1d6064613b89920580613491565b9081670de0b6b3a7640000810205670de0b6b3a764000014821517156111bc5781806702386f26fc10000001126001166111bc57670de0b6b3a764000094613c1e9460008f948089613be6926702386f26fc1000000191026134b4565b9412613e515750613bff613c059360649260010b613491565b056134e5565b905b8184811315613e3157508391505b60070b90613491565b056000613c3282604089015160070b613491565b12613e0d57613c4081614319565b613c50604088015160070b614319565b1015613de2576001600160401b0360a087015116905b613c98613c92613c8c611a07613c87613c82611a0789896135fd565b613858565b61453e565b9461426e565b82613491565b83670de0b6b3a76400000360008512670de0b6b3a76400008212811690670de0b6b3a76400008313901516176111bc57613d3194613540846040613d1a670de0b6b3a764000096613d148f9a613d0e613d08613d259a613d02613d2c9f898b91015160070b613460565b90613491565b9161426e565b906134b4565b906134e5565b9c015160070b613460565b05906134e5565b614456565b976000851315613d8b57505060008213613d50575b5050505b93929190565b613d6083613d77959994996134e5565b976000821315613d8057611a289261354591613491565b93388080613d46565b505050600090613460565b60008394929413613da1575b5050505050613d4a565b849950613dcd955093613db691929394613460565b976000821315613dd757613d149261354591613491565b3880808080613d97565b5050506000906134e5565b612710613e0661ffff610140890151166001600160401b0360a08a015116906135fd565b0490613c66565b612710613e0661ffff610120890151166001600160401b0360a08a015116906135fd565b670de0b6b3a763ffff19809112613e49575b50613c15565b915038613e43565b6135a09150613e68613e6e9460649260010b613491565b05613858565b90613c07565b9050613b10565b8290613b06565b90506020813d602011613eb4575b81613e9d602093836137c6565b810103126103645751670de0b6b3a7640000613ad8565b3d9150613e90565b6040513d6000823e3d90fd5b9150506020813d602011613ef6575b81613ee4602093836137c6565b81010312610364575182906044613a79565b3d9150613ed7565b506020813d602011613f2a575b81613f18602093836137c6565b8101031261036457613a369051613a2c565b3d9150613f0b565b90506020813d602011613f5c575b81613f4d602093836137c6565b810103126103645751386139ed565b3d9150613f40565b613f849150823d8411613f8a575b613f7c81836137c6565b810190614157565b386139b6565b503d613f72565b6024919250613fae602091823d8411613f8a57613f7c81836137c6565b929150613978565b919081101561344a5760c0020190565b61ffff6138559116806000526004602052611bf160406000209161400283549363ffffffff6001613ff56144b3565b92015460a01c169061361a565b9060005260046020526001600160401b0360016040600020015416906135fd565b61404f611a0760649463ffffffff61404761405595670de0b6b3a764000097613460565b9716906135fd565b84613491565b050590600090821561406657505090565b909150811215614077576001900b90565b800b90565b9263ffffffff6140a3670de0b6b3a76400009461409e6064976140ab9661361a565b6135fd565b9116906135fd565b040480156140b65790565b50600190565b919081101561344a57610180020190565b613d08926135326140fd95936064620f42406140f56140ee6135329761426e565b9384613491565b0505906134e5565b81131561410e575b613855906142c3565b506000614105565b61414d6305f5e100936141539361414561414060ff60015460a01c1663ffffffff809416906135fd565b6135c8565b911690613610565b906135fd565b0490565b9081602091031261036457516001600160a01b03811681036103645790565b6000546040516312d43a5160e01b81526001600160a01b03916020908290600490829086165afa908115613ebc576000916141ce575b501633036141b657565b60405163093650d560e01b8152336004820152602490fd5b6141e7915060203d602011613f8a57613f7c81836137c6565b386141ac565b7f6db51741ac577e9ff42cbf42caee7f0384c5d33cdcb300fdb123fb9a9140816e602061ffff831692836000526004825261422c604060002091613fc6565b90818155600161424261423d6144b3565b6148cc565b9101805463ffffffff60a01b191660a09290921b63ffffffff60a01b16919091179055604051908152a2565b6001600160ff1b03811161427f5790565b6024906040519063123baf0360e11b82526004820152fd5b6001546001600160a01b031633036142ab57565b604051632a19e83360e01b8152336004820152602490fd5b600081126142ce5790565b60249060405190635467221960e11b82526004820152fd5b6001600160401b03908181116142fa571690565b604490604051906306dfcc6560e41b8252604060048301526024820152fd5b600081126143245790565b60000390565b7f4129841223ad465c908cd3b7856ab8cc99b4b2f6aac2baefee82fd36ddf7f100608061ffff83169283600052600360205261436a604060002091613869565b91909293600281018360048301556001600160401b0319815416856001600160401b031617905581600182015584815563ffffffff60036143ac61423d6144b3565b9201911663ffffffff198254161790556040519384526020840152604083015260070b6060820152a2565b603281118015614439575b610352576020816144137f8816a9b5d1a4127fa8dc7c70c4fc16abd0b843ea2768e46aab7a2804800b323b9361494b565b6001805460ff60a01b191660a09290921b60ff60a01b16919091179055604051908152a1565b5060ff60015460a81c168160640390606482116111bc57116143e2565b908160070b918083036144665750565b6044906040519063327269a760e01b8252604060048301526024820152fd5b61ffff90818111614494571690565b604490604051906306dfcc6560e41b8252601060048301526024820152fd5b61a4b146148015614532575b8015614526575b6144ce574390565b60405163a3b1b31d60e01b815260208160048160645afa908115613ebc576000916144f7575090565b90506020813d60201161451e575b81614512602093836137c6565b81010312610364575190565b3d9150614505565b5062066eee46146144c6565b5062066eed46146144bf565b61454781614319565b670b021fa09404d5ec81101561461e57506729a2241af62c0000908181018281129060009182841290801582169115161761460a576145959061459a670de0b6b3a764000092828493613491565b6142c3565b04928484018094116145f6576729a2241af62bffff1981019081136001166145f657614595816145c992613491565b049283018093116145e25750906119fd613855926135e0565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b83526011600452602483fd5b634e487b7160e01b82526011600452602482fd5b919050675fd70a6912d9000082116147be576040519161014083018381106001600160401b038211176137b057604052621928518352621397b9602084015262114a5c604084015262103e2e6060840152620fbe3f6080840152620f7fc460a0840152620f60e360c0840152620f518b60e0840152620f49e3610100840152620f4611610120840152670de0b6b3a76400006146c6818304926146c0846135e0565b9061361a565b90620f42409160005b600a60ff821610614743575b5050509091925060ff82116111bc576103e890049066038d7ea4c6800091828102908082048414901517156111bc576001614716921b6135fd565b80156134cf5781906ec097ce7bc90715b34b9f100000000004048181029181830414901517156111bc5790565b8160011b91808304600214901517156111bc578183811015614780575b50811561477b5760ff8091169081146111bc576001016146cf565b6146db565b938192506147a29062ffffff611fe0620f42409460051b168a015116906135fd565b0492670de0b6b3a763ffff1981019081116111bc579038614760565b60009150565b80158015614824575b610352576020816147fe7f5ba729b89796f40d260b117b8654dc301b1d9f7ec17a1e378ae31e4c70b6d2c09361494b565b6001805460ff60a81b191660a89290921b60ff60a81b16919091179055604051908152a1565b5060ff60015460a01c1660640360ff81116111bc5760ff1681116147cd565b600054604051630d2020dd60e01b81526863616c6c6261636b7360b81b60048201526001600160a01b03916020908290602490829086165afa908115613ebc576000916148ad575b5016330361489557565b60405163bde4d0f160e01b8152336004820152602490fd5b6148c6915060203d602011613f8a57613f7c81836137c6565b3861488b565b63ffffffff908181116148dd571690565b604490604051906306dfcc6560e41b8252602060048301526024820152fd5b6001600160a01b0316801561035257600180546001600160a01b031916821790556040519081527f2c1c11af44aa5608f1dca38c00275c30ea091e02417d36e70e9a1538689c433d90602090a1565b60ff81116149595760ff1690565b604490604051906306dfcc6560e41b8252600860048301526024820152fdfef0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220659db93987a8dab1cf7d9fe24d8ce4a5ca0cf5ffc90a0763e79b6455e0efa6fe64736f6c63430008180033