0 txs
2.9k calls
constructor
constructor(address verifier_)
functions
beneficiary
viewfunction beneficiary() view returns (address)
checkpoints
viewfunction checkpoints(address account, uint256 version) view returns (tuple)
coordinator
viewfunction coordinator() view returns (address)
factory
viewfunction factory() view returns (address)
global
viewfunction global() view returns (tuple)
guarantee
viewfunction guarantee(uint256 id) view returns (tuple)
guaranteeReferrers
viewfunction guaranteeReferrers(address, uint256) view returns (address)
guarantees
viewfunction guarantees(address account, uint256 id) view returns (tuple)
liquidators
viewfunction liquidators(address, uint256) view returns (address)
locals
viewfunction locals(address account) view returns (tuple)
oracle
viewfunction oracle() view returns (address)
orderReferrers
viewfunction orderReferrers(address, uint256) view returns (address)
parameter
viewfunction parameter() view returns (tuple)
pending
viewfunction pending() view returns (tuple)
pendingOrder
viewfunction pendingOrder(uint256 id) view returns (tuple)
pendingOrders
viewfunction pendingOrders(address account, uint256 id) view returns (tuple)
pendings
viewfunction pendings(address account) view returns (tuple)
position
viewfunction position() view returns (tuple)
positions
viewfunction positions(address account) view returns (tuple)
riskParameter
viewfunction riskParameter() view returns (tuple)
token
viewfunction token() view returns (address)
verifier
viewfunction verifier() view returns (address)
versions
viewfunction versions(uint256 timestamp) view returns (tuple)
claimExposure
nonpayablefunction claimExposure()
claimFee
nonpayablefunction claimFee(address account) returns (uint256 feeReceived)
initialize
nonpayablefunction initialize(tuple definition_)
migrate
nonpayablefunction migrate()
settle
nonpayablefunction settle(address account)
update
nonpayablefunction update(address account, tuple intent, bytes signature)
update
nonpayablefunction update(address account, int256 amount, int256 collateral, address referrer)
update
nonpayablefunction update(address account, uint256 newMaker, uint256 newLong, uint256 newShort, int256 collateral, bool protect, address referrer)
update
nonpayablefunction update(address account, uint256 newMaker, uint256 newLong, uint256 newShort, int256 collateral, bool protect)
updateBeneficiary
nonpayablefunction updateBeneficiary(address newBeneficiary)
updateCoordinator
nonpayablefunction updateCoordinator(address newCoordinator)
updateParameter
nonpayablefunction updateParameter(tuple newParameter)
updateRiskParameter
nonpayablefunction updateRiskParameter(tuple newRiskParameter)
events
AccountPositionProcessed
event AccountPositionProcessed(address indexed account, uint256 orderId, (uint256 timestamp, uint256 orders, int256 collateral, uint256 makerPos, uint256 makerNeg, uint256 longPos, uint256 longNeg, uint256 shortPos, uint256 shortNeg, uint256 protection, uint256 makerReferral, uint256 takerReferral) order, (int256 collateral, int256 priceOverride, uint256 tradeFee, int256 offset, uint256 settlementFee, uint256 liquidationFee, uint256 subtractiveFee, uint256 solverFee) accumulationResult)
BeneficiaryUpdated
event BeneficiaryUpdated(address newBeneficiary)
CoordinatorUpdated
event CoordinatorUpdated(address newCoordinator)
ExposureClaimed
event ExposureClaimed(address indexed account, int256 amount)
FeeClaimed
event FeeClaimed(address indexed account, address indexed receiver, uint256 amount)
Initialized
event Initialized(uint256 version)
OrderCreated
event OrderCreated(address indexed account, (uint256 timestamp, uint256 orders, int256 collateral, uint256 makerPos, uint256 makerNeg, uint256 longPos, uint256 longNeg, uint256 shortPos, uint256 shortNeg, uint256 protection, uint256 makerReferral, uint256 takerReferral) order, (uint256 orders, int256 notional, uint256 takerPos, uint256 takerNeg, uint256 takerFee, uint256 referral) guarantee, address liquidator, address orderReferrer, address guaranteeReferrer)
ParameterUpdated
event ParameterUpdated((uint256 fundingFee, uint256 interestFee, uint256 makerFee, uint256 takerFee, uint256 riskFee, uint256 maxPendingGlobal, uint256 maxPendingLocal, uint256 maxPriceDeviation, bool closed, bool settle) newParameter)
PositionProcessed
event PositionProcessed(uint256 orderId, (uint256 timestamp, uint256 orders, int256 collateral, uint256 makerPos, uint256 makerNeg, uint256 longPos, uint256 longNeg, uint256 shortPos, uint256 shortNeg, uint256 protection, uint256 makerReferral, uint256 takerReferral) order, (uint256 tradeFee, uint256 subtractiveFee, int256 tradeOffset, int256 tradeOffsetMaker, uint256 tradeOffsetMarket, int256 adiabaticExposure, int256 adiabaticExposureMaker, int256 adiabaticExposureMarket, int256 fundingMaker, int256 fundingLong, int256 fundingShort, uint256 fundingFee, int256 interestMaker, int256 interestLong, int256 interestShort, uint256 interestFee, int256 pnlMaker, int256 pnlLong, int256 pnlShort, uint256 settlementFee, uint256 liquidationFee) accumulationResult)
RiskParameterUpdated
event RiskParameterUpdated((uint256 margin, uint256 maintenance, (uint256 linearFee, uint256 proportionalFee, uint256 adiabaticFee, uint256 scale) takerFee, (uint256 linearFee, uint256 proportionalFee, uint256 scale) makerFee, uint256 makerLimit, uint256 efficiencyLimit, uint256 liquidationFee, (uint256 minRate, uint256 maxRate, uint256 targetRate, uint256 targetUtilization) utilizationCurve, (uint256 k, int256 min, int256 max) pController, uint256 minMargin, uint256 minMaintenance, uint256 staleAfter, bool makerReceiveOnly) newRiskParameter)
errors
Adiabatic6ZeroScaleError
error Adiabatic6ZeroScaleError()
Fixed6OverflowError
error Fixed6OverflowError(uint256 value)
GlobalStorageInvalidError
error GlobalStorageInvalidError()
GuaranteeStorageInvalidError
error GuaranteeStorageInvalidError()
InitializableAlreadyInitializedError
error InitializableAlreadyInitializedError(uint256 version)
InitializableNotInitializingError
error InitializableNotInitializingError()
InitializableZeroVersionError
error InitializableZeroVersionError()
InstanceNotFactoryError
error InstanceNotFactoryError(address sender)
InstanceNotOwnerError
error InstanceNotOwnerError(address sender)
InstancePausedError
error InstancePausedError()
LocalStorageInvalidError
error LocalStorageInvalidError()
LocalStorageInvalidError
error LocalStorageInvalidError()
MarketClosedError
error MarketClosedError()
MarketCollateralBelowLimitError
error MarketCollateralBelowLimitError()
MarketEfficiencyUnderLimitError
error MarketEfficiencyUnderLimitError()
MarketExceedsPendingIdLimitError
error MarketExceedsPendingIdLimitError()
MarketInsufficientCollateralError
error MarketInsufficientCollateralError()
MarketInsufficientLiquidityError
error MarketInsufficientLiquidityError()
MarketInsufficientMarginError
error MarketInsufficientMarginError()
MarketIntentPriceDeviationError
error MarketIntentPriceDeviationError()
MarketInvalidIntentFeeError
error MarketInvalidIntentFeeError()
MarketInvalidMarketParameterError
error MarketInvalidMarketParameterError(uint256 code)
MarketInvalidProtectionError
error MarketInvalidProtectionError()
MarketInvalidReferrerError
error MarketInvalidReferrerError()
MarketInvalidRiskParameterError
error MarketInvalidRiskParameterError(uint256 code)
MarketMakerOverLimitError
error MarketMakerOverLimitError()
MarketNotBeneficiaryError
error MarketNotBeneficiaryError()
MarketNotCoordinatorError
error MarketNotCoordinatorError()
MarketNotOperatorError
error MarketNotOperatorError()
MarketNotSingleSidedError
error MarketNotSingleSidedError()
MarketOperatorNotAllowedError
error MarketOperatorNotAllowedError()
MarketOverCloseError
error MarketOverCloseError()
MarketParameterStorageInvalidError
error MarketParameterStorageInvalidError()
MarketProtectedError
error MarketProtectedError()
MarketSettleOnlyError
error MarketSettleOnlyError()
MarketStalePriceError
error MarketStalePriceError()
OrderStorageInvalidError
error OrderStorageInvalidError()
PositionStorageLocalInvalidError
error PositionStorageLocalInvalidError()
ReentrancyGuardReentrantCallError
error ReentrancyGuardReentrantCallError()
RiskParameterStorageInvalidError
error RiskParameterStorageInvalidError()
UFixed6UnderflowError
error UFixed6UnderflowError(int256 value)
VersionStorageInvalidError
error VersionStorageInvalidError()
creation bytecode
0x60a0346200007757601f62005f5338819003918201601f19168301916001600160401b038311848410176200007b578084926020946040528339810103126200007757516001600160a01b03811681036200007757608052604051615ec390816200009082396080518181816117980152611f400152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816305349f56146122e95750806309218e91146122c45780630a0090971461229c5780630aaffd2a146121d85780630cdfebfa146121885780631a65df2814611fa25780632b56d95c14611f6f5780632b7ac3f314611f2a57806338af3eed14611f015780634468d9b814611dff5780634549a62914611dc857806355f5751014611d815780635b4b969514611d2d5780636a256b2914611c5a5780636e19368014611c125780636ebc51e11461197f578063736a01df146116965780637cc4d340146116435780637dc0d1d01461161a57806387aee00e1461155e5780638fd3ab801461149a57806390dbc10b1461109057806391eece2814610ca0578063977b1f5f1461080f578063a05f99061461078f578063a4d15487146105df578063ac9ed34b14610596578063ad4d4e2914610562578063b68af80a14610519578063b6a597dd146103ce578063c45a015514610399578063c496969b14610365578063cee6c2ec14610306578063e20ccec3146102d0578063f9f94e34146101d35763fc0c546a146101aa575f80fd5b346101d057806003193601126101d057546040516001600160a01b039091168152602090f35b80fd5b50346101d05760203660031901126101d0576004356001600160a01b03818116918290036102cc5760046020825f80516020615e4e833981519152541660405192838092638da5cb5b60e01b82525afa9081156102c1578491610292575b5016330361027a57600580546001600160a01b031916821790556040519081527fc258faa9a17ddfdf4130b4acff63a289202e7d5f9e42f366add65368575486bc90602090a180f35b604051634d193d1f60e01b8152336004820152602490fd5b6102b4915060203d6020116102ba575b6102ac8183612352565b8101906125e9565b5f610231565b503d6102a2565b6040513d86823e3d90fd5b5f80fd5b50346101d057806003193601126101d0576102e96127ae565b506101806102f760166147aa565b610304604051809261248e565bf35b50346101d05760403660031901126101d0576004356001600160a01b03811691908290036102cc5760406103589160c09361033f6126d1565b508152601f602052818120602435825260205220614850565b6103046040518092612389565b50346101d05760203660031901126101d0576102f76040610180926103886127ae565b5060043581526014602052206147aa565b50346101d057806003193601126101d0575f80516020615e4e833981519152546040516001600160a01b039091168152602090f35b50346101d05760403660031901126101d0577f6fee9688c285c5c5c97d6a1a29adced674e6b2ad0888b8ad2116b58a8b3ea2486001815410156105005760019055303b1515806104f9575b6104e057335f80516020615e4e83398151915255303b1515806104f2575b6104e05760015f80516020615e2e833981519152556001600160a01b03600435818116908190036102cc5782546001600160a01b03199081169091178355602435918216918290036104dc576002541617600255807f2801b00eb06461cf9fcb9758b5fafd884ff06a86177386f73b6c49f0bf5a5af0557fbe9b076dc5b65990cca9dd9d7366682482e7817a6f6bc7f4faf4dc32af497f32602060405160018152a180f35b8280fd5b60405163b9a621e160e01b8152600490fd5b5080610437565b5080610419565b604051631edb9c6d60e11b815260016004820152602490fd5b50346101d05760403660031901126101d0576001600160a01b03600435818116908190036102cc578260409160209452601b845281812060243582528452205416604051908152f35b50346101d057806003193601126101d05761057b612bfc565b50610140610589600961471b565b610304604051809261255e565b50346101d05760403660031901126101d0576001600160a01b03600435818116908190036102cc578260409160209452601c845281812060243582528452205416604051908152f35b50346101d057806003193601126101d0575f80516020615e4e83398151915254604051638da5cb5b60e01b81526001600160a01b03916020908290600490829086165afa80156107845782918491610765575b5016330361027a57819081610647600b61429a565b9160c08301908151600161065a826146bc565b14610743575b5081515f1961066e826146bc565b1461071c575b505080516040519081527f25e5e4c41e0fec8db036b4544824413a63ffe455e2b4decd71d72932f607ff5960203392a252730b18a9a54bb159f4e5f7b6db57445be255291ed090813b15610718576106ed6101448492604051948593849263045a766b60e01b8452600b60048501526024840190612809565b5af4801561070d576106fc5750f35b8161070691612352565b6101d05780f35b6040513d84823e3d90fd5b5050fd5b61073461072f61073c93865416926154b9565b6143f9565b9033906146d8565b5f80610674565b61075f9061075761072f84875416926154b9565b903390614413565b5f610660565b61077e915060203d6020116102ba576102ac8183612352565b5f610632565b6040513d85823e3d90fd5b50346101d057806003193601126101d0576107a8612ba6565b506101206107b6600b61429a565b602060e06040519280518452828101518385015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151805160e08401520151610100820152f35b50346101d05760e03660031901126101d0576004356001600160a01b0380821682036102cc5760a435151560a435036102cc578060c4351660c435036102cc5760025f80516020615e2e8339815191525414610c8e57602060049160025f80516020615e2e833981519152555f80516020615e4e833981519152541660405192838092635c975abb60e01b82525afa908115610784578391610c54575b50610c42578180806108c2938160c43591612e67565b906040516397cd07c560e01b81526108dd60048201836129fb565b6108eb610a64820184612ac5565b608435611104820152602435611124820152604435611144820152606435611164820152608081611184817328158dcebbb6b5e69a5a5a26f5fe9a8d199df48c5af480156102c1578490859286908792610bf6575b5060808501519361014087015161096460808901519261095e6127ae565b50615490565b936109726020830151615490565b938a85128686810312811690878781031390151617610be25761099490615490565b6109a16040840151615490565b918b83128284810312811690838581031390151617610bce5760606109c86109d092615490565b940151615490565b938b85128486810312811690858781031390151617610bce578b8b8b6101808c8c60ff8d8d8d8d8d8b9d8c610a34610b4e9f610a2f610a24610a138a8c036154b9565b610a1e8888036154b9565b90613cd8565b610a1e8989036154b9565b6148c3565b9881878903135f14610bc557610a4b8789036154b9565b9180888a03125f14610bbc57610a62888a036154b9565b9381868203135f14610bb357610a798682036154b9565b9582818303125f14610ba857610a8f91036154b9565b9581888203135f14610b9f57610aa68882036154b9565b9782818303125f14610b9457610abc91036154b9565b9760a43515610b8d576001995b149a8b15610b8657819b5b15610b7e579b5b610ae86040519e8f612352565b8d5260208d015260408c015260608b015260808a015260a089015260c088015260e087015261010086015216610120840152610140830152610160820152610b2f81615a6b565b1580610b6e575b15610b62575b60c43592610b486126d1565b926132bd565b60015f80516020615e2e8339815191525580f35b60016020820152610b3c565b50610b7881615a90565b15610b36565b50809b610adb565b809b610ad4565b8199610ac9565b5050610abc816154b9565b610aa6826154b9565b5050610a8f816154b9565b610a79826154b9565b610a62816154b9565b610a4b826154b9565b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8b52601160045260248bfd5b93505050506080813d608011610c3a575b81610c1460809383612352565b81010312610c365780516020820151604083015160609093015190925f610940565b8380fd5b3d9150610c07565b604051634b94d2bb60e01b8152600490fd5b90506020813d602011610c86575b81610c6f60209383612352565b810103126104dc57610c8090612703565b5f6108ac565b3d9150610c62565b6040516345f6780960e11b8152600490fd5b50346101d05760c03660031901126101d0576004356001600160a01b0380821682036102cc5760a435151560a435036102cc5760025f80516020615e2e8339815191525414610c8e57602060049160025f80516020615e2e833981519152555f80516020615e4e833981519152541660405192838092635c975abb60e01b82525afa908115610784578391611056575b50610c42578180808080610d4395612e67565b6040516397cd07c560e01b815290610d5e60048301846129fb565b610d6c610a64830182612ac5565b608435611104830152602435611124830152604435611144830152606435611164830152608082611184817328158dcebbb6b5e69a5a5a26f5fe9a8d199df48c5af480156102c157849085938690879261100e575b50608086015194610140850151610ddf60808701519261095e6127ae565b93610ded6020830151615490565b938a85128686810312811690878781031390151617610be257610e0f90615490565b610e1c6040840151615490565b918b83128284810312811690838581031390151617610bce5760606109c8610e4392615490565b938b85128486810312811690858781031390151617610bce578a8a8a8e8b60ff8c8c8c859c610b4e9c879c610e8f899d610a2f610a13610e84898b036154b9565b610a1e8787036154b9565b9789868803135f1461100557610ea68688036154b9565b908a878903125f14610ffc57610ebd8789036154b9565b928b858203135f14610ff357610ed48582036154b9565b948c818303125f14610fe857610eea91036154b9565b948b878203135f14610fdf57610f018782036154b9565b968c818303125f14610fd457610f1791036154b9565b9660a43515610fcd576001985b14998a15610fc6578b9a5b15610fbf579a5b60206040519e8f90610f4a61018083612352565b8152015260408d015260608c015260808b015260a08a015260c089015260e088015261010087015216610120850152610140840152610160830152610f8e82615a6b565b1580610faf575b15610fa3575b610b486126d1565b60016020830152610f9b565b50610fb982615a90565b15610f95565b508a610f36565b809a610f2f565b8b98610f24565b5050610f178b6154b9565b610f018c6154b9565b5050610eea8b6154b9565b610ed48c6154b9565b610ebd8b6154b9565b610ea68a6154b9565b94505050506080823d60801161104e575b8161102c60809383612352565b81010312610c365781516020830151604084015160609094015190935f610dc1565b3d915061101f565b90506020813d602011611088575b8161107160209383612352565b810103126104dc5761108290612703565b5f610d30565b3d9150611064565b50346101d0576102e03660031901126101d0576040516110b26101a082612352565b60043581526020602435818301526110cb366044612520565b604083015260608060c319360112610c36576040516110ea8282612352565b60c435815260e435838201526101043560408201528184015261012435608084015261014490813560a08501526101643560c085015261112c36610184612520565b60e085015280610203193601126114965760405161114a8282612352565b6102043581526102243584820152610244356040820152610100850152610120926102643584860152610284356101408601526102a4356101608601526102c43580151581036102cc5761018086015260018060a01b039081600554163314159081611429575b5061141757856111c1600b61429a565b946111cc600d612c49565b926111d760066138e4565b976004837302608dd5a2627cb5908f948b3adb9ce437aa0ca7935f80516020615e4e83398151915254166040519283809263ad4d4e2960e01b82525afa93841561140c5785946113dd575b5050813b15610c365761042461125a91859361126560405196879586946302903c7960e21b86526006600487015260248601906129bc565b61030484019061267b565b5af4801561070d576113c8575b506112c69181604061128460066138e4565b98015160406112b9611299828c0151956148dc565b94856112a860a08d01516154b9565b9782858c8b95015191015190615c63565b9682015191015190615c63565b908582820392128183128116918313901516176113b45760c0830180518683820393128184128116918413901516176113a057528391730b18a9a54bb159f4e5f7b6db57445be255291ed09190823b15610c3657839161134391604051948593849263045a766b60e01b8452600b60048501526024840190612809565b5af4801561070d57611387575b506040517f685ea8dd49033251570436255683e840d43dd33fbc52b69e04450747dc56fed2908061138185826123d9565b0390a180f35b8161139191612352565b61139c57815f611350565b5080fd5b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b6113d3828092612352565b6101d0575f611272565b6113fd929450803d10611405575b6113f58183612352565b810190612608565b915f80611222565b503d6113eb565b6040513d87823e3d90fd5b604051639bca062560e01b8152600490fd5b9050600481835f80516020615e4e833981519152541660405192838092638da5cb5b60e01b82525afa90811561148b578392899261146e575b5050163314155f6111b1565b6114849250803d106102ba576102ac8183612352565b5f80611462565b6040513d8a823e3d90fd5b8480fd5b50346101d057806003193601126101d0575f80516020615e4e83398151915254604051638da5cb5b60e01b81526001600160a01b03916020908290600490829086165afa90811561078457839161153f575b5016330361027a578073a9e35cdcf878623c7a2aa19efebad73634dfb76d803b1561153c5781602491604051928380926317251b7160e31b8252600d60048301525af4801561070d576106fc5750f35b50fd5b611558915060203d6020116102ba576102ac8183612352565b5f6114ec565b50346101d05760203660031901126101d0576115926040610180926115816128d3565b506004358152601360205220614572565b604051908051151582526020810151602083015260408101515160408301526060810151516060830152608081015151608083015260a08101515160a083015260c08101515160c083015260e08101515160e0830152610100808201515190830152610120808201515190830152610140808201515190830152610160809101515190820152f35b50346101d057806003193601126101d0576002546040516001600160a01b039091168152602090f35b50346101d05760403660031901126101d0576004356001600160a01b03811691908290036102cc5760406102f7916101809361167d6127ae565b508152601560205281812060243582526020522061418c565b50346101d0576101c03660031901126101d0576004356001600160a01b0380821682036102cc576101803660231901126104dc576101a435906001600160401b038211610c365736602383011215610c3657816004013591846116f884612505565b916117066040519384612352565b84835260209436602482840101116104dc5780602487930183860137830101525f80516020615e2e833981519152926002845414610c8e5760028455600481845f80516020615e4e833981519152541660405192838092635c975abb60e01b82525afa91821561197457879261193a575b5050610c4257606435620f424060026117908284615474565b1461192857837f00000000000000000000000000000000000000000000000000000000000000001695863b156119195760405193635f2d6ed760e01b855260243580600487015260443591826024880152856044880152608435938885168086036102cc57606489015260a435958987168088036102cc5760848a015260c435988960a482015260e4359c8b8e9c8d16809d036102cc578f9c60c4840152610104918235968288168089036102cc5760e48601526101249384359384168094036102cc578f946118958795936101a087959386948a968601526101449081359086015261016490813590860152610184908135908601528401526101a483019061285f565b03925af1801561191d576118ef575b509160019b6118e68b8e81806118eb9f839f9d9b99819f9d9b998b90836118e0846118db8f6118d585985f1961289d565b9061289d565b614456565b91614484565b614484565b5580f35b9961190581809a9896949c9b999795939b612352565b61191957919395975f9991939597996118a4565b8780fd5b6040513d8d823e3d90fd5b604051630f4e914b60e11b8152600490fd5b90809250813d831161196d575b6119518183612352565b810103126119695761196290612703565b5f80611777565b8580fd5b503d611947565b6040513d89823e3d90fd5b50346101d057602090816003193601126101d0576001600160a01b039060043582811691908290036102cc578133141580611b94575b611b825780926119c5600b61429a565b838352601086526119d860408420613b20565b90600487845f80516020615e4e833981519152541660405192838092638da5cb5b60e01b82525afa90811561140c579084918691611b65575b50168514611b4b575b82600254168514611b33575b82600554168514611b1b575b83611a436060840197885190613cd8565b9652730b18a9a54bb159f4e5f7b6db57445be255291ed090813b1561149657611a8d6101448692604051948593849263045a766b60e01b8452600b60048501526024840190612809565b5af480156102c157908491611b06575b509084611ab292526010875260408420614339565b83611ac3575b505050604051908152f35b611ad2915416610757846143f9565b604051908282527f4a34429a0ef883c4301d5b40aa8ae85d4eb024946062f2c7ebd8320acedc831a843393a35f8080611ab8565b81611b1091612352565b6104dc57825f611a9d565b83611b2c6080830197885190613cd8565b9652611a32565b83611b446060830197885190613cd8565b9652611a26565b9450604085019483611b5e875182613cd8565b9652611a1a565b611b7c9150893d8b116102ba576102ac8183612352565b5f611a11565b604051633222db4560e01b8152600490fd5b50604484845f80516020615e4e83398151915254166040519283809263131bac4760e11b82528760048301523360248301525afa90811561070d578291611bdd575b50156119b5565b90508481813d8311611c0b575b611bf48183612352565b8101031261139c57611c0590612703565b5f611bd6565b503d611bea565b50346101d05760203660031901126101d0576004356001600160a01b03811691908290036102cc5760406102f79161018093611c4c6127ae565b50815260196020522061418c565b50346101d05760203660031901126101d0576004356001600160a01b0380821682036102cc575f80516020615e2e833981519152906002825414610c8e576020600491600284555f80516020615e4e833981519152541660405192838092635c975abb60e01b82525afa9081156102c1578491611cf3575b50610c42576118eb611ce5600193613ba4565b611cee81613ce5565b613fc7565b90506020813d602011611d25575b81611d0e60209383612352565b81010312610c3657611d1f90612703565b5f611cd2565b3d9150611d01565b50346101d05760203660031901126101d0576004356001600160a01b03811691908290036102cc576040611d7491608093611d666125c3565b508152601060205220613b20565b610304604051809261232f565b50346101d05760203660031901126101d0576004356001600160a01b03811691908290036102cc576040611d7491608093611dba6125c3565b508152601160205220613a6c565b50346101d057806003193601126101d057611de1612730565b50611dfb611def60066138e4565b604051918291826123d9565b0390f35b50346101d05760803660031901126101d0576004356001600160a01b0380821682036102cc5760643581811681036102cc575f80516020615e2e833981519152916002835414610c8e576020600491600285555f80516020615e4e833981519152541660405192838092635c975abb60e01b82525afa90811561140c578591611ec7575b50610c42578381611e9d8280806118eb968160019a612e67565b611ebe608083015161014083015160808401519160443591602435916131a9565b90610b486126d1565b90506020813d602011611ef9575b81611ee260209383612352565b8101031261149657611ef390612703565b5f611e83565b3d9150611ed5565b50346101d057806003193601126101d0576004546040516001600160a01b039091168152602090f35b50346101d057806003193601126101d0576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346101d05760203660031901126101d057610358604060c092611f916126d1565b506004358152601e60205220612ce0565b50346102cc5761014090816003193601126102cc5760405191611fc58184612352565b6004358352602435602084015260443560408401526064356060840152608435608084015260a43560a084015260c43560c084015260e43560e08401526101043580151581036102cc576101008401526101243580151581036102cc57610120848101919091525f80516020615e4e83398151915254604051638da5cb5b60e01b81526001600160a01b03918216929190602081600481875afa908115612141575f91612169575b5016330361027a5760048173a594130ed88271ae0e5eccb782555fe4bbe59020936040519283809263ad4d4e2960e01b82525afa918215612141575f9261214c575b5050813b156102cc576120f16102845f9260405194859384926373a328f760e11b8452600960048501526120e6602485018c61255e565b61016484019061267b565b5af4801561214157612120575b505f80516020615e6e833981519152919261211c604051809261255e565ba180f35b5f80516020615e6e83398151915292505f61213a91612352565b5f916120fe565b6040513d5f823e3d90fd5b6121629250803d10611405576113f58183612352565b5f806120af565b612182915060203d6020116102ba576102ac8183612352565b5f61206d565b346102cc5760403660031901126102cc576004356001600160a01b038116908190036102cc576121b66125c3565b505f52601a60205260405f206024355f526020526080611d7460405f20612c93565b346102cc5760203660031901126102cc576004356001600160a01b03818116918290036102cc5760046020825f80516020615e4e833981519152541660405192838092638da5cb5b60e01b82525afa908115612141575f9161227d575b5016330361027a57600480546001600160a01b031916821790556040519081527feee59a71c694e68368a1cb0d135c448051bbfb12289e6c2223b0ceb100c2321d90602090a1005b612296915060203d6020116102ba576102ac8183612352565b83612235565b346102cc575f3660031901126102cc576005546040516001600160a01b039091168152602090f35b346102cc575f3660031901126102cc576122dc6125c3565b506080611d74600d612c49565b346102cc5760403660031901126102cc576004356001600160a01b0381811692918390036102cc576020925f52601d835260405f206024355f52835260405f2054168152f35b606080918051845260208101516020850152604081015160408501520151910152565b601f909101601f19168101906001600160401b0382119082101761237557604052565b634e487b7160e01b5f52604160045260245ffd5b60a0809180518452602081015160208501526040810151604085015260608101516060850152608081015160808501520151910152565b6040809180518452602081015160208501520151910152565b9190916102c06102e082019380518352602081015160208401526124056040820151604085019061232f565b612417606082015160c08501906123c0565b608081015190610120918285015260a0810151610140908186015260c082015190610160918287015260e083015193612456610180958689019061232f565b61246a6101008501516102008901906123c0565b8301516102608701528201516102808601528101516102a085015201511515910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151908301526101208082015190830152610140808201519083015261016080910151910152565b6001600160401b03811161237557601f01601f191660200190565b91908260809103126102cc5760405161253a608082612352565b60608082948035845260208101356020850152604081013560408501520135910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151151590830152610120809101511515910152565b604051906125d2608083612352565b5f6060838281528260208201528260408201520152565b908160209103126102cc57516001600160a01b03811681036102cc5790565b809161012092839103126102cc576126236040519283612352565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100809101519082015290565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080910151910152565b604051906126e060c083612352565b5f60a0838281528260208201528260408201528260608201528260808201520152565b519081151582036102cc57565b6040519061271f606083612352565b5f6040838281528260208201520152565b604051906127406101a083612352565b5f610180838281528260208201526127566125c3565b6040820152612763612710565b60608201528260808201528260a08201528260c08201526127826125c3565b60e082015261278f612710565b6101008201528261012082015282610140820152826101608201520152565b604051906127be61018083612352565b5f610160838281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b602060e06101009280518552828101518386015260408101516040860152606081015160608601526080810151608086015260a081015160a086015260c081015160c08601520151805160e08501520151910152565b91908251928382525f5b848110612889575050825f602080949584010152601f8019910116010190565b602081830181015184830182015201612869565b81810292915f8212600160ff1b8214166128bf5781840514901517156128bf57565b634e487b7160e01b5f52601160045260245ffd5b6040908151916128e561018084612352565b610160835f81526129b56020935f8584015280516129038682612352565b5f81528184015280516129168682612352565b5f81526060840152805161292a8682612352565b5f81526080840152805161293e8682612352565b5f815260a084015280516129528682612352565b5f815260c084015280516129668682612352565b5f815260e0840152805161297a8682612352565b5f8152610100840152805161298f8682612352565b5f815261012084015280516129a48682612352565b5f8152610140840152519384612352565b5f83520152565b6102c09080518352602081015160208401526124056040820151604085019061232f565b60408091805184526020810151602085015201511515910152565b80516001600160a01b03168252602080820151612ac393926108e09261014092612a279186019061255e565b612a3a60408201516101608601906129bc565b612a4d60608201516104408601906129e0565b60808101516104a0850152612a6b60a08201516104c0860190612809565b612a7e60c08201516105e086019061232f565b612a9160e082015161066086019061232f565b612aa56101008201516106e086019061232f565b612ab961012082015161076086019061248e565b015191019061248e565b565b6101c061068091805115158452602081015115156020850152604081015160018060a01b0380911660408601528060608301511660608601526080820151608086015260a08201511660a085015260c081015160c0850152612b2f60e082015160e086019061248e565b612b4361010082015161026086019061248e565b612b576101208201516103e086019061232f565b612b6b61014082015161046086019061232f565b612b7f6101608201516104e0860190612389565b612b936101808201516105a0860190612389565b6101a08101516106608501520151910152565b60405190612bb661010083612352565b815f81525f60208201525f60408201525f60608201525f60808201525f60a08201525f60c082015260e060405191612bef604084612352565b5f83525f60208401520152565b60405190612c0c61014083612352565b5f610120838281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152565b612c516125c3565b5054604051906001600160401b03612c6a608084612352565b63ffffffff82168352808260401c1660208401528160801c16604083015260c01c606082015290565b612c9b6125c3565b505460405190612cac608083612352565b8060d01b60d01d825265ffffffffffff8160301c1660208301528060601b60c01d604083015260201b60c01d606082015290565b612ce86126d1565b5054604051906001600160401b0390612d0260c084612352565b63ffffffff811683525f6020840152818160201c166040840152818160601c16606084015260a01c1660808201525f60a082015290565b60405190612d4961016083612352565b815f8152612d55612bfc565b6020820152612d62612730565b6040820152612d6f612710565b60608201525f6080820152612d82612ba6565b60a0820152612d8f6125c3565b60c0820152612d9c6125c3565b60e0820152612da96125c3565b610100820152612db76127ae565b610120820152610140612dc86127ae565b910152565b60405190612ddd6101e083612352565b5f6101c0838281528260208201528260408201528260608201528260808201528260a08201528260c0820152612e116127ae565b60e0820152612e1e6127ae565b610100820152612e2c6125c3565b610120820152612e3a6125c3565b610140820152612e486126d1565b610160820152612e566126d1565b610180820152826101a08201520152565b9594959391909293612e77612d39565b50612e80612dcd565b50612e8a90613ba4565b95612e9487613ce5565b86612e9d612dcd565b9560e0820151612eac906154c8565b61012081818a0152830151612ec091615508565b6101009485830151612ed1906154c8565b61014081818b0152840151612ee591615508565b60a08301908151515f5260209260148452604092835f20612f05906147aa565b60e08c01528a600160a01b60019003988992838951165f5260158852865f209b60c08a019c8d51515f528952875f20612f3d9061418c565b9084015251515f52601e8752855f20612f5590612ce0565b610160830152828851165f52601f8752855f208b51515f528752855f20612f7b90614850565b610180830152828851165f52601b8752855f208b51515f52875282865f20541686830152828851165f52601c8752855f208b51515f52875282865f205416986060998a80940152838951165f52601d8852865f208c51515f5288528d84885f20541660a08201526101a0015282805f80516020615e4e833981519152541698511697865193849263029138af60e21b845260049a60048501528160249f336024870152166044850152166064830152815a91608492fa90811561319f57908892915f918d5f925f9261314e575b50608001521515868d015215158b5216613143575b50818651015194600195600181018091116128bf579686976101c08b01968d01975b613091575b5050505050505050505090565b815151811161313e57878d8489519151165f52601f8752855f20835f528752866130d9620f42406118db836130c78b5f20614850565b965101516130d4876148dc565b61289d565b920151915f838203931281841281169184139015161761312c575f828201928312911290801582169115161761311a578752613114906148b5565b8861307f565b8a601188634e487b7160e01b5f52525ffd5b8b601189634e487b7160e01b5f52525ffd5b613084565b60c08901525f61305d565b9550505050508682813d8311613198575b6131698183612352565b810103126102cc578161317c8993612703565b8c60808761318b8a8601612703565b9401519293929190613048565b503d61315f565b84513d5f823e3d90fd5b94936131d99192936131b96127ae565b9687526040870152836132b45760ff5f5b166020870152610a2f846154b9565b6101608501526131e8826146bc565b801591821561329f575b8215613283575b505015613241575f81131561323857613211816154b9565b60a08401525f81121561322e57613227906154b9565b60e0830152565b506132275f6154b9565b6132115f6154b9565b5f81131561327a57613252816154b9565b6101008401525f81121561327057613269906154b9565b60c0830152565b506132695f6154b9565b6132525f6154b9565b613297919250613292906148dc565b6146bc565b145f806131f9565b91506132ad613292836148dc565b15916131f2565b60ff60016131ca565b93949190946101209283602087015101945f95516138d25760808701908151916101008a01928351908151811161388e575b5050519260e08a01938451908151811161385c575b505061331386888c0151615508565b6101409461332487878d0151615508565b61332f878551615652565b61333a878651615652565b61334787898c0151615652565b61335487878c0151615652565b610160808c0196613366858951615760565b6101808d0199613377868c51615760565b60c08d01516040808c0151910180515f83820193841291129080158216911516176128bf5752890151613851575b8801511590811591613844575b50613812575b5060a08201516137ce575b506133cd85615a6b565b15806137be575b1561375a575b73581c684376a3f23f930cc33b217f2099a7a2ad3490813b15611919576134246113448a8c946134488c9561342f6040519889978896638df462cb60e01b885260048801906129fb565b610a64860190612ac5565b61343d61110485018d61248e565b611284840190612389565b5af4801561197457908791613745575b50506134aa9061347c60a0890193845151895260146020526040892090519061525e565b87516001600160a01b0316875260156020908152604080892060c08b0151518a52909152872090519061538c565b51518452601e6020526040842090516134c281615d3b565b805160408083015160608085015160809095015160a01b600160a01b600160e01b031694901b600160601b600160a01b0316602091821b600160201b600160601b031663ffffffff9490941693909317929092179290921790925585516001600160a01b03168552601f825280852060c0870151518652909152832091519461354a86615d3b565b60208601516002906135649060016001603f1b0390615af5565b146137335760208601516135819060016001603f1b031990615af5565b156137335760a08601516002906135a0906001600160401b0390615474565b146137335785516020808801516040808a01516060808c015160808d015160a09d8e0151918e1b600160a01b600160e01b031693831b600160601b600160a01b031695871b600160201b600160601b031663ffffffff98909816979097179490941791909117885591811b600160401b600160801b03166001600160401b0394909416939093176001968701558383015188516001600160a01b039081168952601b845284892060c08b018051518b52908552858a2080546001600160a01b0319908116948416949094179055928601518a5182168a52601c8552858a208451518b528552858a20805484169183169190911790559490990151885185168852601d835283882091515188529152818620805490981692169190911790955580850151612ac395926136d1826146bc565b14613713575b5001515f196136e5826146bc565b146136f2575b5050613fc7565b61075761072f61370c9360018060a01b03905416926154b9565b5f806136eb565b61372d9061073461072f60018060a01b03875416926154b9565b5f6136d7565b604051637e81879b60e11b8152600490fd5b8161374f91612352565b61196957855f613458565b60025488516001600160a01b039182169116813b156102cc575f91604483926040519485938492631a9be9fd60e11b845230600485015260248401525af18015612141576137a9575b506133da565b6137b69197505f90612352565b5f955f6137a3565b506137c885615a90565b156133d4565b60a08a0180516001600160a01b03918291821615613808575b51169116036137f6575f6133c3565b604051639dbdc5fd60e01b8152600490fd5b81841681526137e7565b60608b0180516001600160a01b0391829182161561383a575b51169116036137f6575f6133b8565b818416815261382b565b905087015115155f6133b2565b3360408e01526133a5565b61386591615633565b5f6101608b015161387581615950565b5260a089015161388581516148b5565b90525f80613304565b61389791615633565b5f6101808b01516138a781615950565b525f60408b01525f60608b01525f60a08b015260c08901516138c981516148b5565b90525f806132ef565b604051630b8b968760e31b8152600490fd5b60ff6101a0916138f2612730565b50805490600260018201549101549162ffffff9160608365ffffffffffff9361391f858560481c16614910565b604093845191613930608084612352565b848460301c168352848460481c1660208401528484831c16868401528183015261395e878760181c16614910565b9085519161396c8284612352565b858560781c168352858560901c16602084015286830152613991888560a81c16614910565b928651966139a0608089612352565b868960781c168852868960901c166020890152868960a81c1681890152868960c01c16838901528051986139d4848b612352565b8a8d168a5260081b60e01d60208a01528b60b01b60e01d818a01526139fb81519e8f612352565b8d87871690528d6020888860181c169101528d01528b015260808a015260d81c1660a088015263ffffffff8560b01c1660c088015260e0870152610100860152808360501c166101208601528260801c166101408501528160d01c1661016084015260e81c16151561018082015290565b613a746125c3565b50600181549101548160f81c1590815f14613b135760038116915b15613afe5760021c60016001603e1b0316905b80613af757815b60018203613aee57600281925b03613ae657915b63ffffffff60405194613ad1608087612352565b16845260208401526040830152606082015290565b505f91613abd565b60025f92613ab6565b5f91613aa9565b50602282901c60016001603e1b031690613aa2565b60038360201c1691613a8f565b613b286125c3565b50546040519063ffffffff613b3e608084612352565b8181168352602082811c90911690830152608081811b60c01d60408401521c6001600160401b0316606082015290565b91908260609103126102cc57604051613b88606082612352565b6040612dc8818395805185526020810151602086015201612703565b906004613baf612d39565b6001600160a01b03938416808252909390613bca600961471b565b60208601526080613bdb60066138e4565b926040938488015260025416835194858092631006976960e11b82525afa8015613cce575f905f90613c8c575b613c84945060808701526060860152613c21600b61429a565b60a0860152805f526010602052613c39825f20613b20565b60c0860152613c48600d612c49565b60e0860152805f526011602052613c60825f20613a6c565b610100860152613c7060166147aa565b6101208601525f5260196020525f2061418c565b610140830152565b505060803d608011613cc7575b613ca38185612352565b8301926080818503126102cc576060613cbf613c849583613b6e565b910151613c08565b503d613c99565b82513d5f823e3d90fd5b919082018092116128bf57565b90604091825192613cf7606085612352565b613cff6128d3565b845260209384810194613d106125c3565b8652828201613d1d612710565b815260e08501958651515f5260138352613d38855f20614572565b845260018060a01b0394858751165f52601a8452805f20986101008801998a51515f528552613d68825f20612c93565b905285600254169888515196825194630e0886f960e41b8652600498600487015260a086602481819f5afa95861561319f575f96613f95575b50859052613db460a08a019586516157f1565b613dbc6127ae565b995b8551878151910151809114159081613f51575b5015613e0d57868651015160018101809111613dfb578b8b613df6928b835192614a42565b613dbe565b8c60118b634e487b7160e01b5f52525ffd5b60c08a018051888151910151141580613f00575b15613e4a57879051015160018101809111613dfb578b8b613e45928b835192614eff565b613e0d565b50939a509594939198509550610120838801510151613ef6576060870191838351519151518211613ecc575b50505051519351518411613e8d575b505050505050565b613ec195613ebb9160c08701908082510151958851165f526015815280835f20925101515f52525f2061418c565b93614eff565b5f8080808080613e85565b613eee9251015190815f5260148552613ee68a5f206147aa565b91868a614a42565b5f8083613e76565b5050505050505050565b509a50818a51165f5260158752835f20878c51015160018101809111613f3f575f528752613f2f845f2061418c565b9a60608b0151518c511115613e21565b8d60118c634e487b7160e01b5f52525ffd5b80929c506001915001809111613f83575f5260148652613f72835f206147aa565b9960608a0151518b5111155f613dd1565b8b60118a634e487b7160e01b5f52525ffd5b613fb891965060a03d60a011613fc0575b613fb08183612352565b810190614928565b50945f613da1565b503d613fa6565b60a08101519190730b18a9a54bb159f4e5f7b6db57445be255291ed0803b156102cc576101445f60409283519283809263045a766b60e01b8252614017859a600b60048501526024840190612809565b5af48015613cce57614177575b5081516001600160a01b039081168552601060205281852060c084015161404a91614339565b8473a9e35cdcf878623c7a2aa19efebad73634dfb76d60e0850151813b156104dc5761409560a48492875194859384926366e4915160e01b8452600d6004850152602484019061232f565b5af4801561416d57614158575b505080835116855260116020528185208573864a9a27cfcb4609a6e2d52b1a4b27f57581371261010086015190803b156104dc576140fd9360a49187519586948593635c7731d160e11b85526004850152602484019061232f565b5af4801561414e57614139575b5090612ac3939461014092614125610120860151601661525e565b84511681526019602052209101519061538c565b614144868092612352565b611496575f61410a565b83513d88823e3d90fd5b8161416291612352565b61149657845f6140a2565b84513d84823e3d90fd5b6141849194505f90612352565b5f925f614024565b6141946127ae565b506001815491015460038260801c169060018080603e1b0393848160821c16948160c01c1663ffffffff95851595865f146142935781965b1561428c57825b8186149081156142855783915b1561427c57600281935b1493841561427457935b1561426c57935b868060401b03986040519a6142126101808d612352565b8088168c528760201c1660208c01528660801b60c01d60408c015260608b015260808a015260a089015260c088015260e087015261010086015260fe1c1661012084015281811661014084015260401c1661016082015290565b505f936141fb565b505f936141f4565b60025f936141ea565b5f916141e0565b5f926141d3565b5f966141cc565b6142a2612ba6565b50600181549101549063ffffffff9165ffffffffffff604051926142c7604085612352565b8260e01b60e01d84528260c81b60e81d6020850152604051946142ec61010087612352565b80821686528160201c166020860152818160401c166040860152818160701c16606086015260a01c1660808401528060881b60c01d60a084015260481b60c01d60c083015260e082015290565b9063ffffffff808251116143e75760208201818151116143e7576040830191600261436b600180603f1b038551615af5565b146143e75782516143859060016001603f1b031990615af5565b156143e757606084019360026143a260018060401b038751615474565b146143e7575191519251935160801b600160801b600160c01b031660409490941b600160401b600160801b031660209390931b63ffffffff60201b1691161717179055565b60405163320f423b60e21b8152600490fd5b64e8d4a51000908181029181830414901517156128bf5790565b60405163a9059cbb60e01b60208201526001600160a01b039283166024820152604480820194909452928352612ac3929190614450606484612352565b16615b06565b811561447057600160ff1b81145f198314166128bf570590565b634e487b7160e01b5f52601260045260245ffd5b620f42406118db6144ac879a899c9a61454597989a612ac39f979a6144c79b61453598612e67565b9790965f6080890151916101408b015160808c0151936131a9565b9760c0880151946144d66126d1565b9a6144e08b615c15565b15159081614569575b5061455d575b61450360a08b01516101008c015190613cd8565b61451660c08c015160e08d015190613cd8565b60608d015260408c01521561454f575f5b60808b01526130d48a6148dc565b60208701526101608501516148c3565b60a08501526132bd565b61455889615c15565b614527565b60208a01518b526144ef565b9050155f6144e9565b61457a6128d3565b508054600182015491600201548260c0916040938451916020948594846145a2878097612352565b8460b81b831d815288516145b68782612352565b8560781b841d81528951916145cb8884612352565b8660381b851d835260d09a8b97898251966145e68289612352565b898b1b8b1d88528351996145fa838c612352565b60a01b8b1d8a5283519a61460e838d612352565b8160901b811d8c5284519c614623908e612352565b8160601b811d8d5284519d614638908f612352565b8d8260301b821d905284519e8f9061464f91612352565b1d8d528251809e6146608383612352565b8360081b901d905282519e8f9261467961018085612352565b60ff1615158352881b881d9101528c015260608b015260808a015260a089015287015260e086015261010085015261012084015261014083015261016082015290565b5f81136146d2575f136146cd575f90565b5f1990565b50600190565b6040516323b872dd60e01b60208201526001600160a01b039283166024820152306044820152606480820194909452928352612ac3929190614450608484612352565b614723612bfc565b50546008808260c81c62ffffff61ffff946040519561474461014088612352565b8282168752828260181c166020880152828260301c166040880152828260481c166060880152828260601c166080880152808260781c1660a08801528160881c1660c087015260981c1660e0850152600480821614610100850152161461012082015290565b6147b26127ae565b5080546001820154600290920154604051926001600160401b039263ffffffff6147de61018087612352565b80821686528160201c1660208601528060801b60c01d6040860152838160801c16606086015260c01c608085015282811660a0850152828160401c1660c0850152828160801c1660e085015260c01c6101008401525f61012084015281811661014084015260401c1661016082015290565b6148586126d1565b506001815491015460018060401b0390816040519361487860c086612352565b63ffffffff811685528060a01b60c01d6020860152818160601c16604086015260a01c166060840152818116608084015260401c1660a082015290565b5f1981146128bf5760010190565b8181029181830414901517156128bf57620f4240900490565b6148f660606148ee6040840151615490565b920151615490565b905f82820392128183128116918313901516176128bf5790565b620f4240908181029181830414901517156128bf5790565b808203929160a084126102cc5761494160409183613b6e565b93605f1901126102cc5760806040519161495c604084612352565b606081015183520151602082015290565b91908260209103126102cc57604051614987602082612352565b91518252565b8051151582526020810151602083015260408101515160408301526060810151516060830152608081015151608083015260a08101515160a083015260c08101515160c083015260e08101515160e08301526101008082015151908301526101208082015151908301526101408082015151908301526101608091015151910152565b906102006040612ac393614a2584825161498d565b614a38602082015161018086019061232f565b01519101906129e0565b9291909360018060a01b03600254166040948551938492630e0886f960e41b845286600485015283602460a09788935afa948515614ef5575f935f96614ed0575b50808301614a928582516157f1565b825f528960208098601e8252614aa98c5f20612ce0565b9a89518111614eb4575b508b6101209b8a8d8a015190614ac891615816565b818a015115614b2792614b0791614e9d575b614ae2612710565b5051634d54b69d60e01b815295614afc600488018c6129fb565b610a64870190614a10565b87610cc4860152614b1c610ce486018c61248e565b610e64850190612389565b614b35610f248401896129e0565b8051610f8484015201928351610fa4830152610300908183610fc48173e5fa0ebd7c0a5484a4717e9077c2876ea0493d7d5af49a8b15614e93575f935f935f9d614cab575b505050509160c09493918a9382528c525192614bbf614bb86080614baf614ba88d8b015197519651876148c3565b8096615809565b950151856148c3565b8094615809565b9089850152614bd28b8501918251613cd8565b9052614bf06060840191614beb83518b8d015190613cd8565b613cd8565b9052614c0160808301918251613cd8565b90520194868651910151905f82820192831291129080158216911516176128bf5760e0614c35928592601398520151615508565b84860152515f5252805f2073107507a3268eec24dd3ffa223777b94552ead05b9251833b156102cc576101a45f92614c879585519687948593631cf7ef4560e11b85526004850152602484019061498d565b5af4908115614ca25750614c985750565b5f612ac391612352565b513d5f823e3d90fd5b929c5094925095949250803d8211614e8c575b614cc88186612352565b84019a848c039182126102cc57610180968783126102cc578790614d678f8f908f614cf582519d8e612352565b614cfe8b612703565b8d52808b0151908d0152614d1482828c0161496d565b908c0152614d258160608b0161496d565b60608c0152614d378160808b0161496d565b60808c0152614d4881868b0161496d565b858c0152614d598160c08b0161496d565b60c08c015260e0890161496d565b60e08a01526101009d8e614d7d82828b0161496d565b908b0152614d8d81838a0161496d565b828b0152610140614da082828b0161496d565b908b0152614db361016091828a0161496d565b908a015261017f198401126102cc57614dce8e519d8e612352565b8501518c526101a08501518b8d01526101c08501518d8d01526101e085015160608d015261020085015160808d0152610220850151908c015261024084015160c08c01528b61025f198201126102cc576060908c614e2e81519182612352565b61026086015181526102808601518c82015260e08d015261029f1901126102cc5760c0946102e08c5194614e63606087612352565b6102a081015186526102c08101518c87015201518c8501529992999193945f8080959395614b7a565b503d614cbe565b8c513d5f823e3d90fd5b614ea68d61591b565b614eaf83615950565b614ada565b614ebe908a615633565b614ec78b615950565b5f8b525f614ab3565b90809650614eeb9294503d8711613fc057613fb08183612352565b929092945f614a83565b87513d5f823e3d90fd5b92909193614ff6959461010093848601868151945f95515f526020936013855260409b8c98614feb614f328b5f20614572565b825f5260138952614fe0614f478d5f20614572565b93614fb260018060a01b039e8f8b51165f52601f8d528d815f20905f528d52614f71815f20614850565b928a518111615242575b50614f8b8a6101408d0151615816565b86511561522b575b614f9b6125c3565b5051630604fb1160e21b81529960048b01906129fb565b614fc0610a648a0188614a10565b8b610cc48a0152614fd5610ce48a018961248e565b610e64890190612389565b610f2487019061498d565b6110a485019061498d565b88836112248173825b2f8c2b992891f0c9a835d5793e09602f212e5af4988915614e93575f935f9a615186575b5050840191825260c08901518b8101908151948a51955f87820197881291129080158216911516176128bf57868b019561505d8751615490565b905f82820392128183128116918313901516176128bf578785938a926150869652015251615508565b868951165f52601a84528a5f2090515f528352895f2073154ae7c2af949357e0713d3676fc220fe7ea44039151823b156102cc5760a45f926150e2948e51958694859363be49f2e760e01b85526004850152602484019061232f565b5af4801561517c5791606096959391612ac39a9b9593615165575b50885186168452601b825284842083855282528484205490516151229187168a615970565b848851168352601c8152838320828452815261514885858520541685890151908a615970565b848851168352601d81528383209183525220541691015191615970565b6151729194505f90612352565b5f926151226150fd565b8a513d5f823e3d90fd5b919950925080833d8511615224575b61519f8183612352565b8101039283126102cc57608083126102cc5760808c51936151c08286612352565b8251855286830151878601528d8301518e86015260608084015190860152607f1901126102cc578b9260e086928551956151fb608088612352565b6080820151875260a08201518588015260c082015190870152015160608501529298905f615023565b503d615195565b6152348a61591b565b61523d83615950565b614f93565b61524c908b615633565b61525583615950565b5f83525f614f7b565b90615268816159e5565b606081019160029160018060401b039083615284838751615474565b1461537a576080810184615299848351615474565b1461537a5760a0820195856152af858951615474565b1461537a5760c0830190866152c5868451615474565b1461537a5760e08401876152da878351615474565b1461537a57610100850191886152f1888551615474565b1461537a576101609363ffffffff87511663ffffffff60201b602089015160201b161788600160401b600160801b039788928360408c015160401b1617600160801b600160c01b0380965160801b1617905160c01b179c5116915160401b1617915160801b1617905160c01b17936101408401511692015160401b161793825560018201550155565b6040516367e4596560e01b8152600490fd5b615395826159e5565b61539e82615a6b565b906153a883615a90565b9260016001603e1b0360026153bd8286615474565b1461537a576153ce60029186615474565b1461537a57610120810193600185511161537a5760019363ffffffff83511663ffffffff60201b602085015160201b1617958560401b8660801b039687604086015160401b1617600360801b61542386615aaa565b60801b1617908660fe1b905160fe1b16928660c01b8760fe1b039060c01b16918660821b8760c01b039060821b1617171793610160848060401b036101408401511692015160401b16179281550155565b818111615489571061548557600190565b5f90565b5050600290565b6001600160ff1b0381116154a15790565b6024906040519063eecaa25d60e01b82526004820152fd5b5f81126154c35790565b5f0390565b6154d06125c3565b508051906020810151906060604082015191015191604051936154f4608086612352565b845260208401526040830152606082015290565b81518152602081019061551b8251615490565b6155286060850151615490565b906155366080860151615490565b915f83820393128184128116918413901516176128bf575f82820192831291129080158216911516176128bf5761556c90615c41565b92604082019061557c8251615490565b61558960a0830151615490565b9061559760c0840151615490565b915f83820393128184128116918413901516176128bf575f82820192831291129080158216911516176128bf576155cf606091615c41565b9301906155dc8251615490565b6155f76101006155ef60e0850151615490565b930151615490565b915f83820393128184128116918413901516176128bf575f82820192831291129080158216911516176128bf5761562d90615c41565b90525252565b61563c8161591b565b5f6101208201525f60408201525f602082015252565b602081016156668151602085015190613cd8565b90604083018051906040860151915f83820193841291129080158216911516176128bf576101206156a08187019182519089015190613cd8565b906101406156b7818901918251908b015190613cd8565b906101606156ce818b01918251908d015190613cd8565b90525252525260608101906156e98251606085015190613cd8565b9260808201906156ff8251608083015190613cd8565b9260a0810190615715825160a085015190613cd8565b9260c082019061572b825160c083015190613cd8565b9260e0810190615757615744835160e086015190613cd8565b9361010080930192835191015190613cd8565b90525252525252565b61576d8151835190613cd8565b815260208101908151926020810151935f85820195861291129080158216911516176128bf5760408201906157a88251604083015190613cd8565b9260608101906157be8251606085015190613cd8565b9260808201906157e960a06157d98451608085015190613cd8565b94019160a0835191015190613cd8565b905252525252565b9060200190815115615801575050565b60a001519052565b919082039182116128bf57565b6020810161582a8151602085015190615809565b90604083018051906040860151915f83820393128184128116918413901516176128bf576101206158648187019182519089015190615809565b9061014061587b818901918251908b015190615809565b90610160615892818b01918251908d015190615809565b90525252525260608101906158ad8251606085015190615809565b9260808201906158c38251608083015190615809565b9260a08101906158d9825160a085015190615809565b9260c08201906158ef825160c083015190615809565b9260e0810190615757615908835160e086015190615809565b9361010080930192835191015190615809565b60605f918261016082015282610140820152826101008201528260e08201528260c08201528260a08201528260808201520152565b60405f918260a08201528260808201528260208201528260608201520152565b9082156159e05781516001600160a01b03918216911681036159a45750606060c06159a092015101918251613cd8565b9052565b612ac3929150805f5260106020526159be60405f20613b20565b916159ce60608401918251613cd8565b90525f52601060205260405f20614339565b505050565b63ffffffff8082511161537a5760208201511161537a57604081018051600290615a179060016001603f1b0390615af5565b1461537a5751615a309060016001603f1b031990615af5565b1561537a5760018060401b03906002615a4e83610140840151615474565b1461537a57600291610160615a64920151615474565b1461537a57565b615a8d9060e0615a84606083015160a084015190613cd8565b91015190613cd8565b90565b615a8d90610100615a84608083015160c084015190613cd8565b60a081015115801590615ae8575b6146d25760e08101511590811591615ad9575b50615ad4575f90565b600290565b6101009150015115155f615acb565b5060c08101511515615ab8565b818113615489571261548557600190565b602091615b8c916001600160a01b03165f80615b2186612505565b93615b2f6040519586612352565b8685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15615c0d573d91615b7183612505565b92615b7f6040519485612352565b83523d5f8785013e615d90565b805180615b9857505050565b818391810103126102cc5781615bae9101612703565b15615bb65750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b606091615d90565b615a8d90610a1e615c3060a083015161010084015190613cd8565b9160c060e082015191015190613cd8565b5f8112615c4b5790565b6024906040519063b02ef08760e01b82526004820152fd5b939190811580615d33575b615d2a578415615d18576118db6118db916118d5615cc7615ccd956118db615c958b615490565b996118d5615cc1615cb7615cb1620f42409e8f9c8d809961289d565b9e615490565b6118db868561289d565b9a615490565b91615490565b92818101918212905f81129081159280158316908416176128bf578301928312908115169116176128bf57615a8d926118d56118db926118db85615d1281600261289d565b9261289d565b60405163c7d40ac960e01b8152600490fd5b50505050505f90565b508315615c6e565b63ffffffff8151116137335760018060401b03906002615d5f836040840151615474565b14613733576002615d74836060840151615474565b14613733576002916080615d89920151615474565b1461373357565b91929015615df25750815115615da4575090565b3b15615dad5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015615e055750805190602001fd5b60405162461bcd60e51b815260206004820152908190615e2990602483019061285f565b0390fdfea9c835c21e93a672e5a6ef8ca0374f90b7d4378f7eec5769dcf22fdefd60ffae0aec74a1754fb10877b53c31a29be82096082042eb1fb374ec96fac88c0e621ba0c85df4ab9af89d2ff184f9d4c24f93d6105f799b04c85e12d76a89fa0f99f0a2646970667358221220cc5c9706c2974831a2db3538964b4f6a2eea408196d6e976668868a5bf36d6ed64736f6c63430008180033000000000000000000000000f12a4acda6ca2e777b353538cb8e5ad6f05e0437