diff --git a/contracts/.changeset/ninety-coins-mate.md b/contracts/.changeset/ninety-coins-mate.md new file mode 100644 index 00000000000..eda09d5c473 --- /dev/null +++ b/contracts/.changeset/ninety-coins-mate.md @@ -0,0 +1,10 @@ +--- +'@chainlink/contracts': patch +--- + +Modified TokenPriceFeedConfig to support tokens with zero decimals #bugfix + + +PR issue: CCIP-3723 + +Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index eb9c104183c..22ac6a8e7c2 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -19,7 +19,7 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244092) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24189) -CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2108354) +CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2108381) CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 332601) CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 458549) CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289173) @@ -67,7 +67,7 @@ CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 139 CCIPHome_setCandidate:test_setCandidate_success() (gas: 1365381) DefensiveExampleTest:test_HappyPath_Success() (gas: 200048) DefensiveExampleTest:test_Recovery() (gas: 424306) -E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1516792) +E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1516795) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96909) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49796) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17435) @@ -89,112 +89,113 @@ EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrit EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925) EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329) EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26348) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16878) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16758) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16800) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 41225) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12484) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 140316) -FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 162560) -FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12287) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11547) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54662) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 45153) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12310) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87853) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13255) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17366) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12352) -FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106589) -FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 110939) -FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 110992) -FeeQuoter_constructor:test_Setup_Success() (gas: 5020726) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16856) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16736) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16778) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 41181) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12462) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 140340) +FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 162349) +FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12265) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11613) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54728) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 45219) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12376) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87721) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13233) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17344) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12330) +FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106689) +FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 111039) +FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 111092) +FeeQuoter_constructor:test_Setup_Success() (gas: 5064266) FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 68361) -FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 29076) -FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 96045) +FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 29234) +FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 96069) FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14774) -FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20809) +FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20832) FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 72793) -FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 26309) -FeeQuoter_getTokenAndGasPrices:test_StalenessCheckDisabled_Success() (gas: 111759) +FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 26388) +FeeQuoter_getTokenAndGasPrices:test_StalenessCheckDisabled_Success() (gas: 111816) FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16081) -FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 109015) -FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 67299) -FeeQuoter_getTokenPrice:test_GetTokenPrice_LocalMoreRecent_Success() (gas: 33219) -FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 78388) -FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 39239) -FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34876) -FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27972) -FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 97567) -FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20441) -FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27780) -FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27803) -FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40372) -FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29499) -FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18354) -FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 82824) -FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 53482) -FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 239286) -FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22571) -FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 29879) -FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100330) -FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 142541) -FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21211) -FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113804) -FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22729) -FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63687) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1974036) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973994) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1954113) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973768) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973972) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973784) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64690) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64570) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) -FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973410) -FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14103) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972087) -FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43675) -FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23514) -FeeQuoter_onReport:test_onReport_Success() (gas: 80116) -FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 26882) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17427) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21545) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18636) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18154) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18513) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18636) -FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44725) -FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 19936) -FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 20333) -FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 17904) -FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122753) -FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42054) -FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28578) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 29949) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76189) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28176) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 26047) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 19523) +FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 108993) +FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 67849) +FeeQuoter_getTokenPrice:test_GetTokenPrice_LocalMoreRecent_Success() (gas: 33342) +FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 78366) +FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 39282) +FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34919) +FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28015) +FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 97630) +FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20506) +FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27823) +FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27846) +FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40415) +FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29542) +FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18377) +FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 82916) +FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 53483) +FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 239378) +FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22594) +FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 29902) +FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100353) +FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 142587) +FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21234) +FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113938) +FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22752) +FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63711) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1974510) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1974468) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1954587) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1974242) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1974446) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1974258) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 65176) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 65056) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58872) +FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973884) +FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61821) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116870) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14160) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972561) +FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43873) +FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23492) +FeeQuoter_onReport:test_onReport_Success() (gas: 80467) +FeeQuoter_onReport:test_onReport_TokenNotSupported_Revert() (gas: 22771) +FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 26982) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17471) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21589) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18680) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18198) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18557) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18680) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44681) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 19914) +FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 20311) +FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 17882) +FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122599) +FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42010) +FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28534) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 29927) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76123) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28132) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 26003) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 19501) FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 12154) -FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 23796) -FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 28528) -FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 74596) -FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 145320) -FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 50898) -FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 63825) -FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 20142) -FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 89470) -FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 51121) -FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12437) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 10655) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 4001581) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10862) -FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6797) -FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6511) +FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 23840) +FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 28572) +FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 74668) +FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 145584) +FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 52376) +FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 66245) +FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 20192) +FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 93429) +FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 53087) +FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12409) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 10633) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 3979031) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10840) +FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6775) +FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6489) HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209230) HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135879) HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107090) @@ -264,27 +265,27 @@ MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 2075068) MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 30794) MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 48166) MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15907) -MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17525) -MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21408) +MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17569) +MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21531) MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 14617) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 210107) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 58394) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 210239) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 58438) MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 17721) MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 45162) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 46370) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 76605) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308233) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 50536) -MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 51181) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 46458) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 76781) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308409) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 50624) +MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 51269) MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19345) MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15913) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 209885) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 60182) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 210017) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 60226) MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 46980) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 48179) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 77706) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308215) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 52324) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 48267) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 77882) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308391) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 52412) MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 11315) MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 19157) MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 10609) @@ -338,10 +339,10 @@ NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 25 NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 220866) NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 60382) NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 152988) -NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 166070) -NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 195673) -NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 139139) -NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 105187) +NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 166004) +NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 195563) +NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 139073) +NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 105143) NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates_success() (gas: 123118) NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 43282) NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64610) @@ -374,8 +375,8 @@ OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 61590) OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68151) OffRamp_commit:test_InvalidInterval_Revert() (gas: 64291) OffRamp_commit:test_InvalidRootRevert() (gas: 63356) -OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6670951) -OffRamp_commit:test_NoConfig_Revert() (gas: 6254557) +OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6670974) +OffRamp_commit:test_NoConfig_Revert() (gas: 6254580) OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 113033) OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 121381) OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 113032) @@ -384,10 +385,10 @@ OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 164378) OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 139413) OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 146578) OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59858) -OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 232042) +OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 232130) OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 125387) OffRamp_commit:test_Unhealthy_Revert() (gas: 58656) -OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 206691) +OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 206735) OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 51722) OffRamp_constructor:test_Constructor_Success() (gas: 6215957) OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 135933) @@ -400,12 +401,12 @@ OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17639) OffRamp_execute:test_LargeBatch_Success() (gas: 3409595) OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 371194) OffRamp_execute:test_MultipleReports_Success() (gas: 299305) -OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7079222) -OffRamp_execute:test_NoConfig_Revert() (gas: 6303697) +OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7079245) +OffRamp_execute:test_NoConfig_Revert() (gas: 6303720) OffRamp_execute:test_NonArray_Revert() (gas: 27562) OffRamp_execute:test_SingleReport_Success() (gas: 175796) OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 147814) -OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7081971) +OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7081994) OffRamp_execute:test_ZeroReports_Revert() (gas: 17361) OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18515) OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 243683) @@ -484,7 +485,7 @@ OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219355) OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227977) OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 294834) OffRamp_trialExecute:test_trialExecute_Success() (gas: 277312) -OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 250779) +OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 250848) OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 17209) OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates_Revert() (gas: 67048) OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates_Success() (gas: 325706) @@ -496,34 +497,34 @@ OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Rever OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 98232) OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 93245) OnRamp_constructor:test_Constructor_Success() (gas: 2762169) -OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115351) -OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 146174) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145749) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143976) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145946) -OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145344) -OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 140719) -OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38560) +OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115307) +OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 146130) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145705) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143932) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145902) +OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145300) +OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 140697) +OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38538) OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 143078) -OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 36625) +OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 36603) OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 36511) OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 18269) OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38460) OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23669) -OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 186396) -OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 212780) -OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146978) -OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 161083) -OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3615293) +OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 186264) +OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 212648) +OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146934) +OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 161127) +OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3615161) OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24016) OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75850) OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38583) -OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280301) -OnRamp_getFee:test_EmptyMessage_Success() (gas: 98597) -OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 65467) -OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86990) -OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35092) -OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113770) +OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280235) +OnRamp_getFee:test_EmptyMessage_Success() (gas: 98689) +OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 65468) +OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 87080) +OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35115) +OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113862) OnRamp_getFee:test_Unhealthy_Revert() (gas: 17039) OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10474) OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35282) @@ -533,12 +534,12 @@ OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigInvalidConfig_Revert( OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (gas: 16850) OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13243) OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56390) -OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97325) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 172600) +OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97303) +PingPong_ccipReceive:test_CcipReceive_Success() (gas: 172601) PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20240) PingPong_plumbing:test_Pausing_Success() (gas: 17718) -PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 153736) -PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 179373) +PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 153737) +PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 179374) RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 18822) RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 18660) RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 20371) @@ -606,23 +607,23 @@ Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89366) Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10663332) Router_applyRampUpdates:test_OnRampDisable() (gas: 56007) Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12334) -Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 131251) -Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 220951) -Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 71652) +Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 131252) +Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 220952) +Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 71675) Router_ccipSend:test_InvalidMsgValue() (gas: 32267) -Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 69340) -Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 192950) -Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 61388) -Router_ccipSend:test_NativeFeeToken_Success() (gas: 191576) -Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 226370) +Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 69363) +Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 192974) +Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 61411) +Router_ccipSend:test_NativeFeeToken_Success() (gas: 191600) +Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 226349) Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24900) Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44902) -Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 193820) -Router_ccipSend:test_ccipSend_nativeFeeNoTokenSuccess_gas() (gas: 140512) -Router_ccipSend:test_ccipSend_nativeFeeOneTokenSuccess_gas() (gas: 230125) +Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 193844) +Router_ccipSend:test_ccipSend_nativeFeeNoTokenSuccess_gas() (gas: 140513) +Router_ccipSend:test_ccipSend_nativeFeeOneTokenSuccess_gas() (gas: 230126) Router_constructor:test_Constructor_Success() (gas: 13076) Router_getArmProxy:test_getArmProxy() (gas: 10573) -Router_getFee:test_GetFeeSupportedChain_Success() (gas: 51693) +Router_getFee:test_GetFeeSupportedChain_Success() (gas: 51716) Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17150) Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10474) Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11334) diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol index 66f63c7c720..323ea1b9c53 100644 --- a/contracts/src/v0.8/ccip/FeeQuoter.sol +++ b/contracts/src/v0.8/ccip/FeeQuoter.sol @@ -57,10 +57,11 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, event DestChainConfigUpdated(uint64 indexed destChainSelector, DestChainConfig destChainConfig); event DestChainAdded(uint64 indexed destChainSelector, DestChainConfig destChainConfig); - /// @dev Token price data feed configuration + /// @dev Contains token price configuration used in both the keystone price updates and the price feed fallback logic. struct TokenPriceFeedConfig { - address dataFeedAddress; // ─╮ AggregatorV3Interface contract (0 - feed is unset) - uint8 tokenDecimals; // ─────╯ Decimals of the token that the feed represents + address dataFeedAddress; // ──╮ Price feed contract. Can be address(0) to indicate no feed is configured. + uint8 tokenDecimals; // | Decimals of the token, used for both keystone and price feed decimal multiplications. + bool isEnabled; // ───────────╯ Whether the token is configured to receive keystone and/or price feed updates. } /// @dev Token price data feed update @@ -248,16 +249,16 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, return tokenPrice; } + // When we have a stale price we should check if there is a more up to date source. If not, return the stale price. TokenPriceFeedConfig memory priceFeedConfig = s_usdPriceFeedsPerToken[token]; - - // If the token price feed is not set, return the stale price - if (priceFeedConfig.dataFeedAddress == address(0)) { + if (!priceFeedConfig.isEnabled || priceFeedConfig.dataFeedAddress == address(0)) { return tokenPrice; } // If the token price feed is set, retrieve the price from the feed Internal.TimestampedPackedUint224 memory feedPrice = _getTokenPriceFromDataFeed(priceFeedConfig); + // We check if the feed price isn't more stale than the stored price. Return the most recent one. return feedPrice.timestamp >= tokenPrice.timestamp ? feedPrice : tokenPrice; } @@ -507,12 +508,14 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, ReceivedCCIPFeedReport[] memory feeds = abi.decode(report, (ReceivedCCIPFeedReport[])); for (uint256 i = 0; i < feeds.length; ++i) { - uint8 tokenDecimals = s_usdPriceFeedsPerToken[feeds[i].token].tokenDecimals; - if (tokenDecimals == 0) { + TokenPriceFeedConfig memory feedConfig = s_usdPriceFeedsPerToken[feeds[i].token]; + + if (!feedConfig.isEnabled) { revert TokenNotSupported(feeds[i].token); } // Keystone reports prices in USD with 18 decimals, so we passing it as 18 in the _calculateRebasedValue function - uint224 rebasedValue = _calculateRebasedValue(uint8(KEYSTONE_PRICE_DECIMALS), tokenDecimals, feeds[i].price); + uint224 rebasedValue = + _calculateRebasedValue(uint8(KEYSTONE_PRICE_DECIMALS), feedConfig.tokenDecimals, feeds[i].price); //if stale update then revert if (feeds[i].timestamp < s_usdPerToken[feeds[i].token].timestamp) { diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol index 36ccb14da93..519c96ca5c5 100644 --- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol +++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol @@ -2218,11 +2218,11 @@ contract FeeQuoter_KeystoneSetup is FeeQuoterSetup { FeeQuoter.TokenPriceFeedUpdate[] memory tokenPriceFeeds = new FeeQuoter.TokenPriceFeedUpdate[](2); tokenPriceFeeds[0] = FeeQuoter.TokenPriceFeedUpdate({ sourceToken: onReportTestToken1, - feedConfig: FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0x0), tokenDecimals: 18}) + feedConfig: FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0x0), tokenDecimals: 18, isEnabled: true}) }); tokenPriceFeeds[1] = FeeQuoter.TokenPriceFeedUpdate({ sourceToken: onReportTestToken2, - feedConfig: FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0x0), tokenDecimals: 20}) + feedConfig: FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0x0), tokenDecimals: 20, isEnabled: true}) }); s_feeQuoter.setReportPermissions(permissions); s_feeQuoter.updateTokenPriceFeeds(tokenPriceFeeds); @@ -2257,6 +2257,19 @@ contract FeeQuoter_onReport is FeeQuoter_KeystoneSetup { vm.assertEq(s_feeQuoter.getTokenPrice(report[1].token).timestamp, report[1].timestamp); } + function test_onReport_TokenNotSupported_Revert() public { + bytes memory encodedPermissionsMetadata = + abi.encodePacked(keccak256(abi.encode("workflowCID")), WORKFLOW_NAME_1, WORKFLOW_OWNER_1, REPORT_NAME_1); + FeeQuoter.ReceivedCCIPFeedReport[] memory report = new FeeQuoter.ReceivedCCIPFeedReport[](1); + report[0] = + FeeQuoter.ReceivedCCIPFeedReport({token: s_sourceTokens[1], price: 4e18, timestamp: uint32(block.timestamp)}); + + // Revert due to token config not being set with the isEnabled flag + vm.expectRevert(abi.encodeWithSelector(FeeQuoter.TokenNotSupported.selector, s_sourceTokens[1])); + vm.startPrank(FORWARDER_1); + s_feeQuoter.onReport(encodedPermissionsMetadata, abi.encode(report)); + } + function test_onReport_InvalidForwarder_Reverts() public { bytes memory encodedPermissionsMetadata = abi.encodePacked(keccak256(abi.encode("workflowCID")), WORKFLOW_NAME_1, WORKFLOW_OWNER_1, REPORT_NAME_1); diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol index f1a00be78c3..20283da17bf 100644 --- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol @@ -210,7 +210,11 @@ contract FeeQuoterSetup is TokenSetup { ) internal pure returns (FeeQuoter.TokenPriceFeedUpdate memory) { return FeeQuoter.TokenPriceFeedUpdate({ sourceToken: sourceToken, - feedConfig: FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: dataFeedAddress, tokenDecimals: tokenDecimals}) + feedConfig: FeeQuoter.TokenPriceFeedConfig({ + dataFeedAddress: dataFeedAddress, + tokenDecimals: tokenDecimals, + isEnabled: true + }) }); } @@ -268,13 +272,14 @@ contract FeeQuoterSetup is TokenSetup { ) internal pure virtual { assertEq(config1.dataFeedAddress, config2.dataFeedAddress); assertEq(config1.tokenDecimals, config2.tokenDecimals); + assertEq(config1.isEnabled, config2.isEnabled); } function _assertTokenPriceFeedConfigUnconfigured( FeeQuoter.TokenPriceFeedConfig memory config ) internal pure virtual { _assertTokenPriceFeedConfigEquality( - config, FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0), tokenDecimals: 0}) + config, FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0), tokenDecimals: 0, isEnabled: false}) ); } diff --git a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go index 45d4f8b5aba..404b215cb43 100644 --- a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go +++ b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go @@ -87,6 +87,7 @@ type FeeQuoterStaticConfig struct { type FeeQuoterTokenPriceFeedConfig struct { DataFeedAddress common.Address TokenDecimals uint8 + IsEnabled bool } type FeeQuoterTokenPriceFeedUpdate struct { @@ -155,8 +156,8 @@ type KeystoneFeedsPermissionHandlerPermission struct { } var FeeQuoterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feedTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storedTimeStamp\",\"type\":\"uint256\"}],\"name\":\"StaleKeystoneUpdate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"name\":\"permission\",\"type\":\"tuple\"}],\"name\":\"ReportPermissionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FEE_BASE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"name\":\"permissions\",\"type\":\"tuple[]\"}],\"name\":\"setReportPermissions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e06040523480156200001157600080fd5b506040516200789238038062007892833981016040819052620000349162001870565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000206565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b1565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018b908662000400565b620001968462000548565b620001a18162000619565b620001ac8262000a81565b60408051600080825260208201909252620001f991859190620001f2565b6040805180820190915260008082526020820152815260200190600190039081620001ca5790505b5062000b4d565b5050505050505062001b2e565b336001600160a01b03821603620002605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000341576000828281518110620002da57620002da6200198f565b60209081029190910101519050620002f460028262000e86565b1562000337576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002b9565b50815160005b8151811015620003fa5760008282815181106200036857620003686200198f565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a6576040516342bcdf7f60e11b815260040160405180910390fd5b620003b360028262000ea6565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000347565b50505050565b60005b8251811015620004a1576200043f8382815181106200042657620004266200198f565b6020026020010151600b62000ebd60201b90919060201c565b1562000498578281815181106200045a576200045a6200198f565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b60010162000403565b5060005b81518110156200054357620004e1828281518110620004c857620004c86200198f565b6020026020010151600b62000ea660201b90919060201c565b156200053a57818181518110620004fc57620004fc6200198f565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101620004a5565b505050565b60005b8151811015620006155760008282815181106200056c576200056c6200198f565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054b565b5050565b60005b8151811015620006155760008282815181106200063d576200063d6200198f565b6020026020010151905060008383815181106200065e576200065e6200198f565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000697575061016081015163ffffffff16155b80620006b957506102008101516001600160e01b031916630a04b54b60e21b14155b80620006d95750806060015163ffffffff1681610160015163ffffffff16115b15620007045760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160a81b900460e01b6001600160e01b03191690036200078457816001600160401b03167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda4626582604051620007769190620019a5565b60405180910390a2620007c8565b816001600160401b03167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051620007bf9190620019a5565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061c565b60005b81518110156200061557600082828151811062000aa55762000aa56200198f565b6020026020010151600001519050600083838151811062000aca5762000aca6200198f565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a84565b60005b825181101562000dc057600083828151811062000b715762000b716200198f565b6020026020010151905060008160000151905060005b82602001515181101562000db15760008360200151828151811062000bb05762000bb06200198f565b602002602001015160200151905060008460200151838151811062000bd95762000bd96200198f565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c385760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000d9e908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000b87565b50505080600101905062000b50565b5060005b81518110156200054357600082828151811062000de55762000de56200198f565b6020026020010151600001519050600083838151811062000e0a5762000e0a6200198f565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000dc4565b600062000e9d836001600160a01b03841662000ed4565b90505b92915050565b600062000e9d836001600160a01b03841662000fd8565b600062000e9d836001600160a01b0384166200102a565b6000818152600183016020526040812054801562000fcd57600062000efb60018362001af6565b855490915060009062000f119060019062001af6565b905081811462000f7d57600086600001828154811062000f355762000f356200198f565b906000526020600020015490508087600001848154811062000f5b5762000f5b6200198f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f915762000f9162001b18565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000ea0565b600091505062000ea0565b6000818152600183016020526040812054620010215750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000ea0565b50600062000ea0565b6000818152600183016020526040812054801562000fcd5760006200105160018362001af6565b8554909150600090620010679060019062001af6565b905080821462000f7d57600086600001828154811062000f355762000f356200198f565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620010c657620010c66200108b565b60405290565b60405160c081016001600160401b0381118282101715620010c657620010c66200108b565b60405161022081016001600160401b0381118282101715620010c657620010c66200108b565b604051601f8201601f191681016001600160401b03811182821017156200114257620011426200108b565b604052919050565b80516001600160a01b03811681146200116257600080fd5b919050565b805163ffffffff811681146200116257600080fd5b6000606082840312156200118f57600080fd5b604051606081016001600160401b0381118282101715620011b457620011b46200108b565b604052825190915081906001600160601b0381168114620011d457600080fd5b8152620011e4602084016200114a565b6020820152620011f76040840162001167565b60408201525092915050565b60006001600160401b038211156200121f576200121f6200108b565b5060051b60200190565b600082601f8301126200123b57600080fd5b81516020620012546200124e8362001203565b62001117565b8083825260208201915060208460051b8701019350868411156200127757600080fd5b602086015b848110156200129e5762001290816200114a565b83529183019183016200127c565b509695505050505050565b600082601f830112620012bb57600080fd5b81516020620012ce6200124e8362001203565b82815260609283028501820192828201919087851115620012ee57600080fd5b8387015b858110156200138157808903828112156200130d5760008081fd5b62001317620010a1565b62001322836200114a565b8152604080601f1984011215620013395760008081fd5b62001343620010a1565b9250620013528885016200114a565b835283015160ff81168114620013685760008081fd5b82880152808701919091528452928401928101620012f2565b5090979650505050505050565b80516001600160401b03811681146200116257600080fd5b805161ffff811681146200116257600080fd5b805180151581146200116257600080fd5b600082601f830112620013dc57600080fd5b81516020620013ef6200124e8362001203565b82815260059290921b840181019181810190868411156200140f57600080fd5b8286015b848110156200129e5780516001600160401b03808211156200143457600080fd5b908801906040601f19838c0381018213156200144f57600080fd5b62001459620010a1565b620014668986016200138e565b815282850151848111156200147a57600080fd5b8086019550508c603f8601126200149057600080fd5b888501519350620014a56200124e8562001203565b84815260e09094028501830193898101908e861115620014c457600080fd5b958401955b858710156200159d57868f0360e0811215620014e457600080fd5b620014ee620010a1565b620014f9896200114a565b815260c086830112156200150c57600080fd5b62001516620010cc565b9150620015258d8a0162001167565b825262001534878a0162001167565b8d8301526200154660608a01620013a6565b878301526200155860808a0162001167565b60608301526200156b60a08a0162001167565b60808301526200157e60c08a01620013b9565b60a0830152808d0191909152825260e09690960195908a0190620014c9565b828b01525087525050509284019250830162001413565b600082601f830112620015c657600080fd5b81516020620015d96200124e8362001203565b82815260069290921b84018101918181019086841115620015f957600080fd5b8286015b848110156200129e5760408189031215620016185760008081fd5b62001622620010a1565b6200162d826200114a565b81526200163c8583016200138e565b81860152835291830191604001620015fd565b80516001600160e01b0319811681146200116257600080fd5b600082601f8301126200167a57600080fd5b815160206200168d6200124e8362001203565b8281526102409283028501820192828201919087851115620016ae57600080fd5b8387015b85811015620013815780890382811215620016cd5760008081fd5b620016d7620010a1565b620016e2836200138e565b815261022080601f1984011215620016fa5760008081fd5b62001704620010f1565b925062001713888501620013b9565b8352604062001724818601620013a6565b8985015260606200173781870162001167565b82860152608091506200174c82870162001167565b9085015260a06200175f86820162001167565b8286015260c0915062001774828701620013a6565b9085015260e06200178786820162001167565b8286015261010091506200179d828701620013a6565b90850152610120620017b1868201620013a6565b828601526101409150620017c7828701620013a6565b90850152610160620017db86820162001167565b828601526101809150620017f182870162001167565b908501526101a0620018058682016200138e565b828601526101c091506200181b82870162001167565b908501526101e06200182f86820162001167565b82860152610200915062001845828701620013b9565b90850152620018568583016200164f565b9084015250808701919091528452928401928101620016b2565b6000806000806000806000610120888a0312156200188d57600080fd5b6200189989896200117c565b60608901519097506001600160401b0380821115620018b757600080fd5b620018c58b838c0162001229565b975060808a0151915080821115620018dc57600080fd5b620018ea8b838c0162001229565b965060a08a01519150808211156200190157600080fd5b6200190f8b838c01620012a9565b955060c08a01519150808211156200192657600080fd5b620019348b838c01620013ca565b945060e08a01519150808211156200194b57600080fd5b620019598b838c01620015b4565b93506101008a01519150808211156200197157600080fd5b50620019808a828b0162001668565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b81511515815261022081016020830151620019c6602084018261ffff169052565b506040830151620019df604084018263ffffffff169052565b506060830151620019f8606084018263ffffffff169052565b50608083015162001a11608084018263ffffffff169052565b5060a083015162001a2860a084018261ffff169052565b5060c083015162001a4160c084018263ffffffff169052565b5060e083015162001a5860e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000ea057634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615d1162001b81600039600081816102fa01526118750152600081816102be01528181610eb80152610f1801526000818161028a01528181610f410152610fb10152615d116000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c8063770e2dc411610104578063a69c64c0116100a2578063d63d3af211610071578063d63d3af214610ab0578063d8694ccd14610ab8578063f2fde38b14610acb578063ffdb4b3714610ade57600080fd5b8063a69c64c0146109d5578063bf78e03f146109e8578063cdc73d5114610a95578063d02641a014610a9d57600080fd5b8063805f2132116100de578063805f21321461081757806382b49eb01461082a5780638da5cb5b1461099a57806391a2749a146109c257600080fd5b8063770e2dc4146107e957806379ba5097146107fc5780637afac3221461080457600080fd5b8063407e10861161017c5780634ab35b0b1161014b5780634ab35b0b14610457578063514e8cff146104975780636cb5f3dd1461053a5780636def4ce71461054d57600080fd5b8063407e1086146103ee57806341ed29e714610401578063430d138c1461041457806345ac924d1461043757600080fd5b8063181f5a77116101b8578063181f5a77146103735780632451a627146103bc578063325c868e146103d15780633937306f146103d957600080fd5b806241e5be146101de578063061877e31461020457806306285c691461025d575b600080fd5b6101f16101ec3660046143f1565b610b26565b6040519081526020015b60405180910390f35b61024461021236600461442d565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101fb565b610327604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101fb565b6103af6040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101fb91906144ac565b6103c4610b94565b6040516101fb91906144bf565b6101f1602481565b6103ec6103e7366004614519565b610ba5565b005b6103ec6103fc3660046146bb565b610e5a565b6103ec61040f3660046147ed565b610e6e565b6104276104223660046149c7565b610eb0565b6040516101fb9493929190614abb565b61044a610445366004614b5a565b6110c0565b6040516101fb9190614b9c565b61046a61046536600461442d565b61118b565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b61052d6104a5366004614c17565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101fb9190614c32565b6103ec610548366004614cc3565b611196565b6107dc61055b366004614c17565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c01000000000000000000000000860485166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516101fb9190614ee3565b6103ec6107f73660046150e1565b6111a7565b6103ec6111b9565b6103ec6108123660046153fb565b6112b6565b6103ec61082536600461545f565b6112c8565b61093a6108383660046154cb565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101fb9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6103ec6109d03660046154f5565b6117b0565b6103ec6109e3366004615586565b6117c1565b610a616109f636600461442d565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526007825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101fb565b6103c46117d2565b61052d610aab36600461442d565b6117de565b6101f1601281565b6101f1610ac636600461564b565b61194b565b6103ec610ad936600461442d565b611e83565b610af1610aec3660046156a0565b611e94565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101fb565b6000610b3182611f4c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b5885611f4c565b610b80907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856156f9565b610b8a9190615710565b90505b9392505050565b6060610ba06002611fe6565b905090565b610bad611ff3565b6000610bb9828061574b565b9050905060005b81811015610d03576000610bd4848061574b565b83818110610be457610be46157b3565b905060400201803603810190610bfa919061580e565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610cf29290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610bc0565b506000610d13602084018461574b565b9050905060005b81811015610e54576000610d31602086018661574b565b83818110610d4157610d416157b3565b905060400201803603810190610d57919061584b565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610e439290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610d1a565b50505050565b610e62612038565b610e6b816120b9565b50565b610e76612038565b60005b8151811015610eac57610ea4828281518110610e9757610e976157b3565b60200260200101516121b7565b600101610e79565b5050565b6000806060807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610f11578a9350610f3f565b610f3c8c8c7f0000000000000000000000000000000000000000000000000000000000000000610b26565b93505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16841115610fe3576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018590526bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b67ffffffffffffffff8d1660009081526009602052604081206001015463ffffffff16906110128c8c84612389565b9050806020015194506110288f8b8b8b8b612532565b925085856110a8836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b95509550955050509950995099509995505050505050565b60608160008167ffffffffffffffff8111156110de576110de614554565b60405190808252806020026020018201604052801561112357816020015b60408051808201909152600080825260208201528152602001906001900390816110fc5790505b50905060005b828110156111805761115b868683818110611146576111466157b3565b9050602002016020810190610aab919061442d565b82828151811061116d5761116d6157b3565b6020908102919091010152600101611129565b509150505b92915050565b600061118582611f4c565b61119e612038565b610e6b816128a3565b6111af612038565b610eac8282612d75565b60015473ffffffffffffffffffffffffffffffffffffffff16331461123a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610fda565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112be612038565b610eac8282613187565b600080600061130c87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506132ce92505050565b92509250925061131e338385846132e9565b600061132c8587018761586e565b905060005b81518110156117a557600060076000848481518110611352576113526157b3565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160009081205474010000000000000000000000000000000000000000900460ff169150819003611413578282815181106113bc576113bc6157b3565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610fda565b600061145c60128386868151811061142d5761142d6157b3565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613441565b905060066000858581518110611474576114746157b3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff168484815181106114e6576114e66157b3565b60200260200101516040015163ffffffff1610156115f057838381518110611510576115106157b3565b60200260200101516000015184848151811061152e5761152e6157b3565b60200260200101516040015160066000878781518110611550576115506157b3565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610fda565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152602001858581518110611631576116316157b3565b60200260200101516040015163ffffffff168152506006600086868151811061165c5761165c6157b3565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905583518490849081106116f4576116f46157b3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a8286868151811061174a5761174a6157b3565b6020026020010151604001516040516117939291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a25050600101611331565b505050505050505050565b6117b8612038565b610e6b81613504565b6117c9612038565b610e6b81613690565b6060610ba0600b611fe6565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169183018290527f000000000000000000000000000000000000000000000000000000000000000016906118a09042615935565b10156118ac5792915050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600760209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff169082015290611911575092915050565b600061191c8261377a565b9050826020015163ffffffff16816020015163ffffffff1610156119405782611942565b805b95945050505050565b67ffffffffffffffff8083166000908152600960209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c01000000000000000000000000880485166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611b85576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610fda565b611ba0611b98608085016060860161442d565b600b9061390c565b611bff57611bb4608084016060850161442d565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610fda565b6000611c0e604085018561574b565b9150611c6a905082611c236020870187615948565b905083611c308880615948565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061393b92505050565b6000611c84611c7f608087016060880161442d565b611f4c565b90506000611c9787856101c001516139e5565b9050600080808515611cd757611ccb878b611cb860808d0160608e0161442d565b88611cc660408f018f61574b565b613ae5565b91945092509050611cf7565b6101a0870151611cf49063ffffffff16662386f26fc100006156f9565b92505b61010087015160009061ffff1615611d3b57611d38886dffffffffffffffffffffffffffff607088901c16611d2f60208e018e615948565b90508a86613dbd565b90505b61018088015160009067ffffffffffffffff16611d64611d5e60808e018e615948565b8c613e6d565b600001518563ffffffff168b60a0015161ffff168e8060200190611d889190615948565b611d939291506156f9565b8c6080015163ffffffff16611da891906159ad565b611db291906159ad565b611dbc91906159ad565b611dd6906dffffffffffffffffffffffffffff89166156f9565b611de091906156f9565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f6060016020810190611e1a919061442d565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054611e559067ffffffffffffffff16896156f9565b611e5f91906159ad565b611e6991906159ad565b611e739190615710565b9c9b505050505050505050505050565b611e8b612038565b610e6b81613f2e565b67ffffffffffffffff8116600090815260096020526040812054819060ff16611ef5576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610fda565b611efe84611f4c565b67ffffffffffffffff8416600090815260096020526040902060010154611f40908590700100000000000000000000000000000000900463ffffffff166139e5565b915091505b9250929050565b600080611f58836117de565b9050806020015163ffffffff1660001480611f90575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15611fdf576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fda565b5192915050565b60606000610b8d83614023565b611ffe60023361390c565b612036576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610fda565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314612036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610fda565b60005b8151811015610eac5760008282815181106120d9576120d96157b3565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506120bc565b600061227082600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a39061237d908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b604080518082019091526000808252602082015260008390036123ca57506040805180820190915267ffffffffffffffff8216815260006020820152610b8d565b60006123d684866159c0565b905060006123e78560048189615a06565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f00000000000000000000000000000000000000000000000000000000001612484578080602001905181019061247b9190615a30565b92505050610b8d565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612500576040518060400160405280828060200190518101906124ec9190615a5c565b815260006020909101529250610b8d915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff808616600090815260096020526040902060010154606091750100000000000000000000000000000000000000000090910460e01b90859081111561258257612582614554565b6040519080825280602002602001820160405280156125b557816020015b60608152602001906001900390816125a05790505b50915060005b858110156128985760008585838181106125d7576125d76157b3565b6125ed926020604090920201908101915061442d565b90506000888884818110612603576126036157b3565b90506020028101906126159190615a75565b612623906040810190615948565b91505060208111156126d35767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff168111156126d3576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610fda565b612743848a8a868181106126e9576126e96157b3565b90506020028101906126fb9190615a75565b612709906020810190615948565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061407f92505050565b67ffffffffffffffff8a166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160c081018352905463ffffffff8082168352640100000000820481168386015268010000000000000000820461ffff16838501526a01000000000000000000008204811660608401526e010000000000000000000000000000820481166080840152720100000000000000000000000000000000000090910460ff16151560a08301908152958552600990935290832054935190937b01000000000000000000000000000000000000000000000000000000900490911691906128425781612848565b82606001515b6040805163ffffffff831660208201529192500160405160208183030381529060405288878151811061287d5761287d6157b3565b602002602001018190525050505050508060010190506125bb565b505095945050505050565b60005b8151811015610eac5760008282815181106128c3576128c36157b3565b6020026020010151905060008383815181106128e1576128e16157b3565b60200260200101516000015190506000826020015190508167ffffffffffffffff166000148061291a575061016081015163ffffffff16155b8061296c57506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b8061298b5750806060015163ffffffff1681610160015163ffffffff16115b156129ce576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610fda565b67ffffffffffffffff82166000908152600960205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff00000000000000000000000000000000000000000000000000000000169003612a76578167ffffffffffffffff167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda4626582604051612a699190614ee3565b60405180910390a2612ab9565b8167ffffffffffffffff167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051612ab09190614ee3565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506128a6565b60005b825181101561309e576000838281518110612d9557612d956157b3565b6020026020010151905060008160000151905060005b82602001515181101561309057600083602001518281518110612dd057612dd06157b3565b6020026020010151602001519050600084602001518381518110612df657612df66157b3565b6020026020010151600001519050602063ffffffff16826080015163ffffffff161015612e795760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610fda565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59061307e908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101612dab565b505050806001019050612d78565b5060005b81518110156131825760008282815181106130bf576130bf6157b3565b602002602001015160000151905060008383815181106130e1576130e16157b3565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a350506001016130a2565b505050565b60005b825181101561322a576131c08382815181106131a8576131a86157b3565b6020026020010151600b6140d190919063ffffffff16565b15613222578281815181106131d7576131d76157b3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b60010161318a565b5060005b81518110156131825761326482828151811061324c5761324c6157b3565b6020026020010151600b6140f390919063ffffffff16565b156132c65781818151811061327b5761327b6157b3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010161322e565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff1661343a576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610fda565b5050505050565b60008061344e8486615ab3565b9050600060248260ff1611156134885761346c602460ff8416615935565b61347790600a615bec565b6134819085615710565b90506134ae565b61349660ff83166024615935565b6134a190600a615bec565b6134ab90856156f9565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611942576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015160005b815181101561359f576000828281518110613529576135296157b3565b6020026020010151905061354781600261411590919063ffffffff16565b156135965760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b5060010161350c565b50815160005b8151811015610e545760008282815181106135c2576135c26157b3565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613632576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61363d6002826140f3565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a1506001016135a5565b60005b8151811015610eac5760008282815181106136b0576136b06157b3565b602002602001015160000151905060008383815181106136d2576136d26157b3565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a25050600101613693565b60408051808201909152600080825260208201526000826000015190506000808273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156137e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138099190615c12565b50935050925050600082121561384b576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138ca8473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561389b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138bf9190615c62565b876020015185613441565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff909216602083015250949350505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b8d565b836040015163ffffffff168311156139945760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610fda565b836020015161ffff168211156139d6576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e548461020001518261407f565b67ffffffffffffffff821660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116825263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169282019290925290831615613add576000816020015163ffffffff1642613a7a9190615935565b90508363ffffffff16811115613adb576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff8516602482015260448101829052606401610fda565b505b519392505050565b6000808083815b81811015613daf576000878783818110613b0857613b086157b3565b905060400201803603810190613b1e9190615c7f565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613c3e576101208d0151613c0b9061ffff16662386f26fc100006156f9565b613c1590886159ad565b96508c610140015186613c289190615cb8565b9550613c35602086615cb8565b94505050613da7565b604081015160009061ffff1615613cf75760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613c9a578351613c9390611f4c565b9050613c9d565b508a5b620186a0836040015161ffff16613cdf8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661413790919063ffffffff16565b613ce991906156f9565b613cf39190615710565b9150505b6060820151613d069088615cb8565b9650816080015186613d189190615cb8565b8251909650600090613d379063ffffffff16662386f26fc100006156f9565b905080821015613d5657613d4b818a6159ad565b985050505050613da7565b6000836020015163ffffffff16662386f26fc10000613d7591906156f9565b905080831115613d9557613d89818b6159ad565b99505050505050613da7565b613d9f838b6159ad565b995050505050505b600101613aec565b505096509650969350505050565b60008063ffffffff8316613dd3610120866156f9565b613ddf876101e06159ad565b613de991906159ad565b613df391906159ad565b905060008760c0015163ffffffff168860e0015161ffff1683613e1691906156f9565b613e2091906159ad565b61010089015190915061ffff16613e476dffffffffffffffffffffffffffff8916836156f9565b613e5191906156f9565b613e6190655af3107a40006156f9565b98975050505050505050565b60408051808201909152600080825260208201526000613e99858585610160015163ffffffff16612389565b9050826060015163ffffffff1681600001511115613ee3576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015613ef757508060200151155b15610b8a576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613fad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610fda565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60608160000180548060200260200160405190810160405280929190818152602001828054801561407357602002820191906000526020600020905b81548152602001906001019080831161405f575b50505050509050919050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610eac5761318281614174565b6000610b8d8373ffffffffffffffffffffffffffffffffffffffff8416614227565b6000610b8d8373ffffffffffffffffffffffffffffffffffffffff8416614321565b6000610b8d8373ffffffffffffffffffffffffffffffffffffffff8416614370565b6000670de0b6b3a764000061416a837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166156f9565b610b8d9190615710565b600081516020146141b357816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610fda91906144ac565b6000828060200190518101906141c99190615a5c565b905073ffffffffffffffffffffffffffffffffffffffff8111806141ee575061040081105b1561118557826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610fda91906144ac565b6000818152600183016020526040812054801561431057600061424b600183615935565b855490915060009061425f90600190615935565b90508082146142c457600086600001828154811061427f5761427f6157b3565b90600052602060002001549050808760000184815481106142a2576142a26157b3565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806142d5576142d5615cd5565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611185565b6000915050611185565b5092915050565b600081815260018301602052604081205461436857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611185565b506000611185565b60008181526001830160205260408120548015614310576000614394600183615935565b85549091506000906143a890600190615935565b90508181146142c457600086600001828154811061427f5761427f6157b3565b803573ffffffffffffffffffffffffffffffffffffffff811681146143ec57600080fd5b919050565b60008060006060848603121561440657600080fd5b61440f846143c8565b925060208401359150614424604085016143c8565b90509250925092565b60006020828403121561443f57600080fd5b610b8d826143c8565b6000815180845260005b8181101561446e57602081850181015186830182015201614452565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b8d6020830184614448565b6020808252825182820181905260009190848201906040850190845b8181101561450d57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016144db565b50909695505050505050565b60006020828403121561452b57600080fd5b813567ffffffffffffffff81111561454257600080fd5b820160408185031215610b8d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156145a6576145a6614554565b60405290565b60405160a0810167ffffffffffffffff811182821017156145a6576145a6614554565b604051610220810167ffffffffffffffff811182821017156145a6576145a6614554565b60405160c0810167ffffffffffffffff811182821017156145a6576145a6614554565b6040516060810167ffffffffffffffff811182821017156145a6576145a6614554565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561468057614680614554565b604052919050565b600067ffffffffffffffff8211156146a2576146a2614554565b5060051b60200190565b60ff81168114610e6b57600080fd5b600060208083850312156146ce57600080fd5b823567ffffffffffffffff8111156146e557600080fd5b8301601f810185136146f657600080fd5b803561470961470482614688565b614639565b8181526060918202830184019184820191908884111561472857600080fd5b938501935b838510156147c857848903818112156147465760008081fd5b61474e614583565b614757876143c8565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08401121561478b5760008081fd5b614793614583565b92506147a08989016143c8565b83528701356147ae816146ac565b82890152808801919091528352938401939185019161472d565b50979650505050505050565b8015158114610e6b57600080fd5b80356143ec816147d4565b6000602080838503121561480057600080fd5b823567ffffffffffffffff81111561481757600080fd5b8301601f8101851361482857600080fd5b803561483661470482614688565b81815260a0918202830184019184820191908884111561485557600080fd5b938501935b838510156147c85780858a0312156148725760008081fd5b61487a6145ac565b614883866143c8565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146148b85760008081fd5b818801526040868101357fffff000000000000000000000000000000000000000000000000000000000000811681146148f15760008081fd5b9082015260606149028782016143c8565b90820152608086810135614915816147d4565b908201528352938401939185019161485a565b803567ffffffffffffffff811681146143ec57600080fd5b60008083601f84011261495257600080fd5b50813567ffffffffffffffff81111561496a57600080fd5b602083019150836020828501011115611f4557600080fd5b60008083601f84011261499457600080fd5b50813567ffffffffffffffff8111156149ac57600080fd5b6020830191508360208260051b8501011115611f4557600080fd5b600080600080600080600080600060c08a8c0312156149e557600080fd5b6149ee8a614928565b98506149fc60208b016143c8565b975060408a0135965060608a013567ffffffffffffffff80821115614a2057600080fd5b614a2c8d838e01614940565b909850965060808c0135915080821115614a4557600080fd5b614a518d838e01614982565b909650945060a08c0135915080821115614a6a57600080fd5b818c0191508c601f830112614a7e57600080fd5b813581811115614a8d57600080fd5b8d60208260061b8501011115614aa257600080fd5b6020830194508093505050509295985092959850929598565b848152600060208515158184015260806040840152614add6080840186614448565b8381036060850152845180825282820190600581901b8301840184880160005b83811015614b49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552614b37838351614448565b94870194925090860190600101614afd565b50909b9a5050505050505050505050565b60008060208385031215614b6d57600080fd5b823567ffffffffffffffff811115614b8457600080fd5b614b9085828601614982565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614c0a57614bfa84835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101614bb9565b5091979650505050505050565b600060208284031215614c2957600080fd5b610b8d82614928565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff169082015260408101611185565b803561ffff811681146143ec57600080fd5b803563ffffffff811681146143ec57600080fd5b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146143ec57600080fd5b60006020808385031215614cd657600080fd5b823567ffffffffffffffff811115614ced57600080fd5b8301601f81018513614cfe57600080fd5b8035614d0c61470482614688565b8181526102409182028301840191848201919088841115614d2c57600080fd5b938501935b838510156147c85784890381811215614d4a5760008081fd5b614d52614583565b614d5b87614928565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215614d905760008081fd5b614d986145cf565b9250614da58989016147e2565b83526040614db4818a01614c6d565b8a8501526060614dc5818b01614c7f565b8286015260809150614dd8828b01614c7f565b9085015260a0614de98a8201614c7f565b8286015260c09150614dfc828b01614c6d565b9085015260e0614e0d8a8201614c7f565b828601526101009150614e21828b01614c6d565b90850152610120614e338a8201614c6d565b828601526101409150614e47828b01614c6d565b90850152610160614e598a8201614c7f565b828601526101809150614e6d828b01614c7f565b908501526101a0614e7f8a8201614928565b828601526101c09150614e93828b01614c7f565b908501526101e0614ea58a8201614c7f565b828601526102009150614eb9828b016147e2565b90850152614ec8898301614c93565b90840152508088019190915283529384019391850191614d31565b81511515815261022081016020830151614f03602084018261ffff169052565b506040830151614f1b604084018263ffffffff169052565b506060830151614f33606084018263ffffffff169052565b506080830151614f4b608084018263ffffffff169052565b5060a0830151614f6160a084018261ffff169052565b5060c0830151614f7960c084018263ffffffff169052565b5060e0830151614f8f60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b600082601f83011261505a57600080fd5b8135602061506a61470483614688565b82815260069290921b8401810191818101908684111561508957600080fd5b8286015b848110156150d657604081890312156150a65760008081fd5b6150ae614583565b6150b782614928565b81526150c48583016143c8565b8186015283529183019160400161508d565b509695505050505050565b600080604083850312156150f457600080fd5b67ffffffffffffffff8335111561510a57600080fd5b83601f84358501011261511c57600080fd5b61512c6147048435850135614688565b8335840180358083526020808401939260059290921b9091010186101561515257600080fd5b602085358601015b85358601803560051b0160200181101561535f5767ffffffffffffffff8135111561518457600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a030112156151bd57600080fd5b6151c5614583565b6151d160208301614928565b815267ffffffffffffffff604083013511156151ec57600080fd5b88603f60408401358401011261520157600080fd5b6152176147046020604085013585010135614688565b6020604084810135850182810135808552928401939260e00201018b101561523e57600080fd5b6040808501358501015b6040858101358601602081013560e00201018110156153405760e0818d03121561527157600080fd5b615279614583565b615282826143c8565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f030112156152b657600080fd5b6152be6145f3565b6152ca60208401614c7f565b81526152d860408401614c7f565b60208201526152e960608401614c6d565b60408201526152fa60808401614c7f565b606082015261530b60a08401614c7f565b608082015261531d60c08401356147d4565b60c083013560a0820152602082810191909152908452929092019160e001615248565b508060208401525050808552505060208301925060208101905061515a565b5092505067ffffffffffffffff6020840135111561537c57600080fd5b61538c8460208501358501615049565b90509250929050565b600082601f8301126153a657600080fd5b813560206153b661470483614688565b8083825260208201915060208460051b8701019350868411156153d857600080fd5b602086015b848110156150d6576153ee816143c8565b83529183019183016153dd565b6000806040838503121561540e57600080fd5b823567ffffffffffffffff8082111561542657600080fd5b61543286838701615395565b9350602085013591508082111561544857600080fd5b5061545585828601615395565b9150509250929050565b6000806000806040858703121561547557600080fd5b843567ffffffffffffffff8082111561548d57600080fd5b61549988838901614940565b909650945060208701359150808211156154b257600080fd5b506154bf87828801614940565b95989497509550505050565b600080604083850312156154de57600080fd5b6154e783614928565b915061538c602084016143c8565b60006020828403121561550757600080fd5b813567ffffffffffffffff8082111561551f57600080fd5b908301906040828603121561553357600080fd5b61553b614583565b82358281111561554a57600080fd5b61555687828601615395565b82525060208301358281111561556b57600080fd5b61557787828601615395565b60208301525095945050505050565b6000602080838503121561559957600080fd5b823567ffffffffffffffff8111156155b057600080fd5b8301601f810185136155c157600080fd5b80356155cf61470482614688565b81815260069190911b820183019083810190878311156155ee57600080fd5b928401925b82841015615640576040848903121561560c5760008081fd5b615614614583565b61561d856143c8565b815261562a868601614928565b81870152825260409390930192908401906155f3565b979650505050505050565b6000806040838503121561565e57600080fd5b61566783614928565b9150602083013567ffffffffffffffff81111561568357600080fd5b830160a0818603121561569557600080fd5b809150509250929050565b600080604083850312156156b357600080fd5b6156bc836143c8565b915061538c60208401614928565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417611185576111856156ca565b600082615746577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261578057600080fd5b83018035915067ffffffffffffffff82111561579b57600080fd5b6020019150600681901b3603821315611f4557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146143ec57600080fd5b60006040828403121561582057600080fd5b615828614583565b615831836143c8565b815261583f602084016157e2565b60208201529392505050565b60006040828403121561585d57600080fd5b615865614583565b61583183614928565b6000602080838503121561588157600080fd5b823567ffffffffffffffff81111561589857600080fd5b8301601f810185136158a957600080fd5b80356158b761470482614688565b818152606091820283018401918482019190888411156158d657600080fd5b938501935b838510156147c85780858a0312156158f35760008081fd5b6158fb614616565b615904866143c8565b81526159118787016157e2565b878201526040615922818801614c7f565b90820152835293840193918501916158db565b81810381811115611185576111856156ca565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261597d57600080fd5b83018035915067ffffffffffffffff82111561599857600080fd5b602001915036819003821315611f4557600080fd5b80820180821115611185576111856156ca565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156150415760049490940360031b84901b1690921692915050565b60008085851115615a1657600080fd5b83861115615a2357600080fd5b5050820193919092039150565b600060408284031215615a4257600080fd5b615a4a614583565b82518152602083015161583f816147d4565b600060208284031215615a6e57600080fd5b5051919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112615aa957600080fd5b9190910192915050565b60ff8181168382160190811115611185576111856156ca565b600181815b80851115615b2557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b0b57615b0b6156ca565b80851615615b1857918102915b93841c9390800290615ad1565b509250929050565b600082615b3c57506001611185565b81615b4957506000611185565b8160018114615b5f5760028114615b6957615b85565b6001915050611185565b60ff841115615b7a57615b7a6156ca565b50506001821b611185565b5060208310610133831016604e8410600b8410161715615ba8575081810a611185565b615bb28383615acc565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615be457615be46156ca565b029392505050565b6000610b8d8383615b2d565b805169ffffffffffffffffffff811681146143ec57600080fd5b600080600080600060a08688031215615c2a57600080fd5b615c3386615bf8565b9450602086015193506040860151925060608601519150615c5660808701615bf8565b90509295509295909350565b600060208284031215615c7457600080fd5b8151610b8d816146ac565b600060408284031215615c9157600080fd5b615c99614583565b615ca2836143c8565b8152602083013560208201528091505092915050565b63ffffffff81811683821601908082111561431a5761431a6156ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feedTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storedTimeStamp\",\"type\":\"uint256\"}],\"name\":\"StaleKeystoneUpdate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"name\":\"permission\",\"type\":\"tuple\"}],\"name\":\"ReportPermissionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FEE_BASE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"name\":\"permissions\",\"type\":\"tuple[]\"}],\"name\":\"setReportPermissions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60e06040523480156200001157600080fd5b50604051620079f7380380620079f78339810160408190526200003491620018b2565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000206565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b1565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018b908662000400565b620001968462000548565b620001a18162000640565b620001ac8262000aa8565b60408051600080825260208201909252620001f991859190620001f2565b6040805180820190915260008082526020820152815260200190600190039081620001ca5790505b5062000b74565b5050505050505062001b70565b336001600160a01b03821603620002605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000341576000828281518110620002da57620002da620019d1565b60209081029190910101519050620002f460028262000ead565b1562000337576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002b9565b50815160005b8151811015620003fa576000828281518110620003685762000368620019d1565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a6576040516342bcdf7f60e11b815260040160405180910390fd5b620003b360028262000ecd565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000347565b50505050565b60005b8251811015620004a1576200043f838281518110620004265762000426620019d1565b6020026020010151600b62000ee460201b90919060201c565b1562000498578281815181106200045a576200045a620019d1565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b60010162000403565b5060005b81518110156200054357620004e1828281518110620004c857620004c8620019d1565b6020026020010151600b62000ecd60201b90919060201c565b156200053a57818181518110620004fc57620004fc620019d1565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101620004a5565b505050565b60005b81518110156200063c5760008282815181106200056c576200056c620019d1565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a0180518589018051949098166001600160a81b03199093168317600160a01b60ff928316021760ff60a81b1916600160a81b9415159490940293909317909355835190815291511697810197909752915115159186019190915292945090929091907fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf9060600160405180910390a25050508060010190506200054b565b5050565b60005b81518110156200063c576000828281518110620006645762000664620019d1565b602002602001015190506000838381518110620006855762000685620019d1565b6020026020010151600001519050600082602001519050816001600160401b031660001480620006be575061016081015163ffffffff16155b80620006e057506102008101516001600160e01b031916630a04b54b60e21b14155b80620007005750806060015163ffffffff1681610160015163ffffffff16115b156200072b5760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160a81b900460e01b6001600160e01b0319169003620007ab57816001600160401b03167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda46265826040516200079d9190620019e7565b60405180910390a2620007ef565b816001600160401b03167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051620007e69190620019e7565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c021790555090505050505080600101905062000643565b60005b81518110156200063c57600082828151811062000acc5762000acc620019d1565b6020026020010151600001519050600083838151811062000af15762000af1620019d1565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000aab565b60005b825181101562000de757600083828151811062000b985762000b98620019d1565b6020026020010151905060008160000151905060005b82602001515181101562000dd85760008360200151828151811062000bd75762000bd7620019d1565b602002602001015160200151905060008460200151838151811062000c005762000c00620019d1565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c5f5760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000dc5908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000bae565b50505080600101905062000b77565b5060005b81518110156200054357600082828151811062000e0c5762000e0c620019d1565b6020026020010151600001519050600083838151811062000e315762000e31620019d1565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000deb565b600062000ec4836001600160a01b03841662000efb565b90505b92915050565b600062000ec4836001600160a01b03841662000fff565b600062000ec4836001600160a01b03841662001051565b6000818152600183016020526040812054801562000ff457600062000f2260018362001b38565b855490915060009062000f389060019062001b38565b905081811462000fa457600086600001828154811062000f5c5762000f5c620019d1565b906000526020600020015490508087600001848154811062000f825762000f82620019d1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000fb85762000fb862001b5a565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000ec7565b600091505062000ec7565b6000818152600183016020526040812054620010485750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000ec7565b50600062000ec7565b6000818152600183016020526040812054801562000ff45760006200107860018362001b38565b85549091506000906200108e9060019062001b38565b905080821462000fa457600086600001828154811062000f5c5762000f5c620019d1565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620010ed57620010ed620010b2565b60405290565b604080519081016001600160401b0381118282101715620010ed57620010ed620010b2565b60405160c081016001600160401b0381118282101715620010ed57620010ed620010b2565b60405161022081016001600160401b0381118282101715620010ed57620010ed620010b2565b604051601f8201601f191681016001600160401b03811182821017156200118e576200118e620010b2565b604052919050565b80516001600160a01b0381168114620011ae57600080fd5b919050565b805163ffffffff81168114620011ae57600080fd5b600060608284031215620011db57600080fd5b620011e5620010c8565b82519091506001600160601b03811681146200120057600080fd5b8152620012106020830162001196565b60208201526200122360408301620011b3565b604082015292915050565b60006001600160401b038211156200124a576200124a620010b2565b5060051b60200190565b600082601f8301126200126657600080fd5b815160206200127f62001279836200122e565b62001163565b8083825260208201915060208460051b870101935086841115620012a257600080fd5b602086015b84811015620012c957620012bb8162001196565b8352918301918301620012a7565b509695505050505050565b80518015158114620011ae57600080fd5b600082601f830112620012f757600080fd5b815160206200130a62001279836200122e565b82815260079290921b840181019181810190868411156200132a57600080fd5b8286015b84811015620012c95780880360808112156200134a5760008081fd5b62001354620010f3565b6200135f8362001196565b8152606080601f1984011215620013765760008081fd5b62001380620010c8565b92506200138f87850162001196565b835260408085015160ff81168114620013a85760008081fd5b84890152620013b9858301620012d4565b9084015250808601919091528352918301916080016200132e565b80516001600160401b0381168114620011ae57600080fd5b805161ffff81168114620011ae57600080fd5b600082601f8301126200141157600080fd5b815160206200142462001279836200122e565b82815260059290921b840181019181810190868411156200144457600080fd5b8286015b84811015620012c95780516001600160401b03808211156200146957600080fd5b908801906040601f19838c0381018213156200148457600080fd5b6200148e620010f3565b6200149b898601620013d4565b81528285015184811115620014af57600080fd5b8086019550508c603f860112620014c557600080fd5b888501519350620014da62001279856200122e565b84815260e09094028501830193898101908e861115620014f957600080fd5b958401955b85871015620015d257868f0360e08112156200151957600080fd5b62001523620010f3565b6200152e8962001196565b815260c086830112156200154157600080fd5b6200154b62001118565b91506200155a8d8a01620011b3565b825262001569878a01620011b3565b8d8301526200157b60608a01620013ec565b878301526200158d60808a01620011b3565b6060830152620015a060a08a01620011b3565b6080830152620015b360c08a01620012d4565b60a0830152808d0191909152825260e09690960195908a0190620014fe565b828b01525087525050509284019250830162001448565b600082601f830112620015fb57600080fd5b815160206200160e62001279836200122e565b82815260069290921b840181019181810190868411156200162e57600080fd5b8286015b84811015620012c957604081890312156200164d5760008081fd5b62001657620010f3565b620016628262001196565b815262001671858301620013d4565b8186015283529183019160400162001632565b80516001600160e01b031981168114620011ae57600080fd5b600082601f830112620016af57600080fd5b81516020620016c262001279836200122e565b8281526102409283028501820192828201919087851115620016e357600080fd5b8387015b85811015620018a55780890382811215620017025760008081fd5b6200170c620010f3565b6200171783620013d4565b815261022080601f19840112156200172f5760008081fd5b620017396200113d565b925062001748888501620012d4565b8352604062001759818601620013ec565b8985015260606200176c818701620011b3565b828601526080915062001781828701620011b3565b9085015260a062001794868201620011b3565b8286015260c09150620017a9828701620013ec565b9085015260e0620017bc868201620011b3565b828601526101009150620017d2828701620013ec565b90850152610120620017e6868201620013ec565b828601526101409150620017fc828701620013ec565b9085015261016062001810868201620011b3565b82860152610180915062001826828701620011b3565b908501526101a06200183a868201620013d4565b828601526101c0915062001850828701620011b3565b908501526101e062001864868201620011b3565b8286015261020091506200187a828701620012d4565b908501526200188b85830162001684565b9084015250808701919091528452928401928101620016e7565b5090979650505050505050565b6000806000806000806000610120888a031215620018cf57600080fd5b620018db8989620011c8565b60608901519097506001600160401b0380821115620018f957600080fd5b620019078b838c0162001254565b975060808a01519150808211156200191e57600080fd5b6200192c8b838c0162001254565b965060a08a01519150808211156200194357600080fd5b620019518b838c01620012e5565b955060c08a01519150808211156200196857600080fd5b620019768b838c01620013ff565b945060e08a01519150808211156200198d57600080fd5b6200199b8b838c01620015e9565b93506101008a0151915080821115620019b357600080fd5b50620019c28a828b016200169d565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b8151151581526102208101602083015162001a08602084018261ffff169052565b50604083015162001a21604084018263ffffffff169052565b50606083015162001a3a606084018263ffffffff169052565b50608083015162001a53608084018263ffffffff169052565b5060a083015162001a6a60a084018261ffff169052565b5060c083015162001a8360c084018263ffffffff169052565b5060e083015162001a9a60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000ec757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615e3462001bc3600039600081816102fa01526118d30152600081816102be01528181610ed50152610f3501526000818161028a01528181610f5e0152610fce0152615e346000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806379ba509711610104578063bf78e03f116100a2578063d8694ccd11610071578063d8694ccd14610ad6578063f2fde38b14610ae9578063fbe3f77814610afc578063ffdb4b3714610b0f57600080fd5b8063bf78e03f146109d5578063cdc73d5114610ab3578063d02641a014610abb578063d63d3af214610ace57600080fd5b806382b49eb0116100de57806382b49eb0146108175780638da5cb5b1461098757806391a2749a146109af578063a69c64c0146109c257600080fd5b806379ba5097146107e95780637afac322146107f1578063805f21321461080457600080fd5b806341ed29e71161017c578063514e8cff1161014b578063514e8cff146104845780636cb5f3dd146105275780636def4ce71461053a578063770e2dc4146107d657600080fd5b806341ed29e7146103ee578063430d138c1461040157806345ac924d146104245780634ab35b0b1461044457600080fd5b8063181f5a77116101b8578063181f5a77146103735780632451a627146103bc578063325c868e146103d15780633937306f146103d957600080fd5b806241e5be146101de578063061877e31461020457806306285c691461025d575b600080fd5b6101f16101ec3660046144fc565b610b57565b6040519081526020015b60405180910390f35b610244610212366004614538565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101fb565b610327604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101fb565b6103af6040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101fb91906145b7565b6103c4610bc5565b6040516101fb91906145ca565b6101f1602481565b6103ec6103e7366004614624565b610bd6565b005b6103ec6103fc3660046147d0565b610e8b565b61041461040f3660046149bb565b610ecd565b6040516101fb9493929190614aaf565b610437610432366004614b4e565b6110dd565b6040516101fb9190614b90565b610457610452366004614538565b6111a8565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b61051a610492366004614c0b565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101fb9190614c26565b6103ec610535366004614cb7565b6111b3565b6107c9610548366004614c0b565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c01000000000000000000000000860485166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516101fb9190614ed7565b6103ec6107e43660046150d5565b6111c7565b6103ec6111d9565b6103ec6107ff3660046153ef565b6112d6565b6103ec610812366004615453565b6112e8565b6109276108253660046154bf565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101fb9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6103ec6109bd3660046154e9565b61180e565b6103ec6109d036600461557a565b61181f565b610a766109e3366004614538565b60408051606080820183526000808352602080840182905292840181905273ffffffffffffffffffffffffffffffffffffffff9485168152600783528390208351918201845254938416815260ff74010000000000000000000000000000000000000000850481169282019290925275010000000000000000000000000000000000000000009093041615159082015290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015160ff1690820152918101511515908201526060016101fb565b6103c4611830565b61051a610ac9366004614538565b61183c565b6101f1601281565b6101f1610ae436600461563f565b6119f1565b6103ec610af7366004614538565b611f29565b6103ec610b0a3660046156a3565b611f3a565b610b22610b1d3660046157c3565b611f4b565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101fb565b6000610b6282612003565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b8985612003565b610bb1907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168561581c565b610bbb9190615833565b90505b9392505050565b6060610bd1600261209d565b905090565b610bde6120aa565b6000610bea828061586e565b9050905060005b81811015610d34576000610c05848061586e565b83818110610c1557610c156158d6565b905060400201803603810190610c2b9190615931565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610d239290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610bf1565b506000610d44602084018461586e565b9050905060005b81811015610e85576000610d62602086018661586e565b83818110610d7257610d726158d6565b905060400201803603810190610d88919061596e565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610e749290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610d4b565b50505050565b610e936120ef565b60005b8151811015610ec957610ec1828281518110610eb457610eb46158d6565b6020026020010151612170565b600101610e96565b5050565b6000806060807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610f2e578a9350610f5c565b610f598c8c7f0000000000000000000000000000000000000000000000000000000000000000610b57565b93505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16841115611000576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018590526bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b67ffffffffffffffff8d1660009081526009602052604081206001015463ffffffff169061102f8c8c84612342565b9050806020015194506110458f8b8b8b8b6124eb565b925085856110c5836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b95509550955050509950995099509995505050505050565b60608160008167ffffffffffffffff8111156110fb576110fb61465f565b60405190808252806020026020018201604052801561114057816020015b60408051808201909152600080825260208201528152602001906001900390816111195790505b50905060005b8281101561119d57611178868683818110611163576111636158d6565b9050602002016020810190610ac99190614538565b82828151811061118a5761118a6158d6565b6020908102919091010152600101611146565b509150505b92915050565b60006111a282612003565b6111bb6120ef565b6111c48161285c565b50565b6111cf6120ef565b610ec98282612d2e565b60015473ffffffffffffffffffffffffffffffffffffffff16331461125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ff7565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112de6120ef565b610ec98282613140565b600080600061132c87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061328792505050565b92509250925061133e338385846132a2565b600061134c85870187615991565b905060005b815181101561180357600060076000848481518110611372576113726158d6565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604091820160002082516060810184529054938416815260ff740100000000000000000000000000000000000000008504811692820192909252750100000000000000000000000000000000000000000090930416151590820181905290915061146d57828281518110611416576114166158d6565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610ff7565b60006114ba6012836020015186868151811061148b5761148b6158d6565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166133fa565b9050600660008585815181106114d2576114d26158d6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff16848481518110611544576115446158d6565b60200260200101516040015163ffffffff16101561164e5783838151811061156e5761156e6158d6565b60200260200101516000015184848151811061158c5761158c6158d6565b602002602001015160400151600660008787815181106115ae576115ae6158d6565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610ff7565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260200185858151811061168f5761168f6158d6565b60200260200101516040015163ffffffff16815250600660008686815181106116ba576116ba6158d6565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790558351849084908110611752576117526158d6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a828686815181106117a8576117a86158d6565b6020026020010151604001516040516117f19291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a25050600101611351565b505050505050505050565b6118166120ef565b6111c4816134bd565b6118276120ef565b6111c481613649565b6060610bd1600b61209d565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169183018290527f000000000000000000000000000000000000000000000000000000000000000016906118fe9042615a58565b101561190a5792915050565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526007602090815260409182902082516060810184529054938416815260ff74010000000000000000000000000000000000000000850481169282019290925275010000000000000000000000000000000000000000009093041615801591830191909152806119ab5750805173ffffffffffffffffffffffffffffffffffffffff16155b156119b7575092915050565b60006119c282613733565b9050826020015163ffffffff16816020015163ffffffff1610156119e657826119e8565b805b95945050505050565b67ffffffffffffffff8083166000908152600960209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c01000000000000000000000000880485166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611c2b576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610ff7565b611c46611c3e6080850160608601614538565b600b906138c5565b611ca557611c5a6080840160608501614538565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610ff7565b6000611cb4604085018561586e565b9150611d10905082611cc96020870187615a6b565b905083611cd68880615a6b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138f492505050565b6000611d2a611d256080870160608801614538565b612003565b90506000611d3d87856101c0015161399e565b9050600080808515611d7d57611d71878b611d5e60808d0160608e01614538565b88611d6c60408f018f61586e565b613a9e565b91945092509050611d9d565b6101a0870151611d9a9063ffffffff16662386f26fc1000061581c565b92505b61010087015160009061ffff1615611de157611dde886dffffffffffffffffffffffffffff607088901c16611dd560208e018e615a6b565b90508a86613d76565b90505b61018088015160009067ffffffffffffffff16611e0a611e0460808e018e615a6b565b8c613e26565b600001518563ffffffff168b60a0015161ffff168e8060200190611e2e9190615a6b565b611e3992915061581c565b8c6080015163ffffffff16611e4e9190615ad0565b611e589190615ad0565b611e629190615ad0565b611e7c906dffffffffffffffffffffffffffff891661581c565b611e86919061581c565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f6060016020810190611ec09190614538565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054611efb9067ffffffffffffffff168961581c565b611f059190615ad0565b611f0f9190615ad0565b611f199190615833565b9c9b505050505050505050505050565b611f316120ef565b6111c481613ee7565b611f426120ef565b6111c481613fdc565b67ffffffffffffffff8116600090815260096020526040812054819060ff16611fac576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610ff7565b611fb584612003565b67ffffffffffffffff8416600090815260096020526040902060010154611ff7908590700100000000000000000000000000000000900463ffffffff1661399e565b915091505b9250929050565b60008061200f8361183c565b9050806020015163ffffffff1660001480612047575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15612096576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610ff7565b5192915050565b60606000610bbe8361412e565b6120b56002336138c5565b6120ed576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610ff7565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ff7565b600061222982600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a390612336908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b6040805180820190915260008082526020820152600083900361238357506040805180820190915267ffffffffffffffff8216815260006020820152610bbe565b600061238f8486615ae3565b905060006123a08560048189615b29565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f0000000000000000000000000000000000000000000000000000000000161243d57808060200190518101906124349190615b53565b92505050610bbe565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016124b9576040518060400160405280828060200190518101906124a59190615b7f565b815260006020909101529250610bbe915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff808616600090815260096020526040902060010154606091750100000000000000000000000000000000000000000090910460e01b90859081111561253b5761253b61465f565b60405190808252806020026020018201604052801561256e57816020015b60608152602001906001900390816125595790505b50915060005b85811015612851576000858583818110612590576125906158d6565b6125a69260206040909202019081019150614538565b905060008888848181106125bc576125bc6158d6565b90506020028101906125ce9190615b98565b6125dc906040810190615a6b565b915050602081111561268c5767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff1681111561268c576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610ff7565b6126fc848a8a868181106126a2576126a26158d6565b90506020028101906126b49190615b98565b6126c2906020810190615a6b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061418a92505050565b67ffffffffffffffff8a166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160c081018352905463ffffffff8082168352640100000000820481168386015268010000000000000000820461ffff16838501526a01000000000000000000008204811660608401526e010000000000000000000000000000820481166080840152720100000000000000000000000000000000000090910460ff16151560a08301908152958552600990935290832054935190937b01000000000000000000000000000000000000000000000000000000900490911691906127fb5781612801565b82606001515b6040805163ffffffff8316602082015291925001604051602081830303815290604052888781518110612836576128366158d6565b60200260200101819052505050505050806001019050612574565b505095945050505050565b60005b8151811015610ec957600082828151811061287c5761287c6158d6565b60200260200101519050600083838151811061289a5761289a6158d6565b60200260200101516000015190506000826020015190508167ffffffffffffffff16600014806128d3575061016081015163ffffffff16155b8061292557506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806129445750806060015163ffffffff1681610160015163ffffffff16115b15612987576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ff7565b67ffffffffffffffff82166000908152600960205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff00000000000000000000000000000000000000000000000000000000169003612a2f578167ffffffffffffffff167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda4626582604051612a229190614ed7565b60405180910390a2612a72565b8167ffffffffffffffff167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051612a699190614ed7565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c021790555090505050505080600101905061285f565b60005b8251811015613057576000838281518110612d4e57612d4e6158d6565b6020026020010151905060008160000151905060005b82602001515181101561304957600083602001518281518110612d8957612d896158d6565b6020026020010151602001519050600084602001518381518110612daf57612daf6158d6565b6020026020010151600001519050602063ffffffff16826080015163ffffffff161015612e325760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610ff7565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b590613037908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101612d64565b505050806001019050612d31565b5060005b815181101561313b576000828281518110613078576130786158d6565b6020026020010151600001519050600083838151811061309a5761309a6158d6565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010161305b565b505050565b60005b82518110156131e357613179838281518110613161576131616158d6565b6020026020010151600b6141dc90919063ffffffff16565b156131db57828181518110613190576131906158d6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101613143565b5060005b815181101561313b5761321d828281518110613205576132056158d6565b6020026020010151600b6141fe90919063ffffffff16565b1561327f57818181518110613234576132346158d6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b6001016131e7565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff166133f3576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610ff7565b5050505050565b6000806134078486615bd6565b9050600060248260ff16111561344157613425602460ff8416615a58565b61343090600a615d0f565b61343a9085615833565b9050613467565b61344f60ff83166024615a58565b61345a90600a615d0f565b613464908561581c565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111156119e8576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015160005b81518110156135585760008282815181106134e2576134e26158d6565b6020026020010151905061350081600261422090919063ffffffff16565b1561354f5760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b506001016134c5565b50815160005b8151811015610e8557600082828151811061357b5761357b6158d6565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135eb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135f66002826141fe565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010161355e565b60005b8151811015610ec9576000828281518110613669576136696158d6565b6020026020010151600001519050600083838151811061368b5761368b6158d6565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010161364c565b60408051808201909152600080825260208201526000826000015190506000808273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561379e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c29190615d35565b509350509250506000821215613804576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138838473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613854573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138789190615d85565b8760200151856133fa565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff909216602083015250949350505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610bbe565b836040015163ffffffff1683111561394d5760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610ff7565b836020015161ffff1682111561398f576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e858461020001518261418a565b67ffffffffffffffff821660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116825263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169282019290925290831615613a96576000816020015163ffffffff1642613a339190615a58565b90508363ffffffff16811115613a94576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff8516602482015260448101829052606401610ff7565b505b519392505050565b6000808083815b81811015613d68576000878783818110613ac157613ac16158d6565b905060400201803603810190613ad79190615da2565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613bf7576101208d0151613bc49061ffff16662386f26fc1000061581c565b613bce9088615ad0565b96508c610140015186613be19190615ddb565b9550613bee602086615ddb565b94505050613d60565b604081015160009061ffff1615613cb05760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613c53578351613c4c90612003565b9050613c56565b508a5b620186a0836040015161ffff16613c988660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661424290919063ffffffff16565b613ca2919061581c565b613cac9190615833565b9150505b6060820151613cbf9088615ddb565b9650816080015186613cd19190615ddb565b8251909650600090613cf09063ffffffff16662386f26fc1000061581c565b905080821015613d0f57613d04818a615ad0565b985050505050613d60565b6000836020015163ffffffff16662386f26fc10000613d2e919061581c565b905080831115613d4e57613d42818b615ad0565b99505050505050613d60565b613d58838b615ad0565b995050505050505b600101613aa5565b505096509650969350505050565b60008063ffffffff8316613d8c6101208661581c565b613d98876101e0615ad0565b613da29190615ad0565b613dac9190615ad0565b905060008760c0015163ffffffff168860e0015161ffff1683613dcf919061581c565b613dd99190615ad0565b61010089015190915061ffff16613e006dffffffffffffffffffffffffffff89168361581c565b613e0a919061581c565b613e1a90655af3107a400061581c565b98975050505050505050565b60408051808201909152600080825260208201526000613e52858585610160015163ffffffff16612342565b9050826060015163ffffffff1681600001511115613e9c576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015613eb057508060200151155b15610bbb576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613f66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ff7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015610ec9576000828281518110613ffc57613ffc6158d6565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a0180518589018051949098167fffffffffffffffffffffff00000000000000000000000000000000000000000090931683177401000000000000000000000000000000000000000060ff92831602177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000009415159490940293909317909355835190815291511697810197909752915115159186019190915292945090929091907fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf9060600160405180910390a2505050806001019050613fdf565b60608160000180548060200260200160405190810160405280929190818152602001828054801561417e57602002820191906000526020600020905b81548152602001906001019080831161416a575b50505050509050919050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610ec95761313b8161427f565b6000610bbe8373ffffffffffffffffffffffffffffffffffffffff8416614332565b6000610bbe8373ffffffffffffffffffffffffffffffffffffffff841661442c565b6000610bbe8373ffffffffffffffffffffffffffffffffffffffff841661447b565b6000670de0b6b3a7640000614275837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff861661581c565b610bbe9190615833565b600081516020146142be57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610ff791906145b7565b6000828060200190518101906142d49190615b7f565b905073ffffffffffffffffffffffffffffffffffffffff8111806142f9575061040081105b156111a257826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610ff791906145b7565b6000818152600183016020526040812054801561441b576000614356600183615a58565b855490915060009061436a90600190615a58565b90508082146143cf57600086600001828154811061438a5761438a6158d6565b90600052602060002001549050808760000184815481106143ad576143ad6158d6565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806143e0576143e0615df8565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506111a2565b60009150506111a2565b5092915050565b6000818152600183016020526040812054614473575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556111a2565b5060006111a2565b6000818152600183016020526040812054801561441b57600061449f600183615a58565b85549091506000906144b390600190615a58565b90508181146143cf57600086600001828154811061438a5761438a6158d6565b803573ffffffffffffffffffffffffffffffffffffffff811681146144f757600080fd5b919050565b60008060006060848603121561451157600080fd5b61451a846144d3565b92506020840135915061452f604085016144d3565b90509250925092565b60006020828403121561454a57600080fd5b610bbe826144d3565b6000815180845260005b818110156145795760208185018101518683018201520161455d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610bbe6020830184614553565b6020808252825182820181905260009190848201906040850190845b8181101561461857835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016145e6565b50909695505050505050565b60006020828403121561463657600080fd5b813567ffffffffffffffff81111561464d57600080fd5b820160408185031215610bbe57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156146b1576146b161465f565b60405290565b6040805190810167ffffffffffffffff811182821017156146b1576146b161465f565b604051610220810167ffffffffffffffff811182821017156146b1576146b161465f565b60405160c0810167ffffffffffffffff811182821017156146b1576146b161465f565b6040516060810167ffffffffffffffff811182821017156146b1576146b161465f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561478b5761478b61465f565b604052919050565b600067ffffffffffffffff8211156147ad576147ad61465f565b5060051b60200190565b80151581146111c457600080fd5b80356144f7816147b7565b600060208083850312156147e357600080fd5b823567ffffffffffffffff8111156147fa57600080fd5b8301601f8101851361480b57600080fd5b803561481e61481982614793565b614744565b81815260a0918202830184019184820191908884111561483d57600080fd5b938501935b838510156149105780858a03121561485a5760008081fd5b61486261468e565b61486b866144d3565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146148a05760008081fd5b818801526040868101357fffff000000000000000000000000000000000000000000000000000000000000811681146148d95760008081fd5b9082015260606148ea8782016144d3565b908201526080868101356148fd816147b7565b9082015283529384019391850191614842565b50979650505050505050565b803567ffffffffffffffff811681146144f757600080fd5b60008083601f84011261494657600080fd5b50813567ffffffffffffffff81111561495e57600080fd5b602083019150836020828501011115611ffc57600080fd5b60008083601f84011261498857600080fd5b50813567ffffffffffffffff8111156149a057600080fd5b6020830191508360208260051b8501011115611ffc57600080fd5b600080600080600080600080600060c08a8c0312156149d957600080fd5b6149e28a61491c565b98506149f060208b016144d3565b975060408a0135965060608a013567ffffffffffffffff80821115614a1457600080fd5b614a208d838e01614934565b909850965060808c0135915080821115614a3957600080fd5b614a458d838e01614976565b909650945060a08c0135915080821115614a5e57600080fd5b818c0191508c601f830112614a7257600080fd5b813581811115614a8157600080fd5b8d60208260061b8501011115614a9657600080fd5b6020830194508093505050509295985092959850929598565b848152600060208515158184015260806040840152614ad16080840186614553565b8381036060850152845180825282820190600581901b8301840184880160005b83811015614b3d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552614b2b838351614553565b94870194925090860190600101614af1565b50909b9a5050505050505050505050565b60008060208385031215614b6157600080fd5b823567ffffffffffffffff811115614b7857600080fd5b614b8485828601614976565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614bfe57614bee84835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101614bad565b5091979650505050505050565b600060208284031215614c1d57600080fd5b610bbe8261491c565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff1690820152604081016111a2565b803561ffff811681146144f757600080fd5b803563ffffffff811681146144f757600080fd5b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146144f757600080fd5b60006020808385031215614cca57600080fd5b823567ffffffffffffffff811115614ce157600080fd5b8301601f81018513614cf257600080fd5b8035614d0061481982614793565b8181526102409182028301840191848201919088841115614d2057600080fd5b938501935b838510156149105784890381811215614d3e5760008081fd5b614d466146b7565b614d4f8761491c565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215614d845760008081fd5b614d8c6146da565b9250614d998989016147c5565b83526040614da8818a01614c61565b8a8501526060614db9818b01614c73565b8286015260809150614dcc828b01614c73565b9085015260a0614ddd8a8201614c73565b8286015260c09150614df0828b01614c61565b9085015260e0614e018a8201614c73565b828601526101009150614e15828b01614c61565b90850152610120614e278a8201614c61565b828601526101409150614e3b828b01614c61565b90850152610160614e4d8a8201614c73565b828601526101809150614e61828b01614c73565b908501526101a0614e738a820161491c565b828601526101c09150614e87828b01614c73565b908501526101e0614e998a8201614c73565b828601526102009150614ead828b016147c5565b90850152614ebc898301614c87565b90840152508088019190915283529384019391850191614d25565b81511515815261022081016020830151614ef7602084018261ffff169052565b506040830151614f0f604084018263ffffffff169052565b506060830151614f27606084018263ffffffff169052565b506080830151614f3f608084018263ffffffff169052565b5060a0830151614f5560a084018261ffff169052565b5060c0830151614f6d60c084018263ffffffff169052565b5060e0830151614f8360e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b600082601f83011261504e57600080fd5b8135602061505e61481983614793565b82815260069290921b8401810191818101908684111561507d57600080fd5b8286015b848110156150ca576040818903121561509a5760008081fd5b6150a26146b7565b6150ab8261491c565b81526150b88583016144d3565b81860152835291830191604001615081565b509695505050505050565b600080604083850312156150e857600080fd5b67ffffffffffffffff833511156150fe57600080fd5b83601f84358501011261511057600080fd5b6151206148198435850135614793565b8335840180358083526020808401939260059290921b9091010186101561514657600080fd5b602085358601015b85358601803560051b016020018110156153535767ffffffffffffffff8135111561517857600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a030112156151b157600080fd5b6151b96146b7565b6151c56020830161491c565b815267ffffffffffffffff604083013511156151e057600080fd5b88603f6040840135840101126151f557600080fd5b61520b6148196020604085013585010135614793565b6020604084810135850182810135808552928401939260e00201018b101561523257600080fd5b6040808501358501015b6040858101358601602081013560e00201018110156153345760e0818d03121561526557600080fd5b61526d6146b7565b615276826144d3565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f030112156152aa57600080fd5b6152b26146fe565b6152be60208401614c73565b81526152cc60408401614c73565b60208201526152dd60608401614c61565b60408201526152ee60808401614c73565b60608201526152ff60a08401614c73565b608082015261531160c08401356147b7565b60c083013560a0820152602082810191909152908452929092019160e00161523c565b508060208401525050808552505060208301925060208101905061514e565b5092505067ffffffffffffffff6020840135111561537057600080fd5b615380846020850135850161503d565b90509250929050565b600082601f83011261539a57600080fd5b813560206153aa61481983614793565b8083825260208201915060208460051b8701019350868411156153cc57600080fd5b602086015b848110156150ca576153e2816144d3565b83529183019183016153d1565b6000806040838503121561540257600080fd5b823567ffffffffffffffff8082111561541a57600080fd5b61542686838701615389565b9350602085013591508082111561543c57600080fd5b5061544985828601615389565b9150509250929050565b6000806000806040858703121561546957600080fd5b843567ffffffffffffffff8082111561548157600080fd5b61548d88838901614934565b909650945060208701359150808211156154a657600080fd5b506154b387828801614934565b95989497509550505050565b600080604083850312156154d257600080fd5b6154db8361491c565b9150615380602084016144d3565b6000602082840312156154fb57600080fd5b813567ffffffffffffffff8082111561551357600080fd5b908301906040828603121561552757600080fd5b61552f6146b7565b82358281111561553e57600080fd5b61554a87828601615389565b82525060208301358281111561555f57600080fd5b61556b87828601615389565b60208301525095945050505050565b6000602080838503121561558d57600080fd5b823567ffffffffffffffff8111156155a457600080fd5b8301601f810185136155b557600080fd5b80356155c361481982614793565b81815260069190911b820183019083810190878311156155e257600080fd5b928401925b8284101561563457604084890312156156005760008081fd5b6156086146b7565b615611856144d3565b815261561e86860161491c565b81870152825260409390930192908401906155e7565b979650505050505050565b6000806040838503121561565257600080fd5b61565b8361491c565b9150602083013567ffffffffffffffff81111561567757600080fd5b830160a0818603121561568957600080fd5b809150509250929050565b60ff811681146111c457600080fd5b600060208083850312156156b657600080fd5b823567ffffffffffffffff8111156156cd57600080fd5b8301601f810185136156de57600080fd5b80356156ec61481982614793565b81815260079190911b8201830190838101908783111561570b57600080fd5b928401925b8284101561563457838803608081121561572a5760008081fd5b6157326146b7565b61573b866144d3565b81526060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08401121561576f5760008081fd5b615777614721565b92506157848888016144d3565b835260408088013561579581615694565b848a015290870135906157a7826147b7565b8301528087019190915282526080939093019290840190615710565b600080604083850312156157d657600080fd5b6157df836144d3565b91506153806020840161491c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176111a2576111a26157ed565b600082615869577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126158a357600080fd5b83018035915067ffffffffffffffff8211156158be57600080fd5b6020019150600681901b3603821315611ffc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146144f757600080fd5b60006040828403121561594357600080fd5b61594b6146b7565b615954836144d3565b815261596260208401615905565b60208201529392505050565b60006040828403121561598057600080fd5b6159886146b7565b6159548361491c565b600060208083850312156159a457600080fd5b823567ffffffffffffffff8111156159bb57600080fd5b8301601f810185136159cc57600080fd5b80356159da61481982614793565b818152606091820283018401918482019190888411156159f957600080fd5b938501935b838510156149105780858a031215615a165760008081fd5b615a1e614721565b615a27866144d3565b8152615a34878701615905565b878201526040615a45818801614c73565b90820152835293840193918501916159fe565b818103818111156111a2576111a26157ed565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615aa057600080fd5b83018035915067ffffffffffffffff821115615abb57600080fd5b602001915036819003821315611ffc57600080fd5b808201808211156111a2576111a26157ed565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156150355760049490940360031b84901b1690921692915050565b60008085851115615b3957600080fd5b83861115615b4657600080fd5b5050820193919092039150565b600060408284031215615b6557600080fd5b615b6d6146b7565b825181526020830151615962816147b7565b600060208284031215615b9157600080fd5b5051919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112615bcc57600080fd5b9190910192915050565b60ff81811683821601908111156111a2576111a26157ed565b600181815b80851115615c4857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615c2e57615c2e6157ed565b80851615615c3b57918102915b93841c9390800290615bf4565b509250929050565b600082615c5f575060016111a2565b81615c6c575060006111a2565b8160018114615c825760028114615c8c57615ca8565b60019150506111a2565b60ff841115615c9d57615c9d6157ed565b50506001821b6111a2565b5060208310610133831016604e8410600b8410161715615ccb575081810a6111a2565b615cd58383615bef565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d0757615d076157ed565b029392505050565b6000610bbe8383615c50565b805169ffffffffffffffffffff811681146144f757600080fd5b600080600080600060a08688031215615d4d57600080fd5b615d5686615d1b565b9450602086015193506040860151925060608601519150615d7960808701615d1b565b90509295509295909350565b600060208284031215615d9757600080fd5b8151610bbe81615694565b600060408284031215615db457600080fd5b615dbc6146b7565b615dc5836144d3565b8152602083013560208201528091505092915050565b63ffffffff818116838216019080821115614425576144256157ed565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var FeeQuoterABI = FeeQuoterMetaData.ABI @@ -2880,7 +2881,7 @@ func (FeeQuoterPremiumMultiplierWeiPerEthUpdated) Topic() common.Hash { } func (FeeQuoterPriceFeedPerTokenUpdated) Topic() common.Hash { - return common.HexToHash("0x08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464") + return common.HexToHash("0xe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf") } func (FeeQuoterReportPermissionSet) Topic() common.Hash { diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 6a1d8342103..89cc91a19ae 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -6,7 +6,7 @@ ccip_encoding_utils: ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEnc ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin 8c603a0de19c4649d69bdd18774ee3b5edfd24c696aabdb7cdb982bd8e304829 ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 5db06eb7fad07ec0d1ae5ac8d39f61398687fe3cda8290716ce0cd8fb9dca1ab ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de -fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 3eb799751e92bb09cf94c8ad9245c620026c3a8a0a0fffee8c3921f8fcd37eb8 +fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 0d069b7b8c240c326fdb54ff53b222dea455939ff31e8e87dff1133806a638e4 lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin e6a8ec9e8faccb1da7d90e0f702ed72975964f97dc3222b54cfcca0a0ba3fea2 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin d73956c26232ebcc4a5444429fa99cbefed960e323be9b5a24925885c2e477d5 message_hasher: ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.abi ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.bin ec2d3a92348d8e7b8f0d359b62a45157b9d2c750c01fbcf991826c4392f6e218