{
	"format": "sphinx-sol-ct-artifact-1",
	"address": "0xc7c8334b09e43a38c20b43cf0f824e074280b566",
	"sourceName": "node_modules/@bananapus/buyback-hook-v6/src/JBBuybackHook.sol",
	"contractName": "JBBuybackHook",
	"chainId": "0x2105",
	"abi": [
		{
			"type": "constructor",
			"inputs": [
				{
					"name": "directory",
					"type": "address",
					"internalType": "contract IJBDirectory"
				},
				{
					"name": "permissions",
					"type": "address",
					"internalType": "contract IJBPermissions"
				},
				{
					"name": "prices",
					"type": "address",
					"internalType": "contract IJBPrices"
				},
				{
					"name": "projects",
					"type": "address",
					"internalType": "contract IJBProjects"
				},
				{
					"name": "tokens",
					"type": "address",
					"internalType": "contract IJBTokens"
				},
				{
					"name": "deployer",
					"type": "address",
					"internalType": "address"
				},
				{
					"name": "trustedForwarder",
					"type": "address",
					"internalType": "address"
				}
			],
			"stateMutability": "nonpayable"
		},
		{
			"type": "receive",
			"stateMutability": "payable"
		},
		{
			"type": "function",
			"name": "DIRECTORY",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "address",
					"internalType": "contract IJBDirectory"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "MAX_TWAP_WINDOW",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "uint256",
					"internalType": "uint256"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "MIN_TWAP_WINDOW",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "uint256",
					"internalType": "uint256"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "PERMISSIONS",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "address",
					"internalType": "contract IJBPermissions"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "PRICES",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "address",
					"internalType": "contract IJBPrices"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "PROJECTS",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "address",
					"internalType": "contract IJBProjects"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "TOKENS",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "address",
					"internalType": "contract IJBTokens"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "TWAP_SLIPPAGE_DENOMINATOR",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "uint256",
					"internalType": "uint256"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "afterCashOutRecordedWith",
			"inputs": [
				{
					"name": "context",
					"type": "tuple",
					"internalType": "struct JBAfterCashOutRecordedContext",
					"components": [
						{
							"name": "holder",
							"type": "address",
							"internalType": "address"
						},
						{
							"name": "projectId",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "rulesetId",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "cashOutCount",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "reclaimedAmount",
							"type": "tuple",
							"internalType": "struct JBTokenAmount",
							"components": [
								{
									"name": "token",
									"type": "address",
									"internalType": "address"
								},
								{
									"name": "decimals",
									"type": "uint8",
									"internalType": "uint8"
								},
								{
									"name": "currency",
									"type": "uint32",
									"internalType": "uint32"
								},
								{
									"name": "value",
									"type": "uint256",
									"internalType": "uint256"
								}
							]
						},
						{
							"name": "forwardedAmount",
							"type": "tuple",
							"internalType": "struct JBTokenAmount",
							"components": [
								{
									"name": "token",
									"type": "address",
									"internalType": "address"
								},
								{
									"name": "decimals",
									"type": "uint8",
									"internalType": "uint8"
								},
								{
									"name": "currency",
									"type": "uint32",
									"internalType": "uint32"
								},
								{
									"name": "value",
									"type": "uint256",
									"internalType": "uint256"
								}
							]
						},
						{
							"name": "cashOutTaxRate",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "beneficiary",
							"type": "address",
							"internalType": "address payable"
						},
						{
							"name": "hookMetadata",
							"type": "bytes",
							"internalType": "bytes"
						},
						{
							"name": "cashOutMetadata",
							"type": "bytes",
							"internalType": "bytes"
						}
					]
				}
			],
			"outputs": [],
			"stateMutability": "payable"
		},
		{
			"type": "function",
			"name": "afterPayRecordedWith",
			"inputs": [
				{
					"name": "context",
					"type": "tuple",
					"internalType": "struct JBAfterPayRecordedContext",
					"components": [
						{
							"name": "payer",
							"type": "address",
							"internalType": "address"
						},
						{
							"name": "projectId",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "rulesetId",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "amount",
							"type": "tuple",
							"internalType": "struct JBTokenAmount",
							"components": [
								{
									"name": "token",
									"type": "address",
									"internalType": "address"
								},
								{
									"name": "decimals",
									"type": "uint8",
									"internalType": "uint8"
								},
								{
									"name": "currency",
									"type": "uint32",
									"internalType": "uint32"
								},
								{
									"name": "value",
									"type": "uint256",
									"internalType": "uint256"
								}
							]
						},
						{
							"name": "forwardedAmount",
							"type": "tuple",
							"internalType": "struct JBTokenAmount",
							"components": [
								{
									"name": "token",
									"type": "address",
									"internalType": "address"
								},
								{
									"name": "decimals",
									"type": "uint8",
									"internalType": "uint8"
								},
								{
									"name": "currency",
									"type": "uint32",
									"internalType": "uint32"
								},
								{
									"name": "value",
									"type": "uint256",
									"internalType": "uint256"
								}
							]
						},
						{
							"name": "weight",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "newlyIssuedTokenCount",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "beneficiary",
							"type": "address",
							"internalType": "address"
						},
						{
							"name": "hookMetadata",
							"type": "bytes",
							"internalType": "bytes"
						},
						{
							"name": "payerMetadata",
							"type": "bytes",
							"internalType": "bytes"
						}
					]
				}
			],
			"outputs": [],
			"stateMutability": "payable"
		},
		{
			"type": "function",
			"name": "beforeCashOutRecordedWith",
			"inputs": [
				{
					"name": "context",
					"type": "tuple",
					"internalType": "struct JBBeforeCashOutRecordedContext",
					"components": [
						{
							"name": "terminal",
							"type": "address",
							"internalType": "address"
						},
						{
							"name": "holder",
							"type": "address",
							"internalType": "address"
						},
						{
							"name": "projectId",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "rulesetId",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "cashOutCount",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "totalSupply",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "surplus",
							"type": "tuple",
							"internalType": "struct JBTokenAmount",
							"components": [
								{
									"name": "token",
									"type": "address",
									"internalType": "address"
								},
								{
									"name": "decimals",
									"type": "uint8",
									"internalType": "uint8"
								},
								{
									"name": "currency",
									"type": "uint32",
									"internalType": "uint32"
								},
								{
									"name": "value",
									"type": "uint256",
									"internalType": "uint256"
								}
							]
						},
						{
							"name": "scopeCashOutsToLocalBalances",
							"type": "bool",
							"internalType": "bool"
						},
						{
							"name": "cashOutTaxRate",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "beneficiaryIsFeeless",
							"type": "bool",
							"internalType": "bool"
						},
						{
							"name": "metadata",
							"type": "bytes",
							"internalType": "bytes"
						}
					]
				}
			],
			"outputs": [
				{
					"name": "cashOutTaxRate",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "cashOutCount",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "totalSupply",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "effectiveSurplusValue",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "hookSpecifications",
					"type": "tuple[]",
					"internalType": "struct JBCashOutHookSpecification[]",
					"components": [
						{
							"name": "hook",
							"type": "address",
							"internalType": "contract IJBCashOutHook"
						},
						{
							"name": "noop",
							"type": "bool",
							"internalType": "bool"
						},
						{
							"name": "amount",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "metadata",
							"type": "bytes",
							"internalType": "bytes"
						}
					]
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "beforePayRecordedWith",
			"inputs": [
				{
					"name": "context",
					"type": "tuple",
					"internalType": "struct JBBeforePayRecordedContext",
					"components": [
						{
							"name": "terminal",
							"type": "address",
							"internalType": "address"
						},
						{
							"name": "payer",
							"type": "address",
							"internalType": "address"
						},
						{
							"name": "amount",
							"type": "tuple",
							"internalType": "struct JBTokenAmount",
							"components": [
								{
									"name": "token",
									"type": "address",
									"internalType": "address"
								},
								{
									"name": "decimals",
									"type": "uint8",
									"internalType": "uint8"
								},
								{
									"name": "currency",
									"type": "uint32",
									"internalType": "uint32"
								},
								{
									"name": "value",
									"type": "uint256",
									"internalType": "uint256"
								}
							]
						},
						{
							"name": "projectId",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "rulesetId",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "beneficiary",
							"type": "address",
							"internalType": "address"
						},
						{
							"name": "weight",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "reservedPercent",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "metadata",
							"type": "bytes",
							"internalType": "bytes"
						}
					]
				}
			],
			"outputs": [
				{
					"name": "weight",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "hookSpecifications",
					"type": "tuple[]",
					"internalType": "struct JBPayHookSpecification[]",
					"components": [
						{
							"name": "hook",
							"type": "address",
							"internalType": "contract IJBPayHook"
						},
						{
							"name": "noop",
							"type": "bool",
							"internalType": "bool"
						},
						{
							"name": "amount",
							"type": "uint256",
							"internalType": "uint256"
						},
						{
							"name": "metadata",
							"type": "bytes",
							"internalType": "bytes"
						}
					]
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "hasMintPermissionFor",
			"inputs": [
				{
					"name": "",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "",
					"type": "tuple",
					"internalType": "struct JBRuleset",
					"components": [
						{
							"name": "cycleNumber",
							"type": "uint48",
							"internalType": "uint48"
						},
						{
							"name": "id",
							"type": "uint48",
							"internalType": "uint48"
						},
						{
							"name": "basedOnId",
							"type": "uint48",
							"internalType": "uint48"
						},
						{
							"name": "start",
							"type": "uint48",
							"internalType": "uint48"
						},
						{
							"name": "duration",
							"type": "uint32",
							"internalType": "uint32"
						},
						{
							"name": "weight",
							"type": "uint112",
							"internalType": "uint112"
						},
						{
							"name": "weightCutPercent",
							"type": "uint32",
							"internalType": "uint32"
						},
						{
							"name": "approvalHook",
							"type": "address",
							"internalType": "contract IJBRulesetApprovalHook"
						},
						{
							"name": "metadata",
							"type": "uint256",
							"internalType": "uint256"
						}
					]
				},
				{
					"name": "",
					"type": "address",
					"internalType": "address"
				}
			],
			"outputs": [
				{
					"name": "",
					"type": "bool",
					"internalType": "bool"
				}
			],
			"stateMutability": "pure"
		},
		{
			"type": "function",
			"name": "initializePoolFor",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "fee",
					"type": "uint24",
					"internalType": "uint24"
				},
				{
					"name": "tickSpacing",
					"type": "int24",
					"internalType": "int24"
				},
				{
					"name": "twapWindow",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "terminalToken",
					"type": "address",
					"internalType": "address"
				},
				{
					"name": "sqrtPriceX96",
					"type": "uint160",
					"internalType": "uint160"
				}
			],
			"outputs": [],
			"stateMutability": "nonpayable"
		},
		{
			"type": "function",
			"name": "isTrustedForwarder",
			"inputs": [
				{
					"name": "forwarder",
					"type": "address",
					"internalType": "address"
				}
			],
			"outputs": [
				{
					"name": "",
					"type": "bool",
					"internalType": "bool"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "oracleHook",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "address",
					"internalType": "contract IHooks"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "poolKeyOf",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "terminalToken",
					"type": "address",
					"internalType": "address"
				}
			],
			"outputs": [
				{
					"name": "key",
					"type": "tuple",
					"internalType": "struct PoolKey",
					"components": [
						{
							"name": "currency0",
							"type": "address",
							"internalType": "Currency"
						},
						{
							"name": "currency1",
							"type": "address",
							"internalType": "Currency"
						},
						{
							"name": "fee",
							"type": "uint24",
							"internalType": "uint24"
						},
						{
							"name": "tickSpacing",
							"type": "int24",
							"internalType": "int24"
						},
						{
							"name": "hooks",
							"type": "address",
							"internalType": "contract IHooks"
						}
					]
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "poolManager",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "address",
					"internalType": "contract IPoolManager"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "projectTokenOf",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				}
			],
			"outputs": [
				{
					"name": "",
					"type": "address",
					"internalType": "address"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "setChainSpecificConstants",
			"inputs": [
				{
					"name": "newPoolManager",
					"type": "address",
					"internalType": "contract IPoolManager"
				},
				{
					"name": "newOracleHook",
					"type": "address",
					"internalType": "contract IHooks"
				}
			],
			"outputs": [],
			"stateMutability": "nonpayable"
		},
		{
			"type": "function",
			"name": "setPoolFor",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "fee",
					"type": "uint24",
					"internalType": "uint24"
				},
				{
					"name": "tickSpacing",
					"type": "int24",
					"internalType": "int24"
				},
				{
					"name": "twapWindow",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "terminalToken",
					"type": "address",
					"internalType": "address"
				}
			],
			"outputs": [],
			"stateMutability": "nonpayable"
		},
		{
			"type": "function",
			"name": "setPoolFor",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "poolKey",
					"type": "tuple",
					"internalType": "struct PoolKey",
					"components": [
						{
							"name": "currency0",
							"type": "address",
							"internalType": "Currency"
						},
						{
							"name": "currency1",
							"type": "address",
							"internalType": "Currency"
						},
						{
							"name": "fee",
							"type": "uint24",
							"internalType": "uint24"
						},
						{
							"name": "tickSpacing",
							"type": "int24",
							"internalType": "int24"
						},
						{
							"name": "hooks",
							"type": "address",
							"internalType": "contract IHooks"
						}
					]
				},
				{
					"name": "twapWindow",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "terminalToken",
					"type": "address",
					"internalType": "address"
				}
			],
			"outputs": [],
			"stateMutability": "nonpayable"
		},
		{
			"type": "function",
			"name": "setTwapWindowOf",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "terminalToken",
					"type": "address",
					"internalType": "address"
				},
				{
					"name": "newWindow",
					"type": "uint256",
					"internalType": "uint256"
				}
			],
			"outputs": [],
			"stateMutability": "nonpayable"
		},
		{
			"type": "function",
			"name": "supportsInterface",
			"inputs": [
				{
					"name": "interfaceId",
					"type": "bytes4",
					"internalType": "bytes4"
				}
			],
			"outputs": [
				{
					"name": "",
					"type": "bool",
					"internalType": "bool"
				}
			],
			"stateMutability": "pure"
		},
		{
			"type": "function",
			"name": "trustedForwarder",
			"inputs": [],
			"outputs": [
				{
					"name": "",
					"type": "address",
					"internalType": "address"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "twapWindowOf",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "terminalToken",
					"type": "address",
					"internalType": "address"
				}
			],
			"outputs": [
				{
					"name": "",
					"type": "uint256",
					"internalType": "uint256"
				}
			],
			"stateMutability": "view"
		},
		{
			"type": "function",
			"name": "unlockCallback",
			"inputs": [
				{
					"name": "data",
					"type": "bytes",
					"internalType": "bytes"
				}
			],
			"outputs": [
				{
					"name": "",
					"type": "bytes",
					"internalType": "bytes"
				}
			],
			"stateMutability": "nonpayable"
		},
		{
			"type": "event",
			"name": "CashOutSwap",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"indexed": true,
					"internalType": "uint256"
				},
				{
					"name": "cashOutCount",
					"type": "uint256",
					"indexed": false,
					"internalType": "uint256"
				},
				{
					"name": "poolId",
					"type": "bytes32",
					"indexed": true,
					"internalType": "PoolId"
				},
				{
					"name": "amountReceived",
					"type": "uint256",
					"indexed": false,
					"internalType": "uint256"
				},
				{
					"name": "caller",
					"type": "address",
					"indexed": false,
					"internalType": "address"
				}
			],
			"anonymous": false
		},
		{
			"type": "event",
			"name": "Mint",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"indexed": true,
					"internalType": "uint256"
				},
				{
					"name": "leftoverAmount",
					"type": "uint256",
					"indexed": false,
					"internalType": "uint256"
				},
				{
					"name": "tokenCount",
					"type": "uint256",
					"indexed": false,
					"internalType": "uint256"
				},
				{
					"name": "caller",
					"type": "address",
					"indexed": false,
					"internalType": "address"
				}
			],
			"anonymous": false
		},
		{
			"type": "event",
			"name": "PoolAdded",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"indexed": true,
					"internalType": "uint256"
				},
				{
					"name": "terminalToken",
					"type": "address",
					"indexed": true,
					"internalType": "address"
				},
				{
					"name": "poolId",
					"type": "bytes32",
					"indexed": false,
					"internalType": "PoolId"
				},
				{
					"name": "caller",
					"type": "address",
					"indexed": false,
					"internalType": "address"
				}
			],
			"anonymous": false
		},
		{
			"type": "event",
			"name": "SellSwapReverted",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"indexed": true,
					"internalType": "uint256"
				},
				{
					"name": "holder",
					"type": "address",
					"indexed": true,
					"internalType": "address"
				},
				{
					"name": "amount",
					"type": "uint256",
					"indexed": false,
					"internalType": "uint256"
				},
				{
					"name": "caller",
					"type": "address",
					"indexed": false,
					"internalType": "address"
				}
			],
			"anonymous": false
		},
		{
			"type": "event",
			"name": "Swap",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"indexed": true,
					"internalType": "uint256"
				},
				{
					"name": "amountToSwapWith",
					"type": "uint256",
					"indexed": false,
					"internalType": "uint256"
				},
				{
					"name": "poolId",
					"type": "bytes32",
					"indexed": true,
					"internalType": "PoolId"
				},
				{
					"name": "amountReceived",
					"type": "uint256",
					"indexed": false,
					"internalType": "uint256"
				},
				{
					"name": "caller",
					"type": "address",
					"indexed": false,
					"internalType": "address"
				}
			],
			"anonymous": false
		},
		{
			"type": "event",
			"name": "TwapWindowChanged",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"indexed": true,
					"internalType": "uint256"
				},
				{
					"name": "terminalToken",
					"type": "address",
					"indexed": true,
					"internalType": "address"
				},
				{
					"name": "oldWindow",
					"type": "uint256",
					"indexed": false,
					"internalType": "uint256"
				},
				{
					"name": "newWindow",
					"type": "uint256",
					"indexed": false,
					"internalType": "uint256"
				},
				{
					"name": "caller",
					"type": "address",
					"indexed": false,
					"internalType": "address"
				}
			],
			"anonymous": false
		},
		{
			"type": "error",
			"name": "FailedCall",
			"inputs": []
		},
		{
			"type": "error",
			"name": "InsufficientBalance",
			"inputs": [
				{
					"name": "balance",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "needed",
					"type": "uint256",
					"internalType": "uint256"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_AlreadyConfigured",
			"inputs": []
		},
		{
			"type": "error",
			"name": "JBBuybackHook_CallerNotPoolManager",
			"inputs": [
				{
					"name": "caller",
					"type": "address",
					"internalType": "address"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_CallerNotTerminal",
			"inputs": [
				{
					"name": "caller",
					"type": "address",
					"internalType": "address"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_InsufficientPayAmount",
			"inputs": [
				{
					"name": "swapAmount",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "totalPaid",
					"type": "uint256",
					"internalType": "uint256"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_InvalidTwapWindow",
			"inputs": [
				{
					"name": "value",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "min",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "max",
					"type": "uint256",
					"internalType": "uint256"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_PoolAlreadySet",
			"inputs": [
				{
					"name": "poolId",
					"type": "bytes32",
					"internalType": "PoolId"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_PoolInitializedAtWrongPrice",
			"inputs": [
				{
					"name": "actualSqrtPriceX96",
					"type": "uint160",
					"internalType": "uint160"
				},
				{
					"name": "expectedSqrtPriceX96",
					"type": "uint160",
					"internalType": "uint160"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_PoolNotInitialized",
			"inputs": [
				{
					"name": "poolId",
					"type": "bytes32",
					"internalType": "PoolId"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_PoolNotSet",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "terminalToken",
					"type": "address",
					"internalType": "address"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_SpecifiedSlippageExceeded",
			"inputs": [
				{
					"name": "amount",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "minimum",
					"type": "uint256",
					"internalType": "uint256"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_TerminalTokenIsProjectToken",
			"inputs": [
				{
					"name": "terminalToken",
					"type": "address",
					"internalType": "address"
				},
				{
					"name": "projectToken",
					"type": "address",
					"internalType": "address"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_Unauthorized",
			"inputs": [
				{
					"name": "caller",
					"type": "address",
					"internalType": "address"
				}
			]
		},
		{
			"type": "error",
			"name": "JBBuybackHook_ZeroProjectToken",
			"inputs": [
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				}
			]
		},
		{
			"type": "error",
			"name": "JBPermissioned_Unauthorized",
			"inputs": [
				{
					"name": "account",
					"type": "address",
					"internalType": "address"
				},
				{
					"name": "sender",
					"type": "address",
					"internalType": "address"
				},
				{
					"name": "projectId",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "permissionId",
					"type": "uint256",
					"internalType": "uint256"
				}
			]
		},
		{
			"type": "error",
			"name": "PRBMath_MulDiv_Overflow",
			"inputs": [
				{
					"name": "x",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "y",
					"type": "uint256",
					"internalType": "uint256"
				},
				{
					"name": "denominator",
					"type": "uint256",
					"internalType": "uint256"
				}
			]
		},
		{
			"type": "error",
			"name": "SafeERC20FailedOperation",
			"inputs": [
				{
					"name": "token",
					"type": "address",
					"internalType": "address"
				}
			]
		}
	],
	"args": [
		"0x5AfF29060E023e6FB87BE5596652B33c65Af535B",
		"0xf92AC1aB5A00033E35a3975739124F61928C36B0",
		"0xad45E4627f068d1e6b21E5301870d807543a8401",
		"0x6017d1FBa9DC279BFA0B03fD931C22E242AB3691",
		"0x1f80d8f057eE36b4C2656D107E4e4558B71bA7D9",
		"0x4dc161eF837fF1C4485b08DDFcDB182F2157bE18",
		"0x3bA60b60933916a7C87D0860DcEE62a0CE34E3e2"
	],
	"solcInputHash": "4f1e71f3baa4e754c4d4bed742f5af17",
	"receipt": {
		"type": "0x2",
		"status": "0x1",
		"cumulativeGasUsed": "0x255094b",
		"logs": [
			{
				"address": "0xa2ea7657440875bf916cbfc0cfa88f13e38ad463",
				"topics": [
					"0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d",
					"0x000000000000000000000000755ff2f75a0a586ecfa2b9a3c959cb662458a105",
					"0x00000000000000000000000091f164e1300f13beaf77358e4d84ed78f8e99d38",
					"0xdb523c6347b1fabe56ebda7737119888ee50c0a03d3d9a1588eec87beff8f49f"
				],
				"data": "0x0000000000000000000000000000000000000000000000000000000000000000",
				"blockHash": "0x8627a4f050951e7daf5a4ad87598b98be4b3b4ba21c1b5d3dcd44c7b4dfdf692",
				"blockNumber": "0x2d33ff2",
				"blockTimestamp": "0x6a30dcc7",
				"transactionHash": "0x16717e6b5f3ea59d31f1f62846f4021d67913f892c716bb54c0e50be8b7af5e5",
				"transactionIndex": "0xb7",
				"logIndex": "0x23d",
				"removed": false
			},
			{
				"address": "0x4dc161ef837ff1c4485b08ddfcdb182f2157be18",
				"topics": [
					"0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8",
					"0x00000000000000000000000091f164e1300f13beaf77358e4d84ed78f8e99d38"
				],
				"data": "0x",
				"blockHash": "0x8627a4f050951e7daf5a4ad87598b98be4b3b4ba21c1b5d3dcd44c7b4dfdf692",
				"blockNumber": "0x2d33ff2",
				"blockTimestamp": "0x6a30dcc7",
				"transactionHash": "0x16717e6b5f3ea59d31f1f62846f4021d67913f892c716bb54c0e50be8b7af5e5",
				"transactionIndex": "0xb7",
				"logIndex": "0x23e",
				"removed": false
			},
			{
				"address": "0x91f164e1300f13beaf77358e4d84ed78f8e99d38",
				"topics": [
					"0xa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa07",
					"0x7121bdb5da6ff5e4ab87d465ed70caab6b1014022975d109ade9af46634578d5"
				],
				"data": "0x0000000000000000000000000000000000000000000000000000000000000025",
				"blockHash": "0x8627a4f050951e7daf5a4ad87598b98be4b3b4ba21c1b5d3dcd44c7b4dfdf692",
				"blockNumber": "0x2d33ff2",
				"blockTimestamp": "0x6a30dcc7",
				"transactionHash": "0x16717e6b5f3ea59d31f1f62846f4021d67913f892c716bb54c0e50be8b7af5e5",
				"transactionIndex": "0xb7",
				"logIndex": "0x23f",
				"removed": false
			}
		],
		"logsBloom": "0x00000000000010000000000000080000001000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000200000000000000000000000000000000040000000000000000040000000000000000000000000000010000000008000000000000000000080008800000000000008000104000000000000000000000000000000000000000000004200040000000000000000000000002200000000000000000000000004000000000002008000000000000000400040000000000000000000000000800000000000000000000900000000000000000200000000000080000000000000000000",
		"transactionHash": "0x16717e6b5f3ea59d31f1f62846f4021d67913f892c716bb54c0e50be8b7af5e5",
		"transactionIndex": "0xb7",
		"blockHash": "0x8627a4f050951e7daf5a4ad87598b98be4b3b4ba21c1b5d3dcd44c7b4dfdf692",
		"blockNumber": "0x2d33ff2",
		"gasUsed": "0x56edfd",
		"effectiveGasPrice": "0x802c80",
		"blobGasUsed": "0x2134c0",
		"from": "0x755ff2f75a0a586ecfa2b9a3c959cb662458a105",
		"to": "0xa2ea7657440875bf916cbfc0cfa88f13e38ad463",
		"contractAddress": null,
		"l1GasPrice": "0xcc8e0ec",
		"l1GasUsed": "0x39701",
		"l1Fee": "0x3bfd80cb37",
		"l1BaseFeeScalar": "0x8dd",
		"l1BlobBaseFee": "0x8cb61d",
		"l1BlobBaseFeeScalar": "0x101c12",
		"daFootprintGasScalar": "0x94"
	},
	"bytecode": "0x6101a06040523461024e5761628460e0813803918261001d81610252565b93849283398101031261024e5780516001600160a01b038116810361024e576020820151906001600160a01b038216820361024e576040830151916001600160a01b038316830361024e576060840151916001600160a01b038316830361024e576080850151916001600160a01b038316830361024e576100ac60c06100a560a0890161028b565b970161028b565b9060805260a05260c052610120526101005260e052610160526101246100d26040610252565b600781526618d85cda13dd5d60ca1b6020909101523060601b6001600160601b0319167f86b14ff4df1839d4c5ed01550f2540ea56ad3e38000000000000000000000000186001600160e01b03191690565b610140526101836101356040610252565b600381526270617960e81b6020909101523060601b6001600160601b0319167fadc756803e4eb4ccfb136b73d5f72e3dc0d452d3000000000000000000000000186001600160e01b03191690565b61018052604051615fe490816102a08239608051818181610254015281816105ff0152613e1b015260a051818181610ffe015281816110590152615fa9015260c051818181610f12015281816116b2015281816122630152612cc3015260e0518181816115e701526129280152610100518181816103fb015281816110de015281816112f6015281816114b4015261156f01526101205181818161114b0152818161162c0152613ed9015261014051816134220152610160518161030e015261018051816122060152f35b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761027757604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361024e5756fe61026080604052600436101561001d575b50361561001b575f80fd5b005b5f905f3560e01c90816301ffc9a714611d3e575080631337f986146116785780631a65893b1461165b5780631d831d5c146116165780631eabcd34146115d157806327e514111461159e578063293c499914611559578063345c42131461146757806349e303831461129657806353fd8e311461108b578063572b6c051461102d5780637da0a87714610fe8578063826a5e7414610f4157806388bc2ef314610efc5780638cc3584614610e2557806391dd73461461083e5780639782ed71146107f95780639785f1ed146107d057806399f6d77f146106d0578063b7433b35146103bc578063b88a92b41461039e578063bac6b2ad146102dc578063c22903b2146102c7578063db312fae146102aa578063dc4c90d314610283578063f434c9141461023e5763f672acac03610010573461023b57602036600319011261023b576004356001600160401b038111610239576101c060031982360301126102395761018b906004016133cb565b92939060409592955195869560a0870193875260208701526040860152606085015260a06080850152825180915260c08401602060c08360051b870101940192905b8282106101dc57505050500390f35b91936001919395506020610229819260bf198a8203018652608060608a51878060a01b03815116845285810151151586850152604081015160408501520151918160608201520190611eef565b96019201920185949391926101cd565b505b80fd5b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b578060031936011261023b57546040516001600160a01b039091168152602090f35b503461023b578060031936011261023b5760206040516127108152f35b506102d96102d436611df1565b612c98565b80f35b503461023b57604036600319011261023b576004356001600160a01b038116908190036102395761030b611e6b565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361038b5782546001600160a01b038116610379576001600160601b0360a01b1617825560018060a01b03166001600160601b0360a01b600154161760015580f35b6001622c6feb60e11b03198452600484fd5b634758af1b60e01b835233600452602483fd5b503461023b578060031936011261023b5760206040516202a3008152f35b503461023b57606036600319011261023b576004356103d9611e6b565b6040516331a9108f60e11b8152600481018390526044359291906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156106c5578591610687575b5061043c615f7e565b6001600160a01b03918216911680821415806105bf575b61059457505061012c83108015610588575b610568576001600160a01b03811661eeee03610562575082915b81845260056020526040842060018060a01b0384165f5260205260ff60405f20541615610541578184526004602081815260408087206001600160a01b0387165f81815291845282822054878a529484528289209082529092529020829055927fac260005f5a1d1cb696ab1065059083a3769fa09f4b4699f1dafd670d071a921919061053b61050d615f7e565b6040805197885260208801949094526001600160a01b03908116938701939093529116939081906060820190565b0390a380f35b633d56755560e01b845260048290526001600160a01b038316602452604484fd5b9161047f565b62904c3760e81b8452600483905261012c6024526202a300604452606484fd5b506202a3008311610465565b908360849260405192631326f75560e11b8452600484015260248301526044820152601c6064820152fd5b50604051631a45b42760e11b8152600481018290526024810183905260448101859052601c606482015260016084820181905260a482015260208160c4817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561067c57879161063e575b5015610453565b90506020813d602011610674575b8161065960209383611f79565b810103126106705761066a90611f9a565b5f610637565b8680fd5b3d915061064c565b6040513d89823e3d90fd5b90506020813d6020116106bd575b816106a260209383611f79565b810103126106b9576106b390612066565b5f610433565b8480fd5b3d9150610695565b6040513d87823e3d90fd5b503461023b5761016036600319011261023b5761012036602319011261023b57604051906106fd82611f5d565b60243565ffffffffffff8116810361023957825260443565ffffffffffff8116810361023957602083015260643565ffffffffffff8116810361023957604083015260843565ffffffffffff8116810361023957606083015260a43563ffffffff8116810361023957608083015260c4356001600160701b03811681036102395760a083015260e43563ffffffff811681036102395760c083015261010435916001600160a01b03831683036102395760209260e0820152610100610124359101526107c7611e81565b50604051908152f35b503461023b578060031936011261023b576001546040516001600160a01b039091168152602090f35b503461023b57604036600319011261023b576040610815611e6b565b9160043581526004602052209060018060a01b03165f52602052602060405f2054604051908152f35b503461023b57602036600319011261023b57600435906001600160401b03821161023b573660238301121561023b5781600401356001600160401b0381116102395782019036602483011161023b5780546001600160a01b03169133839003610e1257610100848203126102395760a06024604051926108bd84611f42565b869003016023190112610239576040516108d681611f13565b6108e260248601611e98565b81526108f060448601611e98565b6020820152606485013562ffffff81168103610bce57604082015261091760848601611e47565b606082015261092860a48601611e98565b6080820152815261093b60c48501611fd9565b93610969602083019580875260e4830135906101046040860194838652013590816060870152151591614c2b565b93825186511515925195600160ff1b8714610dfe5760405193606085018581106001600160401b03821117610dea5792610a296109f8938993602098979660405287528787019a84038b52604087019060018060a01b031681526040519084898301528882526109da604083611f79565b604051633cf3645360e21b81529b8c98899788966004880190611eac565b51151560a48601525160c4850152516001600160a01b031660e4840152610120610104840152610124830190611eef565b03925af1928315610ddf578293610dab575b508260801d935115155f14610d73575180516020909101516001600160a01b03918216949116906001600160801b03908190610a7690612c78565b169316935b6001600160a01b031680610ca757508154604051630476982d60e21b8152906020908290600490829088906001600160a01b03165af18015610c9c57610c6d575b505b6001600160a01b031680158015610c0a5747945b83546001600160a01b031690813b156106b9578491606483926040519485938492630b0d9c0960e01b845289600485015230602485015260448401525af18015610bff57908491610be6575b505015610b69575050610b34610b65924761200e565b604051916020830152604082015260408152610b51606082611f79565b604051918291602083526020830190611eef565b0390f35b6020602491604051928380926370a0823160e01b82523060048301525afa918215610bda5791610ba2575b50610b6592610b349161200e565b90506020813d602011610bd2575b81610bbd60209383611f79565b81010312610bce5751610b65610b94565b5f80fd5b3d9150610bb0565b604051903d90823e3d90fd5b81610bf091611f79565b610bfb57825f610b1e565b8280fd5b6040513d86823e3d90fd5b6040516370a0823160e01b8152306004820152602081602481865afa908115610bff578491610c3b575b5094610ad2565b90506020813d602011610c65575b81610c5660209383611f79565b81010312610bce57515f610c34565b3d9150610c49565b610c8e9060203d602011610c95575b610c868183611f79565b81019061202f565b505f610abc565b503d610c7c565b6040513d85823e3d90fd5b82546001600160a01b0316803b15610d6f57838091602460405180948193632961046560e21b83528760048401525af18015610bff5785918591610d56575b50508354610cff926001600160a01b0390911690614da3565b8154604051630476982d60e21b8152906020908290600490829087906001600160a01b03165af18015610c9c57610d37575b50610abe565b610d4f9060203d602011610c9557610c868183611f79565b505f610d31565b81925090610d6391611f79565b610bfb5783835f610ce6565b8380fd5b51602081015190516001600160a01b0391821694939116906001600160801b03908190610da290600f0b612c78565b16931693610a7b565b9092506020813d602011610dd7575b81610dc760209383611f79565b810103126102395751915f610a3b565b3d9150610dba565b6040513d84823e3d90fd5b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b86526011600452602486fd5b63cb25844560e01b825233600452602482fd5b503461023b57602036600319011261023b576004356001600160401b03811161023957610180600319823603011261023957610e63906004016121cd565b6040519283926040840190845260406020850152825180915260608401602060608360051b870101940192905b828210610e9f57505050500390f35b91936001919395506020610eec8192605f198a8203018652608060608a51878060a01b03815116845285810151151586850152604081015160408501520151918160608201520190611eef565b9601920192018594939192610e90565b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b57604036600319011261023b576040610f5d611e6b565b91610f66612099565b5060043581526002602052209060018060a01b03165f5260205260a060405f2060405190610f9382611f13565b600180841b0381541682526001810154600180851b038116602084015262ffffff81851c16604084015260b81c60020b60608301526002600180851b03910154166080820152610fe66040518092611eac565bf35b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b57602036600319011261023b576004356001600160a01b03811690819003610239576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169091148152602090f35b503461023b5761010036600319011261023b5760043560a03660231901126102395760e4356001600160a01b038116808203610d6f576040516331a9108f60e11b815260048101849052906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106c55784928691611252575b5061eeee9261112591613d88565b0361124c575081905b60405163ea78803f60e01b815260048101829052916020836024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa928315610bff57849361121b575b506040519161119183611f13565b6024356001600160a01b03811681036112175783526044356001600160a01b038116810361121757602084015260643562ffffff811681036112175760408401526084358060020b810361121757606084015260a435936001600160a01b03851685036112175760808401949094526102d9936001600160a01b03169260c43591613fa3565b8580fd5b61123e91935060203d602011611245575b6112368183611f79565b81019061207a565b915f611183565b503d61122c565b9061112e565b9250506020823d60201161128e575b8161126e60209383611f79565b810103126106b9576111258461128661eeee94612066565b915092611117565b3d9150611261565b503461023b5760c036600319011261023b57600435906112b4611e25565b916112bd611e37565b6112c5611e55565b9060a4359460018060a01b0386168096036106b9576040516331a9108f60e11b8152600481018590526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561145c579085918791611412575b506113489493929161134291613d88565b84613e94565b92909184602060018060a01b0382541660c46040518094819363313b65df60e11b83526113786004840189611eac565b8c60a48401525af16113d9575b50845460a0822061139e916001600160a01b0316614394565b5050506001600160a01b0316958087036113c257506102d994955060643591613fa3565b6302c5a6e160e11b86526004879052602452604485fd5b6020813d60201161140a575b816113f260209383611f79565b8101031261121757518060020b810315611385578580fd5b3d91506113e5565b9150506020813d602011611454575b8161142e60209383611f79565b81010312611217579061134285611449611348969594612066565b915091929394611331565b3d9150611421565b6040513d88823e3d90fd5b503461023b5760a036600319011261023b57600435611484611e25565b9061148d611e37565b611495611e55565b6040516331a9108f60e11b8152600481018490529091906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561145c57869161150c575b50906102d994611342856115009594613d88565b92909160643591613fa3565b929190506020833d602011611551575b8161152960209383611f79565b81010312611217576102d9946113428561154561150096612066565b939495505050946114ec565b3d915061151c565b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b57602036600319011261023b57602090600435815260038252604060018060a01b0391205416604051908152f35b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b578060031936011261023b57602060405161012c8152f35b5061168236611df1565b604051636e49181f60e01b8152602082810135600483018190523360248401529190816044816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa908115611b30575f91611d04575b5015611cf157816116f86101c080940182611fa7565b9080949181010312610bce5761170d83611fd9565b9260408101359361172060608301611fd9565b9060808301359260018060a01b03841696878503610bce5760a08201359360c08301359360e0840135926117576101008601611e47565b506117656101208601611fe6565b5080938781151580611ce3575b611cb4575b50505060e088019061eeee6001600160a01b0361179384611ffa565b16149788976117a96117a485611ffa565b613a30565b99611ca2575b88159283611c26575b916117c9916117dd9594938d613b3c565b9390996117d86117a485611ffa565b61200e565b5f98816118eb575b5050505081156118e2575b50806118d0575b6118b057506118229261181c86959361181c9360206101608d9b9a013591013561398d565b90612059565b918261182c578380f35b60209361183e6101a060c49401611ffa565b9560405196879586946363fdc96f60e11b86526004860152602485015260018060a01b0316604484015260a060648401528160a4840152600160848401525af18015610ddf57611891575b818180808380f35b6118a99060203d602011610c9557610c868183611f79565b505f611889565b886044916118be8688612059565b63e2d708a960e01b8352600452602452fd5b50806118dc8587612059565b106117f7565b9050155f6117f0565b8c939499505f9e9d9e50825f93611b42575b8115611b3b57825b6119116117a488611ffa565b9561191b88611ffa565b916020956040519361192d8886611f79565b5f8552333b15610bce575f9361198b60405196879586948594639e6eec0560e01b8652600486015260018060a01b03166024850152604484015286606484015260c060848401528660c484015260e060a484015260e4830190611eef565b0391335af18015611b3057611b18575b509d9e9d8f90611ab3575b5015611a245750506119bd6117a46119c393611ffa565b9061200e565b945b887faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e516611a186119fa886101608d01358b61398d565b604080519a8b5260208b0182905233908b0152989081906060820190565b0390a25f8080806117e5565b6024939192509081906001600160a01b0390611a3f90611ffa565b16604051948580926370a0823160e01b82523360048301525afa908115611aa8578d91611a78575b50611a72925061200e565b946119c5565b905082813d8311611aa1575b611a8e8183611f79565b81010312610bce57611a7291515f611a67565b503d611a84565b6040513d8f823e3d90fd5b6001600160a01b03611ac487611ffa565b16611ad0823383615068565b15611adc575b506119a6565b9050611ae833826150b5565b15611b05578f611af9903383615119565b15611b05578f90611ad6565b8f602491635274afe760e01b8252600452fd5b909f9e50611b27905f90611f79565b5f9d9e5f61199b565b6040513d5f823e3d90fd5b5f92611905565b60249450925060206001600160a01b03611b5b87611ffa565b16604051958680926370a0823160e01b82523360048301525afa8015611b30578d945f91611bf1575b50926001600160a01b03611b9787611ffa565b16611ba3843383615068565b15611baf575b506118fd565b909192939450611bbf33826150b5565b15611bdf57611bcf843383615119565b15611bdf57908d94939291611ba9565b635274afe760e01b5f5260045260245ffd5b9450506020843d602011611c1e575b81611c0d60209383611f79565b81010312610bce578c93515f611b84565b3d9150611c00565b6001600160a01b03611c3786611ffa565b168c610140604051916323b872dd60e01b5f523360045230602452013560445260205f60648180865af19060015f5114821615611c81575b6040525f60605215611bdf57506117b8565b906001811516611c9957823b15153d15161690611c6f565b503d5f823e3d90fd5b98611cae90349061200e565b986117af565b90919750611cc9826101408c0135809361398d565b978461177757611cda93955061398d565b915f8080611777565b50816101408c013510611772565b634758af1b60e01b5f523360045260245ffd5b90506020813d602011611d36575b81611d1f60209383611f79565b81010312610bce57611d3090611f9a565b5f6116e2565b3d9150611d12565b34610bce576020366003190112610bce576004359063ffffffff60e01b8216809203610bce5760209163e347239560e01b8114908115611de0575b8115611dcf575b8115611dbe575b8115611dad575b8115611d9c575b5015158152f35b6301ffc9a760e01b14905083611d95565b633d0d324560e21b81149150611d8e565b6316f0f2dd60e01b81149150611d87565b63611481d960e11b81149150611d80565b63099bfcc360e11b81149150611d79565b6020600319820112610bce57600435906001600160401b038211610bce57610200908290036003190112610bce5760040190565b6024359062ffffff82168203610bce57565b604435908160020b8203610bce57565b35908160020b8203610bce57565b608435906001600160a01b0382168203610bce57565b602435906001600160a01b0382168203610bce57565b61014435906001600160a01b0382168203610bce57565b35906001600160a01b0382168203610bce57565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a081019081106001600160401b03821117611f2e57604052565b634e487b7160e01b5f52604160045260245ffd5b608081019081106001600160401b03821117611f2e57604052565b61012081019081106001600160401b03821117611f2e57604052565b90601f801991011681019081106001600160401b03821117611f2e57604052565b51908115158203610bce57565b903590601e1981360301821215610bce57018035906001600160401b038211610bce57602001918136038313610bce57565b35908115158203610bce57565b35906001600160801b0382168203610bce57565b356001600160a01b0381168103610bce5790565b9190820391821161201b57565b634e487b7160e01b5f52601160045260245ffd5b90816020910312610bce575190565b6001600160401b038111611f2e57601f01601f191660200190565b9190820180921161201b57565b51906001600160a01b0382168203610bce57565b90816020910312610bce57516001600160a01b0381168103610bce5790565b604051906120a682611f13565b5f6080838281528260208201528260408201528260608201520152565b9291926120cf8261203e565b916120dd6040519384611f79565b829481845281830111610bce578281602093845f960137010152565b9190826040910312610bce576020825192015190565b519065ffffffffffff82168203610bce57565b519063ffffffff82168203610bce57565b519061ffff82168203610bce57565b3563ffffffff81168103610bce5790565b3560ff81168103610bce5790565b6001600160401b038111611f2e5760051b60200190565b6040519061218582611f42565b606080835f81525f60208201525f60408201520152565b8051156121a95760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156121a95760400190565b5f61024081905261014081905260408201926101208301359260609061222a6122046121fd610160840184611fa7565b36916120c3565b7f0000000000000000000000000000000000000000000000000000000000000000614457565b90612c50575b5060a08101358411612c35578315612c29575b604051632eec7b5560e11b815260c08201356004820152956020876024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa968715611b30575f97612c08575b506040516320c94b1360e11b815260c08301356004820152610380816024816001600160a01b038c165afa908115611b30575f91612998575b50608083016122e281612142565b63ffffffff808061010086015160241c16169116145f146128ca57505060ff61230c848401612153565b16604d811161201b57600a0a5b61232481888861398d565b60c08401355f908152600360205260409020546001600160a01b039081166101e05290929061eeee9061235683611ffa565b16036128bb57505f955b5f60e08190526101a0819052600161022052610140519093849391156128865760c08601355f52600260205260405f2060018060a01b038a165f5260205260a060405f20604051906123b182611f13565b600180841b0381541682526001810154600180851b038116602084015262ffffff81851c16604084015260b81c60020b8a8301526002600180851b03910154166080820152209560c08101355f52600560205260405f2060018060a01b038b165f5260205260ff60405f2054168061285e575b8061022052612830575b5f60c081815282013581526005602090815260408083206001600160a01b038e16845290915281205490989060ff161561277557505f6102005260a0810135840361275e575f610200525b61022051156101c0526101c051610180526101c051612751575b6101c05180612745575b61272b578b906101805161016052610180511561271b575b6101a05180612710575b80612704575b6126fa575b6102405161266d575b5050604061012081905280516101008190526124ef9190611f79565b600161010051525f5b61012051601f1901811061265357506001600160801b0395969798999a610100519a5f60a052610160515f1461264a575f60a0525b610120515160805260018060a01b03166101e051106020608051015261020051610120516080510152610240516060608051015261014051151560808051015260018060a01b031660a0608051015260c0608051015260e06080510152610100608051015260020b61012060805101521661014060805101526101606080510152610180608051015260c0516101a0608051015260e0516101c060805101526101a05115156101e060805101526101e0608051526125ef610200608051611f79565b61012051516125fd81611f42565b3081526101605115908115602082015260a05161012051820152608051606082015261262b6101005161219c565b526126386101005161219c565b5061263f57565b610100515f93509150565b8460a05261252d565b60209061265e612178565b828261010051010152016124f8565b604080516380d3fe3560e01b815260c092909201356004830152610240516024830152600160448301529298509190829060649082906001600160a01b03165afa8015611b30575f915f916126c9575b5060c052958a5f6124d3565b90506126ed915060403d6040116126f3575b6126e58183611f79565b8101906120f9565b5f6126bd565b503d6126db565b82610240526124ca565b506102405115156124c5565b5061014051156124bf565b61024051831015610160526124b5565b5063e2d708a960e01b5f526004526102405160245260445ffd5b5061024051821061249d565b610140516101c052612493565b61276c8460a083013561200e565b61020052612479565b9a9b9750955096975050505050610240516127c3575b505061014051806127b7575b61279e5750565b63e2d708a960e01b5f526004526102405160245260445ffd5b50610240518110612797565b604080516380d3fe3560e01b815260c092909201356004830152610240516024830152600160448301529091829060649082906001600160a01b03165afa8015611b3057612812575b8061278b565b61282a9060403d6040116126f3576126e58183611f79565b5061280c565b93509350612848886101e051818560c088013561497e565b91929894979350506101a052959460e05261242e565b505f546001600160801b039061287e9089906001600160a01b0316614b97565b161515612424565b935093915061289f876101e051818460c0870135614616565b6101a0999592999894979398529796956102405260e05261242e565b6128c490611ffa565b95612360565b63ffffffff6101006128dd60ff93612142565b93015160241c1663ffffffff6128f4878701612153565b604051631df139fd60e11b815260c088013560048201529482166024860152911660448401521660648201526020816084817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611b30575f91612966575b50612319565b90506020813d602011612990575b8161298160209383611f79565b81010312610bce57515f612960565b3d9150612974565b8091506103803d8111612c01575b6129b08183611f79565b810103906103808212610bce576101208212610bce57604051916129d383611f5d565b6129dc8261210f565b83526129ea6020830161210f565b60208401526129fb6040830161210f565b6040840152612a0b86830161210f565b86840152612a1b60808301612122565b608084015260a08201516001600160701b0381168103610bce5760a0840152612a4660c08301612122565b60c084015260e0820151906001600160a01b0382168203610bce576102609160e085015261010083015161010085015261011f190112610bce57604051906102608201908282106001600160401b03831117611f2e57610360612bf89161024093604052612ab76101208201612133565b8552612ac66101408201612133565b6020860152612ad86101608201612122565b6040860152612aea6101808201611f9a565b89860152612afb6101a08201611f9a565b6080860152612b0d6101c08201611f9a565b60a0860152612b1f6101e08201611f9a565b60c0860152612b316102008201611f9a565b60e0860152612b436102208201611f9a565b610100860152612b54848201611f9a565b610120860152612b676102608201611f9a565b610140860152612b7a6102808201611f9a565b610160860152612b8d6102a08201611f9a565b610180860152612ba06102c08201611f9a565b6101a0860152612bb36102e08201611f9a565b6101c0860152612bc66103008201611f9a565b6101e0860152612bd96103208201611f9a565b610200860152612bec6103408201612066565b61022086015201612133565b9101525f6122d4565b503d6129a6565b612c2291975060203d602011611245576112368183611f79565b955f61229b565b60a08101359350612243565b60a0908463cc8704dd60e01b5f52600452013560245260445ffd5b612c65919450602080825183010191016120f9565b610240819052151561014052925f612230565b600f0b6f7fffffffffffffffffffffffffffffff19811461201b575f0390565b604051636e49181f60e01b815260208281013560048301819052336024840152916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169181604481855afa908115611b30575f91613391575b501561337e576080830161eeee6001600160a01b03612d1783611ffa565b160361336f575f935b835f52600260205260405f2060018060a01b0386165f5260205260405f209160405192612d4c84611f13565b60018060a01b038154168452600181015460018060a01b038116602086015262ffffff8160a01c16604086015260b81c60020b6060850152600260018060a01b03910154166080840152845f52600360205260018060a01b0360405f205416935f9160608401359586925f936101c08701612dc78189611fa7565b90506132d8575b508089116132cf575b50602060249160405192838092632eec7b5560e11b82528d60048301525afa908115611b30575f916132b0575b506040516370a0823160e01b815230600482015290602082602481865afa918215611b30575f9261327c575b5060208960c48c5f60405195869485936363fdc96f60e11b85526004850152602484015230604484015260a060648401528160a484015281608484015260018060a01b03165af18015611b305761324d575b506040516370a0823160e01b8152306004820152602081602481865afa908115611b30575f91613219575b50612ecf91612ebb9161200e565b996001600160a01b03168210858b89614e1b565b9a91909a61318757848061317e575b80613175575b61315e578a969594939291908082111561315657612f019161200e565b8061313c575b5061eeee90506001600160a01b03612f1e83611ffa565b1603612f855750505091612f6260a092612f5d6101a07fbda038b4536720f0edb8da72fb3f9779994198517ff2acfe51d419e07feb0379979601611ffa565b614eaa565b20604080519283526020830195909552339482019490945280606081015b0390a3565b919350916101a06001600160a01b03612f9d84611ffa565b169101916020612fac84611ffa565b6040516370a0823160e01b81526001600160a01b03909116600482015292839060249082905afa918215611b30575f92613106575b50602090613030906130178b6001600160a01b03612ffe84611ffa565b166001600160a01b0361301089611ffa565b1690614da3565b6001600160a01b039061302990611ffa565b1693611ffa565b6040516370a0823160e01b81526001600160a01b03909116600482015292839060249082905afa8015611b30575f906130d2575b61306e925061200e565b90806130c9575b806130c0575b6130ab5750509060a07fbda038b4536720f0edb8da72fb3f9779994198517ff2acfe51d419e07feb037992612f62565b63e2d708a960e01b5f5260045260245260445ffd5b5081811061307b565b50811515613075565b506020823d6020116130fe575b816130ec60209383611f79565b81010312610bce5761306e9151613064565b3d91506130df565b9091506020813d602011613134575b8161312260209383611f79565b81010312610bce575190613030612fe1565b3d9150613115565b61314f9161314987611ffa565b90614da3565b5f80612f07565b50505f612f01565b858b63e2d708a960e01b5f5260045260245260445ffd5b50858b10612ee4565b50851515612ede565b509850945050809192945090613210575b6131fa5750816131d085612f80936131497f8df6e3a86b047621038c6b98aa897b8dd0a6ce91b348704f248b7bbf0e32b21496611ffa565b6001600160a01b03906131e290611ffa565b60408051968752336020880152911694918291820190565b63e2d708a960e01b5f525f60045260245260445ffd5b50801515613198565b90506020813d602011613245575b8161323460209383611f79565b81010312610bce5751612ecf612ead565b3d9150613227565b6020813d602011613274575b8161326660209383611f79565b81010312610bce5751612e82565b3d9150613259565b9091506020813d6020116132a8575b8161329860209383611f79565b81010312610bce5751905f612e30565b3d915061328b565b6132c9915060203d602011611245576112368183611f79565b5f612e04565b97506020612dd7565b9850945092506101006132eb8887611fa7565b905010155f14613344576133026101009786611fa7565b9080989181010312610bce5761331a60608801611e47565b5061332760808801611fe6565b5061333460e08801611fd9565b9260208801359735945b5f612dce565b613352604094939786611fa7565b9080959181010312610bce5760208435940135968415159361333e565b61337881611ffa565b93612d20565b63ccdd427f60e01b5f523360045260245ffd5b90506020813d6020116133c3575b816133ac60209383611f79565b81010312610bce576133bd90611f9a565b5f612cf9565b3d915061339f565b61eeee6001600160a01b036133e260c08401611ffa565b16036138d0575f905b6040818101355f8181526003602052918220546001600160a01b031694919283806134466134206121fd6101a0860186611fa7565b7f0000000000000000000000000000000000000000000000000000000000000000614457565b906138a2575b508015613879575b8015613871575b8015613865575b613807576101208201359260808301359660a0840135966101608501359361348c858a8c8a614f10565b955f905f945f9d600190855f146137e0575050865f52600260205260405f209060018060a01b03165f5260205260a060405f20604051906134cc82611f13565b8054600180851b5f19019182168452820154808216602085015262ffffff81861c16604085015260b81c600290810b606085015290910154166080820152205f549091906001600160801b039061352d9084906001600160a01b0316614b97565b161515905b61353c818b614f78565b998215806137d9575b806137d0575b6137b957826137af575b60019883806137a5575b61366a575b50505015958615613650575b50604094855198613581878b611f79565b60018a52601f1987015f5b8181106136385750509d6001600160801b03918e9f9d9e9c9d8b9d89519860208a015289890152606088015260020b60808701521660a085015260c084015260e0830152151561010082015261010081526135e961012082611f79565b5f8251926135f684611f42565b308452841515602085015283015260608201526136128461219c565b5261361c8361219c565b5061362f575050506127109392915f9190565b95949391925090565b808c60208093613646612178565b920101520161358c565b90955080613660575b945f613570565b5086831115613659565b9298909160409384519061367e8683611f79565b600182526020820190601f19870136833761369b60c08501611ffa565b6136a48461219c565b6001600160a01b0391821690526136ba85611ffa565b16936136d56101006136ce60e08401612153565b9201612142565b91885196879563b5c104f360e01b875260848701926004880152608060248801525180925260a4860194915f5b81811061378457505050506020949263ffffffff859360ff859416604485015216606483015203915afa92831561377b57505f92613747575b501115955f8080613564565b9091506020813d602011613773575b8161376360209383611f79565b81010312610bce5751905f61373b565b3d9150613756565b513d5f823e3d90fd5b83516001600160a01b03168752899750602096870196909301928201613702565b508b88111561355f565b8615159250613555565b868b63e2d708a960e01b5f5260045260245260445ffd5b50868b1061354b565b5085613545565b91935095506137f6939d50829194508c8761497e565b50909d919592949193929091613532565b929450945050613831575b506101608201359160808101359161012060a083013592013590606090565b6138588361385361016082013560a08301356080840135610120850135614f10565b614f78565b8181106130ab5750613812565b50608082013515613462565b50861561345b565b50825f52600560205260405f2060018060a01b0387165f5260205260ff60405f20541615613454565b809650604092508091505181010312610bce576138c6604060208601519501611f9a565b841515905f61344c565b6138dc60c08201611ffa565b906133eb565b81156138ec570490565b634e487b7160e01b5f52601260045260245ffd5b91905f905f198185099080850292838084109303928084039314613980576127108310156139645750612710907fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e9194950990828211900360fc1b910360041c170290565b60649186630c740aef60e31b8352600452602452612710604452fd5b5050506127109192500490565b90915f198383099280830292838086109503948086039514613a205782851015613a085790829109600182190182168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b630c740aef60e31b5f5260045260245260445260645ffd5b505090613a2d92506138e2565b90565b6001600160a01b031661eeee8103613a4757504790565b6020602491604051928380926370a0823160e01b82523060048301525afa908115611b30575f91613a76575090565b90506020813d602011613a9d575b81613a9160209383611f79565b81010312610bce575190565b3d9150613a84565b91909160e06060610100830194613abd848251611eac565b6020810151151560a0850152604081015160c08501520151910152565b602081830312610bce578051906001600160401b038211610bce570181601f82011215610bce57805190613b0d8261203e565b92613b1b6040519485611f79565b82845260208383010111610bce57815f9260208093018386015e8301015290565b9091925f925f80613c64613c23613c3160e08801956101408901359661eeee60018060a01b03613b6b83611ffa565b16148614613d775750602085995b0135988986526002602052604086209060018060a01b03168652602052604085209a6040519b613ba88d611f13565b60018060a01b038154168d528c6060600183015460018060a01b038116602084015262ffffff8160a01c16604084015260b81c60020b910152600260018060a01b039101541660808d015260405191613c0083611f42565b8c8352156020830152876040830152606082015260405192839160208301613aa5565b03601f198101835282611f79565b82546040516348c8949160e01b8152602060048201529485936001600160a01b0390921692849283916024830190611eef565b03925af15f9181613d53575b50613c82575050505050505f90600190565b7f2afb56853a8b76a0868e64c0001eedd84d9a7f5bc7fb788aba6180e422ba6ec5613ce560a0613cc0846020808a979d9b9c9d5183010191016120f9565b91909a2060408051968752602087018390523390870152909950939081906060820190565b0390a384613cf1575050565b6001600160a01b031690813b15610bce575f9160a48392604051948593849263516a997360e11b84523060048501526024840152896044840152608060648401528160848401525af18015611b3057613d475750565b5f613d5191611f79565b565b613d709192503d805f833e613d688183611f79565b810190613ada565b905f613c70565b613d82602091611ffa565b99613b79565b90613d91615f7e565b6001600160a01b0392831692168083141580613ddb575b613db157505050565b6084935060405192631326f75560e11b8452600484015260248301526044820152601d6064820152fd5b50604051631a45b42760e11b8152600481018290526024810184905260448101839052601d606482015260016084820181905260a482015260208160c4817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611b30575f91613e5a575b5015613da8565b90506020813d602011613e8c575b81613e7560209383611f79565b81010312610bce57613e8690611f9a565b5f613e53565b3d9150613e68565b92919091613ea0612099565b506001600160a01b03811661eeee03613f9d57505f915b60405163ea78803f60e01b8152600481019490945291928392906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611b30575f91613f7e575b506001600160a01b03908116931683811015613f71579162ffffff84925b60018060a01b03600154169360405195613f4887611f13565b6001600160a01b03908116875216602086015216604084015260020b6060830152608082015292565b9162ffffff849392613f2f565b613f97915060203d602011611245576112368183611f79565b5f613f11565b91613eb7565b9293919091835f52600560205260405f2060018060a01b0386165f5260205260ff60405f20541661430c5761012c82108015614300575b6142e1576001600160a01b03169384156142ce576001600160a01b0316938085146142b85760a08320906140178260018060a01b035f5416614394565b5050506001600160a01b0316156142a557835160208501805190916001600160a01b03908116848114929091169084908a908461429b575b841561427c575b5050505015614223577fac260005f5a1d1cb696ab1065059083a3769fa09f4b4699f1dafd670d071a9216040948893889360027f8b6c6e3acbbb079495759cfeb1dbf99774b60962f29ff5d8299cbf1dc49f9b1499865f5281602052895f20885f52602052895f209260018060a01b0360018060a01b03835116166001600160601b0360a01b855416178455600184019060018060a01b039060018060a01b03905116166001600160601b0360a01b8254161781558a8201518154606084015160b81b62ffffff60b81b169162ffffff60a01b9060a01b169065ffffffffffff60a01b191617179055608060018060a01b039101511691019060018060a01b03166001600160601b0360a01b825416179055835f526005602052865f20855f52602052865f20600160ff19825416179055835f526004602052865f20855f52602052865f205490845f526004602052875f20865f5260205282885f2055845f526003602052875f20906001600160601b0360a01b8254161790556142026141db615f7e565b885192835260208301939093526001600160a01b0390921660408201529081906060820190565b0390a361420d615f7e565b82519182526001600160a01b03166020820152a3565b60405162461bcd60e51b815260206004820152602b60248201527f4a424275796261636b486f6f6b3a20706f6f6c206b65792063757272656e636960448201526a0cae640dad2e6dac2e8c6d60ab1b6064820152608490fd5b1492509082614291575b50505f838982614056565b149050825f614286565b838214945061404f565b506357421ac560e11b5f5260045260245ffd5b84632ec7c58760e01b5f5260045260245260445ffd5b83633eb257a360e21b5f5260045260245ffd5b5062904c3760e81b5f5260045261012c6024526202a30060445260645ffd5b506202a3008211613fda565b5050505f52600260205260405f209060018060a01b03165f5260205260a060405f206040519061433b82611f13565b600180841b0381541682526001810154600180851b038116602084015262ffffff81851c16604084015260b81c60020b60608301526002600180851b039101541660808201522063ca5a804360e01b5f5260045260245ffd5b91906143a1602091615154565b604051631e2eaeaf60e01b8152600481019190915292839060249082906001600160a01b03165afa918215611b30575f926143ff575b506001600160a01b0382169160a081901c60020b9162ffffff60b883901c81169260d01c1690565b9091506020813d60201161442b575b8161441b60209383611f79565b81010312610bce5751905f6143d7565b3d915061440e565b9081518110156121a9570160200190565b8181029291811591840414171561201b57565b90915f9160606025855111156145fb578451602410156121a95760448501518060f81c9160205b6004810180821161201b576001600160f81b031961449c828b614433565b51161515806145dc575b156145d2576144b59089614433565b516020828a01015160f882901c91906001600160e01b03198881169116146144e157505060050161447e565b955095965092905060098301809311918261201b57611fe0809160f31c1616908082046020149015171561201b5782108015906145b3575b1561457c575050611fe0808551925b60f31c1616918083046020149015171561201b578190039060405193601f19603f8487010116604052828552015f5b8281106145675750505060019190565b80602080928401015182828801015201614557565b61201b5761458a9085614433565b51611fe0808260f81c9260f31c1616908082046020149015171561201b57611fe0809192614528565b505f90506001600160f81b03196145ca8388614433565b511615614519565b5050949550505050565b5060f384901c611fe0168515602087830414171561201b5782106144a6565b50509150505f90604051614610602082611f79565b5f815290565b949293905f945f91875f52600560205260405f2060018060a01b0385165f5260205260ff60405f2054161561496857875f52600260205260405f2060018060a01b0385165f5260205260405f20936040519461467186611f13565b80546001600160a01b03908116875260018201548082166020808a019190915260a082811c62ffffff166040808c019190915260b89390931c600290810b60608c015290940154831660808a019081525f9d8e5260048252828e209584168e529490528b20549187209a54919a969116926146ec8785614b97565b6001600160801b03811692831561495057868a63ffffffff9c9d9e614720936001600160801b0387169e8f9216908a61517a565b909b909a91976001600160a01b038082169084161096928d6001600160801b038e16156147fe57505050505085156147f057906147799392916147628b6154e2565b926001600160801b038b1611156147e857906158ba565b90670de0b6b3a76400008210156147dd5790606462ffffff61479e876147aa95614394565b9250505016049061591a565b966122608810156147d25750806127106147c86147cf939983614444565b049061200e565b94565b965086958692509050565b508796879350915050565b5088906158ba565b508a998a9650945050505050565b939b9c50949e509450975060019b9a9b96959194969860018060a01b0390511660018060a01b038a54160361493b57508861483891614394565b989291968091501580614932575b1561491657506001600160a01b038116156149015791614874969594939161486e939561580f565b996158ba565b9066b1a2bc2ec5000082116148f35762ffffff606491160461012c018061012c1161201b57655af3107a40006148ab920490612059565b6001810180821161201b5761271011156148e6575f19906127100301612710811161201b576148dd6127109187614444565b0493925f929190565b505f945084939284929190565b505f95508594938593929150565b505050505050505093505f935f93925f929190565b94935050505061487493925061492b896154e2565b91996158ba565b9c50869c614846565b5f9c508c9b50998b9998975095505050505050565b505f9b508b9a508a998a995089975095505050505050565b50505050509150505f905f905f905f905f905f90565b919294935f90835f52600560205260405f2060018060a01b0382165f5260205260ff60405f20541615614b8357835f52600260205260405f2060018060a01b0382165f5260205260405f2093604051946149d786611f13565b60018060a01b038154168652600181015460018060a01b038116602088015262ffffff8160a01c16604088015260b81c60020b6060870152600260018060a01b039101541660808601525f52600460205260405f209060018060a01b03165f5260205260405f20549260a081209260018060a01b035f541691614a5a8584614b97565b956001600160801b038716918215614b6d5788614a8b928c9263ffffffff6001600160801b0388169216908861517a565b9a919890978b986001600160801b03819b9d1615614b5557508b15614b445790614ae294939291614abb8b6154e2565b936001600160801b038b161115614b3c57915b6001600160a01b03908116911610926158ba565b90670de0b6b3a7640000821015614b2f5790606462ffffff61479e86614b0795614394565b95612260871015614b2457806127106147c86147cf939983614444565b505f95508594859150565b505f965086958692509050565b508891614ace565b505f9a508a998a9650945050505050565b5f9c508c9b909a508b99506001975095505050505050565b505f995089988998508897508795509350505050565b505f95508594859450849350839250829150565b90614ba190615154565b6003810180911161201b57604051631e2eaeaf60e01b8152600481019190915290602090829060249082906001600160a01b03165afa8015611b30575f90614bf2575b6001600160801b0391501690565b506020813d602011614c23575b81614c0c60209383611f79565b81010312610bce576001600160801b039051614be4565b3d9150614bff565b9080158015614d9b575b614d8b578215614d8657905b600160801b614c5082846138e2565b10614c7d57505015614c65576401000276a490565b73fffd8963efd1fc6a506488495d951d5263988d2590565b600160401b614c8c82846138e2565b10614d6e57614c9a91615a1e565b6001600160c01b038111614d4857614cb49060401b615e5c565b905b15614d13576401000276a3811115614d095773fffd8963efd1fc6a506488495d951d5263988d26811015614cf0576001600160a01b031690565b5073fffd8963efd1fc6a506488495d951d5263988d2590565b506401000276a490565b73fffd8963efd1fc6a506488495d951d5263988d26811015614cf0576401000276a3811115614d09576001600160a01b031690565b614d5190615e5c565b8060201b90808204640100000000149015171561201b5790614cb6565b614d7b90614d8092615994565b615e5c565b90614cb6565b614c41565b505015614c65576401000276a490565b508115614c35565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615614e03575b60405215614de35750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516611c9957823b15153d15161690614dd8565b613c23613c31614e5a925f958695869860405193614e3885611f42565b8452151560208401526040830152606082015260405192839160208301613aa5565b03925af15f9181614e8e575b50614e765750505f905f90600190565b80602080614e89935183010191016120f9565b919092565b614ea39192503d805f833e613d688183611f79565b905f614e66565b814710614ef9575f808093819382604051614ec6602082611f79565b526001600160a01b03165af115614ed957565b3d15614eea576040513d5f823e3d90fd5b63d6bda27560e01b5f5260045ffd5b504763cf47918160e01b5f5260045260245260445ffd5b9291928115614f70576127108314614f705783821015614f69578382614f359261398d565b918015614f6257806127100390612710821161201b57613a2d94614f5c9361181c9261398d565b90613900565b5050905090565b9250505090565b505050505f90565b6101808201358015158103610bce576150635761016082013515614fa557613a2d9150602881049061200e565b615000916020906001600160a01b03614fbd82611ffa565b166040614fcc60c08401611ffa565b815163c66d192b60e01b8152939091013560048401526001600160a01b031660248301529093849190829081906044820190565b03915afa8015611b30575f9061502f575b613a2d92508082101561502757506028816147c8565b6028906147c8565b506020823d60201161505b575b8161504960209383611f79565b81010312610bce57613a2d9151615011565b3d915061503c565b905090565b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f51148416156150a4575b50604052565b3d15903b151516909216915f61509e565b60405163095ea7b360e01b5f9081526001600160a01b03909316600452602483905290929160209060448180875af19260015f51148416156150f75750604052565b60018492941516615110573b15153d151616915f61509e565b833d5f823e3d90fd5b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f51148416156150f75750604052565b604051602081019182526006604082015260408152615174606082611f79565b51902090565b9491939092935f9363ffffffff821696871561548d575060018060a01b036080820151166040516151ac606082611f79565b60028152602081016040368237896151c38361219c565b525f6151ce836121bd565b52604051637cb7cbf960e11b815293849260c48401916151f2906004860190611eac565b60c060a48501525180915260e4830191905f5b81811061546e575050509181805f9403915afa90815f915f9361534f575b506152385750505050505050505f905f905f90565b61524e615244826121bd565b5160060b9161219c565b5160060b900396667fffffffffffff198812667fffffffffffff89131761201b5760030b9660060b87156138ec57667fffffffffffff1981145f1989141661201b5787810560020b975f82129182615340575b505061532b575b6001600160a01b036152b9826121bd565b5116906001600160a01b03906152ce9061219c565b511690036001600160a01b03811161201b576001600160a01b03169081615300575b50506152fd92938561580f565b92565b6152fd94506001600160801b03916153239160801b63ffffffff60801b166138e2565b16925f6152f0565b95627fffff19811461201b575f1901956152a8565b0760060b151590505f806152a1565b915091503d805f833e6153628183611f79565b810190604081830312610bce5780516001600160401b038111610bce5781019082601f83011215610bce57815161539881612161565b926153a66040519485611f79565b81845260208085019260051b82010190858211610bce57602001915b818310615454575050506020810151906001600160401b038211610bce57019180601f84011215610bce578251906153f982612161565b936154076040519586611f79565b82855260208086019360051b820101918211610bce57602001915b8183106154345750505090915f615223565b82516001600160a01b0381168103610bce57815260209283019201615422565b82518060060b8103610bce578152602092830192016153c2565b825163ffffffff16845286945060209384019390920191600101615205565b97959650905060a091929350206154a48187614394565b509097916001600160a01b03161590506154d3576154ce9392916154c791614b97565b948661580f565b929190565b505050509150505f905f905f90565b60020b908160ff1d82810118620d89e881116157fc5763ffffffff9192600182167001fffcb933bd6fad37aa2d162d1a59400102600160801b1891600281166157e0575b600481166157c4575b600881166157a8575b6010811661578c575b60208116615770575b60408116615754575b60808116615738575b610100811661571c575b6102008116615700575b61040081166156e4575b61080081166156c8575b61100081166156ac575b6120008116615690575b6140008116615674575b6180008116615658575b62010000811661563c575b620200008116615621575b620400008116615606575b62080000166155ed575b5f126155e5575b0160201c90565b5f19046155de565b6b048a170391f7dc42444e8fa290910260801c906155d7565b6d2216e584f5fa1ea926041bedfe9890920260801c916155cd565b916e5d6af8dedb81196699c329225ee6040260801c916155c2565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c916155b7565b916f31be135f97d08fd981231505542fcfa60260801c916155ac565b916f70d869a156d2a1b890bb3df62baf32f70260801c916155a2565b916fa9f746462d870fdf8a65dc1f90e061e50260801c91615598565b916fd097f3bdfd2022b8845ad8f792aa58250260801c9161558e565b916fe7159475a2c29b7443b29c7fa6e889d90260801c91615584565b916ff3392b0822b70005940c7a398e4b70f30260801c9161557a565b916ff987a7253ac413176f2b074cf7815e540260801c91615570565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c91615566565b916ffe5dee046a99a2a811c461f1969c30530260801c9161555c565b916fff2ea16466c96a3843ec78b326b528610260801c91615553565b916fff973b41fa98c081472e6896dfb254c00260801c9161554a565b916fffcb9843d60f6159c9db58835c9266440260801c91615541565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c91615538565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c9161552f565b916ffff97272373d413259a46990580e213a0260801c91615526565b826345c3193d60e11b5f5260045260245ffd5b909291906001600160a01b0390615825906154e2565b166001600160801b038111615877578061583e91614444565b916001600160a01b0390811691161015615865576001600160801b03613a2d921690615c37565b6001600160801b03613a2d9216615bb5565b8061588191615aa1565b916001600160a01b03908116911610156158a8576001600160801b03613a2d921690615b6c565b6001600160801b03613a2d9216615aea565b919291906001600160801b031680158015615909575b614f70576158dd91615c80565b90156158f657613a2d916001600160a01b031690615d93565b613a2d916001600160a01b031690615d10565b506001600160a01b038416156158d0565b90612260811015615984576064810180911161201b5760c8811061598c575b6122608110156159845781156150635766b1a2bc2ec50000198211615984578061226003612260811161201b5766b1a2bc2ec50000830180841161201b57613a2d9361181c92615ddc565b505061226090565b5060c8615939565b9060c082901b905f19600160c01b840992828085109403938085039485841115610bce5714615a17578190600160c01b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90608082901b905f19600160801b840992828085109403938085039485841115610bce5714615a17578190600160801b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b81810291905f1982820991838084109303928084039384600160401b1115610bce5714615ae157600160401b910990828211900360c01b910360401c1790565b50505060401c90565b90608082901b905f1983600160801b0992828085109403938085039485841115610bce5714615a17578190600160801b0981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b81810291905f1982820991838084109303928084039384600160801b1115610bce5714615bac57600160801b910990828211900360801b910360801c1790565b50505060801c90565b9060c082901b905f1983600160c01b0992828085109403938085039485841115610bce5714615a17578190600160c01b0981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b81810291905f1982820991838084109303928084039384600160c01b1115610bce5714615c7757600160c01b910990828211900360401b910360c01c1790565b50505060c01c90565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610bce5714615a1757670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b90606082901b905f19600160601b840992828085109403938085039485841115610bce5714615a17578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b81810291905f1982820991838084109303928084039384600160601b1115610bce5714615dd357600160601b910990828211900360a01b910360601c1790565b50505060601c90565b91818302915f1981850993838086109503948086039586851115610bce5714615e54579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b6001811115613a2d57806001600160801b821015615f6d575b600482600160401b615f1f941015615f60575b640100000000811015615f53575b62010000811015615f46575b610100811015615f3a575b6010811015615f2e575b1015615f26575b60030260011c615ece81846138e2565b0160011c615edc81846138e2565b0160011c615eea81846138e2565b0160011c615ef881846138e2565b0160011c615f0681846138e2565b0160011c615f1481846138e2565b0160011c80926138e2565b8111900390565b60011b615ebe565b811c9160021b91615eb7565b60081c91811b91615ead565b60101c9160081b91615ea2565b60201c9160101b91615e96565b60401c9160201b91615e88565b5050608081901c600160401b615e75565b601436101580615fa5575b15615fa1576013193601368111610bce573560601c90565b3390565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614615f8956fea164736f6c634300081c000a",
	"deployedBytecode": "0x61026080604052600436101561001d575b50361561001b575f80fd5b005b5f905f3560e01c90816301ffc9a714611d3e575080631337f986146116785780631a65893b1461165b5780631d831d5c146116165780631eabcd34146115d157806327e514111461159e578063293c499914611559578063345c42131461146757806349e303831461129657806353fd8e311461108b578063572b6c051461102d5780637da0a87714610fe8578063826a5e7414610f4157806388bc2ef314610efc5780638cc3584614610e2557806391dd73461461083e5780639782ed71146107f95780639785f1ed146107d057806399f6d77f146106d0578063b7433b35146103bc578063b88a92b41461039e578063bac6b2ad146102dc578063c22903b2146102c7578063db312fae146102aa578063dc4c90d314610283578063f434c9141461023e5763f672acac03610010573461023b57602036600319011261023b576004356001600160401b038111610239576101c060031982360301126102395761018b906004016133cb565b92939060409592955195869560a0870193875260208701526040860152606085015260a06080850152825180915260c08401602060c08360051b870101940192905b8282106101dc57505050500390f35b91936001919395506020610229819260bf198a8203018652608060608a51878060a01b03815116845285810151151586850152604081015160408501520151918160608201520190611eef565b96019201920185949391926101cd565b505b80fd5b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b578060031936011261023b57546040516001600160a01b039091168152602090f35b503461023b578060031936011261023b5760206040516127108152f35b506102d96102d436611df1565b612c98565b80f35b503461023b57604036600319011261023b576004356001600160a01b038116908190036102395761030b611e6b565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361038b5782546001600160a01b038116610379576001600160601b0360a01b1617825560018060a01b03166001600160601b0360a01b600154161760015580f35b6001622c6feb60e11b03198452600484fd5b634758af1b60e01b835233600452602483fd5b503461023b578060031936011261023b5760206040516202a3008152f35b503461023b57606036600319011261023b576004356103d9611e6b565b6040516331a9108f60e11b8152600481018390526044359291906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156106c5578591610687575b5061043c615f7e565b6001600160a01b03918216911680821415806105bf575b61059457505061012c83108015610588575b610568576001600160a01b03811661eeee03610562575082915b81845260056020526040842060018060a01b0384165f5260205260ff60405f20541615610541578184526004602081815260408087206001600160a01b0387165f81815291845282822054878a529484528289209082529092529020829055927fac260005f5a1d1cb696ab1065059083a3769fa09f4b4699f1dafd670d071a921919061053b61050d615f7e565b6040805197885260208801949094526001600160a01b03908116938701939093529116939081906060820190565b0390a380f35b633d56755560e01b845260048290526001600160a01b038316602452604484fd5b9161047f565b62904c3760e81b8452600483905261012c6024526202a300604452606484fd5b506202a3008311610465565b908360849260405192631326f75560e11b8452600484015260248301526044820152601c6064820152fd5b50604051631a45b42760e11b8152600481018290526024810183905260448101859052601c606482015260016084820181905260a482015260208160c4817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561067c57879161063e575b5015610453565b90506020813d602011610674575b8161065960209383611f79565b810103126106705761066a90611f9a565b5f610637565b8680fd5b3d915061064c565b6040513d89823e3d90fd5b90506020813d6020116106bd575b816106a260209383611f79565b810103126106b9576106b390612066565b5f610433565b8480fd5b3d9150610695565b6040513d87823e3d90fd5b503461023b5761016036600319011261023b5761012036602319011261023b57604051906106fd82611f5d565b60243565ffffffffffff8116810361023957825260443565ffffffffffff8116810361023957602083015260643565ffffffffffff8116810361023957604083015260843565ffffffffffff8116810361023957606083015260a43563ffffffff8116810361023957608083015260c4356001600160701b03811681036102395760a083015260e43563ffffffff811681036102395760c083015261010435916001600160a01b03831683036102395760209260e0820152610100610124359101526107c7611e81565b50604051908152f35b503461023b578060031936011261023b576001546040516001600160a01b039091168152602090f35b503461023b57604036600319011261023b576040610815611e6b565b9160043581526004602052209060018060a01b03165f52602052602060405f2054604051908152f35b503461023b57602036600319011261023b57600435906001600160401b03821161023b573660238301121561023b5781600401356001600160401b0381116102395782019036602483011161023b5780546001600160a01b03169133839003610e1257610100848203126102395760a06024604051926108bd84611f42565b869003016023190112610239576040516108d681611f13565b6108e260248601611e98565b81526108f060448601611e98565b6020820152606485013562ffffff81168103610bce57604082015261091760848601611e47565b606082015261092860a48601611e98565b6080820152815261093b60c48501611fd9565b93610969602083019580875260e4830135906101046040860194838652013590816060870152151591614c2b565b93825186511515925195600160ff1b8714610dfe5760405193606085018581106001600160401b03821117610dea5792610a296109f8938993602098979660405287528787019a84038b52604087019060018060a01b031681526040519084898301528882526109da604083611f79565b604051633cf3645360e21b81529b8c98899788966004880190611eac565b51151560a48601525160c4850152516001600160a01b031660e4840152610120610104840152610124830190611eef565b03925af1928315610ddf578293610dab575b508260801d935115155f14610d73575180516020909101516001600160a01b03918216949116906001600160801b03908190610a7690612c78565b169316935b6001600160a01b031680610ca757508154604051630476982d60e21b8152906020908290600490829088906001600160a01b03165af18015610c9c57610c6d575b505b6001600160a01b031680158015610c0a5747945b83546001600160a01b031690813b156106b9578491606483926040519485938492630b0d9c0960e01b845289600485015230602485015260448401525af18015610bff57908491610be6575b505015610b69575050610b34610b65924761200e565b604051916020830152604082015260408152610b51606082611f79565b604051918291602083526020830190611eef565b0390f35b6020602491604051928380926370a0823160e01b82523060048301525afa918215610bda5791610ba2575b50610b6592610b349161200e565b90506020813d602011610bd2575b81610bbd60209383611f79565b81010312610bce5751610b65610b94565b5f80fd5b3d9150610bb0565b604051903d90823e3d90fd5b81610bf091611f79565b610bfb57825f610b1e565b8280fd5b6040513d86823e3d90fd5b6040516370a0823160e01b8152306004820152602081602481865afa908115610bff578491610c3b575b5094610ad2565b90506020813d602011610c65575b81610c5660209383611f79565b81010312610bce57515f610c34565b3d9150610c49565b610c8e9060203d602011610c95575b610c868183611f79565b81019061202f565b505f610abc565b503d610c7c565b6040513d85823e3d90fd5b82546001600160a01b0316803b15610d6f57838091602460405180948193632961046560e21b83528760048401525af18015610bff5785918591610d56575b50508354610cff926001600160a01b0390911690614da3565b8154604051630476982d60e21b8152906020908290600490829087906001600160a01b03165af18015610c9c57610d37575b50610abe565b610d4f9060203d602011610c9557610c868183611f79565b505f610d31565b81925090610d6391611f79565b610bfb5783835f610ce6565b8380fd5b51602081015190516001600160a01b0391821694939116906001600160801b03908190610da290600f0b612c78565b16931693610a7b565b9092506020813d602011610dd7575b81610dc760209383611f79565b810103126102395751915f610a3b565b3d9150610dba565b6040513d84823e3d90fd5b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b86526011600452602486fd5b63cb25844560e01b825233600452602482fd5b503461023b57602036600319011261023b576004356001600160401b03811161023957610180600319823603011261023957610e63906004016121cd565b6040519283926040840190845260406020850152825180915260608401602060608360051b870101940192905b828210610e9f57505050500390f35b91936001919395506020610eec8192605f198a8203018652608060608a51878060a01b03815116845285810151151586850152604081015160408501520151918160608201520190611eef565b9601920192018594939192610e90565b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b57604036600319011261023b576040610f5d611e6b565b91610f66612099565b5060043581526002602052209060018060a01b03165f5260205260a060405f2060405190610f9382611f13565b600180841b0381541682526001810154600180851b038116602084015262ffffff81851c16604084015260b81c60020b60608301526002600180851b03910154166080820152610fe66040518092611eac565bf35b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b57602036600319011261023b576004356001600160a01b03811690819003610239576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169091148152602090f35b503461023b5761010036600319011261023b5760043560a03660231901126102395760e4356001600160a01b038116808203610d6f576040516331a9108f60e11b815260048101849052906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106c55784928691611252575b5061eeee9261112591613d88565b0361124c575081905b60405163ea78803f60e01b815260048101829052916020836024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa928315610bff57849361121b575b506040519161119183611f13565b6024356001600160a01b03811681036112175783526044356001600160a01b038116810361121757602084015260643562ffffff811681036112175760408401526084358060020b810361121757606084015260a435936001600160a01b03851685036112175760808401949094526102d9936001600160a01b03169260c43591613fa3565b8580fd5b61123e91935060203d602011611245575b6112368183611f79565b81019061207a565b915f611183565b503d61122c565b9061112e565b9250506020823d60201161128e575b8161126e60209383611f79565b810103126106b9576111258461128661eeee94612066565b915092611117565b3d9150611261565b503461023b5760c036600319011261023b57600435906112b4611e25565b916112bd611e37565b6112c5611e55565b9060a4359460018060a01b0386168096036106b9576040516331a9108f60e11b8152600481018590526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561145c579085918791611412575b506113489493929161134291613d88565b84613e94565b92909184602060018060a01b0382541660c46040518094819363313b65df60e11b83526113786004840189611eac565b8c60a48401525af16113d9575b50845460a0822061139e916001600160a01b0316614394565b5050506001600160a01b0316958087036113c257506102d994955060643591613fa3565b6302c5a6e160e11b86526004879052602452604485fd5b6020813d60201161140a575b816113f260209383611f79565b8101031261121757518060020b810315611385578580fd5b3d91506113e5565b9150506020813d602011611454575b8161142e60209383611f79565b81010312611217579061134285611449611348969594612066565b915091929394611331565b3d9150611421565b6040513d88823e3d90fd5b503461023b5760a036600319011261023b57600435611484611e25565b9061148d611e37565b611495611e55565b6040516331a9108f60e11b8152600481018490529091906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561145c57869161150c575b50906102d994611342856115009594613d88565b92909160643591613fa3565b929190506020833d602011611551575b8161152960209383611f79565b81010312611217576102d9946113428561154561150096612066565b939495505050946114ec565b3d915061151c565b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b57602036600319011261023b57602090600435815260038252604060018060a01b0391205416604051908152f35b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b578060031936011261023b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461023b578060031936011261023b57602060405161012c8152f35b5061168236611df1565b604051636e49181f60e01b8152602082810135600483018190523360248401529190816044816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa908115611b30575f91611d04575b5015611cf157816116f86101c080940182611fa7565b9080949181010312610bce5761170d83611fd9565b9260408101359361172060608301611fd9565b9060808301359260018060a01b03841696878503610bce5760a08201359360c08301359360e0840135926117576101008601611e47565b506117656101208601611fe6565b5080938781151580611ce3575b611cb4575b50505060e088019061eeee6001600160a01b0361179384611ffa565b16149788976117a96117a485611ffa565b613a30565b99611ca2575b88159283611c26575b916117c9916117dd9594938d613b3c565b9390996117d86117a485611ffa565b61200e565b5f98816118eb575b5050505081156118e2575b50806118d0575b6118b057506118229261181c86959361181c9360206101608d9b9a013591013561398d565b90612059565b918261182c578380f35b60209361183e6101a060c49401611ffa565b9560405196879586946363fdc96f60e11b86526004860152602485015260018060a01b0316604484015260a060648401528160a4840152600160848401525af18015610ddf57611891575b818180808380f35b6118a99060203d602011610c9557610c868183611f79565b505f611889565b886044916118be8688612059565b63e2d708a960e01b8352600452602452fd5b50806118dc8587612059565b106117f7565b9050155f6117f0565b8c939499505f9e9d9e50825f93611b42575b8115611b3b57825b6119116117a488611ffa565b9561191b88611ffa565b916020956040519361192d8886611f79565b5f8552333b15610bce575f9361198b60405196879586948594639e6eec0560e01b8652600486015260018060a01b03166024850152604484015286606484015260c060848401528660c484015260e060a484015260e4830190611eef565b0391335af18015611b3057611b18575b509d9e9d8f90611ab3575b5015611a245750506119bd6117a46119c393611ffa565b9061200e565b945b887faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e516611a186119fa886101608d01358b61398d565b604080519a8b5260208b0182905233908b0152989081906060820190565b0390a25f8080806117e5565b6024939192509081906001600160a01b0390611a3f90611ffa565b16604051948580926370a0823160e01b82523360048301525afa908115611aa8578d91611a78575b50611a72925061200e565b946119c5565b905082813d8311611aa1575b611a8e8183611f79565b81010312610bce57611a7291515f611a67565b503d611a84565b6040513d8f823e3d90fd5b6001600160a01b03611ac487611ffa565b16611ad0823383615068565b15611adc575b506119a6565b9050611ae833826150b5565b15611b05578f611af9903383615119565b15611b05578f90611ad6565b8f602491635274afe760e01b8252600452fd5b909f9e50611b27905f90611f79565b5f9d9e5f61199b565b6040513d5f823e3d90fd5b5f92611905565b60249450925060206001600160a01b03611b5b87611ffa565b16604051958680926370a0823160e01b82523360048301525afa8015611b30578d945f91611bf1575b50926001600160a01b03611b9787611ffa565b16611ba3843383615068565b15611baf575b506118fd565b909192939450611bbf33826150b5565b15611bdf57611bcf843383615119565b15611bdf57908d94939291611ba9565b635274afe760e01b5f5260045260245ffd5b9450506020843d602011611c1e575b81611c0d60209383611f79565b81010312610bce578c93515f611b84565b3d9150611c00565b6001600160a01b03611c3786611ffa565b168c610140604051916323b872dd60e01b5f523360045230602452013560445260205f60648180865af19060015f5114821615611c81575b6040525f60605215611bdf57506117b8565b906001811516611c9957823b15153d15161690611c6f565b503d5f823e3d90fd5b98611cae90349061200e565b986117af565b90919750611cc9826101408c0135809361398d565b978461177757611cda93955061398d565b915f8080611777565b50816101408c013510611772565b634758af1b60e01b5f523360045260245ffd5b90506020813d602011611d36575b81611d1f60209383611f79565b81010312610bce57611d3090611f9a565b5f6116e2565b3d9150611d12565b34610bce576020366003190112610bce576004359063ffffffff60e01b8216809203610bce5760209163e347239560e01b8114908115611de0575b8115611dcf575b8115611dbe575b8115611dad575b8115611d9c575b5015158152f35b6301ffc9a760e01b14905083611d95565b633d0d324560e21b81149150611d8e565b6316f0f2dd60e01b81149150611d87565b63611481d960e11b81149150611d80565b63099bfcc360e11b81149150611d79565b6020600319820112610bce57600435906001600160401b038211610bce57610200908290036003190112610bce5760040190565b6024359062ffffff82168203610bce57565b604435908160020b8203610bce57565b35908160020b8203610bce57565b608435906001600160a01b0382168203610bce57565b602435906001600160a01b0382168203610bce57565b61014435906001600160a01b0382168203610bce57565b35906001600160a01b0382168203610bce57565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a081019081106001600160401b03821117611f2e57604052565b634e487b7160e01b5f52604160045260245ffd5b608081019081106001600160401b03821117611f2e57604052565b61012081019081106001600160401b03821117611f2e57604052565b90601f801991011681019081106001600160401b03821117611f2e57604052565b51908115158203610bce57565b903590601e1981360301821215610bce57018035906001600160401b038211610bce57602001918136038313610bce57565b35908115158203610bce57565b35906001600160801b0382168203610bce57565b356001600160a01b0381168103610bce5790565b9190820391821161201b57565b634e487b7160e01b5f52601160045260245ffd5b90816020910312610bce575190565b6001600160401b038111611f2e57601f01601f191660200190565b9190820180921161201b57565b51906001600160a01b0382168203610bce57565b90816020910312610bce57516001600160a01b0381168103610bce5790565b604051906120a682611f13565b5f6080838281528260208201528260408201528260608201520152565b9291926120cf8261203e565b916120dd6040519384611f79565b829481845281830111610bce578281602093845f960137010152565b9190826040910312610bce576020825192015190565b519065ffffffffffff82168203610bce57565b519063ffffffff82168203610bce57565b519061ffff82168203610bce57565b3563ffffffff81168103610bce5790565b3560ff81168103610bce5790565b6001600160401b038111611f2e5760051b60200190565b6040519061218582611f42565b606080835f81525f60208201525f60408201520152565b8051156121a95760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156121a95760400190565b5f61024081905261014081905260408201926101208301359260609061222a6122046121fd610160840184611fa7565b36916120c3565b7f0000000000000000000000000000000000000000000000000000000000000000614457565b90612c50575b5060a08101358411612c35578315612c29575b604051632eec7b5560e11b815260c08201356004820152956020876024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa968715611b30575f97612c08575b506040516320c94b1360e11b815260c08301356004820152610380816024816001600160a01b038c165afa908115611b30575f91612998575b50608083016122e281612142565b63ffffffff808061010086015160241c16169116145f146128ca57505060ff61230c848401612153565b16604d811161201b57600a0a5b61232481888861398d565b60c08401355f908152600360205260409020546001600160a01b039081166101e05290929061eeee9061235683611ffa565b16036128bb57505f955b5f60e08190526101a0819052600161022052610140519093849391156128865760c08601355f52600260205260405f2060018060a01b038a165f5260205260a060405f20604051906123b182611f13565b600180841b0381541682526001810154600180851b038116602084015262ffffff81851c16604084015260b81c60020b8a8301526002600180851b03910154166080820152209560c08101355f52600560205260405f2060018060a01b038b165f5260205260ff60405f2054168061285e575b8061022052612830575b5f60c081815282013581526005602090815260408083206001600160a01b038e16845290915281205490989060ff161561277557505f6102005260a0810135840361275e575f610200525b61022051156101c0526101c051610180526101c051612751575b6101c05180612745575b61272b578b906101805161016052610180511561271b575b6101a05180612710575b80612704575b6126fa575b6102405161266d575b5050604061012081905280516101008190526124ef9190611f79565b600161010051525f5b61012051601f1901811061265357506001600160801b0395969798999a610100519a5f60a052610160515f1461264a575f60a0525b610120515160805260018060a01b03166101e051106020608051015261020051610120516080510152610240516060608051015261014051151560808051015260018060a01b031660a0608051015260c0608051015260e06080510152610100608051015260020b61012060805101521661014060805101526101606080510152610180608051015260c0516101a0608051015260e0516101c060805101526101a05115156101e060805101526101e0608051526125ef610200608051611f79565b61012051516125fd81611f42565b3081526101605115908115602082015260a05161012051820152608051606082015261262b6101005161219c565b526126386101005161219c565b5061263f57565b610100515f93509150565b8460a05261252d565b60209061265e612178565b828261010051010152016124f8565b604080516380d3fe3560e01b815260c092909201356004830152610240516024830152600160448301529298509190829060649082906001600160a01b03165afa8015611b30575f915f916126c9575b5060c052958a5f6124d3565b90506126ed915060403d6040116126f3575b6126e58183611f79565b8101906120f9565b5f6126bd565b503d6126db565b82610240526124ca565b506102405115156124c5565b5061014051156124bf565b61024051831015610160526124b5565b5063e2d708a960e01b5f526004526102405160245260445ffd5b5061024051821061249d565b610140516101c052612493565b61276c8460a083013561200e565b61020052612479565b9a9b9750955096975050505050610240516127c3575b505061014051806127b7575b61279e5750565b63e2d708a960e01b5f526004526102405160245260445ffd5b50610240518110612797565b604080516380d3fe3560e01b815260c092909201356004830152610240516024830152600160448301529091829060649082906001600160a01b03165afa8015611b3057612812575b8061278b565b61282a9060403d6040116126f3576126e58183611f79565b5061280c565b93509350612848886101e051818560c088013561497e565b91929894979350506101a052959460e05261242e565b505f546001600160801b039061287e9089906001600160a01b0316614b97565b161515612424565b935093915061289f876101e051818460c0870135614616565b6101a0999592999894979398529796956102405260e05261242e565b6128c490611ffa565b95612360565b63ffffffff6101006128dd60ff93612142565b93015160241c1663ffffffff6128f4878701612153565b604051631df139fd60e11b815260c088013560048201529482166024860152911660448401521660648201526020816084817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611b30575f91612966575b50612319565b90506020813d602011612990575b8161298160209383611f79565b81010312610bce57515f612960565b3d9150612974565b8091506103803d8111612c01575b6129b08183611f79565b810103906103808212610bce576101208212610bce57604051916129d383611f5d565b6129dc8261210f565b83526129ea6020830161210f565b60208401526129fb6040830161210f565b6040840152612a0b86830161210f565b86840152612a1b60808301612122565b608084015260a08201516001600160701b0381168103610bce5760a0840152612a4660c08301612122565b60c084015260e0820151906001600160a01b0382168203610bce576102609160e085015261010083015161010085015261011f190112610bce57604051906102608201908282106001600160401b03831117611f2e57610360612bf89161024093604052612ab76101208201612133565b8552612ac66101408201612133565b6020860152612ad86101608201612122565b6040860152612aea6101808201611f9a565b89860152612afb6101a08201611f9a565b6080860152612b0d6101c08201611f9a565b60a0860152612b1f6101e08201611f9a565b60c0860152612b316102008201611f9a565b60e0860152612b436102208201611f9a565b610100860152612b54848201611f9a565b610120860152612b676102608201611f9a565b610140860152612b7a6102808201611f9a565b610160860152612b8d6102a08201611f9a565b610180860152612ba06102c08201611f9a565b6101a0860152612bb36102e08201611f9a565b6101c0860152612bc66103008201611f9a565b6101e0860152612bd96103208201611f9a565b610200860152612bec6103408201612066565b61022086015201612133565b9101525f6122d4565b503d6129a6565b612c2291975060203d602011611245576112368183611f79565b955f61229b565b60a08101359350612243565b60a0908463cc8704dd60e01b5f52600452013560245260445ffd5b612c65919450602080825183010191016120f9565b610240819052151561014052925f612230565b600f0b6f7fffffffffffffffffffffffffffffff19811461201b575f0390565b604051636e49181f60e01b815260208281013560048301819052336024840152916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169181604481855afa908115611b30575f91613391575b501561337e576080830161eeee6001600160a01b03612d1783611ffa565b160361336f575f935b835f52600260205260405f2060018060a01b0386165f5260205260405f209160405192612d4c84611f13565b60018060a01b038154168452600181015460018060a01b038116602086015262ffffff8160a01c16604086015260b81c60020b6060850152600260018060a01b03910154166080840152845f52600360205260018060a01b0360405f205416935f9160608401359586925f936101c08701612dc78189611fa7565b90506132d8575b508089116132cf575b50602060249160405192838092632eec7b5560e11b82528d60048301525afa908115611b30575f916132b0575b506040516370a0823160e01b815230600482015290602082602481865afa918215611b30575f9261327c575b5060208960c48c5f60405195869485936363fdc96f60e11b85526004850152602484015230604484015260a060648401528160a484015281608484015260018060a01b03165af18015611b305761324d575b506040516370a0823160e01b8152306004820152602081602481865afa908115611b30575f91613219575b50612ecf91612ebb9161200e565b996001600160a01b03168210858b89614e1b565b9a91909a61318757848061317e575b80613175575b61315e578a969594939291908082111561315657612f019161200e565b8061313c575b5061eeee90506001600160a01b03612f1e83611ffa565b1603612f855750505091612f6260a092612f5d6101a07fbda038b4536720f0edb8da72fb3f9779994198517ff2acfe51d419e07feb0379979601611ffa565b614eaa565b20604080519283526020830195909552339482019490945280606081015b0390a3565b919350916101a06001600160a01b03612f9d84611ffa565b169101916020612fac84611ffa565b6040516370a0823160e01b81526001600160a01b03909116600482015292839060249082905afa918215611b30575f92613106575b50602090613030906130178b6001600160a01b03612ffe84611ffa565b166001600160a01b0361301089611ffa565b1690614da3565b6001600160a01b039061302990611ffa565b1693611ffa565b6040516370a0823160e01b81526001600160a01b03909116600482015292839060249082905afa8015611b30575f906130d2575b61306e925061200e565b90806130c9575b806130c0575b6130ab5750509060a07fbda038b4536720f0edb8da72fb3f9779994198517ff2acfe51d419e07feb037992612f62565b63e2d708a960e01b5f5260045260245260445ffd5b5081811061307b565b50811515613075565b506020823d6020116130fe575b816130ec60209383611f79565b81010312610bce5761306e9151613064565b3d91506130df565b9091506020813d602011613134575b8161312260209383611f79565b81010312610bce575190613030612fe1565b3d9150613115565b61314f9161314987611ffa565b90614da3565b5f80612f07565b50505f612f01565b858b63e2d708a960e01b5f5260045260245260445ffd5b50858b10612ee4565b50851515612ede565b509850945050809192945090613210575b6131fa5750816131d085612f80936131497f8df6e3a86b047621038c6b98aa897b8dd0a6ce91b348704f248b7bbf0e32b21496611ffa565b6001600160a01b03906131e290611ffa565b60408051968752336020880152911694918291820190565b63e2d708a960e01b5f525f60045260245260445ffd5b50801515613198565b90506020813d602011613245575b8161323460209383611f79565b81010312610bce5751612ecf612ead565b3d9150613227565b6020813d602011613274575b8161326660209383611f79565b81010312610bce5751612e82565b3d9150613259565b9091506020813d6020116132a8575b8161329860209383611f79565b81010312610bce5751905f612e30565b3d915061328b565b6132c9915060203d602011611245576112368183611f79565b5f612e04565b97506020612dd7565b9850945092506101006132eb8887611fa7565b905010155f14613344576133026101009786611fa7565b9080989181010312610bce5761331a60608801611e47565b5061332760808801611fe6565b5061333460e08801611fd9565b9260208801359735945b5f612dce565b613352604094939786611fa7565b9080959181010312610bce5760208435940135968415159361333e565b61337881611ffa565b93612d20565b63ccdd427f60e01b5f523360045260245ffd5b90506020813d6020116133c3575b816133ac60209383611f79565b81010312610bce576133bd90611f9a565b5f612cf9565b3d915061339f565b61eeee6001600160a01b036133e260c08401611ffa565b16036138d0575f905b6040818101355f8181526003602052918220546001600160a01b031694919283806134466134206121fd6101a0860186611fa7565b7f0000000000000000000000000000000000000000000000000000000000000000614457565b906138a2575b508015613879575b8015613871575b8015613865575b613807576101208201359260808301359660a0840135966101608501359361348c858a8c8a614f10565b955f905f945f9d600190855f146137e0575050865f52600260205260405f209060018060a01b03165f5260205260a060405f20604051906134cc82611f13565b8054600180851b5f19019182168452820154808216602085015262ffffff81861c16604085015260b81c600290810b606085015290910154166080820152205f549091906001600160801b039061352d9084906001600160a01b0316614b97565b161515905b61353c818b614f78565b998215806137d9575b806137d0575b6137b957826137af575b60019883806137a5575b61366a575b50505015958615613650575b50604094855198613581878b611f79565b60018a52601f1987015f5b8181106136385750509d6001600160801b03918e9f9d9e9c9d8b9d89519860208a015289890152606088015260020b60808701521660a085015260c084015260e0830152151561010082015261010081526135e961012082611f79565b5f8251926135f684611f42565b308452841515602085015283015260608201526136128461219c565b5261361c8361219c565b5061362f575050506127109392915f9190565b95949391925090565b808c60208093613646612178565b920101520161358c565b90955080613660575b945f613570565b5086831115613659565b9298909160409384519061367e8683611f79565b600182526020820190601f19870136833761369b60c08501611ffa565b6136a48461219c565b6001600160a01b0391821690526136ba85611ffa565b16936136d56101006136ce60e08401612153565b9201612142565b91885196879563b5c104f360e01b875260848701926004880152608060248801525180925260a4860194915f5b81811061378457505050506020949263ffffffff859360ff859416604485015216606483015203915afa92831561377b57505f92613747575b501115955f8080613564565b9091506020813d602011613773575b8161376360209383611f79565b81010312610bce5751905f61373b565b3d9150613756565b513d5f823e3d90fd5b83516001600160a01b03168752899750602096870196909301928201613702565b508b88111561355f565b8615159250613555565b868b63e2d708a960e01b5f5260045260245260445ffd5b50868b1061354b565b5085613545565b91935095506137f6939d50829194508c8761497e565b50909d919592949193929091613532565b929450945050613831575b506101608201359160808101359161012060a083013592013590606090565b6138588361385361016082013560a08301356080840135610120850135614f10565b614f78565b8181106130ab5750613812565b50608082013515613462565b50861561345b565b50825f52600560205260405f2060018060a01b0387165f5260205260ff60405f20541615613454565b809650604092508091505181010312610bce576138c6604060208601519501611f9a565b841515905f61344c565b6138dc60c08201611ffa565b906133eb565b81156138ec570490565b634e487b7160e01b5f52601260045260245ffd5b91905f905f198185099080850292838084109303928084039314613980576127108310156139645750612710907fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e9194950990828211900360fc1b910360041c170290565b60649186630c740aef60e31b8352600452602452612710604452fd5b5050506127109192500490565b90915f198383099280830292838086109503948086039514613a205782851015613a085790829109600182190182168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b630c740aef60e31b5f5260045260245260445260645ffd5b505090613a2d92506138e2565b90565b6001600160a01b031661eeee8103613a4757504790565b6020602491604051928380926370a0823160e01b82523060048301525afa908115611b30575f91613a76575090565b90506020813d602011613a9d575b81613a9160209383611f79565b81010312610bce575190565b3d9150613a84565b91909160e06060610100830194613abd848251611eac565b6020810151151560a0850152604081015160c08501520151910152565b602081830312610bce578051906001600160401b038211610bce570181601f82011215610bce57805190613b0d8261203e565b92613b1b6040519485611f79565b82845260208383010111610bce57815f9260208093018386015e8301015290565b9091925f925f80613c64613c23613c3160e08801956101408901359661eeee60018060a01b03613b6b83611ffa565b16148614613d775750602085995b0135988986526002602052604086209060018060a01b03168652602052604085209a6040519b613ba88d611f13565b60018060a01b038154168d528c6060600183015460018060a01b038116602084015262ffffff8160a01c16604084015260b81c60020b910152600260018060a01b039101541660808d015260405191613c0083611f42565b8c8352156020830152876040830152606082015260405192839160208301613aa5565b03601f198101835282611f79565b82546040516348c8949160e01b8152602060048201529485936001600160a01b0390921692849283916024830190611eef565b03925af15f9181613d53575b50613c82575050505050505f90600190565b7f2afb56853a8b76a0868e64c0001eedd84d9a7f5bc7fb788aba6180e422ba6ec5613ce560a0613cc0846020808a979d9b9c9d5183010191016120f9565b91909a2060408051968752602087018390523390870152909950939081906060820190565b0390a384613cf1575050565b6001600160a01b031690813b15610bce575f9160a48392604051948593849263516a997360e11b84523060048501526024840152896044840152608060648401528160848401525af18015611b3057613d475750565b5f613d5191611f79565b565b613d709192503d805f833e613d688183611f79565b810190613ada565b905f613c70565b613d82602091611ffa565b99613b79565b90613d91615f7e565b6001600160a01b0392831692168083141580613ddb575b613db157505050565b6084935060405192631326f75560e11b8452600484015260248301526044820152601d6064820152fd5b50604051631a45b42760e11b8152600481018290526024810184905260448101839052601d606482015260016084820181905260a482015260208160c4817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611b30575f91613e5a575b5015613da8565b90506020813d602011613e8c575b81613e7560209383611f79565b81010312610bce57613e8690611f9a565b5f613e53565b3d9150613e68565b92919091613ea0612099565b506001600160a01b03811661eeee03613f9d57505f915b60405163ea78803f60e01b8152600481019490945291928392906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611b30575f91613f7e575b506001600160a01b03908116931683811015613f71579162ffffff84925b60018060a01b03600154169360405195613f4887611f13565b6001600160a01b03908116875216602086015216604084015260020b6060830152608082015292565b9162ffffff849392613f2f565b613f97915060203d602011611245576112368183611f79565b5f613f11565b91613eb7565b9293919091835f52600560205260405f2060018060a01b0386165f5260205260ff60405f20541661430c5761012c82108015614300575b6142e1576001600160a01b03169384156142ce576001600160a01b0316938085146142b85760a08320906140178260018060a01b035f5416614394565b5050506001600160a01b0316156142a557835160208501805190916001600160a01b03908116848114929091169084908a908461429b575b841561427c575b5050505015614223577fac260005f5a1d1cb696ab1065059083a3769fa09f4b4699f1dafd670d071a9216040948893889360027f8b6c6e3acbbb079495759cfeb1dbf99774b60962f29ff5d8299cbf1dc49f9b1499865f5281602052895f20885f52602052895f209260018060a01b0360018060a01b03835116166001600160601b0360a01b855416178455600184019060018060a01b039060018060a01b03905116166001600160601b0360a01b8254161781558a8201518154606084015160b81b62ffffff60b81b169162ffffff60a01b9060a01b169065ffffffffffff60a01b191617179055608060018060a01b039101511691019060018060a01b03166001600160601b0360a01b825416179055835f526005602052865f20855f52602052865f20600160ff19825416179055835f526004602052865f20855f52602052865f205490845f526004602052875f20865f5260205282885f2055845f526003602052875f20906001600160601b0360a01b8254161790556142026141db615f7e565b885192835260208301939093526001600160a01b0390921660408201529081906060820190565b0390a361420d615f7e565b82519182526001600160a01b03166020820152a3565b60405162461bcd60e51b815260206004820152602b60248201527f4a424275796261636b486f6f6b3a20706f6f6c206b65792063757272656e636960448201526a0cae640dad2e6dac2e8c6d60ab1b6064820152608490fd5b1492509082614291575b50505f838982614056565b149050825f614286565b838214945061404f565b506357421ac560e11b5f5260045260245ffd5b84632ec7c58760e01b5f5260045260245260445ffd5b83633eb257a360e21b5f5260045260245ffd5b5062904c3760e81b5f5260045261012c6024526202a30060445260645ffd5b506202a3008211613fda565b5050505f52600260205260405f209060018060a01b03165f5260205260a060405f206040519061433b82611f13565b600180841b0381541682526001810154600180851b038116602084015262ffffff81851c16604084015260b81c60020b60608301526002600180851b039101541660808201522063ca5a804360e01b5f5260045260245ffd5b91906143a1602091615154565b604051631e2eaeaf60e01b8152600481019190915292839060249082906001600160a01b03165afa918215611b30575f926143ff575b506001600160a01b0382169160a081901c60020b9162ffffff60b883901c81169260d01c1690565b9091506020813d60201161442b575b8161441b60209383611f79565b81010312610bce5751905f6143d7565b3d915061440e565b9081518110156121a9570160200190565b8181029291811591840414171561201b57565b90915f9160606025855111156145fb578451602410156121a95760448501518060f81c9160205b6004810180821161201b576001600160f81b031961449c828b614433565b51161515806145dc575b156145d2576144b59089614433565b516020828a01015160f882901c91906001600160e01b03198881169116146144e157505060050161447e565b955095965092905060098301809311918261201b57611fe0809160f31c1616908082046020149015171561201b5782108015906145b3575b1561457c575050611fe0808551925b60f31c1616918083046020149015171561201b578190039060405193601f19603f8487010116604052828552015f5b8281106145675750505060019190565b80602080928401015182828801015201614557565b61201b5761458a9085614433565b51611fe0808260f81c9260f31c1616908082046020149015171561201b57611fe0809192614528565b505f90506001600160f81b03196145ca8388614433565b511615614519565b5050949550505050565b5060f384901c611fe0168515602087830414171561201b5782106144a6565b50509150505f90604051614610602082611f79565b5f815290565b949293905f945f91875f52600560205260405f2060018060a01b0385165f5260205260ff60405f2054161561496857875f52600260205260405f2060018060a01b0385165f5260205260405f20936040519461467186611f13565b80546001600160a01b03908116875260018201548082166020808a019190915260a082811c62ffffff166040808c019190915260b89390931c600290810b60608c015290940154831660808a019081525f9d8e5260048252828e209584168e529490528b20549187209a54919a969116926146ec8785614b97565b6001600160801b03811692831561495057868a63ffffffff9c9d9e614720936001600160801b0387169e8f9216908a61517a565b909b909a91976001600160a01b038082169084161096928d6001600160801b038e16156147fe57505050505085156147f057906147799392916147628b6154e2565b926001600160801b038b1611156147e857906158ba565b90670de0b6b3a76400008210156147dd5790606462ffffff61479e876147aa95614394565b9250505016049061591a565b966122608810156147d25750806127106147c86147cf939983614444565b049061200e565b94565b965086958692509050565b508796879350915050565b5088906158ba565b508a998a9650945050505050565b939b9c50949e509450975060019b9a9b96959194969860018060a01b0390511660018060a01b038a54160361493b57508861483891614394565b989291968091501580614932575b1561491657506001600160a01b038116156149015791614874969594939161486e939561580f565b996158ba565b9066b1a2bc2ec5000082116148f35762ffffff606491160461012c018061012c1161201b57655af3107a40006148ab920490612059565b6001810180821161201b5761271011156148e6575f19906127100301612710811161201b576148dd6127109187614444565b0493925f929190565b505f945084939284929190565b505f95508594938593929150565b505050505050505093505f935f93925f929190565b94935050505061487493925061492b896154e2565b91996158ba565b9c50869c614846565b5f9c508c9b50998b9998975095505050505050565b505f9b508b9a508a998a995089975095505050505050565b50505050509150505f905f905f905f905f905f90565b919294935f90835f52600560205260405f2060018060a01b0382165f5260205260ff60405f20541615614b8357835f52600260205260405f2060018060a01b0382165f5260205260405f2093604051946149d786611f13565b60018060a01b038154168652600181015460018060a01b038116602088015262ffffff8160a01c16604088015260b81c60020b6060870152600260018060a01b039101541660808601525f52600460205260405f209060018060a01b03165f5260205260405f20549260a081209260018060a01b035f541691614a5a8584614b97565b956001600160801b038716918215614b6d5788614a8b928c9263ffffffff6001600160801b0388169216908861517a565b9a919890978b986001600160801b03819b9d1615614b5557508b15614b445790614ae294939291614abb8b6154e2565b936001600160801b038b161115614b3c57915b6001600160a01b03908116911610926158ba565b90670de0b6b3a7640000821015614b2f5790606462ffffff61479e86614b0795614394565b95612260871015614b2457806127106147c86147cf939983614444565b505f95508594859150565b505f965086958692509050565b508891614ace565b505f9a508a998a9650945050505050565b5f9c508c9b909a508b99506001975095505050505050565b505f995089988998508897508795509350505050565b505f95508594859450849350839250829150565b90614ba190615154565b6003810180911161201b57604051631e2eaeaf60e01b8152600481019190915290602090829060249082906001600160a01b03165afa8015611b30575f90614bf2575b6001600160801b0391501690565b506020813d602011614c23575b81614c0c60209383611f79565b81010312610bce576001600160801b039051614be4565b3d9150614bff565b9080158015614d9b575b614d8b578215614d8657905b600160801b614c5082846138e2565b10614c7d57505015614c65576401000276a490565b73fffd8963efd1fc6a506488495d951d5263988d2590565b600160401b614c8c82846138e2565b10614d6e57614c9a91615a1e565b6001600160c01b038111614d4857614cb49060401b615e5c565b905b15614d13576401000276a3811115614d095773fffd8963efd1fc6a506488495d951d5263988d26811015614cf0576001600160a01b031690565b5073fffd8963efd1fc6a506488495d951d5263988d2590565b506401000276a490565b73fffd8963efd1fc6a506488495d951d5263988d26811015614cf0576401000276a3811115614d09576001600160a01b031690565b614d5190615e5c565b8060201b90808204640100000000149015171561201b5790614cb6565b614d7b90614d8092615994565b615e5c565b90614cb6565b614c41565b505015614c65576401000276a490565b508115614c35565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615614e03575b60405215614de35750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516611c9957823b15153d15161690614dd8565b613c23613c31614e5a925f958695869860405193614e3885611f42565b8452151560208401526040830152606082015260405192839160208301613aa5565b03925af15f9181614e8e575b50614e765750505f905f90600190565b80602080614e89935183010191016120f9565b919092565b614ea39192503d805f833e613d688183611f79565b905f614e66565b814710614ef9575f808093819382604051614ec6602082611f79565b526001600160a01b03165af115614ed957565b3d15614eea576040513d5f823e3d90fd5b63d6bda27560e01b5f5260045ffd5b504763cf47918160e01b5f5260045260245260445ffd5b9291928115614f70576127108314614f705783821015614f69578382614f359261398d565b918015614f6257806127100390612710821161201b57613a2d94614f5c9361181c9261398d565b90613900565b5050905090565b9250505090565b505050505f90565b6101808201358015158103610bce576150635761016082013515614fa557613a2d9150602881049061200e565b615000916020906001600160a01b03614fbd82611ffa565b166040614fcc60c08401611ffa565b815163c66d192b60e01b8152939091013560048401526001600160a01b031660248301529093849190829081906044820190565b03915afa8015611b30575f9061502f575b613a2d92508082101561502757506028816147c8565b6028906147c8565b506020823d60201161505b575b8161504960209383611f79565b81010312610bce57613a2d9151615011565b3d915061503c565b905090565b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f51148416156150a4575b50604052565b3d15903b151516909216915f61509e565b60405163095ea7b360e01b5f9081526001600160a01b03909316600452602483905290929160209060448180875af19260015f51148416156150f75750604052565b60018492941516615110573b15153d151616915f61509e565b833d5f823e3d90fd5b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f51148416156150f75750604052565b604051602081019182526006604082015260408152615174606082611f79565b51902090565b9491939092935f9363ffffffff821696871561548d575060018060a01b036080820151166040516151ac606082611f79565b60028152602081016040368237896151c38361219c565b525f6151ce836121bd565b52604051637cb7cbf960e11b815293849260c48401916151f2906004860190611eac565b60c060a48501525180915260e4830191905f5b81811061546e575050509181805f9403915afa90815f915f9361534f575b506152385750505050505050505f905f905f90565b61524e615244826121bd565b5160060b9161219c565b5160060b900396667fffffffffffff198812667fffffffffffff89131761201b5760030b9660060b87156138ec57667fffffffffffff1981145f1989141661201b5787810560020b975f82129182615340575b505061532b575b6001600160a01b036152b9826121bd565b5116906001600160a01b03906152ce9061219c565b511690036001600160a01b03811161201b576001600160a01b03169081615300575b50506152fd92938561580f565b92565b6152fd94506001600160801b03916153239160801b63ffffffff60801b166138e2565b16925f6152f0565b95627fffff19811461201b575f1901956152a8565b0760060b151590505f806152a1565b915091503d805f833e6153628183611f79565b810190604081830312610bce5780516001600160401b038111610bce5781019082601f83011215610bce57815161539881612161565b926153a66040519485611f79565b81845260208085019260051b82010190858211610bce57602001915b818310615454575050506020810151906001600160401b038211610bce57019180601f84011215610bce578251906153f982612161565b936154076040519586611f79565b82855260208086019360051b820101918211610bce57602001915b8183106154345750505090915f615223565b82516001600160a01b0381168103610bce57815260209283019201615422565b82518060060b8103610bce578152602092830192016153c2565b825163ffffffff16845286945060209384019390920191600101615205565b97959650905060a091929350206154a48187614394565b509097916001600160a01b03161590506154d3576154ce9392916154c791614b97565b948661580f565b929190565b505050509150505f905f905f90565b60020b908160ff1d82810118620d89e881116157fc5763ffffffff9192600182167001fffcb933bd6fad37aa2d162d1a59400102600160801b1891600281166157e0575b600481166157c4575b600881166157a8575b6010811661578c575b60208116615770575b60408116615754575b60808116615738575b610100811661571c575b6102008116615700575b61040081166156e4575b61080081166156c8575b61100081166156ac575b6120008116615690575b6140008116615674575b6180008116615658575b62010000811661563c575b620200008116615621575b620400008116615606575b62080000166155ed575b5f126155e5575b0160201c90565b5f19046155de565b6b048a170391f7dc42444e8fa290910260801c906155d7565b6d2216e584f5fa1ea926041bedfe9890920260801c916155cd565b916e5d6af8dedb81196699c329225ee6040260801c916155c2565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c916155b7565b916f31be135f97d08fd981231505542fcfa60260801c916155ac565b916f70d869a156d2a1b890bb3df62baf32f70260801c916155a2565b916fa9f746462d870fdf8a65dc1f90e061e50260801c91615598565b916fd097f3bdfd2022b8845ad8f792aa58250260801c9161558e565b916fe7159475a2c29b7443b29c7fa6e889d90260801c91615584565b916ff3392b0822b70005940c7a398e4b70f30260801c9161557a565b916ff987a7253ac413176f2b074cf7815e540260801c91615570565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c91615566565b916ffe5dee046a99a2a811c461f1969c30530260801c9161555c565b916fff2ea16466c96a3843ec78b326b528610260801c91615553565b916fff973b41fa98c081472e6896dfb254c00260801c9161554a565b916fffcb9843d60f6159c9db58835c9266440260801c91615541565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c91615538565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c9161552f565b916ffff97272373d413259a46990580e213a0260801c91615526565b826345c3193d60e11b5f5260045260245ffd5b909291906001600160a01b0390615825906154e2565b166001600160801b038111615877578061583e91614444565b916001600160a01b0390811691161015615865576001600160801b03613a2d921690615c37565b6001600160801b03613a2d9216615bb5565b8061588191615aa1565b916001600160a01b03908116911610156158a8576001600160801b03613a2d921690615b6c565b6001600160801b03613a2d9216615aea565b919291906001600160801b031680158015615909575b614f70576158dd91615c80565b90156158f657613a2d916001600160a01b031690615d93565b613a2d916001600160a01b031690615d10565b506001600160a01b038416156158d0565b90612260811015615984576064810180911161201b5760c8811061598c575b6122608110156159845781156150635766b1a2bc2ec50000198211615984578061226003612260811161201b5766b1a2bc2ec50000830180841161201b57613a2d9361181c92615ddc565b505061226090565b5060c8615939565b9060c082901b905f19600160c01b840992828085109403938085039485841115610bce5714615a17578190600160c01b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90608082901b905f19600160801b840992828085109403938085039485841115610bce5714615a17578190600160801b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b81810291905f1982820991838084109303928084039384600160401b1115610bce5714615ae157600160401b910990828211900360c01b910360401c1790565b50505060401c90565b90608082901b905f1983600160801b0992828085109403938085039485841115610bce5714615a17578190600160801b0981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b81810291905f1982820991838084109303928084039384600160801b1115610bce5714615bac57600160801b910990828211900360801b910360801c1790565b50505060801c90565b9060c082901b905f1983600160c01b0992828085109403938085039485841115610bce5714615a17578190600160c01b0981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b81810291905f1982820991838084109303928084039384600160c01b1115610bce5714615c7757600160c01b910990828211900360401b910360c01c1790565b50505060c01c90565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610bce5714615a1757670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b90606082901b905f19600160601b840992828085109403938085039485841115610bce5714615a17578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b81810291905f1982820991838084109303928084039384600160601b1115610bce5714615dd357600160601b910990828211900360a01b910360601c1790565b50505060601c90565b91818302915f1981850993838086109503948086039586851115610bce5714615e54579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b6001811115613a2d57806001600160801b821015615f6d575b600482600160401b615f1f941015615f60575b640100000000811015615f53575b62010000811015615f46575b610100811015615f3a575b6010811015615f2e575b1015615f26575b60030260011c615ece81846138e2565b0160011c615edc81846138e2565b0160011c615eea81846138e2565b0160011c615ef881846138e2565b0160011c615f0681846138e2565b0160011c615f1481846138e2565b0160011c80926138e2565b8111900390565b60011b615ebe565b811c9160021b91615eb7565b60081c91811b91615ead565b60101c9160081b91615ea2565b60201c9160101b91615e96565b60401c9160201b91615e88565b5050608081901c600160401b615e75565b601436101580615fa5575b15615fa1576013193601368111610bce573560601c90565b3390565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614615f8956fea164736f6c634300081c000a",
	"metadata": "{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"directory\",\"type\":\"address\"},{\"internalType\":\"contract IJBPermissions\",\"name\":\"permissions\",\"type\":\"address\"},{\"internalType\":\"contract IJBPrices\",\"name\":\"prices\",\"type\":\"address\"},{\"internalType\":\"contract IJBProjects\",\"name\":\"projects\",\"type\":\"address\"},{\"internalType\":\"contract IJBTokens\",\"name\":\"tokens\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"trustedForwarder\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"FailedCall\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"InsufficientBalance\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"JBBuybackHook_AlreadyConfigured\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_CallerNotPoolManager\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_CallerNotTerminal\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"swapAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalPaid\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_InsufficientPayAmount\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_InvalidTwapWindow\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_PoolAlreadySet\"},{\"inputs\":[{\"internalType\":\"uint160\",\"name\":\"actualSqrtPriceX96\",\"type\":\"uint160\"},{\"internalType\":\"uint160\",\"name\":\"expectedSqrtPriceX96\",\"type\":\"uint160\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_PoolInitializedAtWrongPrice\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_PoolNotInitialized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_PoolNotSet\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_SpecifiedSlippageExceeded\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"projectToken\",\"type\":\"address\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_TerminalTokenIsProjectToken\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"JBBuybackHook_ZeroProjectToken\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"permissionId\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"JBPermissioned_Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"PRBMath_MulDiv_Overflow\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"cashOutCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"CashOutSwap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"leftoverAmount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"tokenCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Mint\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"PoolAdded\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"SellSwapReverted\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountToSwapWith\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Swap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapWindowChanged\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"DIRECTORY\",\"outputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PERMISSIONS\",\"outputs\":[{\"internalType\":\"contract IJBPermissions\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PRICES\",\"outputs\":[{\"internalType\":\"contract IJBPrices\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROJECTS\",\"outputs\":[{\"internalType\":\"contract IJBProjects\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TOKENS\",\"outputs\":[{\"internalType\":\"contract IJBTokens\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TWAP_SLIPPAGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"struct JBAfterCashOutRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cashOutCount\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"reclaimedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"cashOutTaxRate\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"cashOutMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterCashOutRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBAfterPayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newlyIssuedTokenCount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"payerMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterPayRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBBeforeCashOutRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cashOutCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"surplus\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"bool\",\"name\":\"scopeCashOutsToLocalBalances\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"cashOutTaxRate\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"beneficiaryIsFeeless\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforeCashOutRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"cashOutTaxRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cashOutCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"effectiveSurplusValue\",\"type\":\"uint256\"},{\"internalType\":\"struct JBCashOutHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBCashOutHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"noop\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"struct JBBeforePayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedPercent\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforePayRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"struct JBPayHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBPayHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"noop\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"struct JBRuleset\",\"name\":\"\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"uint48\",\"name\":\"cycleNumber\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"id\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"basedOnId\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"start\",\"type\":\"uint48\"},{\"internalType\":\"uint32\",\"name\":\"duration\",\"type\":\"uint32\"},{\"internalType\":\"uint112\",\"name\":\"weight\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"weightCutPercent\",\"type\":\"uint32\"},{\"internalType\":\"contract IJBRulesetApprovalHook\",\"name\":\"approvalHook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"metadata\",\"type\":\"uint256\"}]},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"hasMintPermissionFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"uint256\",\"name\":\"twapWindow\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"initializePoolFor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"oracleHook\",\"outputs\":[{\"internalType\":\"contract IHooks\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolKeyOf\",\"outputs\":[{\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolManager\",\"outputs\":[{\"internalType\":\"contract IPoolManager\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"projectTokenOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"contract IPoolManager\",\"name\":\"newPoolManager\",\"type\":\"address\"},{\"internalType\":\"contract IHooks\",\"name\":\"newOracleHook\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setChainSpecificConstants\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"uint256\",\"name\":\"twapWindow\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"struct PoolKey\",\"name\":\"poolKey\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}]},{\"internalType\":\"uint256\",\"name\":\"twapWindow\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapWindowOf\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapWindowOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"unlockCallback\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}]},{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterCashOutRecordedWith((address,uint256,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,address,bytes,bytes))\":{\"details\":\"Called after the data-hook path chooses pool execution over protocol cash out.The terminal has already burned the holder's project tokens by the time this callback runs, so this hook remints tokens to itself before executing the sell. The count to remint/sell comes from `hookMetadata` (set during `beforeCashOutRecordedWith`), NOT from `context.cashOutCount`. This distinction matters when a data hook wrapper (e.g. REVDeployer) splits the cash-out into fee and non-fee tranches — the terminal always passes the original full count in `context.cashOutCount`, but only the non-fee portion should be sold.\",\"params\":{\"context\":\"Standard Juicebox cash-out hook context. `hookMetadata` encodes (minimumSwapAmountOut, cashOutCountToSell) chosen during `beforeCashOutRecordedWith`, followed by informational sell-side routing metadata.\"}},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"details\":\"The swap uses the issuance rate as its price limit: it fills while the pool offers a better rate than minting, and any unswapped tokens are minted at the issuance rate. The combined output (swap + leftover mint) must meet the user's specified minimum, otherwise the transaction reverts. If the swap reverts entirely (due to insufficient liquidity or something else), all tokens are minted as a fallback. Explicit caller-provided minimums still apply in that case, but oracle-derived routing minimums do not.\",\"params\":{\"context\":\"The pay context passed in by the terminal.\"}},\"beforeCashOutRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bool,bytes))\":{\"details\":\"Returns the protocol cash-out values unchanged unless selling the burned project tokens into the configured pool is expected to return more of the terminal token than the direct reclaim path.If the sell path wins, the hook returns an active cash-out hook specification (`noop = false`) and maxes the tax rate so the terminal does not reclaim surplus itself. The sell executes in `afterCashOutRecordedWith`.This function auto-applies the \\\"floor arbitrage\\\" path described in ARBITRAGE.md (Path 2, in revnet-core-v6). When the AMM bid is HIGHER than the bonding-curve reclaim, the hook routes the holder's burn through the pool — they get more ETH. When the AMM bid is LOWER, the hook passes through to the terminal — the bonding-curve floor is what they receive. Either way, the holder receives at least the bonding-curve reclaim. The terminal path only wins if the selected terminal can locally settle the gross reclaim; aggregate surplus may price a cash-out, but it cannot fund settlement from a terminal whose own local surplus is insufficient. **Why this matters for protocol health:** when external actors arbitrage between the AMM and the terminal cash-out path directly (buying tokens cheap on the AMM, then cashing out via terminal at the higher floor), the cash-out tax (configured per ruleset, e.g. 10%) is retained in the project surplus — boosting per-token backing for remaining holders. The AMM price corrects upward toward fair value. This hook auto-captures the same incentive for ordinary users. **Diagnostic metadata in returned hook specs:** when the hook chooses to noop (passthrough), the spec carries pool state (twapTick, liquidity, poolId, etc.) so off-chain clients can preview what the routing decision would be. Do not optimize this away — it's the protocol's public preview API for the buyback cash-out decision surface. **Caller-provided sell-side controls (via the `cashOut` metadata entry, encoded as `(uint256 minimumSwapAmountOut, bool skip)`):** - `minimumSwapAmountOut`: a hard slippage floor on the net terminal-token output. It is a protection   value, NOT a venue selector. - `skip` (default false): when true, forces the cash-out through the protocol bonding-curve/terminal   path and skips the pool entirely — even when the pool would pay more. The `minimumSwapAmountOut` floor   is still enforced against the direct reclaim, so an unmeetable floor reverts rather than silently   routing to the AMM.\",\"params\":{\"context\":\"Standard Juicebox cash-out data-hook context.\"},\"returns\":{\"cashOutCount\":\"The number of project tokens to cash out.\",\"cashOutTaxRate\":\"The tax rate the terminal should use for the cash out.\",\"effectiveSurplusValue\":\"The surplus to use for reclaim calculation.\",\"hookSpecifications\":\"Any cash-out hook specifications to fulfill after the terminal records the cash out.\",\"totalSupply\":\"The total project token supply to use in reclaim math.\"}},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"details\":\"This function auto-applies the \\\"ceiling arbitrage\\\" path described in ARBITRAGE.md (Path 3, in revnet-core-v6). When the AMM ask is HIGHER than the terminal's pay rate (`weight × ETH`), the hook returns `noop=true` and the terminal mints at the bonding-curve rate — saving the user money. When the AMM ask is LOWER, the hook routes through the pool — the user gets more tokens per ETH. Either way, the user receives at least the bonding-curve mint amount. The `noop` spec is intentionally returned with diagnostic metadata (twapTick, liquidity, poolId, weight ratio, raw swap quote) so off-chain clients (frontends, arbitrage bots, indexers) can preview what the routing decision would be without executing a pay. Do not optimize this away — it's the protocol's public preview API for the buyback decision surface. **Why this matters for protocol health:** when external actors arbitrage between the terminal pay path and the AMM directly (paying terminal at low weight, then selling on AMM at higher price), the AMM price converges downward toward the issuance rate. Their payment lands in project surplus, growing the protocol. This hook auto-captures the same incentive for ordinary users transacting through the terminal — they never need to know whether to mint or swap.\",\"params\":{\"context\":\"Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`. `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap. If `context.metadata` does not specify a quote, one will be calculated based on the TWAP. If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount paid in.\"},\"returns\":{\"hookSpecifications\":\"Specifications containing pay hooks, as well as the amount and metadata to send to them. Empty if only minting.\",\"weight\":\"The weight to use for minting. 0 if all tokens come from the swap.\"}},\"constructor\":{\"params\":{\"deployer\":\"The address authorized to call `setChainSpecificConstants` exactly once. Held immutable so the constructor inputs are byte-identical across chains and the CREATE2 address is unified.\",\"directory\":\"The directory of terminals and controllers.\",\"permissions\":\"The permissions contract.\",\"prices\":\"The contract that exposes price feeds.\",\"projects\":\"The project registry.\",\"tokens\":\"The token registry.\",\"trustedForwarder\":\"A trusted forwarder of transactions to this contract.\"}},\"initializePoolFor(uint256,uint24,int24,uint256,address,uint160)\":{\"details\":\"Atomically initializes the pool (if not already initialized) and calls `_setPoolFor`.Operator-only. Configuring the pool turns on the floor + ceiling arbitrage routing above for this `(projectId, terminalToken)` pair. Without a configured pool, the hook is a passthrough.\",\"params\":{\"fee\":\"The Uniswap V4 pool fee tier.\",\"projectId\":\"The ID of the project to set the pool for.\",\"sqrtPriceX96\":\"The initial sqrtPriceX96 for the pool (if not already initialized).\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"tickSpacing\":\"The Uniswap V4 pool tick spacing.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"}},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"poolKeyOf(uint256,address)\":{\"params\":{\"projectId\":\"The ID of the project.\",\"terminalToken\":\"The terminal token address (normalized to address(0) for native).\"},\"returns\":{\"key\":\"The V4 PoolKey.\"}},\"setChainSpecificConstants(address,address)\":{\"details\":\"Callable only by `_DEPLOYER` and only once (when `poolManager` is still `address(0)`). After this call both values are effectively immutable for the contract's lifetime. Mirrors the `JBOptimismSuckerDeployer.setChainSpecificConstants` pattern so the contract's CREATE2 inputs stay byte-identical across chains and its deployed address is unified.\",\"params\":{\"newOracleHook\":\"The Uniswap V4 oracle hook deployed against `newPoolManager` on the current chain.\",\"newPoolManager\":\"The Uniswap V4 PoolManager singleton on the current chain.\"}},\"setPoolFor(uint256,(address,address,uint24,int24,address),uint256,address)\":{\"details\":\"Pool keys are intentionally immutable once set. This prevents manipulation of swap routing after a project's buyback hook is configured.WARNING: The `poolKey.hooks` field is NOT validated. A malicious or buggy V4 hook address in the pool key could interfere with swaps (e.g. manipulate pricing, revert, or extract value). Because this function is permissioned to the project owner (or a delegate with `SET_BUYBACK_POOL`), this is a self-harming-only risk. Callers MUST ensure the pool key — including its hooks field — references a trusted pool.Operator-only. Configuring the pool turns on the floor + ceiling arbitrage routing above for this `(projectId, terminalToken)` pair. Without a configured pool, the hook is a passthrough.\",\"params\":{\"poolKey\":\"The V4 PoolKey identifying the pool.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"}},\"setPoolFor(uint256,uint24,int24,uint256,address)\":{\"details\":\"Uses address(0) for the hooks field. The hook sorts the project token and terminal token into the correct currency order. Pool keys are intentionally immutable once set.Operator-only. Configuring the pool turns on the floor + ceiling arbitrage routing above for this `(projectId, terminalToken)` pair. Without a configured pool, the hook is a passthrough.\",\"params\":{\"fee\":\"The Uniswap V4 pool fee tier.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"tickSpacing\":\"The Uniswap V4 pool tick spacing.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"}},\"setTwapWindowOf(uint256,address,uint256)\":{\"params\":{\"newWindow\":\"The new TWAP window.\",\"projectId\":\"The ID of the project to set the TWAP window of.\",\"terminalToken\":\"The terminal token address (use JBConstants.NATIVE_TOKEN for native ETH).\"}},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"unlockCallback(bytes)\":{\"details\":\"ONLY callable by the PoolManager singleton.\",\"params\":{\"data\":\"ABI-encoded SwapCallbackData.\"},\"returns\":{\"_0\":\"result ABI-encoded swap input consumed and output received.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"DIRECTORY()\":{\"notice\":\"The directory of terminals and controllers.\"},\"MAX_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window longer than this constant.\"},\"MIN_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window shorter than this constant.\"},\"PERMISSIONS()\":{\"notice\":\"A contract storing permissions.\"},\"PRICES()\":{\"notice\":\"The contract that exposes price feeds.\"},\"PROJECTS()\":{\"notice\":\"The project registry.\"},\"TOKENS()\":{\"notice\":\"The token registry.\"},\"TWAP_SLIPPAGE_DENOMINATOR()\":{\"notice\":\"The denominator used when calculating TWAP slippage percent values.\"},\"afterCashOutRecordedWith((address,uint256,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,address,bytes,bytes))\":{\"notice\":\"Sells project tokens into the configured Uniswap V4 pool and sends the proceeds to the beneficiary. Called by the terminal after `beforeCashOutRecordedWith` determined that the pool route beats direct reclaim.\"},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Buys project tokens from the Uniswap V4 pool, then mints any leftover at the issuance rate. The swap fills only while the pool price beats the mint rate — leftover input is returned to the project's terminal.\"},\"beforeCashOutRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bool,bytes))\":{\"notice\":\"Data-hook callback consulted by the terminal during `cashOutTokensOf()`. Compares the expected output from selling project tokens in the pool against the bonding-curve reclaim amount, and if the pool offers more (net of fees) routes the cash-out through the pool via `afterCashOutRecordedWith`.\"},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"notice\":\"Data-hook callback consulted by the terminal during `pay()`. Compares the pool swap rate against the project's mint rate and chooses the better one. If the pool wins, returns weight=0 so all tokens come from the swap executed in `afterPayRecordedWith`.\"},\"hasMintPermissionFor(uint256,(uint48,uint48,uint48,uint48,uint32,uint112,uint32,address,uint256),address)\":{\"notice\":\"Always returns false — the buyback hook never claims mint permission directly. Minting is handled via the controller in `afterPayRecordedWith`/`afterCashOutRecordedWith` using permission from the registry.\"},\"initializePoolFor(uint256,uint24,int24,uint256,address,uint160)\":{\"notice\":\"Initialize a Uniswap V4 pool in the PoolManager and configure it as the buyback pool for a project.\"},\"oracleHook()\":{\"notice\":\"The oracle hook used for configured Uniswap V4 pools. Set once by `_DEPLOYER` after construction via `setChainSpecificConstants` and never changed thereafter.\"},\"poolKeyOf(uint256,address)\":{\"notice\":\"Returns the PoolKey for a given project and terminal token pair.\"},\"poolManager()\":{\"notice\":\"The Uniswap V4 PoolManager singleton. Set once by `_DEPLOYER` after construction via `setChainSpecificConstants` and never changed thereafter.\"},\"projectTokenOf(uint256)\":{\"notice\":\"The address of each project's token.\"},\"setChainSpecificConstants(address,address)\":{\"notice\":\"One-shot setter for the chain-specific Uniswap V4 PoolManager and oracle hook.\"},\"setPoolFor(uint256,(address,address,uint24,int24,address),uint256,address)\":{\"notice\":\"Set the V4 pool to use for a given project and terminal token pair.\"},\"setPoolFor(uint256,uint24,int24,uint256,address)\":{\"notice\":\"Set the V4 pool to use for a given project and terminal token pair, constructing the PoolKey internally.\"},\"setTwapWindowOf(uint256,address,uint256)\":{\"notice\":\"Change the TWAP window for a project's terminal token.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Indicates which interfaces this contract implements (ERC-165).\"},\"twapWindowOf(uint256,address)\":{\"notice\":\"The TWAP window for a given project and terminal token pair.\"},\"unlockCallback(bytes)\":{\"notice\":\"The V4 PoolManager unlock callback. Executes the swap and settles/takes tokens.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@arbitrum/=node_modules/@arbitrum/\",\"@ballkidz/=node_modules/@ballkidz/\",\"@bananapus/=node_modules/@bananapus/\",\"@bannynet/=node_modules/@bannynet/\",\"@chainlink/=node_modules/@chainlink/\",\"@croptop/=node_modules/@croptop/\",\"@ensdomains/=node_modules/@ensdomains/\",\"@eth-optimism/=node_modules/@eth-optimism/\",\"@offchainlabs/=node_modules/@offchainlabs/\",\"@openzeppelin/=node_modules/@openzeppelin/\",\"@prb/=node_modules/@prb/\",\"@rev-net/=node_modules/@rev-net/\",\"@scroll-tech/=node_modules/@scroll-tech/\",\"@sphinx-labs/=node_modules/@sphinx-labs/\",\"@uniswap/=node_modules/@uniswap/\",\"@unruggable/=node_modules/@unruggable/\",\"@zksync/=node_modules/@zksync/\",\"base64-sol/=node_modules/base64-sol/\",\"ds-test/=node_modules/@uniswap/v4-core/lib/solmate/lib/ds-test/\",\"erc4626-tests/=node_modules/@uniswap/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/\",\"forge-gas-snapshot/=node_modules/@uniswap/v4-periphery/lib/permit2/lib/forge-gas-snapshot/\",\"forge-std/=lib/forge-std/src/\",\"hardhat/=node_modules/hardhat/\",\"lib/base64/=node_modules/base64-sol/\",\"openzeppelin-contracts/=node_modules/@uniswap/v4-core/lib/openzeppelin-contracts/\",\"permit2/=node_modules/@uniswap/v4-periphery/lib/permit2/\",\"solady/=node_modules/solady/\",\"solmate/=node_modules/@sphinx-labs/contracts/node_modules/solmate/\",\"typeface/=lib/typeface/contracts/\",\"v4-core/=node_modules/@uniswap/v4-periphery/lib/v4-core/\"],\"optimizer\":{\"enabled\":true,\"runs\":200},\"metadata\":{\"bytecodeHash\":\"none\"},\"compilationTarget\":{\"node_modules/@bananapus/buyback-hook-v6/src/JBBuybackHook.sol\":\"JBBuybackHook\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"viaIR\":true},\"sources\":{\"node_modules/@bananapus/buyback-hook-v6/src/JBBuybackHook.sol\":{\"keccak256\":\"0xf19461ab0bc8b5343463b56304cd65ab5658f79c46688995085b59164b193686\",\"urls\":[\"bzz-raw://e699dd5ae0408730832f5901801f93fb2227ad658b692655dded56c9ecb86158\",\"dweb:/ipfs/Qmb2vGcKFvr7KdvwqSXPqjff7rqD9oVLxHbmzyHvGpUiGu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/buyback-hook-v6/src/interfaces/IGeomeanOracle.sol\":{\"keccak256\":\"0xe4831da96b6e9824361e342cd425cf8cced4348e48e91f54e3f4efe9caa4b6e9\",\"urls\":[\"bzz-raw://3af80df97cfdc8fb8594337573bace541b8d801f7f01add3dae4efc4af05bab7\",\"dweb:/ipfs/Qmb59duxRBrf3qcKUaPtpLtpaK1YKJGZXru8ZiWNimZzei\"],\"license\":\"MIT\"},\"node_modules/@bananapus/buyback-hook-v6/src/interfaces/IJBBuybackHook.sol\":{\"keccak256\":\"0x19342cf0bd42e836a4756f7c0165063e9332efa9f509cef43b018356c2c8c4a4\",\"urls\":[\"bzz-raw://055828e23c8189559a1f0bd673c43eb8c970f50762588af3d162de6092e16c4c\",\"dweb:/ipfs/QmUJUB3P6AfqyQRCzv597BtA3GdNkCAGAJV3QKc2sRfNBq\"],\"license\":\"MIT\"},\"node_modules/@bananapus/buyback-hook-v6/src/libraries/JBSwapLib.sol\":{\"keccak256\":\"0x24c8843e20f8990751a7c9884dca313aa041f23ceedadd06035387b63b8eb8f9\",\"urls\":[\"bzz-raw://e917e9e9adbc6e058b1889a4a64963e0ae8ea3f49d14e05fd6032af50ad85e3d\",\"dweb:/ipfs/QmRcXm8ZEqSdsunJfejjBNU3NbPBvJWcuJ4bRV55obNznj\"],\"license\":\"MIT\"},\"node_modules/@bananapus/buyback-hook-v6/src/structs/SwapCallbackData.sol\":{\"keccak256\":\"0x823e3b6d50c27a11a5810306740a5eb3bdff8f070269006a835116aac23099b9\",\"urls\":[\"bzz-raw://0b083b072b3b75ec05dae2686a22b715b2c11c82b1df09a3d844b7e8b129a4cc\",\"dweb:/ipfs/QmRmRzhJDi2Myxi9PoXJvfQZwHrr1yg1K5ACa9iEr616Hj\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/abstract/JBPermissioned.sol\":{\"keccak256\":\"0x16a1fa9f031564f9f3253d5e21327b228651269263bfbde10eb04862c65ed577\",\"urls\":[\"bzz-raw://4150d75d10f267953c0a42948ebd7bffe1568a5fb0dfe84befcda512ddf3a19c\",\"dweb:/ipfs/QmVMYXMRyiLySHCtoPke9AuVkhoVm9Gx1zoLMmSjXjFf2M\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/enums/JBApprovalStatus.sol\":{\"keccak256\":\"0x58f3eed8b6ecea6b640f4eb78a5a416ce8737f9155e350ef4077db422b3fca8f\",\"urls\":[\"bzz-raw://0b56bde97ef9d8ec2a3e464202c5d2fee9c39597485b3fb8baaeef971cc63bc8\",\"dweb:/ipfs/QmSdPaNfPm83yibuSvgLbaqgZw7LYkTLhacrxDagH3sprJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBCashOutHook.sol\":{\"keccak256\":\"0x2a6d327092775fdbeaf922b8364403102cae437f765f662fe142bf97e87c2ef1\",\"urls\":[\"bzz-raw://5f9a23971860b907569917fe14cbcc85993d83fb32e5342dd5338a1721e540f7\",\"dweb:/ipfs/Qmamt2n7HaWo2cUDn8K2FhrZPHBVxuaCWh9jf8V3WYPXMN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBCashOutTerminal.sol\":{\"keccak256\":\"0x4923d51fd680cc280a9e90eec8e0597334ae2beb8c04d71289e319d7f82aa70b\",\"urls\":[\"bzz-raw://a39ee26c58248c154e5d4818fe544c614effded1c069b7d2e732c25d9caab4ff\",\"dweb:/ipfs/QmefeSH8CWtNQcrb8iNmfKKSViu3YnnJ9ciaNfEKhxgFHh\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBController.sol\":{\"keccak256\":\"0x7032c26dd11cec1ed279bd96a63c0b4f77126835e9fec744e259495827f9ad92\",\"urls\":[\"bzz-raw://a2129d48bed0763676d7f0854d6e784134642584f4c70fabdc7e9e5a9490bf13\",\"dweb:/ipfs/QmU1D5L4gxf2acwXz4QAp9fSZNVboDcj4qTE3xCz5bh2M4\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBDirectory.sol\":{\"keccak256\":\"0xb8f3ba0a544360b32c9f0a704168ee93c2960accfc010735c8cbea54941e63d5\",\"urls\":[\"bzz-raw://e9f14d5daa2357db4afe96313b40bf0c53c606315c9cb55109fffdc9c2fd85d0\",\"dweb:/ipfs/QmRPHFAiivM9CqdfocRyahdSjfWTbaSepPNCGGQU23ABcv\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBDirectoryAccessControl.sol\":{\"keccak256\":\"0x963e641f7b02187389fa813ab177b8d0f20a7a543f6ce2306e8d5f9db95d56e3\",\"urls\":[\"bzz-raw://b500161bcc70fac6830211b2f9855c2c1ab17a91226619cedde7daa166f9196c\",\"dweb:/ipfs/QmV92TK8CTZxVJoGBDEsBfUDidoLAobFmyL1NdQVJARpCD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBFeeTerminal.sol\":{\"keccak256\":\"0xaaa9a98ad8967e1ab71b560f1cc07fc53d4900a8d595d53f5fb090d8e004562f\",\"urls\":[\"bzz-raw://36513a02be24f9677e0f1e82e01970c81c09043b69e4e60cb3007e2a05f3ce64\",\"dweb:/ipfs/QmZPKkEhgM5A5GzHG4TPxAe8HzjyLxLZzmJaDMDTNxV783\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBFeelessAddresses.sol\":{\"keccak256\":\"0x13cad5a8ef2daeb7634d93df6c9f6d1681b5344f4cdc89b03bbbd0953802fd8a\",\"urls\":[\"bzz-raw://35f25042894569b5c50a38d39ab3ceb91e4f69e56d448785701a3ffff335fe98\",\"dweb:/ipfs/QmTd6dF5X6L3v9bnfsh2ZKtRjK5ApwvmKipMWHNXfjwjBF\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBFeelessHook.sol\":{\"keccak256\":\"0x39b8d6e9798a90f555ea9ca44ade52f2fec5964df8994494bd5f4cfd42853602\",\"urls\":[\"bzz-raw://18e0a22e15d53db093648f6087280b45cf5a19571cf721ea49e4453f5da1cb98\",\"dweb:/ipfs/QmaRDN58nhCR4EkP3oaHpyG5EPgLtR2DSEDfPw4gRUG5Zd\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBFundAccessLimits.sol\":{\"keccak256\":\"0x0cb50a855cccbbe7c74a1ebc454112b7b63f502badd019895dd936365ac73340\",\"urls\":[\"bzz-raw://226be05349028b8f055e386fbc41f7db0feb6d027b6068c1c929b0924688e129\",\"dweb:/ipfs/QmXyotizn7pR8DQJtuj6Xkcr7LKorSkm9q8kQGaSDDikSw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBMultiTerminal.sol\":{\"keccak256\":\"0x8e258ab09d0b1c429236d98a78610b829a9604e88f7c20fc1041535922c8b207\",\"urls\":[\"bzz-raw://0418c1dcfcd663ad55bf55ce38690e45ebefcc5a01575d6d7ecde18de283edab\",\"dweb:/ipfs/Qmbt2BJ3r9rLXqAZzrs36s24Ks3e6Ho3UTwvuUrtRdDtW6\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBPayHook.sol\":{\"keccak256\":\"0x08599d439d898566b311bc4bedf7f0050ce25c86e246c43f673f3ab4d2457f21\",\"urls\":[\"bzz-raw://db19e95707920262c79197be9296fe381782220bfaf00b71df3a4271da83832f\",\"dweb:/ipfs/QmYzdomQzXNSk46U5vkiEnDErJJdR17deL4S6hPundstZd\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBPayoutTerminal.sol\":{\"keccak256\":\"0x67353962158e3349be384d3ceec89db2b7525c5f5c7f6c8cb8f98aeb09142e95\",\"urls\":[\"bzz-raw://01e55c712af9794b2bf0caeab8bd2bd8150f4c6cab61dfec026d40652d5a26d6\",\"dweb:/ipfs/QmbbcxEBJ8UxFUbGPWvyu1cwxgU9YefwhdNuPvfj7LzSZw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBPermissioned.sol\":{\"keccak256\":\"0xa43d05c9cc31cd768072e60d4f097d60dfe199469bfc96aa8df29346a15ee4dc\",\"urls\":[\"bzz-raw://de7caab7841a56b681140993557374edb54763a08b28aaaba35f1bc1a01f7937\",\"dweb:/ipfs/QmQKG6QNm7PNebRtKeLSzzXgp71Yw5Ja37nGPCvVa62Rzu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBPermissions.sol\":{\"keccak256\":\"0xb32e13d512a7deb9ba1e47bbc0992817a63caa9e1f2913d6c55b637a57084037\",\"urls\":[\"bzz-raw://0d291ccc6edc581febf386779423001b0ed4d3b5b021ec444f7bef01cb2f9d28\",\"dweb:/ipfs/QmSUFhJpcpWYLEUzt4KrzyC4am39TNost8tWAtn5GdAUg2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBPermitTerminal.sol\":{\"keccak256\":\"0x5540c746854add8cdc1911f9903a77c9fc97098d8d205075b8baf07485be5cd2\",\"urls\":[\"bzz-raw://b2136b9ac8a2f2429c83531150810b144f5f7f1855dc85c60fcf8e8c161889a3\",\"dweb:/ipfs/QmNSB7LStqYoPLkZcDwb1dTcakxBp9iENoFfkTaNswBYXj\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBPriceFeed.sol\":{\"keccak256\":\"0x3a948500b5397c90e926f3bdef9423e7f095f906b23cd1503009802c80bedb41\",\"urls\":[\"bzz-raw://a0ea0b7e5d442257f6159799b7bf262615b0f04e5cd542b0980f131ae40a63bb\",\"dweb:/ipfs/QmX7uugLaXtT5XmYxqfrmDqU2YuknAeYjHMiLm9iHaRfHw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBPrices.sol\":{\"keccak256\":\"0xed5e532f6ee86029a1a4a1ba8b593296f772909a5f9d95da6cc6c595a838446f\",\"urls\":[\"bzz-raw://4314cbfe4ebd96a48eaf1c14af860aa08b7cd6a73da10391746b4d3410d13d67\",\"dweb:/ipfs/QmfRkWFbxmJUMew6DsDGbK88PypDBUA6PDTJFvfBaMno5n\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBProjectUriRegistry.sol\":{\"keccak256\":\"0x4342aaa8b9566e17691f69fc71e050350dd89b63f5040f092f115610d7a6c0eb\",\"urls\":[\"bzz-raw://88ce07791403524a229b080ad05604962d5b54e57106a533f62bff8a32896b1d\",\"dweb:/ipfs/QmSYxFpoH714CF7mZVhgKvFdYHHgg8R4UGXVXhMS69C7H2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBProjects.sol\":{\"keccak256\":\"0x72c6cbda5a93593e3cc49ef6c4e0848a4b6daa88c188c4192776af86c49911dc\",\"urls\":[\"bzz-raw://448ed5d7a704b5f4dd759514dbcb78160b82732ac6bd7bc368a9f8822045e6de\",\"dweb:/ipfs/QmbnpCPxQLDvQx5ymEy1Ty3aks7bjonydops1CsjCACJBN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBRulesetApprovalHook.sol\":{\"keccak256\":\"0x11dd67effb025396bec1bb97d35a9ba162340e9a824c048e8286802a12acaa45\",\"urls\":[\"bzz-raw://bae11f483c66d98e7fad9bbf47249f6fa4434693e8bace78cbe6d4da9afee009\",\"dweb:/ipfs/QmWjrjPtr8dLGtXQBrz6idwcNqyx2yVSVVQtqo74yqUSZV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBRulesetDataHook.sol\":{\"keccak256\":\"0xf9aad7d3c7de29e020af4fea893bbaa6a1c0e9a8ae5860331c9f4d68d1a5a99f\",\"urls\":[\"bzz-raw://e10b6ed0827ac155153544b8018d2fa812628016e8a168f7df771616f92fd6f4\",\"dweb:/ipfs/QmUB3zuj8B2MAdgSYEMPh7ovXuM1fBb7jN6gLVxstjcAE7\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBRulesets.sol\":{\"keccak256\":\"0x8fd69e04aa2b5962a917394c0a4baa6653f7cea93629a1915c1f9c2e870143e5\",\"urls\":[\"bzz-raw://6c7ce64037e6a11cc03e5c66607a219eb25c953ad76aa7b914d2a9e8f0cd5434\",\"dweb:/ipfs/QmYoTec9wfd89HAnNckC2XJWegtgUmfjmi1vJYT4LTXQ61\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBSplitHook.sol\":{\"keccak256\":\"0x8155763689f6f51b5c6712ac6f23728b248a8924e69e63f8aa14d01c78ea17f1\",\"urls\":[\"bzz-raw://7bab14bd7250cc3ba6665573f2a961308a3453015af7a0305488c0db1745f95b\",\"dweb:/ipfs/QmYpKwToPcSChWXyJ75SBEeWKugBygAnQ1WaZ8wWcu5rha\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBSplits.sol\":{\"keccak256\":\"0x9d27fe4d9aa6dcbb24a24ee1fc16e51b51fab1c4ab1eace93981e73f3c4ce636\",\"urls\":[\"bzz-raw://7a6a1243102ac23cb1643bcc670b6b16b70566877941233964159f9b37755113\",\"dweb:/ipfs/Qmewa2o3nyoRwZ4pdhWqUh1ShWXA3GHJffiVafcKYXg2Ao\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBTerminal.sol\":{\"keccak256\":\"0xa3621c12f7c2e33ee38b5de626a5939190d8a12b1e5318a7cd8d398595480cec\",\"urls\":[\"bzz-raw://1341254389038383117d9b23ed2f9d1812fc30ef1c11cfd6c8423918894d7ba3\",\"dweb:/ipfs/QmV2WJ5a3NW12RnZAM3ySbEfGHNN6GfqqpsMHXorfoxiQo\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBTerminalStore.sol\":{\"keccak256\":\"0x0ab2fd1b5249ff9dcbb51585df7df8c09af309a984fb0a2378426c7fd1800f43\",\"urls\":[\"bzz-raw://8bab809f8ea5692c738fbeb3f83d7b7259e469e03b7e4e3011358f887636ca44\",\"dweb:/ipfs/QmdbyiVSctQZcfibvygyyJntRpwzRoMDKrSkPydn7VouYm\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBToken.sol\":{\"keccak256\":\"0xadb3a7c3c149b60b6b51fdfb2acc814956d8aa9bb94e745c0e907c171b0983f2\",\"urls\":[\"bzz-raw://dddd118b37582f19c7559bdf848f53a29fb16289311bd14957c95fdee9cd28e6\",\"dweb:/ipfs/QmbwWXXVR4SGH9tz6pMKKMZxZ8YF8iRQpMCP3DnXDadx3L\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBTokenUriResolver.sol\":{\"keccak256\":\"0xcbdb1448260ebea5937411516957ef199099e34ff997e7f2a617c2898f921994\",\"urls\":[\"bzz-raw://d1cbf97e5684c987be6703c096e8230d870fab25a23eec8d209cd082e3f2637b\",\"dweb:/ipfs/QmNmzeuQoFiaUTQAcV1tyJyjUYEJ3t7386zTw4ofT7HoZM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/interfaces/IJBTokens.sol\":{\"keccak256\":\"0xf7b458ce7e75e1c4daf2052873846b7c99abb098c0d5fbb2ee5d18e132e4a76c\",\"urls\":[\"bzz-raw://ee20abdc20787df386809255eaee2ef27daca71d4769a0d146cc249502ab0604\",\"dweb:/ipfs/QmP3ZpnnnTQKKGNV9KyLxCYXkjBDuiAgqHX6NRGYuYzTaW\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/libraries/JBCashOuts.sol\":{\"keccak256\":\"0x02077cebb8074e7cd800a415ed78cf4c82572d753ed36ab8e6d5f5e40f5856a3\",\"urls\":[\"bzz-raw://e4f24e42d5d4e61c90d069ced44b1d5c87267f08469ab1472e629a6f88537204\",\"dweb:/ipfs/QmXiGkU7h8rqyJyYK8UBj3odwdHDgV8YQUekd46FXg2G5R\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/libraries/JBConstants.sol\":{\"keccak256\":\"0x5d4b095f3b94c52f89b9cf8a8104de0242497e61f1b32ddc82e78a9ba71a6d0f\",\"urls\":[\"bzz-raw://3ac3340339e0b6a7aae881781b2830f59e3f44114955e2f770172a9bffddc104\",\"dweb:/ipfs/QmV9pFGNGcknqHLEuc6rmC1YPwuwtsokjzh1WX8H2jmVRp\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/libraries/JBFees.sol\":{\"keccak256\":\"0x8f09351a739b9b99258bf6034190fd8bc9e48adc4ece31615dbeaa0f830859aa\",\"urls\":[\"bzz-raw://30b4486940f25131972c603c4417dc0b8b0166390fb8ebf9b9afbf1a0c0fa5ba\",\"dweb:/ipfs/Qme5YniWZmqotsBHnJnhtGVY2xQuUG1yaNo9URhQ2Qu4GY\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/libraries/JBMetadataResolver.sol\":{\"keccak256\":\"0x8f671604390274457e0d13806f9ca9aab44c784f4492612771bada213ed261bd\",\"urls\":[\"bzz-raw://e10babd77a88bb1e9c09d5a99b3f165ce46cca4b348e23add2dc4d53aefe07d7\",\"dweb:/ipfs/QmTLc2R1o5W3hkxX8avYrWPtf1oMLTtmve1sPujAbtoUtz\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol\":{\"keccak256\":\"0xbd3b117f9457dbe55bd29a2daf368a682c0ab25cbedc0139f309809a4ab646c5\",\"urls\":[\"bzz-raw://6a72f70e18edb22b8abc238ba169e5c775696d07915b5d91a8601c1a28ff096e\",\"dweb:/ipfs/QmQZHfiTLqdk1pv1hiursm2icuAwFSzmjGTxRaHMcAqsUh\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBAccountingContext.sol\":{\"keccak256\":\"0xf53e975ce2632558a95d0a57679dbb8afff984d06daaa530cd4c442e467c3403\",\"urls\":[\"bzz-raw://519f7c466c8d90227afe2bd9108e7477412600fea8b4134889795a58a51b156c\",\"dweb:/ipfs/QmaSHMrNLfP8D9RRUaYbMWURdZYweUmt5ysgtTGMZiwnai\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBAfterCashOutRecordedContext.sol\":{\"keccak256\":\"0x8cd6d13c98bd825d7e61cb3b2f5cbf56e77f9a2f85eaa0e27d82f1fb8d5af4f7\",\"urls\":[\"bzz-raw://0e4ff9a254147cc6728b3bdc3862b77d15b518b49375e400b5f0b78552f14c62\",\"dweb:/ipfs/Qmd25R3LDrnRHiSdrNSdfqk8746A3J3VH44C5HDfHkFvU2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBAfterPayRecordedContext.sol\":{\"keccak256\":\"0xcf1761f48e4cbd6eeeb64bb19e434eff50a7f666b2116657f88f63d19620c6de\",\"urls\":[\"bzz-raw://842fe47a4ad56c830040864b458de398efd0cf82eb0add9349e792d0c8b0c275\",\"dweb:/ipfs/QmXBj6EVnzvVX8ZYa2ndyjoSZDGjpXxaoy7dBuoGMaAmRX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBBeforeCashOutRecordedContext.sol\":{\"keccak256\":\"0xd3af6ce6d8ef731aa746e08de846f0422b34a568a3d1000fb8f85a32ba5701b0\",\"urls\":[\"bzz-raw://237e31d3ee24305c1ff4ffb9f829a4159fbd6bb8b4ecb5b557aa16e7eb924bcd\",\"dweb:/ipfs/QmeW4zTaM2J8DDxdC7zLwaHryBLcC3ydbHNSTHcmyETGvG\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBBeforePayRecordedContext.sol\":{\"keccak256\":\"0xa5e4dd0ffa54c8e56f3bb6a437b2e13ef8728ee15aee3d7cb1d0dc96317e75dd\",\"urls\":[\"bzz-raw://fcd2113962a3f34e782090a553f1ba5ace6653bd5d5f932e8bb5279f42bbcb5b\",\"dweb:/ipfs/QmWLhDEprdQsNFmPhmNojRHDhqwG2QMx58AV5j4o56P4mx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBCashOutHookSpecification.sol\":{\"keccak256\":\"0x1579c160a19e68eb06158f56120acf06b8aa4bbbc9836c80fabbb3d2e57ccf3d\",\"urls\":[\"bzz-raw://a81f5e0c384caf0ac11814825ce07e6c6cee97d28f60dcd65dfe8d529b6135fe\",\"dweb:/ipfs/QmY2q7oMFDMN1PoQ8zp7PUQu4K5dYKhYLKBKqrTy42YU6N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBCurrencyAmount.sol\":{\"keccak256\":\"0x7f321bbcbd13abfbc8f0d08a5adaaf8ef312db5bb899012fcffb6170fbb962a9\",\"urls\":[\"bzz-raw://bf9301ef1dbb3abda7b492585377617508ba048c6170f21a5e7d2b3c034eb384\",\"dweb:/ipfs/QmcetEFxSYLLNSZzPBpNn3Fc8sFcrFE8A8h12ZSj2tLgxD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBFee.sol\":{\"keccak256\":\"0x354a99f21d8fa1e306886b0163c8b2daed66d32a2b2bcf6eb1dcefecfc7ef471\",\"urls\":[\"bzz-raw://91b468d942f96d5e27882b836d503125aedd8b0da4ea8e4295cd1b619a83073b\",\"dweb:/ipfs/QmT6TL5eEap2GvaWCwcsCEgVVVwnwnNWmBGskrkESJeFKu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBFundAccessLimitGroup.sol\":{\"keccak256\":\"0x7e62015441edc056c3959fb0e5d0b59a1b209a91ce4beab9d3f6c25e02daf0c0\",\"urls\":[\"bzz-raw://5c77a27155794a7c05ea17ed4bdb382039187b9effecc300563d7fb144029983\",\"dweb:/ipfs/QmXE4FptihU4wSqFLeGWsaNDpZmmNYFLEXMnWGhEC5pf3X\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBPayHookSpecification.sol\":{\"keccak256\":\"0x28f565b626774c36a990ac999f268fbaf9d7f7861e862fab1fb8301f2534e8d1\",\"urls\":[\"bzz-raw://a5d7375934179178febd3b412099b1a5ff42a154ce8b949df2c11b5f3cb3b80e\",\"dweb:/ipfs/QmXP5vVq8Z6HntiuMcPWfQURCKejyiyHLKYuMmzCuUJJtV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBPermissionsData.sol\":{\"keccak256\":\"0x9cb75b1171657be08950f9fc9f6c2bcb2496f618de4ab932141d424dec29d9df\",\"urls\":[\"bzz-raw://a8f578d6132c92048ae553a3c13260ecfa657f4a1bbe18f6c550d96988167590\",\"dweb:/ipfs/QmSYfGm2mcYfMm4wfnZMTjuUr1kBJoq4vZSCkwdgi9BRFk\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBRuleset.sol\":{\"keccak256\":\"0xd03f45345597fca43effe3bc593572c989f4294d909505e331cbd2640a801d23\",\"urls\":[\"bzz-raw://2cc09b335549f4982c16c1109f3078f09fb81c32370baff007633a38badb7a83\",\"dweb:/ipfs/QmYJHBvXscvokRqzdGdTCRQtHUpnePS2uaCDfgHLuuMo56\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBRulesetConfig.sol\":{\"keccak256\":\"0x812ca14f18e228fde272c0caf56a59b71302bfb4f9c514ac6fb0989ab8e1c48e\",\"urls\":[\"bzz-raw://9b234704315ac567db402c89dd5be46ca029094872f6dd52698324dd6ddf6a2d\",\"dweb:/ipfs/QmYPUJHLkyUwbYfJ7UdcpgvyzPtibUmhrKtzXQcRtA8Kvz\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBRulesetMetadata.sol\":{\"keccak256\":\"0xbb9bda3b7ebb6796fa091ee6ce3182ad2a03dc35b89df0fb1107fae7c26ae0b4\",\"urls\":[\"bzz-raw://1b400674d8ec4e3495041c03d5601c07a68eb5d18a0cff83a5823007d6bad36e\",\"dweb:/ipfs/Qma76CRFPwV9WZq2ttZ2FFvui5BvzRHnftrL3Tz1m9uGKv\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBRulesetWithMetadata.sol\":{\"keccak256\":\"0x1bcfadf20488f6df65227f8d4d0fbf9b7539456a2389567f7fe3900d23289bc3\",\"urls\":[\"bzz-raw://0a15c399a71e5373f8c0484c6d6b83521eda31e063a2c53e4c5cec4e74550343\",\"dweb:/ipfs/QmQwi8zkjoTVXbK89NeETYimWCacTrNsesJdpLSvGdqMPX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBSplit.sol\":{\"keccak256\":\"0xf50ba85591d86076ff127e97af2c4b7d1a1be3e20e25d784b64591697d71ab52\",\"urls\":[\"bzz-raw://04276773313a01c2b816c95addea68843c21db3888f4c547eb6e6c486ac55547\",\"dweb:/ipfs/QmZGpxzryNkheek5V9dJWfcJyTP7T52PsPXgRBuweK2rsN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBSplitGroup.sol\":{\"keccak256\":\"0x8dc98fa9e730bee8bcc0a8acf1bc4db1c9b0edf307d969c9c9caa4d6b8d856d9\",\"urls\":[\"bzz-raw://66f4306e0e69c82033927952564fd617e7c4b29aa8b165d5b53a0ebe3109ea12\",\"dweb:/ipfs/QmQqN1u7FHAdEtEZNRcKvZwYtXEQVQnLd6FMzHESP7wDtx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBSplitHookContext.sol\":{\"keccak256\":\"0xa2246f4960ec2b24db3fbfce5d59782cdb9a8fb3c3f832a2c39ddc92859ff170\",\"urls\":[\"bzz-raw://3e3a0ae100c15bb15f0484cb68e3052c3d3d764f84e37020e8dd6b658ff98076\",\"dweb:/ipfs/QmPAv99zN7senrfCMMkeT4RMWpwTdqLgMURQR73BLRe4ZG\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBTerminalConfig.sol\":{\"keccak256\":\"0x9e31505080d3754b6d7db96095b0545930ef6dbc035b91fcc32fdc76a0e7c2a5\",\"urls\":[\"bzz-raw://f7702ab33a1b713c37e5397a55d8ef089289f4da8034cfe9622cbc69a98c47de\",\"dweb:/ipfs/QmXyiXps4aJyiM7vtDC373QUoqwB4DMETaZzC5cZPJKaAK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core-v6/src/structs/JBTokenAmount.sol\":{\"keccak256\":\"0xc61593d33d5ec30e695d382948a1b944d01e29a8f2bfd29f75ecebcdbc7816de\",\"urls\":[\"bzz-raw://8992c1e5fca0c2342ecc0e734dfba6a2a752e4c29184784931d0971e44305051\",\"dweb:/ipfs/QmYNcaW3qeCkgAExUaFTq238fgfJuoYCTwjCn7jm94U4dJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/permission-ids-v6/src/JBPermissionIds.sol\":{\"keccak256\":\"0x5105c29834e0dce4e395e262f23089a1077404f5317c591c89f3621cdfda9628\",\"urls\":[\"bzz-raw://54deca2c06d77f5d1087911e8035d244dde2b08a5dc0dff146b86e6a314419e8\",\"dweb:/ipfs/QmNdpTioAbk6bahJx4aT1WFUY9aV182JH1Dn4FqfuqC8QC\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x9695d220b99dcf62910533bdf5d40d4cf6a4e04d5b106b6803a80586486dc7f7\",\"urls\":[\"bzz-raw://83b7aecd65882d8953643dce144efe91367082cc01830c9c4ed3c8a4837fb558\",\"dweb:/ipfs/QmQ5HxGavcCKjuhd8buv177qjG6A4kvxx4pZviceKdspdM\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098\",\"urls\":[\"bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0\",\"dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0xf78f05f3b8c9f75570e85300d7b4600d7f6f6a198449273f31d44c1641adb46f\",\"urls\":[\"bzz-raw://e28b872613b45e0e801d4995aa4380be2531147bfe2d85c1d6275f1de514fba3\",\"dweb:/ipfs/QmeeFcfShHYaS3BdgVj78nxR28ZaVUwbvr66ud8bT6kzw9\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x0fa9e0d3a859900b5a46f70a03c73adf259603d5e05027a37fe0b45529d85346\",\"urls\":[\"bzz-raw://c2add4da0240c9f2ce47649c8bb6b11b40e98cf6f88b8bdc76b2704e89391710\",\"dweb:/ipfs/QmNQTwF2uVzu4CRtNxr8bxyP9XuW6VsZuo2Nr4KR2bZr3d\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/LowLevelCall.sol\":{\"keccak256\":\"0x6ba3db1346fc75a832aa6cd075e12f6f1fa172fa2122a020f324c319fe5be75e\",\"urls\":[\"bzz-raw://ab92e9e1cb08144c43fa3a383a87c48f49a652d51156950b928c2a50bee6b3a5\",\"dweb:/ipfs/QmWeKkKZBgLDKgRFGKCzsKybYF7C8g9ysg5kU1b1p7QFBi\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857\",\"urls\":[\"bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5\",\"dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083\",\"urls\":[\"bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9\",\"dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif\"],\"license\":\"MIT\"},\"node_modules/@prb/math/src/Common.sol\":{\"keccak256\":\"0x1949276271967e9954a65f27c1c32e1dd73cbd1f3d2af88f2fdd694ba4b7da60\",\"urls\":[\"bzz-raw://ca414ac0a29a3d0d9e194afa73029a7d94168029df6aeb5f6a4b540d0072eb14\",\"dweb:/ipfs/QmYVipmQDvcvurNZZSFGjxabWXwEpdfijYYx2b3d7ico8U\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0xaa631cc9f53e699301d94233007110a345e6779011def484e8dd97b8fe0af771\",\"urls\":[\"bzz-raw://fc0502cf19c9c18f320a3001201e89e350393b75837f6b7971de18b2de06f30d\",\"dweb:/ipfs/QmT9SfhdJ7VJNNrf94g4H5usyi7ShqWGx7Cqsz9jZTjX96\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol\":{\"keccak256\":\"0xe6df9966f8841dc3958ee86169c89de97e7f614c81c28b9dc947b12d732df64e\",\"urls\":[\"bzz-raw://3d4eafdee7f48c3be8350a94eb6edd0bfb2af2c105df65787a77174f356c0317\",\"dweb:/ipfs/QmY1j2adeeAhNpn6cUuthemxGCdLXHTfyMh9yTKsY4mZ2d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/interfaces/IExtsload.sol\":{\"keccak256\":\"0x80b53ca4907d6f0088c3b931f2b72cad1dc4615a95094d96bd0fb8dff8d5ba43\",\"urls\":[\"bzz-raw://375c69148622aab7a3537d5fd37d373a8e9731022c8d87bdaee46233b0a99fe1\",\"dweb:/ipfs/QmXFjdoYRxsA5B1kyuxEXgNf3FBoL1zPvy26Qy8EtpdFRN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/interfaces/IExttload.sol\":{\"keccak256\":\"0xc6b68283ebd8d1c789df536756726eed51c589134bb20821b236a0d22a135937\",\"urls\":[\"bzz-raw://294394f72dfc219689209f4130d85601dfd0d63c8d47578050d312db70f9b6c8\",\"dweb:/ipfs/QmTDMQ3oxCGHgEBU48a3Lp4S1rRjc8vVCxkhE5ZNej1bsY\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/interfaces/IHooks.sol\":{\"keccak256\":\"0xc131ffa2d04c10a012fe715fe2c115811526b7ea34285cf0a04ce7ce8320da8d\",\"urls\":[\"bzz-raw://3b212358897db5d99c21244d88f97b2e788527552cb430629b472a8cc6289aec\",\"dweb:/ipfs/QmQtwV4dDe2RYk2ErLpaAX7U82jWh1L6Lw2HRuKDvBi84G\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/interfaces/IPoolManager.sol\":{\"keccak256\":\"0xbdab3544da3d32dfdf7457baa94e17d5a3012952428559e013ffac45d067038e\",\"urls\":[\"bzz-raw://ce95ff864468e37c76adf71df061d4f3d6f3a5ec1f9bc3aea090463bc72798f4\",\"dweb:/ipfs/QmSbWh1pLbz51yQF4HEu5NRhr8XVv9JYGEw1hq1HudAnCi\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/interfaces/IProtocolFees.sol\":{\"keccak256\":\"0x32a666e588a2f66334430357bb1e2424fe7eebeb98a3364b1dd16eb6ccca9848\",\"urls\":[\"bzz-raw://85751d302125881f72e5f8af051c2d5d9b1f606ebaea8ca7d04fccdd27cc252d\",\"dweb:/ipfs/QmeRwomeh9NWm6A6fgNA4KZPQZHPpdKsPQyYsHSFmvud7J\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/interfaces/callback/IUnlockCallback.sol\":{\"keccak256\":\"0x58c82f2bd9d7c097ed09bd0991fedc403b0ec270eb3d0158bfb095c06a03d719\",\"urls\":[\"bzz-raw://91168ca26a10980df2cdc3fbfe8ddf372c002b7ef19e3c59a0c9870d64198f1b\",\"dweb:/ipfs/QmUSpaM825vd1SwvF38esgbdLgYiPwefKaFERTWvUi6uSK\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/interfaces/external/IERC20Minimal.sol\":{\"keccak256\":\"0xeccadf1bf69ba2eb51f2fe4fa511bc7bb05bbd6b9f9a3cb8e5d83d9582613e0f\",\"urls\":[\"bzz-raw://118757369892687b99ef46ce28d6861f62c098285bd7687a4f17f7e44e5f81de\",\"dweb:/ipfs/QmUxqbYqQtcEwwFbb9e6BBMePEaSgN8C45v6RKubD4ib8d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/interfaces/external/IERC6909Claims.sol\":{\"keccak256\":\"0xa586f345739e52b0488a0fe40b6e375cce67fdd25758408b0efcb5133ad96a48\",\"urls\":[\"bzz-raw://e8c557b7e52abdbbd82e415a1acc27921446a7fd090b7d4877e52be72619547f\",\"dweb:/ipfs/QmXE2KNPbXmGX8BQF3ei6zhzRTnhoTQg39XmqMnkhbr6QK\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/libraries/BitMath.sol\":{\"keccak256\":\"0x51b9be4f5c4fd3e80cbc9631a65244a2eb2be250b6b7f128a2035080e18aee8d\",\"urls\":[\"bzz-raw://fe98bbd5498e912146b9319827fc63621eb66ff55d5baae0fa02a7a972ab8d1e\",\"dweb:/ipfs/QmY5hCuyrtgsJtk4AavrxcvBkRrChfr4N6ZnhdC8roPpNi\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/libraries/CustomRevert.sol\":{\"keccak256\":\"0x111ed3031b6990c80a93ae35dde6b6ac0b7e6af471388fdd7461e91edda9b7de\",\"urls\":[\"bzz-raw://c9ea883c98d6ae1829160d0977bb5195761cfd5bc81692d0a941f45717f594cd\",\"dweb:/ipfs/QmZPwxzaeMNv536wzrAMrMswu7vMHuqPVpjcqL3YvCMoxt\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/libraries/FixedPoint128.sol\":{\"keccak256\":\"0xad236e10853f4b4b20a35a9bb52b857c4fc79874846b7e444e06ead7f2630542\",\"urls\":[\"bzz-raw://0de1f9a06520b1a689660943faa14fc0b8344ab41fab9e6012ea34bff4b9b3eb\",\"dweb:/ipfs/QmRNMPTyko7W6d6KxuTsnDBa9oZgDK4xiwRRq3H9ASTbwy\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/libraries/FullMath.sol\":{\"keccak256\":\"0x4fc73a00817193fd3cac1cc03d8167d21af97d75f1815a070ee31a90c702b4c2\",\"urls\":[\"bzz-raw://c3b2d66d36b1ad56b1ab6e2eb8a816740877b40b461c93f125e88621c8378e52\",\"dweb:/ipfs/QmPGvMZzKQvNiWKd8aRzzdW7oAizwrMgcMtnaworDkVHFC\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/libraries/LiquidityMath.sol\":{\"keccak256\":\"0x000ef2eadcc1eb7b2c18a77655f94e76e0e860f605783484657ef65fd6eda353\",\"urls\":[\"bzz-raw://a766b620a7a22798b43c6c1f23b5c6cff0ebf588deb89842bad05208d448cd99\",\"dweb:/ipfs/QmVKjaFJdzkqA3ey2Byum8iTCMssWVD8MmVC8rw62Tj5WD\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/libraries/Position.sol\":{\"keccak256\":\"0xddab2a831f1befb6abf5567e77c4582169ca8156cf69eb4f22d8e87f7226a3f9\",\"urls\":[\"bzz-raw://c79fe61b50f3b70cff503abfa6f5643fcbefb9b794855bee1019b1e6d9c083b2\",\"dweb:/ipfs/QmbKmYNQesaMz8bo1b7TMHQcAwaDd3eDPrE5pAdPPZTtk5\"],\"license\":\"BUSL-1.1\"},\"node_modules/@uniswap/v4-core/src/libraries/SafeCast.sol\":{\"keccak256\":\"0x42c4a24f996a14d358be397b71f7ec9d7daf666aaec78002c63315a6ee67aa86\",\"urls\":[\"bzz-raw://c3db86e2ba3679105fc32edec656c70282e1fede6cab11217702443f6c26fa59\",\"dweb:/ipfs/QmX4yaaSPdKQzYNRsezjTvZKsubzS8JRTEGFD3fPpTTCcj\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/libraries/StateLibrary.sol\":{\"keccak256\":\"0x96db333ee126a841dd959e38e452cc59d73583cb0437a1d48b2052e33a74f952\",\"urls\":[\"bzz-raw://8672bba1eb69608299b0904f4ff305238eb18479d371c26518f278c9ee184cd0\",\"dweb:/ipfs/QmTLu3s6ECvsEDHStQv8HTVHYtvkviBbdjPrFJd4SpVRFY\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/libraries/TickMath.sol\":{\"keccak256\":\"0x4e1a11e154eb06106cb1c4598f06cca5f5ca16eaa33494ba2f0e74981123eca8\",\"urls\":[\"bzz-raw://a79a57f7b240783b045168d1c4f774ac1812caf8f9a83cb6959a86b0b07b6c70\",\"dweb:/ipfs/QmTb5kvxwDNW8jDuQaqdJ445cCFejNkUqEB17Bjo8UBiva\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/types/BalanceDelta.sol\":{\"keccak256\":\"0xa719c8fe51e0a9524280178f19f6851bcc3b3b60e73618f3d60905d35ae5569f\",\"urls\":[\"bzz-raw://7436928dc9de35c6c7c5c636cb51adaf295cfd590da83b19a004ae33cbec9ef9\",\"dweb:/ipfs/QmRJ9yZkUpzk4433GX3LgVVL8jwpbSYSUwXcucKisf3v4H\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/types/BeforeSwapDelta.sol\":{\"keccak256\":\"0x2a774312d91285313d569da1a718c909655da5432310417692097a1d4dc83a78\",\"urls\":[\"bzz-raw://a2c7a0379955cff9c17ab9e61f95e42909aa5947c22740f86ce940d09856f782\",\"dweb:/ipfs/QmaAuo8UBYXsGrVuKh8iRoAAdqwtg1jDq515cW1ZRP5m9K\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/types/Currency.sol\":{\"keccak256\":\"0x4a0b84b282577ff6f8acf13ec9f4d32dbb9348748b49611d00e68bee96609c93\",\"urls\":[\"bzz-raw://45f9d62ab3d51b52957279e353853ba1547c3182c9a1e3d1846ada4a90263b01\",\"dweb:/ipfs/QmS8NG84ccQS1yXVD8cv3eKX7J1UKxuJhbUfHTQR2opKF5\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/types/PoolId.sol\":{\"keccak256\":\"0x308311916ea0f5c2fd878b6a2751eb223d170a69e33f601fae56dfe3c5d392af\",\"urls\":[\"bzz-raw://669c2cd7ac17690b5d8831e0bda72822376c3a04b36afed6d31df4d75fe60918\",\"dweb:/ipfs/QmT6EpkxqU8VF3WsgrZ66F3s1cCQRffR95z1HDYZz7ph6y\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/types/PoolKey.sol\":{\"keccak256\":\"0xf89856e0580d7a4856d3187a76858377ccee9d59702d230c338d84388221b786\",\"urls\":[\"bzz-raw://6f3118fa189025695c37fdf0bdd1190f085ad097484d3c88cf4c56d1db65f639\",\"dweb:/ipfs/QmamXpgtB8GV1CaFLvqefPWSoikLDhMk1yU4heBnVzU8gi\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v4-core/src/types/PoolOperation.sol\":{\"keccak256\":\"0x7a1a107fc1f2208abb2c9364c8c54e56e98dca27673e9441bed2b949b6382162\",\"urls\":[\"bzz-raw://4ad2470383bc5595d5af17840c64971f457adac68895a4db41ba5c71a4478e07\",\"dweb:/ipfs/QmdwKhBHDZFuqXrR2BfDBD9r7rB2ULGQBznsajRTkTmL4c\"],\"license\":\"MIT\"}},\"version\":1}",
	"gitCommit": "npm:@bananapus/buyback-hook-v6@1.0.0",
	"gitDirty": false,
	"history": []
}
